From 946ec201e2b674998f117f09f54b1788608c8fac Mon Sep 17 00:00:00 2001 From: JT Olio Date: Thu, 19 Sep 2019 10:19:29 -0600 Subject: [PATCH] metainfo: move api keys to part of the request (#3069) What: we move api keys out of the grpc connection-level metadata on the client side and into the request protobufs directly. the server side still supports both mechanisms for backwards compatibility. Why: dRPC won't support connection-level metadata. the only thing we currently use connection-level metadata for is api keys. we need to move all information needed by a request into the request protobuf itself for drpc support. check out the .proto changes for the main details. One fun side-fact: Did you know that protobuf fields 1-15 are special and only use one byte for both the field number and type? Additionally did you know we don't use field 15 anywhere yet? So the new request header will use field 15, and should use field 15 on all protobufs going forward. Please describe the tests: all existing tests should pass Please describe the performance impact: none --- internal/testplanet/uplink.go | 12 +- internal/testplanet/uplink_test.go | 4 +- lib/uplink/bucket_attrs_test.go | 4 +- lib/uplink/examples_test.go | 2 +- lib/uplink/list_test.go | 2 +- lib/uplink/uplink.go | 2 +- lib/uplinkc/testdata_test.go | 2 +- linksharing/handler_test.go | 2 +- pkg/auth/grpcauth/apikey.go | 18 +- pkg/auth/grpcauth/apikey_test.go | 2 +- pkg/macaroon/serialize.go | 12 +- pkg/miniogw/gateway_test.go | 2 +- pkg/pb/metainfo.pb.go | 1031 ++++++++++++-------- pkg/pb/metainfo.proto | 64 +- proto.lock | 149 ++- satellite/metainfo/batch.go | 18 + satellite/metainfo/metainfo.go | 67 +- satellite/metainfo/metainfo_test.go | 12 +- satellite/metainfo/validation.go | 21 +- uplink/metainfo/client.go | 182 ++-- uplink/metainfo/kvmetainfo/buckets_test.go | 2 +- uplink/storage/streams/store_test.go | 2 +- 22 files changed, 1078 insertions(+), 534 deletions(-) diff --git a/internal/testplanet/uplink.go b/internal/testplanet/uplink.go index b3f2e2270..9fe6e871a 100644 --- a/internal/testplanet/uplink.go +++ b/internal/testplanet/uplink.go @@ -39,7 +39,7 @@ type Uplink struct { Transport transport.Client StorageNodeCount int - APIKey map[storj.NodeID]string + APIKey map[storj.NodeID]*macaroon.APIKey ProjectID map[storj.NodeID]uuid.UUID } @@ -75,7 +75,7 @@ func (planet *Planet) newUplink(name string, storageNodeCount int) (*Uplink, err Log: planet.log.Named(name), Identity: identity, StorageNodeCount: storageNodeCount, - APIKey: map[storj.NodeID]string{}, + APIKey: map[storj.NodeID]*macaroon.APIKey{}, ProjectID: map[storj.NodeID]uuid.UUID{}, } @@ -126,7 +126,7 @@ func (planet *Planet) newUplink(name string, storageNodeCount int) (*Uplink, err return nil, err } - uplink.APIKey[satellite.ID()] = key.Serialize() + uplink.APIKey[satellite.ID()] = key uplink.ProjectID[satellite.ID()] = project.ID } @@ -148,7 +148,7 @@ func (client *Uplink) Local() pb.Node { return client.Info } func (client *Uplink) Shutdown() error { return nil } // DialMetainfo dials destination with apikey and returns metainfo Client -func (client *Uplink) DialMetainfo(ctx context.Context, destination Peer, apikey string) (*metainfo.Client, error) { +func (client *Uplink) DialMetainfo(ctx context.Context, destination Peer, apikey *macaroon.APIKey) (*metainfo.Client, error) { return metainfo.Dial(ctx, client.Transport, destination.Addr(), apikey) } @@ -338,7 +338,9 @@ func (client *Uplink) CreateBucket(ctx context.Context, satellite *SatelliteSyst func (client *Uplink) GetConfig(satellite *SatelliteSystem) uplink.Config { config := getDefaultConfig() - apiKey, err := libuplink.ParseAPIKey(client.APIKey[satellite.ID()]) + // client.APIKey[satellite.ID()] is a *macaroon.APIKey, but we want a + // *libuplink.APIKey, so, serialize and parse for now + apiKey, err := libuplink.ParseAPIKey(client.APIKey[satellite.ID()].Serialize()) if err != nil { panic(err) } diff --git a/internal/testplanet/uplink_test.go b/internal/testplanet/uplink_test.go index c12671e80..86ea2ce7a 100644 --- a/internal/testplanet/uplink_test.go +++ b/internal/testplanet/uplink_test.go @@ -266,9 +266,9 @@ func TestDeleteWithOfflineStoragenode(t *testing.T) { err = planet.Uplinks[0].Delete(ctx, planet.Satellites[0], "test-bucket", "test-file") require.Error(t, err) - apiKey := planet.Uplinks[0].APIKey[planet.Satellites[0].ID()] + key := planet.Uplinks[0].APIKey[planet.Satellites[0].ID()] - metainfoClient, err := planet.Uplinks[0].DialMetainfo(ctx, planet.Satellites[0], apiKey) + metainfoClient, err := planet.Uplinks[0].DialMetainfo(ctx, planet.Satellites[0], key) require.NoError(t, err) defer ctx.Check(metainfoClient.Close) diff --git a/lib/uplink/bucket_attrs_test.go b/lib/uplink/bucket_attrs_test.go index 6b1696ea4..0f2360749 100644 --- a/lib/uplink/bucket_attrs_test.go +++ b/lib/uplink/bucket_attrs_test.go @@ -36,7 +36,7 @@ func testPlanetWithLibUplink(t *testing.T, cfg testConfig, satellite := planet.Satellites[0] cfg.uplinkCfg.Volatile.TLS.SkipPeerCAWhitelist = true - apiKey, err := uplink.ParseAPIKey(testUplink.APIKey[satellite.ID()]) + apiKey, err := uplink.ParseAPIKey(testUplink.APIKey[satellite.ID()].Serialize()) if err != nil { t.Fatalf("could not parse API key from testplanet: %v", err) } @@ -66,7 +66,7 @@ func TestPartnerBucketAttrs(t *testing.T) { SatelliteCount: 1, StorageNodeCount: 5, UplinkCount: 1, }, func(t *testing.T, ctx *testcontext.Context, planet *testplanet.Planet) { satellite := planet.Satellites[0] - apikey, err := uplink.ParseAPIKey(planet.Uplinks[0].APIKey[satellite.ID()]) + apikey, err := uplink.ParseAPIKey(planet.Uplinks[0].APIKey[satellite.ID()].Serialize()) require.NoError(t, err) partnerID := testrand.UUID() diff --git a/lib/uplink/examples_test.go b/lib/uplink/examples_test.go index 81cf60b44..d155496be 100644 --- a/lib/uplink/examples_test.go +++ b/lib/uplink/examples_test.go @@ -26,7 +26,7 @@ func TestBucketExamples(t *testing.T) { cfg.Volatile.TLS.SkipPeerCAWhitelist = true satelliteAddr := planet.Satellites[0].Local().Address.Address - apiKey := planet.Uplinks[0].APIKey[planet.Satellites[0].ID()] + apiKey := planet.Uplinks[0].APIKey[planet.Satellites[0].ID()].Serialize() out := bytes.NewBuffer(nil) err := ListBucketsExample(ctx, satelliteAddr, apiKey, &cfg, out) diff --git a/lib/uplink/list_test.go b/lib/uplink/list_test.go index 689e6a053..d69f6c183 100644 --- a/lib/uplink/list_test.go +++ b/lib/uplink/list_test.go @@ -46,7 +46,7 @@ func TestPutGetList(t *testing.T) { StorageNodeCount: 1, UplinkCount: 1}, func(t *testing.T, ctx *testcontext.Context, planet *testplanet.Planet) { - apiKey := planet.Uplinks[0].APIKey[planet.Satellites[0].ID()] + apiKey := planet.Uplinks[0].APIKey[planet.Satellites[0].ID()].Serialize() satelliteAddr := planet.Satellites[0].Local().Address.Address tests := []putGetListTest{ diff --git a/lib/uplink/uplink.go b/lib/uplink/uplink.go index 8463b1d72..a10853eb7 100644 --- a/lib/uplink/uplink.go +++ b/lib/uplink/uplink.go @@ -161,7 +161,7 @@ func NewUplink(ctx context.Context, cfg *Config) (_ *Uplink, err error) { func (u *Uplink) OpenProject(ctx context.Context, satelliteAddr string, apiKey APIKey) (p *Project, err error) { defer mon.Task()(&ctx)(&err) - m, err := metainfo.Dial(ctx, u.tc, satelliteAddr, apiKey.Serialize()) + m, err := metainfo.Dial(ctx, u.tc, satelliteAddr, apiKey.key) if err != nil { return nil, err } diff --git a/lib/uplinkc/testdata_test.go b/lib/uplinkc/testdata_test.go index b14754b8c..4ea632072 100644 --- a/lib/uplinkc/testdata_test.go +++ b/lib/uplinkc/testdata_test.go @@ -80,7 +80,7 @@ func TestC(t *testing.T) { cmd.Dir = filepath.Dir(testexe) cmd.Env = append(os.Environ(), "SATELLITE_0_ADDR="+planet.Satellites[0].Addr(), - "GATEWAY_0_API_KEY="+planet.Uplinks[0].APIKey[planet.Satellites[0].ID()], + "GATEWAY_0_API_KEY="+planet.Uplinks[0].APIKey[planet.Satellites[0].ID()].Serialize(), ) out, err := cmd.CombinedOutput() diff --git a/linksharing/handler_test.go b/linksharing/handler_test.go index 23d0d1d31..5b0a3a3cc 100644 --- a/linksharing/handler_test.go +++ b/linksharing/handler_test.go @@ -122,7 +122,7 @@ func testHandlerRequests(t *testing.T, ctx *testcontext.Context, planet *testpla err := planet.Uplinks[0].Upload(ctx, planet.Satellites[0], "testbucket", "test/foo", []byte("FOO")) require.NoError(t, err) - apiKey, err := uplink.ParseAPIKey(planet.Uplinks[0].APIKey[planet.Satellites[0].ID()]) + apiKey, err := uplink.ParseAPIKey(planet.Uplinks[0].APIKey[planet.Satellites[0].ID()].Serialize()) require.NoError(t, err) scope, err := (&uplink.Scope{ diff --git a/pkg/auth/grpcauth/apikey.go b/pkg/auth/grpcauth/apikey.go index aa44065b6..926875559 100644 --- a/pkg/auth/grpcauth/apikey.go +++ b/pkg/auth/grpcauth/apikey.go @@ -32,25 +32,25 @@ func InterceptAPIKey(ctx context.Context, req interface{}, info *grpc.UnaryServe return handler(auth.WithAPIKey(ctx, []byte(apikeys[0])), req) } -// APIKeyCredentials implements grpc/credentials.PerRPCCredentials -// for authenticating with the grpc server. -type APIKeyCredentials struct { +// DeprecatedAPIKeyCredentials implements grpc/credentials.PerRPCCredentials +// for authenticating with the grpc server. This does not work with drpc. +type DeprecatedAPIKeyCredentials struct { value string } -// NewAPIKeyCredentials returns a new APIKeyCredentials -func NewAPIKeyCredentials(apikey string) *APIKeyCredentials { - return &APIKeyCredentials{apikey} +// NewDeprecatedAPIKeyCredentials returns a new DeprecatedAPIKeyCredentials +func NewDeprecatedAPIKeyCredentials(apikey string) *DeprecatedAPIKeyCredentials { + return &DeprecatedAPIKeyCredentials{apikey} } // GetRequestMetadata gets the current request metadata, refreshing tokens if required. -func (creds *APIKeyCredentials) GetRequestMetadata(ctx context.Context, uri ...string) (map[string]string, error) { +func (creds *DeprecatedAPIKeyCredentials) GetRequestMetadata(ctx context.Context, uri ...string) (map[string]string, error) { return map[string]string{ "apikey": creds.value, }, nil } // RequireTransportSecurity indicates whether the credentials requires transport security. -func (creds *APIKeyCredentials) RequireTransportSecurity() bool { - return false +func (creds *DeprecatedAPIKeyCredentials) RequireTransportSecurity() bool { + return false // Deprecated anyway, but how was this the right choice? } diff --git a/pkg/auth/grpcauth/apikey_test.go b/pkg/auth/grpcauth/apikey_test.go index 6ef5b5bc6..1e4c52d61 100644 --- a/pkg/auth/grpcauth/apikey_test.go +++ b/pkg/auth/grpcauth/apikey_test.go @@ -52,7 +52,7 @@ func TestAPIKey(t *testing.T) { {"good key", codes.OK}, } { conn, err := grpc.DialContext(ctx, listener.Addr().String(), - grpc.WithPerRPCCredentials(grpcauth.NewAPIKeyCredentials(test.apikey)), + grpc.WithPerRPCCredentials(grpcauth.NewDeprecatedAPIKeyCredentials(test.apikey)), grpc.WithBlock(), grpc.WithInsecure(), ) diff --git a/pkg/macaroon/serialize.go b/pkg/macaroon/serialize.go index 60309d933..24ff1c289 100644 --- a/pkg/macaroon/serialize.go +++ b/pkg/macaroon/serialize.go @@ -19,6 +19,10 @@ const ( fieldSignature fieldType = 6 ) +const ( + version byte = 2 +) + type packet struct { fieldType fieldType data []byte @@ -29,7 +33,7 @@ func (m *Macaroon) Serialize() (data []byte) { ctx := context.TODO() defer mon.Task()(&ctx)(nil) // Start data from version int - data = append(data, 2) + data = append(data, version) // Serilize Identity data = serializePacket(data, packet{ @@ -78,6 +82,12 @@ func appendVarint(data []byte, x int) []byte { func ParseMacaroon(data []byte) (_ *Macaroon, err error) { ctx := context.TODO() defer mon.Task()(&ctx)(&err) + if len(data) < 2 { + return nil, errors.New("empty macaroon") + } + if data[0] != version { + return nil, errors.New("invalid macaroon version") + } // skip version data = data[1:] // Parse Location diff --git a/pkg/miniogw/gateway_test.go b/pkg/miniogw/gateway_test.go index 19c3a22d1..11c8d0d67 100644 --- a/pkg/miniogw/gateway_test.go +++ b/pkg/miniogw/gateway_test.go @@ -684,7 +684,7 @@ func initEnv(ctx context.Context, t *testing.T, planet *testplanet.Planet) (mini return nil, nil, nil, err } - m, err := planet.Uplinks[0].DialMetainfo(ctx, planet.Satellites[0], apiKey.Serialize()) + m, err := planet.Uplinks[0].DialMetainfo(ctx, planet.Satellites[0], apiKey) if err != nil { return nil, nil, nil, err } diff --git a/pkg/pb/metainfo.pb.go b/pkg/pb/metainfo.pb.go index 78fd6e5f2..253388844 100644 --- a/pkg/pb/metainfo.pb.go +++ b/pkg/pb/metainfo.pb.go @@ -58,7 +58,45 @@ func (x Object_Status) String() string { } func (Object_Status) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_631e2f30a93cd64e, []int{29, 0} + return fileDescriptor_631e2f30a93cd64e, []int{30, 0} +} + +type RequestHeader struct { + ApiKey []byte `protobuf:"bytes,1,opt,name=api_key,json=apiKey,proto3" json:"api_key,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *RequestHeader) Reset() { *m = RequestHeader{} } +func (m *RequestHeader) String() string { return proto.CompactTextString(m) } +func (*RequestHeader) ProtoMessage() {} +func (*RequestHeader) Descriptor() ([]byte, []int) { + return fileDescriptor_631e2f30a93cd64e, []int{0} +} +func (m *RequestHeader) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_RequestHeader.Unmarshal(m, b) +} +func (m *RequestHeader) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_RequestHeader.Marshal(b, m, deterministic) +} +func (m *RequestHeader) XXX_Merge(src proto.Message) { + xxx_messageInfo_RequestHeader.Merge(m, src) +} +func (m *RequestHeader) XXX_Size() int { + return xxx_messageInfo_RequestHeader.Size(m) +} +func (m *RequestHeader) XXX_DiscardUnknown() { + xxx_messageInfo_RequestHeader.DiscardUnknown(m) +} + +var xxx_messageInfo_RequestHeader proto.InternalMessageInfo + +func (m *RequestHeader) GetApiKey() []byte { + if m != nil { + return m.ApiKey + } + return nil } type Bucket struct { @@ -78,7 +116,7 @@ func (m *Bucket) Reset() { *m = Bucket{} } func (m *Bucket) String() string { return proto.CompactTextString(m) } func (*Bucket) ProtoMessage() {} func (*Bucket) Descriptor() ([]byte, []int) { - return fileDescriptor_631e2f30a93cd64e, []int{0} + return fileDescriptor_631e2f30a93cd64e, []int{1} } func (m *Bucket) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_Bucket.Unmarshal(m, b) @@ -159,7 +197,7 @@ func (m *BucketListItem) Reset() { *m = BucketListItem{} } func (m *BucketListItem) String() string { return proto.CompactTextString(m) } func (*BucketListItem) ProtoMessage() {} func (*BucketListItem) Descriptor() ([]byte, []int) { - return fileDescriptor_631e2f30a93cd64e, []int{1} + return fileDescriptor_631e2f30a93cd64e, []int{2} } func (m *BucketListItem) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_BucketListItem.Unmarshal(m, b) @@ -194,6 +232,7 @@ func (m *BucketListItem) GetCreatedAt() time.Time { } type BucketCreateRequest struct { + Header *RequestHeader `protobuf:"bytes,15,opt,name=header,proto3" json:"header,omitempty"` Name []byte `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` PathCipher CipherSuite `protobuf:"varint,2,opt,name=path_cipher,json=pathCipher,proto3,enum=encryption.CipherSuite" json:"path_cipher,omitempty"` DefaultSegmentSize int64 `protobuf:"varint,3,opt,name=default_segment_size,json=defaultSegmentSize,proto3" json:"default_segment_size,omitempty"` @@ -209,7 +248,7 @@ func (m *BucketCreateRequest) Reset() { *m = BucketCreateRequest{} } func (m *BucketCreateRequest) String() string { return proto.CompactTextString(m) } func (*BucketCreateRequest) ProtoMessage() {} func (*BucketCreateRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_631e2f30a93cd64e, []int{2} + return fileDescriptor_631e2f30a93cd64e, []int{3} } func (m *BucketCreateRequest) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_BucketCreateRequest.Unmarshal(m, b) @@ -229,6 +268,13 @@ func (m *BucketCreateRequest) XXX_DiscardUnknown() { var xxx_messageInfo_BucketCreateRequest proto.InternalMessageInfo +func (m *BucketCreateRequest) GetHeader() *RequestHeader { + if m != nil { + return m.Header + } + return nil +} + func (m *BucketCreateRequest) GetName() []byte { if m != nil { return m.Name @@ -282,7 +328,7 @@ func (m *BucketCreateResponse) Reset() { *m = BucketCreateResponse{} } func (m *BucketCreateResponse) String() string { return proto.CompactTextString(m) } func (*BucketCreateResponse) ProtoMessage() {} func (*BucketCreateResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_631e2f30a93cd64e, []int{3} + return fileDescriptor_631e2f30a93cd64e, []int{4} } func (m *BucketCreateResponse) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_BucketCreateResponse.Unmarshal(m, b) @@ -310,17 +356,18 @@ func (m *BucketCreateResponse) GetBucket() *Bucket { } type BucketGetRequest struct { - Name []byte `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + Header *RequestHeader `protobuf:"bytes,15,opt,name=header,proto3" json:"header,omitempty"` + Name []byte `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` } func (m *BucketGetRequest) Reset() { *m = BucketGetRequest{} } func (m *BucketGetRequest) String() string { return proto.CompactTextString(m) } func (*BucketGetRequest) ProtoMessage() {} func (*BucketGetRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_631e2f30a93cd64e, []int{4} + return fileDescriptor_631e2f30a93cd64e, []int{5} } func (m *BucketGetRequest) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_BucketGetRequest.Unmarshal(m, b) @@ -340,6 +387,13 @@ func (m *BucketGetRequest) XXX_DiscardUnknown() { var xxx_messageInfo_BucketGetRequest proto.InternalMessageInfo +func (m *BucketGetRequest) GetHeader() *RequestHeader { + if m != nil { + return m.Header + } + return nil +} + func (m *BucketGetRequest) GetName() []byte { if m != nil { return m.Name @@ -358,7 +412,7 @@ func (m *BucketGetResponse) Reset() { *m = BucketGetResponse{} } func (m *BucketGetResponse) String() string { return proto.CompactTextString(m) } func (*BucketGetResponse) ProtoMessage() {} func (*BucketGetResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_631e2f30a93cd64e, []int{5} + return fileDescriptor_631e2f30a93cd64e, []int{6} } func (m *BucketGetResponse) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_BucketGetResponse.Unmarshal(m, b) @@ -386,17 +440,18 @@ func (m *BucketGetResponse) GetBucket() *Bucket { } type BucketDeleteRequest struct { - Name []byte `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + Header *RequestHeader `protobuf:"bytes,15,opt,name=header,proto3" json:"header,omitempty"` + Name []byte `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` } func (m *BucketDeleteRequest) Reset() { *m = BucketDeleteRequest{} } func (m *BucketDeleteRequest) String() string { return proto.CompactTextString(m) } func (*BucketDeleteRequest) ProtoMessage() {} func (*BucketDeleteRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_631e2f30a93cd64e, []int{6} + return fileDescriptor_631e2f30a93cd64e, []int{7} } func (m *BucketDeleteRequest) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_BucketDeleteRequest.Unmarshal(m, b) @@ -416,6 +471,13 @@ func (m *BucketDeleteRequest) XXX_DiscardUnknown() { var xxx_messageInfo_BucketDeleteRequest proto.InternalMessageInfo +func (m *BucketDeleteRequest) GetHeader() *RequestHeader { + if m != nil { + return m.Header + } + return nil +} + func (m *BucketDeleteRequest) GetName() []byte { if m != nil { return m.Name @@ -433,7 +495,7 @@ func (m *BucketDeleteResponse) Reset() { *m = BucketDeleteResponse{} } func (m *BucketDeleteResponse) String() string { return proto.CompactTextString(m) } func (*BucketDeleteResponse) ProtoMessage() {} func (*BucketDeleteResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_631e2f30a93cd64e, []int{7} + return fileDescriptor_631e2f30a93cd64e, []int{8} } func (m *BucketDeleteResponse) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_BucketDeleteResponse.Unmarshal(m, b) @@ -454,19 +516,20 @@ func (m *BucketDeleteResponse) XXX_DiscardUnknown() { var xxx_messageInfo_BucketDeleteResponse proto.InternalMessageInfo type BucketListRequest struct { - Cursor []byte `protobuf:"bytes,1,opt,name=cursor,proto3" json:"cursor,omitempty"` - Limit int32 `protobuf:"varint,2,opt,name=limit,proto3" json:"limit,omitempty"` - Direction int32 `protobuf:"varint,3,opt,name=direction,proto3" json:"direction,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + Header *RequestHeader `protobuf:"bytes,15,opt,name=header,proto3" json:"header,omitempty"` + Cursor []byte `protobuf:"bytes,1,opt,name=cursor,proto3" json:"cursor,omitempty"` + Limit int32 `protobuf:"varint,2,opt,name=limit,proto3" json:"limit,omitempty"` + Direction int32 `protobuf:"varint,3,opt,name=direction,proto3" json:"direction,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` } func (m *BucketListRequest) Reset() { *m = BucketListRequest{} } func (m *BucketListRequest) String() string { return proto.CompactTextString(m) } func (*BucketListRequest) ProtoMessage() {} func (*BucketListRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_631e2f30a93cd64e, []int{8} + return fileDescriptor_631e2f30a93cd64e, []int{9} } func (m *BucketListRequest) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_BucketListRequest.Unmarshal(m, b) @@ -486,6 +549,13 @@ func (m *BucketListRequest) XXX_DiscardUnknown() { var xxx_messageInfo_BucketListRequest proto.InternalMessageInfo +func (m *BucketListRequest) GetHeader() *RequestHeader { + if m != nil { + return m.Header + } + return nil +} + func (m *BucketListRequest) GetCursor() []byte { if m != nil { return m.Cursor @@ -519,7 +589,7 @@ func (m *BucketListResponse) Reset() { *m = BucketListResponse{} } func (m *BucketListResponse) String() string { return proto.CompactTextString(m) } func (*BucketListResponse) ProtoMessage() {} func (*BucketListResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_631e2f30a93cd64e, []int{9} + return fileDescriptor_631e2f30a93cd64e, []int{10} } func (m *BucketListResponse) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_BucketListResponse.Unmarshal(m, b) @@ -554,18 +624,19 @@ func (m *BucketListResponse) GetMore() bool { } type BucketSetAttributionRequest struct { - Name []byte `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` - PartnerId []byte `protobuf:"bytes,2,opt,name=partner_id,json=partnerId,proto3" json:"partner_id,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + Header *RequestHeader `protobuf:"bytes,15,opt,name=header,proto3" json:"header,omitempty"` + Name []byte `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + PartnerId []byte `protobuf:"bytes,2,opt,name=partner_id,json=partnerId,proto3" json:"partner_id,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` } func (m *BucketSetAttributionRequest) Reset() { *m = BucketSetAttributionRequest{} } func (m *BucketSetAttributionRequest) String() string { return proto.CompactTextString(m) } func (*BucketSetAttributionRequest) ProtoMessage() {} func (*BucketSetAttributionRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_631e2f30a93cd64e, []int{10} + return fileDescriptor_631e2f30a93cd64e, []int{11} } func (m *BucketSetAttributionRequest) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_BucketSetAttributionRequest.Unmarshal(m, b) @@ -585,6 +656,13 @@ func (m *BucketSetAttributionRequest) XXX_DiscardUnknown() { var xxx_messageInfo_BucketSetAttributionRequest proto.InternalMessageInfo +func (m *BucketSetAttributionRequest) GetHeader() *RequestHeader { + if m != nil { + return m.Header + } + return nil +} + func (m *BucketSetAttributionRequest) GetName() []byte { if m != nil { return m.Name @@ -609,7 +687,7 @@ func (m *BucketSetAttributionResponse) Reset() { *m = BucketSetAttributi func (m *BucketSetAttributionResponse) String() string { return proto.CompactTextString(m) } func (*BucketSetAttributionResponse) ProtoMessage() {} func (*BucketSetAttributionResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_631e2f30a93cd64e, []int{11} + return fileDescriptor_631e2f30a93cd64e, []int{12} } func (m *BucketSetAttributionResponse) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_BucketSetAttributionResponse.Unmarshal(m, b) @@ -641,7 +719,7 @@ func (m *AddressedOrderLimit) Reset() { *m = AddressedOrderLimit{} } func (m *AddressedOrderLimit) String() string { return proto.CompactTextString(m) } func (*AddressedOrderLimit) ProtoMessage() {} func (*AddressedOrderLimit) Descriptor() ([]byte, []int) { - return fileDescriptor_631e2f30a93cd64e, []int{12} + return fileDescriptor_631e2f30a93cd64e, []int{13} } func (m *AddressedOrderLimit) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_AddressedOrderLimit.Unmarshal(m, b) @@ -676,6 +754,7 @@ func (m *AddressedOrderLimit) GetStorageNodeAddress() *NodeAddress { } type SegmentWriteRequestOld struct { + Header *RequestHeader `protobuf:"bytes,15,opt,name=header,proto3" json:"header,omitempty"` Bucket []byte `protobuf:"bytes,1,opt,name=bucket,proto3" json:"bucket,omitempty"` Path []byte `protobuf:"bytes,2,opt,name=path,proto3" json:"path,omitempty"` Segment int64 `protobuf:"varint,3,opt,name=segment,proto3" json:"segment,omitempty"` @@ -691,7 +770,7 @@ func (m *SegmentWriteRequestOld) Reset() { *m = SegmentWriteRequestOld{} func (m *SegmentWriteRequestOld) String() string { return proto.CompactTextString(m) } func (*SegmentWriteRequestOld) ProtoMessage() {} func (*SegmentWriteRequestOld) Descriptor() ([]byte, []int) { - return fileDescriptor_631e2f30a93cd64e, []int{13} + return fileDescriptor_631e2f30a93cd64e, []int{14} } func (m *SegmentWriteRequestOld) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_SegmentWriteRequestOld.Unmarshal(m, b) @@ -711,6 +790,13 @@ func (m *SegmentWriteRequestOld) XXX_DiscardUnknown() { var xxx_messageInfo_SegmentWriteRequestOld proto.InternalMessageInfo +func (m *SegmentWriteRequestOld) GetHeader() *RequestHeader { + if m != nil { + return m.Header + } + return nil +} + func (m *SegmentWriteRequestOld) GetBucket() []byte { if m != nil { return m.Bucket @@ -766,7 +852,7 @@ func (m *SegmentWriteResponseOld) Reset() { *m = SegmentWriteResponseOld func (m *SegmentWriteResponseOld) String() string { return proto.CompactTextString(m) } func (*SegmentWriteResponseOld) ProtoMessage() {} func (*SegmentWriteResponseOld) Descriptor() ([]byte, []int) { - return fileDescriptor_631e2f30a93cd64e, []int{14} + return fileDescriptor_631e2f30a93cd64e, []int{15} } func (m *SegmentWriteResponseOld) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_SegmentWriteResponseOld.Unmarshal(m, b) @@ -794,21 +880,22 @@ func (m *SegmentWriteResponseOld) GetAddressedLimits() []*AddressedOrderLimit { } type SegmentCommitRequestOld struct { - Bucket []byte `protobuf:"bytes,1,opt,name=bucket,proto3" json:"bucket,omitempty"` - Path []byte `protobuf:"bytes,2,opt,name=path,proto3" json:"path,omitempty"` - Segment int64 `protobuf:"varint,3,opt,name=segment,proto3" json:"segment,omitempty"` - Pointer *Pointer `protobuf:"bytes,4,opt,name=pointer,proto3" json:"pointer,omitempty"` - OriginalLimits []*OrderLimit `protobuf:"bytes,5,rep,name=original_limits,json=originalLimits,proto3" json:"original_limits,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + Header *RequestHeader `protobuf:"bytes,15,opt,name=header,proto3" json:"header,omitempty"` + Bucket []byte `protobuf:"bytes,1,opt,name=bucket,proto3" json:"bucket,omitempty"` + Path []byte `protobuf:"bytes,2,opt,name=path,proto3" json:"path,omitempty"` + Segment int64 `protobuf:"varint,3,opt,name=segment,proto3" json:"segment,omitempty"` + Pointer *Pointer `protobuf:"bytes,4,opt,name=pointer,proto3" json:"pointer,omitempty"` + OriginalLimits []*OrderLimit `protobuf:"bytes,5,rep,name=original_limits,json=originalLimits,proto3" json:"original_limits,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` } func (m *SegmentCommitRequestOld) Reset() { *m = SegmentCommitRequestOld{} } func (m *SegmentCommitRequestOld) String() string { return proto.CompactTextString(m) } func (*SegmentCommitRequestOld) ProtoMessage() {} func (*SegmentCommitRequestOld) Descriptor() ([]byte, []int) { - return fileDescriptor_631e2f30a93cd64e, []int{15} + return fileDescriptor_631e2f30a93cd64e, []int{16} } func (m *SegmentCommitRequestOld) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_SegmentCommitRequestOld.Unmarshal(m, b) @@ -828,6 +915,13 @@ func (m *SegmentCommitRequestOld) XXX_DiscardUnknown() { var xxx_messageInfo_SegmentCommitRequestOld proto.InternalMessageInfo +func (m *SegmentCommitRequestOld) GetHeader() *RequestHeader { + if m != nil { + return m.Header + } + return nil +} + func (m *SegmentCommitRequestOld) GetBucket() []byte { if m != nil { return m.Bucket @@ -874,7 +968,7 @@ func (m *SegmentCommitResponseOld) Reset() { *m = SegmentCommitResponseO func (m *SegmentCommitResponseOld) String() string { return proto.CompactTextString(m) } func (*SegmentCommitResponseOld) ProtoMessage() {} func (*SegmentCommitResponseOld) Descriptor() ([]byte, []int) { - return fileDescriptor_631e2f30a93cd64e, []int{16} + return fileDescriptor_631e2f30a93cd64e, []int{17} } func (m *SegmentCommitResponseOld) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_SegmentCommitResponseOld.Unmarshal(m, b) @@ -902,19 +996,20 @@ func (m *SegmentCommitResponseOld) GetPointer() *Pointer { } type SegmentDownloadRequestOld struct { - Bucket []byte `protobuf:"bytes,1,opt,name=bucket,proto3" json:"bucket,omitempty"` - Path []byte `protobuf:"bytes,2,opt,name=path,proto3" json:"path,omitempty"` - Segment int64 `protobuf:"varint,3,opt,name=segment,proto3" json:"segment,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + Header *RequestHeader `protobuf:"bytes,15,opt,name=header,proto3" json:"header,omitempty"` + Bucket []byte `protobuf:"bytes,1,opt,name=bucket,proto3" json:"bucket,omitempty"` + Path []byte `protobuf:"bytes,2,opt,name=path,proto3" json:"path,omitempty"` + Segment int64 `protobuf:"varint,3,opt,name=segment,proto3" json:"segment,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` } func (m *SegmentDownloadRequestOld) Reset() { *m = SegmentDownloadRequestOld{} } func (m *SegmentDownloadRequestOld) String() string { return proto.CompactTextString(m) } func (*SegmentDownloadRequestOld) ProtoMessage() {} func (*SegmentDownloadRequestOld) Descriptor() ([]byte, []int) { - return fileDescriptor_631e2f30a93cd64e, []int{17} + return fileDescriptor_631e2f30a93cd64e, []int{18} } func (m *SegmentDownloadRequestOld) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_SegmentDownloadRequestOld.Unmarshal(m, b) @@ -934,6 +1029,13 @@ func (m *SegmentDownloadRequestOld) XXX_DiscardUnknown() { var xxx_messageInfo_SegmentDownloadRequestOld proto.InternalMessageInfo +func (m *SegmentDownloadRequestOld) GetHeader() *RequestHeader { + if m != nil { + return m.Header + } + return nil +} + func (m *SegmentDownloadRequestOld) GetBucket() []byte { if m != nil { return m.Bucket @@ -968,7 +1070,7 @@ func (m *SegmentDownloadResponseOld) Reset() { *m = SegmentDownloadRespo func (m *SegmentDownloadResponseOld) String() string { return proto.CompactTextString(m) } func (*SegmentDownloadResponseOld) ProtoMessage() {} func (*SegmentDownloadResponseOld) Descriptor() ([]byte, []int) { - return fileDescriptor_631e2f30a93cd64e, []int{18} + return fileDescriptor_631e2f30a93cd64e, []int{19} } func (m *SegmentDownloadResponseOld) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_SegmentDownloadResponseOld.Unmarshal(m, b) @@ -1003,19 +1105,20 @@ func (m *SegmentDownloadResponseOld) GetPointer() *Pointer { } type SegmentInfoRequestOld struct { - Bucket []byte `protobuf:"bytes,1,opt,name=bucket,proto3" json:"bucket,omitempty"` - Path []byte `protobuf:"bytes,2,opt,name=path,proto3" json:"path,omitempty"` - Segment int64 `protobuf:"varint,3,opt,name=segment,proto3" json:"segment,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + Header *RequestHeader `protobuf:"bytes,15,opt,name=header,proto3" json:"header,omitempty"` + Bucket []byte `protobuf:"bytes,1,opt,name=bucket,proto3" json:"bucket,omitempty"` + Path []byte `protobuf:"bytes,2,opt,name=path,proto3" json:"path,omitempty"` + Segment int64 `protobuf:"varint,3,opt,name=segment,proto3" json:"segment,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` } func (m *SegmentInfoRequestOld) Reset() { *m = SegmentInfoRequestOld{} } func (m *SegmentInfoRequestOld) String() string { return proto.CompactTextString(m) } func (*SegmentInfoRequestOld) ProtoMessage() {} func (*SegmentInfoRequestOld) Descriptor() ([]byte, []int) { - return fileDescriptor_631e2f30a93cd64e, []int{19} + return fileDescriptor_631e2f30a93cd64e, []int{20} } func (m *SegmentInfoRequestOld) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_SegmentInfoRequestOld.Unmarshal(m, b) @@ -1035,6 +1138,13 @@ func (m *SegmentInfoRequestOld) XXX_DiscardUnknown() { var xxx_messageInfo_SegmentInfoRequestOld proto.InternalMessageInfo +func (m *SegmentInfoRequestOld) GetHeader() *RequestHeader { + if m != nil { + return m.Header + } + return nil +} + func (m *SegmentInfoRequestOld) GetBucket() []byte { if m != nil { return m.Bucket @@ -1067,7 +1177,7 @@ func (m *SegmentInfoResponseOld) Reset() { *m = SegmentInfoResponseOld{} func (m *SegmentInfoResponseOld) String() string { return proto.CompactTextString(m) } func (*SegmentInfoResponseOld) ProtoMessage() {} func (*SegmentInfoResponseOld) Descriptor() ([]byte, []int) { - return fileDescriptor_631e2f30a93cd64e, []int{20} + return fileDescriptor_631e2f30a93cd64e, []int{21} } func (m *SegmentInfoResponseOld) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_SegmentInfoResponseOld.Unmarshal(m, b) @@ -1095,19 +1205,20 @@ func (m *SegmentInfoResponseOld) GetPointer() *Pointer { } type SegmentDeleteRequestOld struct { - Bucket []byte `protobuf:"bytes,1,opt,name=bucket,proto3" json:"bucket,omitempty"` - Path []byte `protobuf:"bytes,2,opt,name=path,proto3" json:"path,omitempty"` - Segment int64 `protobuf:"varint,3,opt,name=segment,proto3" json:"segment,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + Header *RequestHeader `protobuf:"bytes,15,opt,name=header,proto3" json:"header,omitempty"` + Bucket []byte `protobuf:"bytes,1,opt,name=bucket,proto3" json:"bucket,omitempty"` + Path []byte `protobuf:"bytes,2,opt,name=path,proto3" json:"path,omitempty"` + Segment int64 `protobuf:"varint,3,opt,name=segment,proto3" json:"segment,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` } func (m *SegmentDeleteRequestOld) Reset() { *m = SegmentDeleteRequestOld{} } func (m *SegmentDeleteRequestOld) String() string { return proto.CompactTextString(m) } func (*SegmentDeleteRequestOld) ProtoMessage() {} func (*SegmentDeleteRequestOld) Descriptor() ([]byte, []int) { - return fileDescriptor_631e2f30a93cd64e, []int{21} + return fileDescriptor_631e2f30a93cd64e, []int{22} } func (m *SegmentDeleteRequestOld) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_SegmentDeleteRequestOld.Unmarshal(m, b) @@ -1127,6 +1238,13 @@ func (m *SegmentDeleteRequestOld) XXX_DiscardUnknown() { var xxx_messageInfo_SegmentDeleteRequestOld proto.InternalMessageInfo +func (m *SegmentDeleteRequestOld) GetHeader() *RequestHeader { + if m != nil { + return m.Header + } + return nil +} + func (m *SegmentDeleteRequestOld) GetBucket() []byte { if m != nil { return m.Bucket @@ -1160,7 +1278,7 @@ func (m *SegmentDeleteResponseOld) Reset() { *m = SegmentDeleteResponseO func (m *SegmentDeleteResponseOld) String() string { return proto.CompactTextString(m) } func (*SegmentDeleteResponseOld) ProtoMessage() {} func (*SegmentDeleteResponseOld) Descriptor() ([]byte, []int) { - return fileDescriptor_631e2f30a93cd64e, []int{22} + return fileDescriptor_631e2f30a93cd64e, []int{23} } func (m *SegmentDeleteResponseOld) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_SegmentDeleteResponseOld.Unmarshal(m, b) @@ -1188,23 +1306,24 @@ func (m *SegmentDeleteResponseOld) GetAddressedLimits() []*AddressedOrderLimit { } type ListSegmentsRequestOld struct { - Bucket []byte `protobuf:"bytes,1,opt,name=bucket,proto3" json:"bucket,omitempty"` - Prefix []byte `protobuf:"bytes,2,opt,name=prefix,proto3" json:"prefix,omitempty"` - StartAfter []byte `protobuf:"bytes,3,opt,name=start_after,json=startAfter,proto3" json:"start_after,omitempty"` - EndBefore []byte `protobuf:"bytes,4,opt,name=end_before,json=endBefore,proto3" json:"end_before,omitempty"` - Recursive bool `protobuf:"varint,5,opt,name=recursive,proto3" json:"recursive,omitempty"` - Limit int32 `protobuf:"varint,6,opt,name=limit,proto3" json:"limit,omitempty"` - MetaFlags uint32 `protobuf:"fixed32,7,opt,name=meta_flags,json=metaFlags,proto3" json:"meta_flags,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + Header *RequestHeader `protobuf:"bytes,15,opt,name=header,proto3" json:"header,omitempty"` + Bucket []byte `protobuf:"bytes,1,opt,name=bucket,proto3" json:"bucket,omitempty"` + Prefix []byte `protobuf:"bytes,2,opt,name=prefix,proto3" json:"prefix,omitempty"` + StartAfter []byte `protobuf:"bytes,3,opt,name=start_after,json=startAfter,proto3" json:"start_after,omitempty"` + EndBefore []byte `protobuf:"bytes,4,opt,name=end_before,json=endBefore,proto3" json:"end_before,omitempty"` + Recursive bool `protobuf:"varint,5,opt,name=recursive,proto3" json:"recursive,omitempty"` + Limit int32 `protobuf:"varint,6,opt,name=limit,proto3" json:"limit,omitempty"` + MetaFlags uint32 `protobuf:"fixed32,7,opt,name=meta_flags,json=metaFlags,proto3" json:"meta_flags,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` } func (m *ListSegmentsRequestOld) Reset() { *m = ListSegmentsRequestOld{} } func (m *ListSegmentsRequestOld) String() string { return proto.CompactTextString(m) } func (*ListSegmentsRequestOld) ProtoMessage() {} func (*ListSegmentsRequestOld) Descriptor() ([]byte, []int) { - return fileDescriptor_631e2f30a93cd64e, []int{23} + return fileDescriptor_631e2f30a93cd64e, []int{24} } func (m *ListSegmentsRequestOld) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_ListSegmentsRequestOld.Unmarshal(m, b) @@ -1224,6 +1343,13 @@ func (m *ListSegmentsRequestOld) XXX_DiscardUnknown() { var xxx_messageInfo_ListSegmentsRequestOld proto.InternalMessageInfo +func (m *ListSegmentsRequestOld) GetHeader() *RequestHeader { + if m != nil { + return m.Header + } + return nil +} + func (m *ListSegmentsRequestOld) GetBucket() []byte { if m != nil { return m.Bucket @@ -1285,7 +1411,7 @@ func (m *ListSegmentsResponseOld) Reset() { *m = ListSegmentsResponseOld func (m *ListSegmentsResponseOld) String() string { return proto.CompactTextString(m) } func (*ListSegmentsResponseOld) ProtoMessage() {} func (*ListSegmentsResponseOld) Descriptor() ([]byte, []int) { - return fileDescriptor_631e2f30a93cd64e, []int{24} + return fileDescriptor_631e2f30a93cd64e, []int{25} } func (m *ListSegmentsResponseOld) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_ListSegmentsResponseOld.Unmarshal(m, b) @@ -1332,7 +1458,7 @@ func (m *ListSegmentsResponseOld_Item) Reset() { *m = ListSegmentsRespon func (m *ListSegmentsResponseOld_Item) String() string { return proto.CompactTextString(m) } func (*ListSegmentsResponseOld_Item) ProtoMessage() {} func (*ListSegmentsResponseOld_Item) Descriptor() ([]byte, []int) { - return fileDescriptor_631e2f30a93cd64e, []int{24, 0} + return fileDescriptor_631e2f30a93cd64e, []int{25, 0} } func (m *ListSegmentsResponseOld_Item) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_ListSegmentsResponseOld_Item.Unmarshal(m, b) @@ -1374,18 +1500,19 @@ func (m *ListSegmentsResponseOld_Item) GetIsPrefix() bool { } type SetAttributionRequestOld struct { - BucketName []byte `protobuf:"bytes,1,opt,name=bucket_name,json=bucketName,proto3" json:"bucket_name,omitempty"` - PartnerId []byte `protobuf:"bytes,2,opt,name=partner_id,json=partnerId,proto3" json:"partner_id,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + Header *RequestHeader `protobuf:"bytes,15,opt,name=header,proto3" json:"header,omitempty"` + BucketName []byte `protobuf:"bytes,1,opt,name=bucket_name,json=bucketName,proto3" json:"bucket_name,omitempty"` + PartnerId []byte `protobuf:"bytes,2,opt,name=partner_id,json=partnerId,proto3" json:"partner_id,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` } func (m *SetAttributionRequestOld) Reset() { *m = SetAttributionRequestOld{} } func (m *SetAttributionRequestOld) String() string { return proto.CompactTextString(m) } func (*SetAttributionRequestOld) ProtoMessage() {} func (*SetAttributionRequestOld) Descriptor() ([]byte, []int) { - return fileDescriptor_631e2f30a93cd64e, []int{25} + return fileDescriptor_631e2f30a93cd64e, []int{26} } func (m *SetAttributionRequestOld) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_SetAttributionRequestOld.Unmarshal(m, b) @@ -1405,6 +1532,13 @@ func (m *SetAttributionRequestOld) XXX_DiscardUnknown() { var xxx_messageInfo_SetAttributionRequestOld proto.InternalMessageInfo +func (m *SetAttributionRequestOld) GetHeader() *RequestHeader { + if m != nil { + return m.Header + } + return nil +} + func (m *SetAttributionRequestOld) GetBucketName() []byte { if m != nil { return m.BucketName @@ -1429,7 +1563,7 @@ func (m *SetAttributionResponseOld) Reset() { *m = SetAttributionRespons func (m *SetAttributionResponseOld) String() string { return proto.CompactTextString(m) } func (*SetAttributionResponseOld) ProtoMessage() {} func (*SetAttributionResponseOld) Descriptor() ([]byte, []int) { - return fileDescriptor_631e2f30a93cd64e, []int{26} + return fileDescriptor_631e2f30a93cd64e, []int{27} } func (m *SetAttributionResponseOld) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_SetAttributionResponseOld.Unmarshal(m, b) @@ -1450,16 +1584,17 @@ func (m *SetAttributionResponseOld) XXX_DiscardUnknown() { var xxx_messageInfo_SetAttributionResponseOld proto.InternalMessageInfo type ProjectInfoRequest struct { - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + Header *RequestHeader `protobuf:"bytes,15,opt,name=header,proto3" json:"header,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` } func (m *ProjectInfoRequest) Reset() { *m = ProjectInfoRequest{} } func (m *ProjectInfoRequest) String() string { return proto.CompactTextString(m) } func (*ProjectInfoRequest) ProtoMessage() {} func (*ProjectInfoRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_631e2f30a93cd64e, []int{27} + return fileDescriptor_631e2f30a93cd64e, []int{28} } func (m *ProjectInfoRequest) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_ProjectInfoRequest.Unmarshal(m, b) @@ -1479,6 +1614,13 @@ func (m *ProjectInfoRequest) XXX_DiscardUnknown() { var xxx_messageInfo_ProjectInfoRequest proto.InternalMessageInfo +func (m *ProjectInfoRequest) GetHeader() *RequestHeader { + if m != nil { + return m.Header + } + return nil +} + type ProjectInfoResponse struct { ProjectSalt []byte `protobuf:"bytes,1,opt,name=project_salt,json=projectSalt,proto3" json:"project_salt,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` @@ -1490,7 +1632,7 @@ func (m *ProjectInfoResponse) Reset() { *m = ProjectInfoResponse{} } func (m *ProjectInfoResponse) String() string { return proto.CompactTextString(m) } func (*ProjectInfoResponse) ProtoMessage() {} func (*ProjectInfoResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_631e2f30a93cd64e, []int{28} + return fileDescriptor_631e2f30a93cd64e, []int{29} } func (m *ProjectInfoResponse) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_ProjectInfoResponse.Unmarshal(m, b) @@ -1543,7 +1685,7 @@ func (m *Object) Reset() { *m = Object{} } func (m *Object) String() string { return proto.CompactTextString(m) } func (*Object) ProtoMessage() {} func (*Object) Descriptor() ([]byte, []int) { - return fileDescriptor_631e2f30a93cd64e, []int{29} + return fileDescriptor_631e2f30a93cd64e, []int{30} } func (m *Object) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_Object.Unmarshal(m, b) @@ -1662,6 +1804,7 @@ func (m *Object) GetRemoteSize() int64 { } type ObjectBeginRequest struct { + Header *RequestHeader `protobuf:"bytes,15,opt,name=header,proto3" json:"header,omitempty"` Bucket []byte `protobuf:"bytes,1,opt,name=bucket,proto3" json:"bucket,omitempty"` EncryptedPath []byte `protobuf:"bytes,2,opt,name=encrypted_path,json=encryptedPath,proto3" json:"encrypted_path,omitempty"` Version int32 `protobuf:"varint,3,opt,name=version,proto3" json:"version,omitempty"` @@ -1677,7 +1820,7 @@ func (m *ObjectBeginRequest) Reset() { *m = ObjectBeginRequest{} } func (m *ObjectBeginRequest) String() string { return proto.CompactTextString(m) } func (*ObjectBeginRequest) ProtoMessage() {} func (*ObjectBeginRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_631e2f30a93cd64e, []int{30} + return fileDescriptor_631e2f30a93cd64e, []int{31} } func (m *ObjectBeginRequest) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_ObjectBeginRequest.Unmarshal(m, b) @@ -1697,6 +1840,13 @@ func (m *ObjectBeginRequest) XXX_DiscardUnknown() { var xxx_messageInfo_ObjectBeginRequest proto.InternalMessageInfo +func (m *ObjectBeginRequest) GetHeader() *RequestHeader { + if m != nil { + return m.Header + } + return nil +} + func (m *ObjectBeginRequest) GetBucket() []byte { if m != nil { return m.Bucket @@ -1755,7 +1905,7 @@ func (m *ObjectBeginResponse) Reset() { *m = ObjectBeginResponse{} } func (m *ObjectBeginResponse) String() string { return proto.CompactTextString(m) } func (*ObjectBeginResponse) ProtoMessage() {} func (*ObjectBeginResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_631e2f30a93cd64e, []int{31} + return fileDescriptor_631e2f30a93cd64e, []int{32} } func (m *ObjectBeginResponse) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_ObjectBeginResponse.Unmarshal(m, b) @@ -1811,19 +1961,20 @@ func (m *ObjectBeginResponse) GetEncryptionParameters() *EncryptionParameters { } type ObjectCommitRequest struct { - StreamId StreamID `protobuf:"bytes,1,opt,name=stream_id,json=streamId,proto3,customtype=StreamID" json:"stream_id"` - EncryptedMetadataNonce Nonce `protobuf:"bytes,2,opt,name=encrypted_metadata_nonce,json=encryptedMetadataNonce,proto3,customtype=Nonce" json:"encrypted_metadata_nonce"` - EncryptedMetadata []byte `protobuf:"bytes,3,opt,name=encrypted_metadata,json=encryptedMetadata,proto3" json:"encrypted_metadata,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + Header *RequestHeader `protobuf:"bytes,15,opt,name=header,proto3" json:"header,omitempty"` + StreamId StreamID `protobuf:"bytes,1,opt,name=stream_id,json=streamId,proto3,customtype=StreamID" json:"stream_id"` + EncryptedMetadataNonce Nonce `protobuf:"bytes,2,opt,name=encrypted_metadata_nonce,json=encryptedMetadataNonce,proto3,customtype=Nonce" json:"encrypted_metadata_nonce"` + EncryptedMetadata []byte `protobuf:"bytes,3,opt,name=encrypted_metadata,json=encryptedMetadata,proto3" json:"encrypted_metadata,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` } func (m *ObjectCommitRequest) Reset() { *m = ObjectCommitRequest{} } func (m *ObjectCommitRequest) String() string { return proto.CompactTextString(m) } func (*ObjectCommitRequest) ProtoMessage() {} func (*ObjectCommitRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_631e2f30a93cd64e, []int{32} + return fileDescriptor_631e2f30a93cd64e, []int{33} } func (m *ObjectCommitRequest) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_ObjectCommitRequest.Unmarshal(m, b) @@ -1843,6 +1994,13 @@ func (m *ObjectCommitRequest) XXX_DiscardUnknown() { var xxx_messageInfo_ObjectCommitRequest proto.InternalMessageInfo +func (m *ObjectCommitRequest) GetHeader() *RequestHeader { + if m != nil { + return m.Header + } + return nil +} + func (m *ObjectCommitRequest) GetEncryptedMetadata() []byte { if m != nil { return m.EncryptedMetadata @@ -1860,7 +2018,7 @@ func (m *ObjectCommitResponse) Reset() { *m = ObjectCommitResponse{} } func (m *ObjectCommitResponse) String() string { return proto.CompactTextString(m) } func (*ObjectCommitResponse) ProtoMessage() {} func (*ObjectCommitResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_631e2f30a93cd64e, []int{33} + return fileDescriptor_631e2f30a93cd64e, []int{34} } func (m *ObjectCommitResponse) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_ObjectCommitResponse.Unmarshal(m, b) @@ -1881,19 +2039,20 @@ func (m *ObjectCommitResponse) XXX_DiscardUnknown() { var xxx_messageInfo_ObjectCommitResponse proto.InternalMessageInfo type ObjectGetRequest struct { - Bucket []byte `protobuf:"bytes,1,opt,name=bucket,proto3" json:"bucket,omitempty"` - EncryptedPath []byte `protobuf:"bytes,2,opt,name=encrypted_path,json=encryptedPath,proto3" json:"encrypted_path,omitempty"` - Version int32 `protobuf:"varint,3,opt,name=version,proto3" json:"version,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + Header *RequestHeader `protobuf:"bytes,15,opt,name=header,proto3" json:"header,omitempty"` + Bucket []byte `protobuf:"bytes,1,opt,name=bucket,proto3" json:"bucket,omitempty"` + EncryptedPath []byte `protobuf:"bytes,2,opt,name=encrypted_path,json=encryptedPath,proto3" json:"encrypted_path,omitempty"` + Version int32 `protobuf:"varint,3,opt,name=version,proto3" json:"version,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` } func (m *ObjectGetRequest) Reset() { *m = ObjectGetRequest{} } func (m *ObjectGetRequest) String() string { return proto.CompactTextString(m) } func (*ObjectGetRequest) ProtoMessage() {} func (*ObjectGetRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_631e2f30a93cd64e, []int{34} + return fileDescriptor_631e2f30a93cd64e, []int{35} } func (m *ObjectGetRequest) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_ObjectGetRequest.Unmarshal(m, b) @@ -1913,6 +2072,13 @@ func (m *ObjectGetRequest) XXX_DiscardUnknown() { var xxx_messageInfo_ObjectGetRequest proto.InternalMessageInfo +func (m *ObjectGetRequest) GetHeader() *RequestHeader { + if m != nil { + return m.Header + } + return nil +} + func (m *ObjectGetRequest) GetBucket() []byte { if m != nil { return m.Bucket @@ -1945,7 +2111,7 @@ func (m *ObjectGetResponse) Reset() { *m = ObjectGetResponse{} } func (m *ObjectGetResponse) String() string { return proto.CompactTextString(m) } func (*ObjectGetResponse) ProtoMessage() {} func (*ObjectGetResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_631e2f30a93cd64e, []int{35} + return fileDescriptor_631e2f30a93cd64e, []int{36} } func (m *ObjectGetResponse) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_ObjectGetResponse.Unmarshal(m, b) @@ -1973,6 +2139,7 @@ func (m *ObjectGetResponse) GetObject() *Object { } type ObjectListRequest struct { + Header *RequestHeader `protobuf:"bytes,15,opt,name=header,proto3" json:"header,omitempty"` Bucket []byte `protobuf:"bytes,1,opt,name=bucket,proto3" json:"bucket,omitempty"` EncryptedPrefix []byte `protobuf:"bytes,2,opt,name=encrypted_prefix,json=encryptedPrefix,proto3" json:"encrypted_prefix,omitempty"` EncryptedCursor []byte `protobuf:"bytes,3,opt,name=encrypted_cursor,json=encryptedCursor,proto3" json:"encrypted_cursor,omitempty"` @@ -1988,7 +2155,7 @@ func (m *ObjectListRequest) Reset() { *m = ObjectListRequest{} } func (m *ObjectListRequest) String() string { return proto.CompactTextString(m) } func (*ObjectListRequest) ProtoMessage() {} func (*ObjectListRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_631e2f30a93cd64e, []int{36} + return fileDescriptor_631e2f30a93cd64e, []int{37} } func (m *ObjectListRequest) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_ObjectListRequest.Unmarshal(m, b) @@ -2008,6 +2175,13 @@ func (m *ObjectListRequest) XXX_DiscardUnknown() { var xxx_messageInfo_ObjectListRequest proto.InternalMessageInfo +func (m *ObjectListRequest) GetHeader() *RequestHeader { + if m != nil { + return m.Header + } + return nil +} + func (m *ObjectListRequest) GetBucket() []byte { if m != nil { return m.Bucket @@ -2062,7 +2236,7 @@ func (m *ObjectListResponse) Reset() { *m = ObjectListResponse{} } func (m *ObjectListResponse) String() string { return proto.CompactTextString(m) } func (*ObjectListResponse) ProtoMessage() {} func (*ObjectListResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_631e2f30a93cd64e, []int{37} + return fileDescriptor_631e2f30a93cd64e, []int{38} } func (m *ObjectListResponse) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_ObjectListResponse.Unmarshal(m, b) @@ -2114,7 +2288,7 @@ func (m *ObjectListItem) Reset() { *m = ObjectListItem{} } func (m *ObjectListItem) String() string { return proto.CompactTextString(m) } func (*ObjectListItem) ProtoMessage() {} func (*ObjectListItem) Descriptor() ([]byte, []int) { - return fileDescriptor_631e2f30a93cd64e, []int{38} + return fileDescriptor_631e2f30a93cd64e, []int{39} } func (m *ObjectListItem) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_ObjectListItem.Unmarshal(m, b) @@ -2194,7 +2368,7 @@ func (m *ObjectListItemIncludes) Reset() { *m = ObjectListItemIncludes{} func (m *ObjectListItemIncludes) String() string { return proto.CompactTextString(m) } func (*ObjectListItemIncludes) ProtoMessage() {} func (*ObjectListItemIncludes) Descriptor() ([]byte, []int) { - return fileDescriptor_631e2f30a93cd64e, []int{39} + return fileDescriptor_631e2f30a93cd64e, []int{40} } func (m *ObjectListItemIncludes) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_ObjectListItemIncludes.Unmarshal(m, b) @@ -2222,19 +2396,20 @@ func (m *ObjectListItemIncludes) GetMetadata() bool { } type ObjectBeginDeleteRequest struct { - Bucket []byte `protobuf:"bytes,1,opt,name=bucket,proto3" json:"bucket,omitempty"` - EncryptedPath []byte `protobuf:"bytes,2,opt,name=encrypted_path,json=encryptedPath,proto3" json:"encrypted_path,omitempty"` - Version int32 `protobuf:"varint,3,opt,name=version,proto3" json:"version,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + Header *RequestHeader `protobuf:"bytes,15,opt,name=header,proto3" json:"header,omitempty"` + Bucket []byte `protobuf:"bytes,1,opt,name=bucket,proto3" json:"bucket,omitempty"` + EncryptedPath []byte `protobuf:"bytes,2,opt,name=encrypted_path,json=encryptedPath,proto3" json:"encrypted_path,omitempty"` + Version int32 `protobuf:"varint,3,opt,name=version,proto3" json:"version,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` } func (m *ObjectBeginDeleteRequest) Reset() { *m = ObjectBeginDeleteRequest{} } func (m *ObjectBeginDeleteRequest) String() string { return proto.CompactTextString(m) } func (*ObjectBeginDeleteRequest) ProtoMessage() {} func (*ObjectBeginDeleteRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_631e2f30a93cd64e, []int{40} + return fileDescriptor_631e2f30a93cd64e, []int{41} } func (m *ObjectBeginDeleteRequest) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_ObjectBeginDeleteRequest.Unmarshal(m, b) @@ -2254,6 +2429,13 @@ func (m *ObjectBeginDeleteRequest) XXX_DiscardUnknown() { var xxx_messageInfo_ObjectBeginDeleteRequest proto.InternalMessageInfo +func (m *ObjectBeginDeleteRequest) GetHeader() *RequestHeader { + if m != nil { + return m.Header + } + return nil +} + func (m *ObjectBeginDeleteRequest) GetBucket() []byte { if m != nil { return m.Bucket @@ -2286,7 +2468,7 @@ func (m *ObjectBeginDeleteResponse) Reset() { *m = ObjectBeginDeleteResp func (m *ObjectBeginDeleteResponse) String() string { return proto.CompactTextString(m) } func (*ObjectBeginDeleteResponse) ProtoMessage() {} func (*ObjectBeginDeleteResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_631e2f30a93cd64e, []int{41} + return fileDescriptor_631e2f30a93cd64e, []int{42} } func (m *ObjectBeginDeleteResponse) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_ObjectBeginDeleteResponse.Unmarshal(m, b) @@ -2307,17 +2489,18 @@ func (m *ObjectBeginDeleteResponse) XXX_DiscardUnknown() { var xxx_messageInfo_ObjectBeginDeleteResponse proto.InternalMessageInfo type ObjectFinishDeleteRequest struct { - StreamId StreamID `protobuf:"bytes,1,opt,name=stream_id,json=streamId,proto3,customtype=StreamID" json:"stream_id"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + Header *RequestHeader `protobuf:"bytes,15,opt,name=header,proto3" json:"header,omitempty"` + StreamId StreamID `protobuf:"bytes,1,opt,name=stream_id,json=streamId,proto3,customtype=StreamID" json:"stream_id"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` } func (m *ObjectFinishDeleteRequest) Reset() { *m = ObjectFinishDeleteRequest{} } func (m *ObjectFinishDeleteRequest) String() string { return proto.CompactTextString(m) } func (*ObjectFinishDeleteRequest) ProtoMessage() {} func (*ObjectFinishDeleteRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_631e2f30a93cd64e, []int{42} + return fileDescriptor_631e2f30a93cd64e, []int{43} } func (m *ObjectFinishDeleteRequest) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_ObjectFinishDeleteRequest.Unmarshal(m, b) @@ -2337,6 +2520,13 @@ func (m *ObjectFinishDeleteRequest) XXX_DiscardUnknown() { var xxx_messageInfo_ObjectFinishDeleteRequest proto.InternalMessageInfo +func (m *ObjectFinishDeleteRequest) GetHeader() *RequestHeader { + if m != nil { + return m.Header + } + return nil +} + type ObjectFinishDeleteResponse struct { XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` @@ -2347,7 +2537,7 @@ func (m *ObjectFinishDeleteResponse) Reset() { *m = ObjectFinishDeleteRe func (m *ObjectFinishDeleteResponse) String() string { return proto.CompactTextString(m) } func (*ObjectFinishDeleteResponse) ProtoMessage() {} func (*ObjectFinishDeleteResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_631e2f30a93cd64e, []int{43} + return fileDescriptor_631e2f30a93cd64e, []int{44} } func (m *ObjectFinishDeleteResponse) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_ObjectFinishDeleteResponse.Unmarshal(m, b) @@ -2385,7 +2575,7 @@ func (m *SatStreamID) Reset() { *m = SatStreamID{} } func (m *SatStreamID) String() string { return proto.CompactTextString(m) } func (*SatStreamID) ProtoMessage() {} func (*SatStreamID) Descriptor() ([]byte, []int) { - return fileDescriptor_631e2f30a93cd64e, []int{44} + return fileDescriptor_631e2f30a93cd64e, []int{45} } func (m *SatStreamID) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_SatStreamID.Unmarshal(m, b) @@ -2471,7 +2661,7 @@ func (m *Segment) Reset() { *m = Segment{} } func (m *Segment) String() string { return proto.CompactTextString(m) } func (*Segment) ProtoMessage() {} func (*Segment) Descriptor() ([]byte, []int) { - return fileDescriptor_631e2f30a93cd64e, []int{45} + return fileDescriptor_631e2f30a93cd64e, []int{46} } func (m *Segment) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_Segment.Unmarshal(m, b) @@ -2538,7 +2728,7 @@ func (m *Piece) Reset() { *m = Piece{} } func (m *Piece) String() string { return proto.CompactTextString(m) } func (*Piece) ProtoMessage() {} func (*Piece) Descriptor() ([]byte, []int) { - return fileDescriptor_631e2f30a93cd64e, []int{46} + return fileDescriptor_631e2f30a93cd64e, []int{47} } func (m *Piece) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_Piece.Unmarshal(m, b) @@ -2577,7 +2767,7 @@ func (m *SegmentPosition) Reset() { *m = SegmentPosition{} } func (m *SegmentPosition) String() string { return proto.CompactTextString(m) } func (*SegmentPosition) ProtoMessage() {} func (*SegmentPosition) Descriptor() ([]byte, []int) { - return fileDescriptor_631e2f30a93cd64e, []int{47} + return fileDescriptor_631e2f30a93cd64e, []int{48} } func (m *SegmentPosition) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_SegmentPosition.Unmarshal(m, b) @@ -2612,6 +2802,7 @@ func (m *SegmentPosition) GetIndex() int32 { } type SegmentBeginRequest struct { + Header *RequestHeader `protobuf:"bytes,15,opt,name=header,proto3" json:"header,omitempty"` StreamId StreamID `protobuf:"bytes,1,opt,name=stream_id,json=streamId,proto3,customtype=StreamID" json:"stream_id"` Position *SegmentPosition `protobuf:"bytes,2,opt,name=position,proto3" json:"position,omitempty"` MaxOrderLimit int64 `protobuf:"varint,3,opt,name=max_order_limit,json=maxOrderLimit,proto3" json:"max_order_limit,omitempty"` @@ -2624,7 +2815,7 @@ func (m *SegmentBeginRequest) Reset() { *m = SegmentBeginRequest{} } func (m *SegmentBeginRequest) String() string { return proto.CompactTextString(m) } func (*SegmentBeginRequest) ProtoMessage() {} func (*SegmentBeginRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_631e2f30a93cd64e, []int{48} + return fileDescriptor_631e2f30a93cd64e, []int{49} } func (m *SegmentBeginRequest) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_SegmentBeginRequest.Unmarshal(m, b) @@ -2644,6 +2835,13 @@ func (m *SegmentBeginRequest) XXX_DiscardUnknown() { var xxx_messageInfo_SegmentBeginRequest proto.InternalMessageInfo +func (m *SegmentBeginRequest) GetHeader() *RequestHeader { + if m != nil { + return m.Header + } + return nil +} + func (m *SegmentBeginRequest) GetPosition() *SegmentPosition { if m != nil { return m.Position @@ -2671,7 +2869,7 @@ func (m *SegmentBeginResponse) Reset() { *m = SegmentBeginResponse{} } func (m *SegmentBeginResponse) String() string { return proto.CompactTextString(m) } func (*SegmentBeginResponse) ProtoMessage() {} func (*SegmentBeginResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_631e2f30a93cd64e, []int{49} + return fileDescriptor_631e2f30a93cd64e, []int{50} } func (m *SegmentBeginResponse) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_SegmentBeginResponse.Unmarshal(m, b) @@ -2699,6 +2897,7 @@ func (m *SegmentBeginResponse) GetAddressedLimits() []*AddressedOrderLimit { } type SegmentCommitRequest struct { + Header *RequestHeader `protobuf:"bytes,15,opt,name=header,proto3" json:"header,omitempty"` SegmentId SegmentID `protobuf:"bytes,1,opt,name=segment_id,json=segmentId,proto3,customtype=SegmentID" json:"segment_id"` EncryptedKeyNonce Nonce `protobuf:"bytes,2,opt,name=encrypted_key_nonce,json=encryptedKeyNonce,proto3,customtype=Nonce" json:"encrypted_key_nonce"` EncryptedKey []byte `protobuf:"bytes,3,opt,name=encrypted_key,json=encryptedKey,proto3" json:"encrypted_key,omitempty"` @@ -2713,7 +2912,7 @@ func (m *SegmentCommitRequest) Reset() { *m = SegmentCommitRequest{} } func (m *SegmentCommitRequest) String() string { return proto.CompactTextString(m) } func (*SegmentCommitRequest) ProtoMessage() {} func (*SegmentCommitRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_631e2f30a93cd64e, []int{50} + return fileDescriptor_631e2f30a93cd64e, []int{51} } func (m *SegmentCommitRequest) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_SegmentCommitRequest.Unmarshal(m, b) @@ -2733,6 +2932,13 @@ func (m *SegmentCommitRequest) XXX_DiscardUnknown() { var xxx_messageInfo_SegmentCommitRequest proto.InternalMessageInfo +func (m *SegmentCommitRequest) GetHeader() *RequestHeader { + if m != nil { + return m.Header + } + return nil +} + func (m *SegmentCommitRequest) GetEncryptedKey() []byte { if m != nil { return m.EncryptedKey @@ -2767,7 +2973,7 @@ func (m *SegmentPieceUploadResult) Reset() { *m = SegmentPieceUploadResu func (m *SegmentPieceUploadResult) String() string { return proto.CompactTextString(m) } func (*SegmentPieceUploadResult) ProtoMessage() {} func (*SegmentPieceUploadResult) Descriptor() ([]byte, []int) { - return fileDescriptor_631e2f30a93cd64e, []int{51} + return fileDescriptor_631e2f30a93cd64e, []int{52} } func (m *SegmentPieceUploadResult) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_SegmentPieceUploadResult.Unmarshal(m, b) @@ -2821,7 +3027,7 @@ func (m *SatSegmentID) Reset() { *m = SatSegmentID{} } func (m *SatSegmentID) String() string { return proto.CompactTextString(m) } func (*SatSegmentID) ProtoMessage() {} func (*SatSegmentID) Descriptor() ([]byte, []int) { - return fileDescriptor_631e2f30a93cd64e, []int{52} + return fileDescriptor_631e2f30a93cd64e, []int{53} } func (m *SatSegmentID) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_SatSegmentID.Unmarshal(m, b) @@ -2894,7 +3100,7 @@ func (m *SegmentCommitResponse) Reset() { *m = SegmentCommitResponse{} } func (m *SegmentCommitResponse) String() string { return proto.CompactTextString(m) } func (*SegmentCommitResponse) ProtoMessage() {} func (*SegmentCommitResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_631e2f30a93cd64e, []int{53} + return fileDescriptor_631e2f30a93cd64e, []int{54} } func (m *SegmentCommitResponse) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_SegmentCommitResponse.Unmarshal(m, b) @@ -2922,6 +3128,7 @@ func (m *SegmentCommitResponse) GetSuccessfulPieces() int32 { } type SegmentMakeInlineRequest struct { + Header *RequestHeader `protobuf:"bytes,15,opt,name=header,proto3" json:"header,omitempty"` StreamId StreamID `protobuf:"bytes,1,opt,name=stream_id,json=streamId,proto3,customtype=StreamID" json:"stream_id"` Position *SegmentPosition `protobuf:"bytes,2,opt,name=position,proto3" json:"position,omitempty"` EncryptedKeyNonce Nonce `protobuf:"bytes,3,opt,name=encrypted_key_nonce,json=encryptedKeyNonce,proto3,customtype=Nonce" json:"encrypted_key_nonce"` @@ -2936,7 +3143,7 @@ func (m *SegmentMakeInlineRequest) Reset() { *m = SegmentMakeInlineReque func (m *SegmentMakeInlineRequest) String() string { return proto.CompactTextString(m) } func (*SegmentMakeInlineRequest) ProtoMessage() {} func (*SegmentMakeInlineRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_631e2f30a93cd64e, []int{54} + return fileDescriptor_631e2f30a93cd64e, []int{55} } func (m *SegmentMakeInlineRequest) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_SegmentMakeInlineRequest.Unmarshal(m, b) @@ -2956,6 +3163,13 @@ func (m *SegmentMakeInlineRequest) XXX_DiscardUnknown() { var xxx_messageInfo_SegmentMakeInlineRequest proto.InternalMessageInfo +func (m *SegmentMakeInlineRequest) GetHeader() *RequestHeader { + if m != nil { + return m.Header + } + return nil +} + func (m *SegmentMakeInlineRequest) GetPosition() *SegmentPosition { if m != nil { return m.Position @@ -2987,7 +3201,7 @@ func (m *SegmentMakeInlineResponse) Reset() { *m = SegmentMakeInlineResp func (m *SegmentMakeInlineResponse) String() string { return proto.CompactTextString(m) } func (*SegmentMakeInlineResponse) ProtoMessage() {} func (*SegmentMakeInlineResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_631e2f30a93cd64e, []int{55} + return fileDescriptor_631e2f30a93cd64e, []int{56} } func (m *SegmentMakeInlineResponse) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_SegmentMakeInlineResponse.Unmarshal(m, b) @@ -3008,6 +3222,7 @@ func (m *SegmentMakeInlineResponse) XXX_DiscardUnknown() { var xxx_messageInfo_SegmentMakeInlineResponse proto.InternalMessageInfo type SegmentBeginDeleteRequest struct { + Header *RequestHeader `protobuf:"bytes,15,opt,name=header,proto3" json:"header,omitempty"` StreamId []byte `protobuf:"bytes,1,opt,name=stream_id,json=streamId,proto3" json:"stream_id,omitempty"` Position *SegmentPosition `protobuf:"bytes,2,opt,name=position,proto3" json:"position,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` @@ -3019,7 +3234,7 @@ func (m *SegmentBeginDeleteRequest) Reset() { *m = SegmentBeginDeleteReq func (m *SegmentBeginDeleteRequest) String() string { return proto.CompactTextString(m) } func (*SegmentBeginDeleteRequest) ProtoMessage() {} func (*SegmentBeginDeleteRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_631e2f30a93cd64e, []int{56} + return fileDescriptor_631e2f30a93cd64e, []int{57} } func (m *SegmentBeginDeleteRequest) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_SegmentBeginDeleteRequest.Unmarshal(m, b) @@ -3039,6 +3254,13 @@ func (m *SegmentBeginDeleteRequest) XXX_DiscardUnknown() { var xxx_messageInfo_SegmentBeginDeleteRequest proto.InternalMessageInfo +func (m *SegmentBeginDeleteRequest) GetHeader() *RequestHeader { + if m != nil { + return m.Header + } + return nil +} + func (m *SegmentBeginDeleteRequest) GetStreamId() []byte { if m != nil { return m.StreamId @@ -3066,7 +3288,7 @@ func (m *SegmentBeginDeleteResponse) Reset() { *m = SegmentBeginDeleteRe func (m *SegmentBeginDeleteResponse) String() string { return proto.CompactTextString(m) } func (*SegmentBeginDeleteResponse) ProtoMessage() {} func (*SegmentBeginDeleteResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_631e2f30a93cd64e, []int{57} + return fileDescriptor_631e2f30a93cd64e, []int{58} } func (m *SegmentBeginDeleteResponse) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_SegmentBeginDeleteResponse.Unmarshal(m, b) @@ -3094,6 +3316,7 @@ func (m *SegmentBeginDeleteResponse) GetAddressedLimits() []*AddressedOrderLimit } type SegmentFinishDeleteRequest struct { + Header *RequestHeader `protobuf:"bytes,15,opt,name=header,proto3" json:"header,omitempty"` SegmentId SegmentID `protobuf:"bytes,1,opt,name=segment_id,json=segmentId,proto3,customtype=SegmentID" json:"segment_id"` Results []*SegmentPieceDeleteResult `protobuf:"bytes,2,rep,name=results,proto3" json:"results,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` @@ -3105,7 +3328,7 @@ func (m *SegmentFinishDeleteRequest) Reset() { *m = SegmentFinishDeleteR func (m *SegmentFinishDeleteRequest) String() string { return proto.CompactTextString(m) } func (*SegmentFinishDeleteRequest) ProtoMessage() {} func (*SegmentFinishDeleteRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_631e2f30a93cd64e, []int{58} + return fileDescriptor_631e2f30a93cd64e, []int{59} } func (m *SegmentFinishDeleteRequest) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_SegmentFinishDeleteRequest.Unmarshal(m, b) @@ -3125,6 +3348,13 @@ func (m *SegmentFinishDeleteRequest) XXX_DiscardUnknown() { var xxx_messageInfo_SegmentFinishDeleteRequest proto.InternalMessageInfo +func (m *SegmentFinishDeleteRequest) GetHeader() *RequestHeader { + if m != nil { + return m.Header + } + return nil +} + func (m *SegmentFinishDeleteRequest) GetResults() []*SegmentPieceDeleteResult { if m != nil { return m.Results @@ -3145,7 +3375,7 @@ func (m *SegmentPieceDeleteResult) Reset() { *m = SegmentPieceDeleteResu func (m *SegmentPieceDeleteResult) String() string { return proto.CompactTextString(m) } func (*SegmentPieceDeleteResult) ProtoMessage() {} func (*SegmentPieceDeleteResult) Descriptor() ([]byte, []int) { - return fileDescriptor_631e2f30a93cd64e, []int{59} + return fileDescriptor_631e2f30a93cd64e, []int{60} } func (m *SegmentPieceDeleteResult) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_SegmentPieceDeleteResult.Unmarshal(m, b) @@ -3189,7 +3419,7 @@ func (m *SegmentFinishDeleteResponse) Reset() { *m = SegmentFinishDelete func (m *SegmentFinishDeleteResponse) String() string { return proto.CompactTextString(m) } func (*SegmentFinishDeleteResponse) ProtoMessage() {} func (*SegmentFinishDeleteResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_631e2f30a93cd64e, []int{60} + return fileDescriptor_631e2f30a93cd64e, []int{61} } func (m *SegmentFinishDeleteResponse) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_SegmentFinishDeleteResponse.Unmarshal(m, b) @@ -3210,6 +3440,7 @@ func (m *SegmentFinishDeleteResponse) XXX_DiscardUnknown() { var xxx_messageInfo_SegmentFinishDeleteResponse proto.InternalMessageInfo type SegmentListRequest struct { + Header *RequestHeader `protobuf:"bytes,15,opt,name=header,proto3" json:"header,omitempty"` StreamId []byte `protobuf:"bytes,1,opt,name=stream_id,json=streamId,proto3" json:"stream_id,omitempty"` CursorPosition *SegmentPosition `protobuf:"bytes,2,opt,name=cursor_position,json=cursorPosition,proto3" json:"cursor_position,omitempty"` Limit int32 `protobuf:"varint,3,opt,name=limit,proto3" json:"limit,omitempty"` @@ -3222,7 +3453,7 @@ func (m *SegmentListRequest) Reset() { *m = SegmentListRequest{} } func (m *SegmentListRequest) String() string { return proto.CompactTextString(m) } func (*SegmentListRequest) ProtoMessage() {} func (*SegmentListRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_631e2f30a93cd64e, []int{61} + return fileDescriptor_631e2f30a93cd64e, []int{62} } func (m *SegmentListRequest) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_SegmentListRequest.Unmarshal(m, b) @@ -3242,6 +3473,13 @@ func (m *SegmentListRequest) XXX_DiscardUnknown() { var xxx_messageInfo_SegmentListRequest proto.InternalMessageInfo +func (m *SegmentListRequest) GetHeader() *RequestHeader { + if m != nil { + return m.Header + } + return nil +} + func (m *SegmentListRequest) GetStreamId() []byte { if m != nil { return m.StreamId @@ -3275,7 +3513,7 @@ func (m *SegmentListResponse) Reset() { *m = SegmentListResponse{} } func (m *SegmentListResponse) String() string { return proto.CompactTextString(m) } func (*SegmentListResponse) ProtoMessage() {} func (*SegmentListResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_631e2f30a93cd64e, []int{62} + return fileDescriptor_631e2f30a93cd64e, []int{63} } func (m *SegmentListResponse) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_SegmentListResponse.Unmarshal(m, b) @@ -3320,7 +3558,7 @@ func (m *SegmentListItem) Reset() { *m = SegmentListItem{} } func (m *SegmentListItem) String() string { return proto.CompactTextString(m) } func (*SegmentListItem) ProtoMessage() {} func (*SegmentListItem) Descriptor() ([]byte, []int) { - return fileDescriptor_631e2f30a93cd64e, []int{63} + return fileDescriptor_631e2f30a93cd64e, []int{64} } func (m *SegmentListItem) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_SegmentListItem.Unmarshal(m, b) @@ -3348,6 +3586,7 @@ func (m *SegmentListItem) GetPosition() *SegmentPosition { } type SegmentDownloadRequest struct { + Header *RequestHeader `protobuf:"bytes,15,opt,name=header,proto3" json:"header,omitempty"` StreamId StreamID `protobuf:"bytes,1,opt,name=stream_id,json=streamId,proto3,customtype=StreamID" json:"stream_id"` CursorPosition *SegmentPosition `protobuf:"bytes,2,opt,name=cursor_position,json=cursorPosition,proto3" json:"cursor_position,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` @@ -3359,7 +3598,7 @@ func (m *SegmentDownloadRequest) Reset() { *m = SegmentDownloadRequest{} func (m *SegmentDownloadRequest) String() string { return proto.CompactTextString(m) } func (*SegmentDownloadRequest) ProtoMessage() {} func (*SegmentDownloadRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_631e2f30a93cd64e, []int{64} + return fileDescriptor_631e2f30a93cd64e, []int{65} } func (m *SegmentDownloadRequest) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_SegmentDownloadRequest.Unmarshal(m, b) @@ -3379,6 +3618,13 @@ func (m *SegmentDownloadRequest) XXX_DiscardUnknown() { var xxx_messageInfo_SegmentDownloadRequest proto.InternalMessageInfo +func (m *SegmentDownloadRequest) GetHeader() *RequestHeader { + if m != nil { + return m.Header + } + return nil +} + func (m *SegmentDownloadRequest) GetCursorPosition() *SegmentPosition { if m != nil { return m.CursorPosition @@ -3404,7 +3650,7 @@ func (m *SegmentDownloadResponse) Reset() { *m = SegmentDownloadResponse func (m *SegmentDownloadResponse) String() string { return proto.CompactTextString(m) } func (*SegmentDownloadResponse) ProtoMessage() {} func (*SegmentDownloadResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_631e2f30a93cd64e, []int{65} + return fileDescriptor_631e2f30a93cd64e, []int{66} } func (m *SegmentDownloadResponse) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_SegmentDownloadResponse.Unmarshal(m, b) @@ -3460,6 +3706,8 @@ func (m *SegmentDownloadResponse) GetNext() *SegmentPosition { } type BatchRequest struct { + Header *RequestHeader `protobuf:"bytes,15,opt,name=header,proto3" json:"header,omitempty"` + // headers for specific BatchRequestItems are ignored entirely Requests []*BatchRequestItem `protobuf:"bytes,1,rep,name=requests,proto3" json:"requests,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` @@ -3470,7 +3718,7 @@ func (m *BatchRequest) Reset() { *m = BatchRequest{} } func (m *BatchRequest) String() string { return proto.CompactTextString(m) } func (*BatchRequest) ProtoMessage() {} func (*BatchRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_631e2f30a93cd64e, []int{66} + return fileDescriptor_631e2f30a93cd64e, []int{67} } func (m *BatchRequest) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_BatchRequest.Unmarshal(m, b) @@ -3490,6 +3738,13 @@ func (m *BatchRequest) XXX_DiscardUnknown() { var xxx_messageInfo_BatchRequest proto.InternalMessageInfo +func (m *BatchRequest) GetHeader() *RequestHeader { + if m != nil { + return m.Header + } + return nil +} + func (m *BatchRequest) GetRequests() []*BatchRequestItem { if m != nil { return m.Requests @@ -3527,7 +3782,7 @@ func (m *BatchRequestItem) Reset() { *m = BatchRequestItem{} } func (m *BatchRequestItem) String() string { return proto.CompactTextString(m) } func (*BatchRequestItem) ProtoMessage() {} func (*BatchRequestItem) Descriptor() ([]byte, []int) { - return fileDescriptor_631e2f30a93cd64e, []int{67} + return fileDescriptor_631e2f30a93cd64e, []int{68} } func (m *BatchRequestItem) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_BatchRequestItem.Unmarshal(m, b) @@ -4147,7 +4402,7 @@ func (m *BatchResponse) Reset() { *m = BatchResponse{} } func (m *BatchResponse) String() string { return proto.CompactTextString(m) } func (*BatchResponse) ProtoMessage() {} func (*BatchResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_631e2f30a93cd64e, []int{68} + return fileDescriptor_631e2f30a93cd64e, []int{69} } func (m *BatchResponse) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_BatchResponse.Unmarshal(m, b) @@ -4204,7 +4459,7 @@ func (m *BatchResponseItem) Reset() { *m = BatchResponseItem{} } func (m *BatchResponseItem) String() string { return proto.CompactTextString(m) } func (*BatchResponseItem) ProtoMessage() {} func (*BatchResponseItem) Descriptor() ([]byte, []int) { - return fileDescriptor_631e2f30a93cd64e, []int{69} + return fileDescriptor_631e2f30a93cd64e, []int{70} } func (m *BatchResponseItem) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_BatchResponseItem.Unmarshal(m, b) @@ -4815,6 +5070,7 @@ func _BatchResponseItem_OneofSizer(msg proto.Message) (n int) { func init() { proto.RegisterEnum("metainfo.Object_Status", Object_Status_name, Object_Status_value) + proto.RegisterType((*RequestHeader)(nil), "metainfo.RequestHeader") proto.RegisterType((*Bucket)(nil), "metainfo.Bucket") proto.RegisterType((*BucketListItem)(nil), "metainfo.BucketListItem") proto.RegisterType((*BucketCreateRequest)(nil), "metainfo.BucketCreateRequest") @@ -4891,234 +5147,239 @@ func init() { func init() { proto.RegisterFile("metainfo.proto", fileDescriptor_631e2f30a93cd64e) } var fileDescriptor_631e2f30a93cd64e = []byte{ - // 3629 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xd4, 0x5b, 0xcd, 0x6f, 0x1b, 0xd7, - 0xb5, 0x17, 0xbf, 0xc9, 0x43, 0x4a, 0x24, 0xaf, 0x64, 0x99, 0xa6, 0x2c, 0xcb, 0x1e, 0x7f, 0xc4, - 0xc1, 0x4b, 0xe4, 0x40, 0x79, 0xef, 0x21, 0x0f, 0x71, 0x5e, 0x9e, 0x64, 0xca, 0x16, 0x13, 0x4b, - 0x56, 0x46, 0x76, 0xec, 0xe7, 0x97, 0xbc, 0xc1, 0x88, 0x73, 0x25, 0x4d, 0x4d, 0x72, 0xd8, 0x99, - 0x61, 0x2a, 0x67, 0xd5, 0x45, 0x81, 0xa2, 0x48, 0x17, 0x5d, 0x76, 0x95, 0x4d, 0xd1, 0x55, 0xff, - 0x82, 0x02, 0x45, 0xb7, 0x2d, 0x8a, 0xa2, 0x8b, 0x74, 0xd7, 0x02, 0x69, 0x57, 0x5d, 0x76, 0x93, - 0x5d, 0x81, 0x02, 0xc5, 0xfd, 0x9a, 0xb9, 0xf3, 0x49, 0x4a, 0x96, 0x0d, 0x64, 0xc7, 0x39, 0xf7, - 0xdc, 0x33, 0xf7, 0x9e, 0x8f, 0xdf, 0x39, 0xf7, 0x5c, 0x0e, 0xcc, 0x0d, 0xb0, 0xab, 0x9b, 0xc3, - 0x03, 0x6b, 0x75, 0x64, 0x5b, 0xae, 0x85, 0xca, 0xe2, 0xb9, 0xdd, 0xc0, 0xc3, 0x9e, 0xfd, 0x7c, - 0xe4, 0x9a, 0xd6, 0x90, 0x8d, 0xb5, 0xe1, 0xd0, 0x3a, 0xe4, 0x7c, 0xed, 0x95, 0x43, 0xcb, 0x3a, - 0xec, 0xe3, 0x5b, 0xf4, 0x69, 0x7f, 0x7c, 0x70, 0xcb, 0x35, 0x07, 0xd8, 0x71, 0xf5, 0xc1, 0x48, - 0x30, 0x0f, 0x2d, 0x03, 0xf3, 0xdf, 0xf5, 0x91, 0x65, 0x0e, 0x5d, 0x6c, 0x1b, 0xfb, 0x9c, 0x50, - 0xb3, 0x6c, 0x03, 0xdb, 0x0e, 0x7b, 0x52, 0x7e, 0x91, 0x83, 0xe2, 0xc6, 0xb8, 0xf7, 0x0c, 0xbb, - 0x08, 0x41, 0x7e, 0xa8, 0x0f, 0x70, 0x2b, 0x73, 0x39, 0x73, 0xb3, 0xa6, 0xd2, 0xdf, 0xe8, 0x1d, - 0xa8, 0x8e, 0x74, 0xf7, 0x48, 0xeb, 0x99, 0xa3, 0x23, 0x6c, 0xb7, 0xb2, 0x97, 0x33, 0x37, 0xe7, - 0xd6, 0xce, 0xaf, 0x4a, 0xcb, 0xbb, 0x43, 0x47, 0xf6, 0xc6, 0xa6, 0x8b, 0x55, 0x20, 0xbc, 0x8c, - 0x80, 0xee, 0x00, 0xf4, 0x6c, 0xac, 0xbb, 0xd8, 0xd0, 0x74, 0xb7, 0x95, 0xbb, 0x9c, 0xb9, 0x59, - 0x5d, 0x6b, 0xaf, 0xb2, 0x95, 0xaf, 0x8a, 0x95, 0xaf, 0x3e, 0x14, 0x2b, 0xdf, 0x28, 0xff, 0xf6, - 0xeb, 0x95, 0x99, 0x9f, 0xfc, 0x65, 0x25, 0xa3, 0x56, 0xf8, 0xbc, 0x75, 0x17, 0xbd, 0x05, 0x0b, - 0x06, 0x3e, 0xd0, 0xc7, 0x7d, 0x57, 0x73, 0xf0, 0xe1, 0x00, 0x0f, 0x5d, 0xcd, 0x31, 0x3f, 0xc7, - 0xad, 0xfc, 0xe5, 0xcc, 0xcd, 0x9c, 0x8a, 0xf8, 0xd8, 0x1e, 0x1b, 0xda, 0x33, 0x3f, 0xc7, 0xe8, - 0x31, 0x5c, 0x10, 0x33, 0x6c, 0x6c, 0x8c, 0x87, 0x86, 0x3e, 0xec, 0x3d, 0xd7, 0x9c, 0xde, 0x11, - 0x1e, 0xe0, 0x56, 0x81, 0xae, 0x62, 0x69, 0xd5, 0x57, 0x89, 0xea, 0xf1, 0xec, 0x51, 0x16, 0xf5, - 0x3c, 0x9f, 0x1d, 0x1e, 0x40, 0x06, 0x2c, 0x0b, 0xc1, 0xfe, 0xee, 0xb5, 0x91, 0x6e, 0xeb, 0x03, - 0xec, 0x62, 0xdb, 0x69, 0x15, 0xa9, 0xf0, 0xcb, 0xb2, 0x6e, 0x36, 0xbd, 0x9f, 0xbb, 0x1e, 0x9f, - 0xba, 0xc4, 0xc5, 0xc4, 0x0d, 0xa2, 0x65, 0x80, 0x91, 0x6e, 0xbb, 0x43, 0x6c, 0x6b, 0xa6, 0xd1, - 0x2a, 0x51, 0x4b, 0x54, 0x38, 0xa5, 0x6b, 0x28, 0x26, 0xcc, 0x31, 0x63, 0xdd, 0x37, 0x1d, 0xb7, - 0xeb, 0xe2, 0x41, 0xac, 0xd1, 0x82, 0xaa, 0xcf, 0x9e, 0x4a, 0xf5, 0xca, 0x37, 0x59, 0x98, 0x67, - 0xef, 0xba, 0x43, 0x69, 0x2a, 0xfe, 0xee, 0x18, 0x3b, 0x67, 0xed, 0x25, 0x49, 0x06, 0xce, 0x9d, - 0xce, 0xc0, 0xf9, 0x97, 0x69, 0xe0, 0xc2, 0xd9, 0x1b, 0xb8, 0x18, 0x36, 0xf0, 0xff, 0xc0, 0x42, - 0x50, 0xe9, 0xce, 0xc8, 0x1a, 0x3a, 0x18, 0xdd, 0x84, 0xe2, 0x3e, 0xa5, 0x53, 0xbd, 0x57, 0xd7, - 0x1a, 0xab, 0x1e, 0x76, 0x30, 0x7e, 0x95, 0x8f, 0x2b, 0x37, 0xa0, 0xc1, 0x28, 0xf7, 0xb0, 0x9b, - 0x62, 0x33, 0xe5, 0x3d, 0x68, 0x4a, 0x7c, 0x27, 0x7e, 0xcd, 0xeb, 0xc2, 0x3b, 0x3a, 0xb8, 0x8f, - 0x53, 0xbd, 0x43, 0x59, 0x14, 0x7b, 0x12, 0xac, 0xec, 0x65, 0x8a, 0x26, 0x56, 0x40, 0x9c, 0x59, - 0x08, 0x58, 0x84, 0x62, 0x6f, 0x6c, 0x3b, 0x96, 0xcd, 0x45, 0xf0, 0x27, 0xb4, 0x00, 0x85, 0xbe, - 0x39, 0x30, 0x99, 0x3b, 0x17, 0x54, 0xf6, 0x80, 0x2e, 0x42, 0xc5, 0x30, 0x6d, 0xdc, 0x23, 0x4a, - 0xa6, 0x3e, 0x53, 0x50, 0x7d, 0x82, 0xf2, 0x04, 0x90, 0xfc, 0x02, 0xbe, 0xc7, 0x55, 0x28, 0x98, - 0x2e, 0x1e, 0x38, 0xad, 0xcc, 0xe5, 0xdc, 0xcd, 0xea, 0x5a, 0x2b, 0xbc, 0x45, 0x11, 0x5a, 0x2a, - 0x63, 0x23, 0x5b, 0x1a, 0x58, 0x36, 0xa6, 0x2f, 0x2e, 0xab, 0xf4, 0xb7, 0xb2, 0x0b, 0x4b, 0x8c, - 0x79, 0x0f, 0xbb, 0xeb, 0xae, 0x6b, 0x9b, 0xfb, 0x63, 0xf2, 0xc6, 0xb4, 0x18, 0x09, 0x1a, 0x3e, - 0x1b, 0x36, 0xfc, 0x25, 0xb8, 0x18, 0x2f, 0x91, 0x2b, 0xeb, 0x07, 0x19, 0x98, 0x5f, 0x37, 0x0c, - 0x1b, 0x3b, 0x0e, 0x36, 0x1e, 0x10, 0x04, 0xbf, 0x4f, 0x35, 0x70, 0x53, 0xe8, 0x85, 0x19, 0x0c, - 0xad, 0x72, 0x74, 0xf7, 0x59, 0x84, 0xae, 0xee, 0xc0, 0x82, 0xe3, 0x5a, 0xb6, 0x7e, 0x88, 0x35, - 0x92, 0x1e, 0x34, 0x9d, 0x49, 0xe3, 0xf8, 0xd0, 0x5c, 0xa5, 0x39, 0x63, 0xc7, 0x32, 0x30, 0x7f, - 0x8d, 0x8a, 0x38, 0xbb, 0x44, 0x53, 0xbe, 0xcc, 0xc2, 0x22, 0x8f, 0xc6, 0xc7, 0xb6, 0xe9, 0xd9, - 0xfd, 0x41, 0xdf, 0x20, 0x96, 0x93, 0x7c, 0xa7, 0x26, 0x3c, 0x85, 0x28, 0x83, 0x04, 0x3c, 0xdf, - 0x32, 0xfd, 0x8d, 0x5a, 0x50, 0xe2, 0xe1, 0xce, 0x23, 0x5d, 0x3c, 0xa2, 0x77, 0x01, 0xfc, 0xb0, - 0x9e, 0x26, 0x9e, 0x25, 0x76, 0xf4, 0x2e, 0xb4, 0x07, 0xfa, 0xb1, 0x08, 0x5f, 0x6c, 0x04, 0x31, - 0xa5, 0x40, 0xdf, 0x74, 0x7e, 0xa0, 0x1f, 0x6f, 0x0a, 0x06, 0x19, 0x58, 0x3a, 0x00, 0xf8, 0x78, - 0x64, 0xda, 0x3a, 0x75, 0xa6, 0xe2, 0x09, 0x50, 0x53, 0x9a, 0xa7, 0x7c, 0x95, 0x81, 0xf3, 0x41, - 0x05, 0x31, 0x03, 0x12, 0x0d, 0x6d, 0x41, 0x43, 0x17, 0x26, 0xd4, 0xa8, 0x51, 0x84, 0x13, 0x2e, - 0xfb, 0x4e, 0x18, 0x63, 0x64, 0xb5, 0xee, 0x4d, 0xa3, 0xcf, 0x0e, 0x7a, 0x1b, 0x66, 0x6d, 0xcb, - 0x72, 0xb5, 0x91, 0x89, 0x7b, 0xd8, 0xf3, 0xa7, 0x8d, 0x3a, 0x59, 0xd2, 0x9f, 0xbe, 0x5e, 0x29, - 0xed, 0x12, 0x7a, 0xb7, 0xa3, 0x56, 0x09, 0x17, 0x7b, 0x30, 0x28, 0x4a, 0xdb, 0xe6, 0x67, 0xba, - 0x8b, 0xb5, 0x67, 0xf8, 0x39, 0x55, 0x7c, 0x6d, 0xe3, 0x3c, 0x9f, 0x52, 0xa7, 0x5c, 0xbb, 0x6c, - 0xfc, 0x43, 0xfc, 0x5c, 0x85, 0x91, 0xf7, 0x5b, 0xf9, 0x9d, 0xbf, 0xa9, 0x3b, 0xd6, 0x80, 0xac, - 0xe8, 0xac, 0xcd, 0xfe, 0x06, 0x94, 0xb8, 0x8d, 0xb9, 0xcd, 0x91, 0x64, 0xf3, 0x5d, 0xf6, 0x4b, - 0x15, 0x2c, 0xe8, 0x5d, 0xa8, 0x5b, 0xb6, 0x79, 0x68, 0x0e, 0xf5, 0xbe, 0xd0, 0x63, 0x81, 0xea, - 0x31, 0xce, 0xfd, 0xe7, 0x04, 0x2b, 0xd3, 0x9d, 0xb2, 0x05, 0xad, 0xd0, 0x5e, 0x7c, 0x0b, 0x49, - 0xcb, 0xc8, 0x4c, 0x5c, 0x86, 0xa2, 0xc3, 0x05, 0x2e, 0xa9, 0x63, 0x7d, 0x6f, 0xd8, 0xb7, 0x74, - 0xe3, 0xac, 0xf5, 0xa2, 0xfc, 0x21, 0x03, 0xed, 0xc8, 0x3b, 0x5e, 0x86, 0x47, 0x49, 0x3b, 0xcf, - 0x4e, 0x36, 0xc0, 0xe9, 0x5d, 0xe9, 0x53, 0x38, 0xc7, 0xf7, 0xd3, 0x1d, 0x1e, 0x58, 0x67, 0xae, - 0xaf, 0xbb, 0x1e, 0x3c, 0x31, 0xf1, 0xb1, 0xa6, 0x9d, 0xbc, 0x41, 0x45, 0xf3, 0x1c, 0x3e, 0x90, - 0xdf, 0xce, 0x6e, 0xa1, 0x5f, 0x66, 0x3c, 0x37, 0x0c, 0xa6, 0xc5, 0xb3, 0x35, 0x6b, 0xc8, 0x50, - 0xd9, 0xe9, 0x0d, 0xf5, 0xe7, 0x0c, 0x2c, 0x92, 0x54, 0xc8, 0x17, 0xe9, 0x4c, 0xa1, 0x81, 0x45, - 0x28, 0x8e, 0x6c, 0x7c, 0x60, 0x1e, 0x73, 0x1d, 0xf0, 0x27, 0xb4, 0x02, 0x55, 0xc7, 0xd5, 0x6d, - 0x57, 0xd3, 0x0f, 0x88, 0xfa, 0xa9, 0xb7, 0xa8, 0x40, 0x49, 0xeb, 0x84, 0x42, 0x72, 0x23, 0x1e, - 0x1a, 0xda, 0x3e, 0x3e, 0x20, 0x89, 0x36, 0xcf, 0x72, 0x23, 0x1e, 0x1a, 0x1b, 0x94, 0x40, 0xb2, - 0xbc, 0x8d, 0x49, 0x1d, 0x60, 0x7e, 0xc6, 0x50, 0xbc, 0xac, 0xfa, 0x04, 0xbf, 0x32, 0x28, 0xca, - 0x95, 0xc1, 0x32, 0x00, 0xd1, 0x94, 0x76, 0xd0, 0xd7, 0x0f, 0x1d, 0x5a, 0x48, 0x97, 0xd4, 0x0a, - 0xa1, 0xdc, 0x25, 0x04, 0x0a, 0xd3, 0xc1, 0xdd, 0xf9, 0xda, 0xbf, 0x1d, 0x2c, 0x10, 0x6e, 0xf8, - 0x2a, 0x4f, 0x98, 0xb1, 0x3a, 0xa1, 0x5c, 0x68, 0x63, 0xc8, 0x8b, 0x62, 0x9d, 0xba, 0x48, 0x46, - 0x72, 0x91, 0x93, 0x05, 0xde, 0x12, 0x54, 0x4c, 0x47, 0xe3, 0x5a, 0xce, 0xd1, 0x57, 0x94, 0x4d, - 0x67, 0x97, 0x3e, 0x2b, 0x4f, 0x89, 0x4b, 0xc5, 0xd4, 0x23, 0x64, 0x53, 0x2b, 0x50, 0x65, 0x56, - 0xd2, 0xa4, 0xca, 0x04, 0x18, 0x69, 0x67, 0x8a, 0xfa, 0x64, 0x89, 0x60, 0x5d, 0x5c, 0x65, 0xf2, - 0xa0, 0x6f, 0x28, 0x0b, 0x80, 0x76, 0x6d, 0xeb, 0x3b, 0xb8, 0x27, 0x07, 0xb5, 0xf2, 0x0e, 0xcc, - 0x07, 0xa8, 0xbc, 0xfe, 0xba, 0x02, 0xb5, 0x11, 0x23, 0x6b, 0x8e, 0xde, 0x17, 0x3e, 0x54, 0xe5, - 0xb4, 0x3d, 0xbd, 0xef, 0x2a, 0x3f, 0x2a, 0x41, 0xf1, 0xc1, 0x3e, 0x79, 0x4c, 0xf4, 0xb5, 0xeb, - 0x30, 0xe7, 0xa7, 0x79, 0x29, 0xee, 0x66, 0x3d, 0xea, 0x2e, 0x0f, 0xc0, 0xcf, 0xb0, 0xed, 0xf8, - 0xe5, 0xa1, 0x78, 0x44, 0xb7, 0xa0, 0xe8, 0xb8, 0xba, 0x3b, 0x76, 0xa8, 0xbf, 0x91, 0xe3, 0x8a, - 0x67, 0x66, 0xf6, 0xea, 0xd5, 0x3d, 0x3a, 0xac, 0x72, 0x36, 0xf4, 0x26, 0x54, 0x1c, 0xd7, 0xc6, - 0xfa, 0x80, 0xe8, 0xa7, 0x40, 0x03, 0xa9, 0xc1, 0x03, 0xa9, 0xbc, 0x47, 0x07, 0xba, 0x1d, 0xb5, - 0xcc, 0x58, 0xba, 0x46, 0xe8, 0x10, 0x56, 0x3c, 0xdd, 0xf9, 0x77, 0x9d, 0xbc, 0x93, 0xbc, 0x9d, - 0xc8, 0x28, 0x9d, 0x40, 0x46, 0x99, 0x4d, 0x5b, 0x27, 0x65, 0x1f, 0x2b, 0x4f, 0x30, 0x95, 0x51, - 0x3e, 0xc9, 0x3a, 0xf8, 0xbc, 0x75, 0x17, 0xdd, 0x83, 0x96, 0xaf, 0x6d, 0xa2, 0x27, 0x43, 0x77, - 0x75, 0x6d, 0x68, 0x0d, 0x7b, 0xb8, 0x55, 0xa1, 0xaa, 0x98, 0xe5, 0xaa, 0x28, 0xec, 0x10, 0xa2, - 0xba, 0xe8, 0xb1, 0x6f, 0x73, 0x6e, 0x4a, 0x47, 0x6f, 0x02, 0x8a, 0x0a, 0x6a, 0x01, 0x35, 0x5d, - 0x33, 0x32, 0x07, 0xbd, 0x01, 0xe8, 0xc0, 0x3c, 0x0e, 0x17, 0x72, 0x55, 0x0a, 0xa5, 0x0d, 0x3a, - 0x22, 0x57, 0x70, 0x5b, 0xd0, 0x8c, 0x1e, 0x09, 0x6b, 0x93, 0x4b, 0xc8, 0x86, 0x1d, 0x3e, 0x0b, - 0x3e, 0x82, 0x73, 0xf1, 0x67, 0xc0, 0xd9, 0x29, 0xcf, 0x80, 0x0b, 0x38, 0xe1, 0xf0, 0xe7, 0x5a, - 0xae, 0xde, 0x67, 0xdb, 0x98, 0xa3, 0xdb, 0xa8, 0x50, 0x0a, 0x5d, 0xff, 0x0a, 0x54, 0xcd, 0x61, - 0xdf, 0x1c, 0x62, 0x36, 0x5e, 0xa7, 0xe3, 0xc0, 0x48, 0x82, 0xc1, 0xc6, 0x03, 0xcb, 0xe5, 0x0c, - 0x0d, 0xc6, 0xc0, 0x48, 0x84, 0x41, 0xf9, 0x08, 0x8a, 0xcc, 0x6b, 0x51, 0x15, 0x4a, 0xdd, 0x9d, - 0x8f, 0xd7, 0xef, 0x77, 0x3b, 0x8d, 0x19, 0x34, 0x0b, 0x95, 0x47, 0xbb, 0xf7, 0x1f, 0xac, 0x77, - 0xba, 0x3b, 0xf7, 0x1a, 0x19, 0x34, 0x07, 0x70, 0xe7, 0xc1, 0xf6, 0x76, 0xf7, 0xe1, 0x43, 0xf2, - 0x9c, 0x25, 0xc3, 0xfc, 0x79, 0xb3, 0xd3, 0xc8, 0xa1, 0x1a, 0x94, 0x3b, 0x9b, 0xf7, 0x37, 0xe9, - 0x60, 0x5e, 0xf9, 0x63, 0x16, 0x10, 0x0b, 0x88, 0x0d, 0x7c, 0x68, 0x0e, 0xa5, 0x73, 0xda, 0xcb, - 0x89, 0xcb, 0xa0, 0xbf, 0xe6, 0x4f, 0xe7, 0xaf, 0xb1, 0x9e, 0x50, 0x3a, 0x53, 0x4f, 0x28, 0xbf, - 0x88, 0x27, 0x28, 0xbf, 0xce, 0xc2, 0x7c, 0x40, 0xab, 0x1c, 0x1c, 0x5f, 0x9a, 0x5a, 0x03, 0xe8, - 0x95, 0x9f, 0x88, 0x5e, 0xb1, 0x0a, 0x2c, 0x9c, 0xa9, 0x02, 0x8b, 0x2f, 0xa4, 0xc0, 0x5f, 0x65, - 0x84, 0x02, 0x03, 0x27, 0x92, 0xe0, 0x3e, 0x33, 0x13, 0xf7, 0x99, 0x06, 0x6c, 0xd9, 0x17, 0x07, - 0xb6, 0x5c, 0x02, 0xb0, 0x29, 0x8b, 0xb0, 0x10, 0x5c, 0x3d, 0x3f, 0xe6, 0x3f, 0x83, 0x06, 0xa3, - 0x4b, 0xdd, 0x9b, 0x97, 0xe5, 0x13, 0xca, 0x7b, 0xd0, 0x94, 0x5e, 0xe6, 0xb7, 0x80, 0x2c, 0x4a, - 0x8c, 0xb6, 0x80, 0x18, 0xb3, 0xca, 0xc7, 0x95, 0xef, 0x67, 0xc5, 0xfc, 0x50, 0x03, 0x27, 0x76, - 0xb5, 0xaf, 0x43, 0x43, 0x5a, 0xad, 0x5c, 0x26, 0xd6, 0xfd, 0xf5, 0xb2, 0x7a, 0x31, 0xc0, 0xca, - 0xbb, 0x41, 0xb9, 0x10, 0xeb, 0x1d, 0xd6, 0x16, 0x0a, 0x94, 0x86, 0xf9, 0xc4, 0xd2, 0xb0, 0x20, - 0x97, 0x86, 0x5d, 0xa8, 0xb3, 0x1d, 0x68, 0xe6, 0xb0, 0xd7, 0x1f, 0x1b, 0xd8, 0xf7, 0xc5, 0xd0, - 0x56, 0x45, 0x2b, 0xa8, 0xcb, 0xf9, 0xd4, 0x39, 0x36, 0x51, 0x3c, 0x2b, 0x4f, 0x04, 0x36, 0x4e, - 0xd9, 0x61, 0x0a, 0x8a, 0x4d, 0xeb, 0x30, 0xfd, 0x26, 0x07, 0x73, 0x41, 0xee, 0x18, 0x7b, 0x67, - 0x26, 0xd8, 0x3b, 0x9b, 0x54, 0xf2, 0xe4, 0xa6, 0x2b, 0x79, 0x82, 0x35, 0x4c, 0xfe, 0x0c, 0x6a, - 0x98, 0xc2, 0x19, 0xd4, 0x30, 0xc5, 0xb3, 0xaf, 0x61, 0x4a, 0x2f, 0x1e, 0xea, 0xe5, 0xa4, 0x50, - 0xff, 0x77, 0x58, 0x8c, 0xf7, 0x26, 0xd4, 0x86, 0xb2, 0x37, 0x3d, 0xc3, 0x6a, 0x79, 0xf1, 0xac, - 0x38, 0xd0, 0x92, 0xf2, 0x43, 0xb0, 0xc9, 0xfa, 0xd2, 0x00, 0xe1, 0x03, 0xb8, 0x10, 0xf3, 0x52, - 0xee, 0xd5, 0x27, 0x43, 0x56, 0x5f, 0xd6, 0x5d, 0x73, 0x68, 0x3a, 0x47, 0xc1, 0x1d, 0x9c, 0x50, - 0xd6, 0x45, 0x68, 0xc7, 0xc9, 0xe2, 0x98, 0xf9, 0xf7, 0x2c, 0x54, 0xf7, 0x74, 0x57, 0xcc, 0x7b, - 0x79, 0x39, 0xf4, 0x85, 0x7a, 0x93, 0x5d, 0x98, 0xa5, 0x31, 0x41, 0xb2, 0xa0, 0xa1, 0xbb, 0xf8, - 0x44, 0xa1, 0x50, 0x13, 0x53, 0x3b, 0xba, 0x8b, 0xd1, 0x36, 0xd4, 0xfd, 0x8e, 0x23, 0x13, 0x76, - 0x92, 0x98, 0x98, 0xf3, 0x27, 0x53, 0x71, 0xb7, 0x60, 0xde, 0xd1, 0x5d, 0xdc, 0xef, 0x9b, 0xb4, - 0xb0, 0x3c, 0x1c, 0xea, 0xee, 0xd8, 0xe6, 0x75, 0xbd, 0x8a, 0xbc, 0xa1, 0x3d, 0x31, 0xa2, 0xfc, - 0x35, 0x0b, 0x25, 0x5e, 0x77, 0x9f, 0x34, 0xdf, 0xfe, 0x07, 0x94, 0x47, 0x96, 0x63, 0xba, 0x02, - 0x9d, 0xaa, 0x6b, 0x17, 0x7c, 0x10, 0xe2, 0x32, 0x77, 0x39, 0x83, 0xea, 0xb1, 0xa2, 0xf7, 0x60, - 0xde, 0x37, 0xdd, 0x33, 0xfc, 0x9c, 0x87, 0x6d, 0x2e, 0x2e, 0x6c, 0xfd, 0x10, 0xfc, 0x10, 0x3f, - 0x67, 0x11, 0x7b, 0x15, 0x66, 0x03, 0xd3, 0x79, 0x8b, 0xa1, 0x26, 0x73, 0xa2, 0x55, 0x98, 0x27, - 0x55, 0xb5, 0xd4, 0x3d, 0xa6, 0x81, 0xc9, 0xba, 0xc6, 0x4d, 0x32, 0xe4, 0xb5, 0x8d, 0x3b, 0xe4, - 0x6c, 0xb2, 0xe6, 0x15, 0x36, 0xd8, 0xd0, 0x78, 0xdd, 0x4e, 0x67, 0xb0, 0x4b, 0x1d, 0x7f, 0xc1, - 0x5d, 0x3a, 0x46, 0xe7, 0xbc, 0x06, 0x45, 0xda, 0xb2, 0x75, 0x5a, 0x25, 0x9a, 0x1a, 0xea, 0xfe, - 0xe6, 0x69, 0x2f, 0x46, 0xe5, 0xc3, 0xca, 0x16, 0x14, 0x28, 0x81, 0x1c, 0xf8, 0x59, 0x93, 0x77, - 0x38, 0x1e, 0x50, 0xfd, 0x16, 0xd4, 0x32, 0x25, 0xec, 0x8c, 0x07, 0x48, 0x81, 0xfc, 0xd0, 0x32, - 0x44, 0xa5, 0x32, 0xc7, 0xf5, 0x50, 0xdc, 0xb1, 0x0c, 0xdc, 0xed, 0xa8, 0x74, 0x4c, 0xd9, 0x82, - 0x7a, 0x48, 0xaf, 0xe4, 0x18, 0x41, 0x0e, 0xf6, 0x44, 0xe4, 0x3e, 0xef, 0x74, 0x16, 0x54, 0x7a, - 0xfa, 0xdf, 0xa1, 0x14, 0x92, 0x37, 0xcd, 0xa1, 0x81, 0x8f, 0xc5, 0x65, 0x0b, 0x7d, 0x50, 0x7e, - 0x96, 0x81, 0x79, 0x2e, 0x2a, 0x70, 0x14, 0x78, 0x35, 0x2e, 0x70, 0x03, 0xea, 0x03, 0xfd, 0x58, - 0xa3, 0xfd, 0x5d, 0xd6, 0x13, 0xe3, 0x2d, 0xb5, 0xd9, 0x81, 0x7e, 0xec, 0xb7, 0xc0, 0x94, 0xdf, - 0x67, 0x60, 0x21, 0xb8, 0x4a, 0x8e, 0x5f, 0x6f, 0x01, 0x88, 0x53, 0xa4, 0xb7, 0xce, 0x26, 0x5f, - 0x67, 0x45, 0x34, 0x0d, 0x3b, 0x6a, 0x85, 0x33, 0x75, 0xe3, 0xdb, 0x70, 0xd9, 0xb3, 0x68, 0xc3, - 0x9d, 0xa0, 0x5f, 0xfa, 0xf3, 0xac, 0xb7, 0x9d, 0x60, 0xa1, 0x7b, 0xf2, 0xed, 0x24, 0x04, 0x51, - 0xf6, 0xb4, 0x41, 0x94, 0x9b, 0x3e, 0x88, 0xf2, 0x49, 0x41, 0x74, 0x0f, 0x66, 0xc7, 0xa3, 0xbe, - 0xa5, 0x1b, 0x9a, 0x8d, 0x9d, 0x71, 0xdf, 0xe5, 0x7d, 0x7c, 0x25, 0xea, 0x11, 0x44, 0x47, 0x8f, - 0x46, 0xbc, 0x01, 0x3e, 0xee, 0xbb, 0x6a, 0x6d, 0x2c, 0x3d, 0x29, 0x3f, 0xf4, 0xfb, 0xa9, 0x11, - 0xd6, 0xf4, 0x20, 0x7a, 0x0d, 0x4a, 0xf4, 0x3e, 0xcc, 0xbb, 0x45, 0x09, 0xc7, 0x51, 0x91, 0x0c, - 0x77, 0x0d, 0x74, 0x1d, 0xf2, 0x47, 0xba, 0x73, 0xc4, 0xff, 0xcb, 0xd0, 0x14, 0x57, 0x0d, 0xf4, - 0x75, 0x5b, 0xba, 0x73, 0xa4, 0xd2, 0x61, 0xe5, 0x9f, 0x59, 0xa8, 0x91, 0x74, 0x24, 0x4c, 0x80, - 0xd6, 0xc2, 0xf1, 0x51, 0x5d, 0x3b, 0x27, 0xed, 0xcf, 0xcf, 0x5c, 0x52, 0x90, 0x84, 0x42, 0x34, - 0x9b, 0x1c, 0xa2, 0x39, 0x29, 0x44, 0xa3, 0xf7, 0x42, 0x85, 0x29, 0xee, 0x85, 0x3e, 0x82, 0x73, - 0xde, 0x6d, 0x8a, 0x14, 0x5e, 0xa4, 0x2a, 0x9e, 0xc2, 0xd7, 0xe7, 0xc5, 0x5c, 0x9f, 0xe6, 0x44, - 0x93, 0x5d, 0xe9, 0xd4, 0xc9, 0x2e, 0x21, 0x3b, 0x95, 0x13, 0xb3, 0x53, 0xc7, 0xbb, 0x61, 0x08, - 0x9e, 0xad, 0xd0, 0xbf, 0x41, 0xd3, 0x19, 0xf7, 0x7a, 0xd8, 0x71, 0x0e, 0xc6, 0x7d, 0x8d, 0xe3, - 0x30, 0xf3, 0x86, 0x86, 0x3f, 0xb0, 0xcb, 0x00, 0xf8, 0xa7, 0x59, 0xcf, 0x9f, 0xb6, 0xf5, 0x67, - 0x98, 0x61, 0xf8, 0xab, 0x45, 0xbc, 0x57, 0x91, 0xf4, 0x12, 0x93, 0x58, 0x21, 0x31, 0x89, 0xb1, - 0x56, 0x70, 0x44, 0x33, 0xbc, 0x18, 0xb3, 0xbc, 0xc1, 0x98, 0xc2, 0x75, 0x29, 0xa2, 0xb7, 0x17, - 0xd6, 0x92, 0xf2, 0x95, 0x7f, 0x43, 0x16, 0x57, 0xb5, 0x7e, 0x3b, 0x51, 0xff, 0xc7, 0xfe, 0xa6, - 0xe2, 0xca, 0xe7, 0x93, 0x6f, 0xea, 0x36, 0x94, 0x18, 0xc0, 0x8a, 0xbd, 0x24, 0x20, 0xac, 0xa7, - 0x3d, 0x82, 0xb0, 0x62, 0x4a, 0x04, 0x5c, 0x65, 0xae, 0x57, 0x0b, 0xae, 0xcb, 0xb0, 0x14, 0xab, - 0x17, 0xee, 0x7d, 0x5f, 0x64, 0x00, 0xf1, 0x71, 0xb9, 0x27, 0x91, 0xea, 0x77, 0x1b, 0x50, 0x67, - 0x3d, 0x06, 0x6d, 0x7a, 0xf7, 0x9b, 0x63, 0x33, 0xbc, 0x8a, 0xca, 0x6b, 0x34, 0xe4, 0xa4, 0x46, - 0x83, 0xf2, 0xd4, 0xab, 0x97, 0x02, 0xed, 0x81, 0x5b, 0xc1, 0xf6, 0x40, 0xf4, 0x35, 0xd3, 0xf4, - 0x07, 0xfc, 0xb2, 0xce, 0xeb, 0x0f, 0xc8, 0x01, 0x94, 0x99, 0x3e, 0x80, 0xbe, 0xc8, 0x78, 0x77, - 0xa6, 0xa1, 0x6b, 0xec, 0x93, 0xe2, 0xdc, 0x19, 0x68, 0x52, 0xf9, 0x65, 0xce, 0xbf, 0x79, 0x0d, - 0x5d, 0x78, 0x7f, 0x3b, 0x63, 0x39, 0x19, 0x62, 0xf3, 0xc9, 0xe7, 0x84, 0x2b, 0x50, 0x8b, 0xf9, - 0xeb, 0x4a, 0xd5, 0x91, 0x2e, 0x3b, 0x12, 0xb2, 0x43, 0xf1, 0xb4, 0xd9, 0xa1, 0x14, 0x93, 0x1d, - 0xde, 0x84, 0xfc, 0x10, 0x1f, 0x8b, 0x5b, 0xa3, 0x14, 0x2b, 0x52, 0x36, 0xe5, 0x2e, 0xd4, 0x36, - 0x74, 0xb7, 0x77, 0x24, 0xdc, 0xe7, 0x3f, 0xa1, 0x6c, 0xb3, 0x9f, 0xc2, 0xd7, 0xdb, 0xd2, 0x9f, - 0xad, 0x24, 0x4e, 0xea, 0xec, 0x1e, 0xaf, 0xf2, 0x37, 0x80, 0x46, 0x78, 0x18, 0x75, 0x60, 0x96, - 0x5f, 0x60, 0xb2, 0xd6, 0x12, 0x77, 0xf1, 0xe5, 0xf0, 0xdf, 0xb7, 0x02, 0xff, 0x56, 0xdc, 0x9a, - 0x51, 0x6b, 0xfb, 0x12, 0x99, 0x1c, 0xe1, 0xb9, 0x94, 0x43, 0xec, 0xff, 0x35, 0x32, 0x24, 0xc2, - 0xef, 0xbd, 0x6e, 0xcd, 0xa8, 0x95, 0x7d, 0x41, 0x93, 0x96, 0x60, 0x50, 0xd8, 0xe1, 0x60, 0x15, - 0x59, 0x42, 0x00, 0xac, 0xfd, 0x25, 0x30, 0x32, 0xfa, 0x6f, 0xef, 0x26, 0xb6, 0x6f, 0x3a, 0xae, - 0xd7, 0x46, 0x88, 0xf9, 0x17, 0x9a, 0x2f, 0x81, 0x2f, 0x9a, 0x10, 0xd1, 0xa7, 0xb0, 0xc8, 0xe7, - 0x3b, 0xd8, 0xd5, 0x74, 0xff, 0x46, 0x96, 0x77, 0x14, 0xae, 0x87, 0x45, 0xc5, 0xde, 0x09, 0x6f, - 0xcd, 0xa8, 0x0b, 0xfb, 0x31, 0xc3, 0x68, 0x1d, 0x6a, 0xbc, 0x3b, 0xba, 0x4f, 0xd2, 0x29, 0xef, - 0x2c, 0x5c, 0x0c, 0xb7, 0x0a, 0xe5, 0x13, 0xe0, 0xd6, 0x8c, 0x5a, 0xb5, 0x7c, 0x2a, 0xd1, 0x13, - 0x17, 0xd1, 0xa3, 0x15, 0x18, 0xaf, 0xfe, 0x96, 0xc3, 0x32, 0x02, 0x07, 0x1a, 0xa2, 0x27, 0x4b, - 0x22, 0x13, 0x53, 0x71, 0x29, 0xc4, 0x54, 0xe5, 0xb0, 0xa9, 0xc2, 0x6d, 0x72, 0x62, 0x2a, 0x4b, - 0xd0, 0x88, 0x92, 0xf9, 0x64, 0xaa, 0xe4, 0x4a, 0x58, 0xc9, 0x91, 0xbe, 0x35, 0x51, 0xb2, 0xe5, - 0x11, 0xd1, 0x43, 0x98, 0x97, 0xb5, 0x20, 0x0c, 0x0e, 0x54, 0x8e, 0x12, 0xab, 0x8c, 0xb0, 0xd5, - 0x9b, 0x56, 0x78, 0x0c, 0x3d, 0x86, 0x05, 0x2e, 0xf5, 0x80, 0x66, 0x2f, 0x21, 0xb6, 0x4a, 0xc5, - 0x5e, 0x0d, 0x8b, 0x8d, 0x49, 0xfd, 0x5b, 0x33, 0x2a, 0xb2, 0x22, 0x83, 0x44, 0xe3, 0x02, 0x2f, - 0x98, 0xd5, 0x6a, 0x61, 0x8d, 0xc7, 0x1c, 0xdc, 0x89, 0xc6, 0x1d, 0x89, 0x8c, 0xee, 0xc1, 0x9c, - 0x90, 0xc2, 0x0d, 0xc7, 0xae, 0x3b, 0x2f, 0x45, 0xc4, 0x84, 0x2d, 0x27, 0xde, 0xce, 0x4d, 0xf7, - 0x10, 0xe6, 0x85, 0xa0, 0x81, 0xfe, 0x0c, 0x73, 0xd4, 0xa3, 0x17, 0x9e, 0x71, 0x95, 0x47, 0xa4, - 0xc0, 0x26, 0xda, 0x73, 0xc2, 0x63, 0x44, 0x7b, 0x81, 0x4d, 0x0a, 0xed, 0xd5, 0xc3, 0xda, 0x4b, - 0x2c, 0x40, 0x89, 0xf6, 0x9c, 0xc8, 0x20, 0x7a, 0x0a, 0xe7, 0x84, 0xe0, 0xa0, 0x5d, 0x1a, 0x54, - 0xf2, 0xb5, 0x88, 0xe4, 0x78, 0xc3, 0x88, 0x3d, 0x07, 0x2c, 0xb3, 0xee, 0x23, 0x39, 0xf5, 0xc4, - 0x66, 0x38, 0x9c, 0xa2, 0xe5, 0x0a, 0x09, 0x27, 0xc7, 0xa7, 0xa2, 0x6d, 0x68, 0x08, 0x11, 0x06, - 0x4f, 0x89, 0x2d, 0x14, 0xbe, 0xb0, 0x88, 0xcf, 0xe0, 0x5b, 0x33, 0x6a, 0xdd, 0x09, 0x8e, 0x6c, - 0x54, 0xa0, 0x24, 0xfe, 0xa1, 0xf1, 0x01, 0xcc, 0x72, 0x9c, 0xe5, 0x19, 0xf6, 0xbf, 0xa0, 0x62, - 0xf3, 0xdf, 0x02, 0xb2, 0x97, 0x22, 0x90, 0xcd, 0xc6, 0x29, 0x66, 0xfb, 0xdc, 0xca, 0x3f, 0x00, - 0x9a, 0x11, 0x06, 0xb4, 0x19, 0x8f, 0xda, 0x97, 0x92, 0x50, 0x9b, 0x4d, 0x8d, 0xc0, 0xf6, 0xed, - 0x18, 0xd8, 0x5e, 0x8a, 0x85, 0x6d, 0x4f, 0x80, 0x84, 0xdb, 0x9b, 0xf1, 0xb8, 0x7d, 0x29, 0x09, - 0xb7, 0xc3, 0x8b, 0xe0, 0xa6, 0x7c, 0x3f, 0x0e, 0xb8, 0x2f, 0xc6, 0x03, 0xb7, 0x27, 0x42, 0x46, - 0xee, 0xff, 0x9f, 0x80, 0xdc, 0x37, 0x26, 0x21, 0xb7, 0x27, 0x35, 0x1e, 0xba, 0x37, 0x62, 0xa1, - 0x7b, 0x39, 0x01, 0xba, 0x3d, 0x61, 0x01, 0xec, 0xde, 0x8c, 0xc7, 0xee, 0x4b, 0x49, 0xd8, 0xed, - 0xeb, 0x2a, 0x00, 0xde, 0xb7, 0x63, 0xc0, 0x7b, 0x29, 0x16, 0xbc, 0x7d, 0x83, 0xf9, 0xe8, 0xfd, - 0x7e, 0x1c, 0x7a, 0x5f, 0x8c, 0x47, 0x6f, 0x5f, 0xd3, 0x12, 0x7c, 0x3f, 0x4a, 0x83, 0xef, 0xab, - 0xa9, 0xf0, 0xed, 0xc9, 0x8b, 0xc1, 0xef, 0x27, 0xa9, 0xf8, 0x7d, 0x2d, 0x1d, 0xbf, 0x3d, 0xc1, - 0x71, 0x00, 0xbe, 0x19, 0x0f, 0xe0, 0x97, 0x92, 0x00, 0xdc, 0x57, 0x7b, 0x00, 0xc1, 0xb7, 0x12, - 0x10, 0x7c, 0x25, 0x11, 0xc1, 0x3d, 0x41, 0x21, 0x08, 0x7f, 0x94, 0x06, 0xe1, 0x57, 0x53, 0x21, - 0xdc, 0xd7, 0x60, 0x14, 0xc3, 0x9f, 0xa4, 0x62, 0xf8, 0xb5, 0x74, 0x0c, 0xf7, 0x35, 0x18, 0x03, - 0xe2, 0xff, 0x97, 0x0e, 0xe2, 0xd7, 0x27, 0x80, 0xb8, 0x27, 0x3b, 0x16, 0xc5, 0x37, 0x62, 0x51, - 0x7c, 0x39, 0x01, 0xc5, 0xfd, 0xc8, 0x92, 0x61, 0x7c, 0x27, 0x11, 0xc6, 0xaf, 0xa4, 0xc0, 0xb8, - 0x27, 0x2b, 0x82, 0xe3, 0x00, 0x65, 0x31, 0xbc, 0xf6, 0x4d, 0x13, 0xca, 0xdb, 0x5c, 0x06, 0xda, - 0x86, 0x1a, 0x83, 0x4d, 0xfe, 0x5d, 0x57, 0x7a, 0x89, 0xdc, 0x9e, 0x80, 0xc5, 0xa8, 0x03, 0x95, - 0x7b, 0xd8, 0xe5, 0xb2, 0x52, 0x6a, 0xe5, 0x76, 0x1a, 0x20, 0x93, 0x45, 0x31, 0x5d, 0x26, 0x2d, - 0x2a, 0x90, 0x4d, 0xdb, 0x13, 0xb0, 0x19, 0x6d, 0x41, 0x95, 0x28, 0x95, 0x8d, 0x39, 0x28, 0xad, - 0x7c, 0x6e, 0xa7, 0x42, 0x34, 0xc2, 0xb0, 0xb0, 0x27, 0xb6, 0x27, 0x83, 0xe9, 0x74, 0x65, 0x74, - 0x7b, 0x4a, 0xcc, 0x46, 0x1f, 0x40, 0x95, 0x7a, 0x2b, 0xff, 0x5b, 0x63, 0x6a, 0x3d, 0xdd, 0x4e, - 0x87, 0x6c, 0x6a, 0x60, 0x1a, 0xa5, 0x5c, 0x58, 0x7a, 0x61, 0xdd, 0x9e, 0x80, 0xdd, 0xdc, 0xc0, - 0x5c, 0x56, 0x4a, 0x85, 0xdd, 0x4e, 0x03, 0x70, 0x61, 0x11, 0x36, 0x10, 0xb0, 0x48, 0xa4, 0xd6, - 0x6e, 0xa7, 0x42, 0x39, 0xfa, 0x04, 0x9a, 0x52, 0x60, 0xf3, 0x75, 0x4d, 0x51, 0x73, 0xb7, 0xa7, - 0x01, 0x76, 0xa4, 0x01, 0x92, 0x43, 0x9b, 0x8b, 0x9f, 0xa6, 0xf6, 0x6e, 0x4f, 0x05, 0xf0, 0xc4, - 0x3a, 0xf4, 0xbd, 0xe2, 0x86, 0x34, 0xbd, 0x08, 0x6f, 0x4f, 0x80, 0x78, 0xb4, 0x0b, 0xb3, 0xcc, - 0x5e, 0x42, 0xde, 0x84, 0x6a, 0xbc, 0x3d, 0x09, 0xeb, 0x89, 0x7e, 0x7d, 0x44, 0x16, 0x52, 0xa7, - 0xa8, 0xca, 0xdb, 0xd3, 0xc0, 0x3e, 0xd1, 0xaf, 0xa4, 0x76, 0x21, 0x7e, 0x9a, 0xea, 0xbc, 0x3d, - 0x15, 0xfc, 0xa3, 0x7d, 0x98, 0x97, 0xf5, 0x2e, 0xde, 0x30, 0x55, 0x95, 0xde, 0x9e, 0x2e, 0x0d, - 0xa0, 0x0f, 0xa1, 0x26, 0xff, 0xd7, 0x1b, 0xa5, 0xd6, 0xeb, 0xed, 0xf4, 0x3c, 0x80, 0x3e, 0x86, - 0xba, 0x00, 0x6d, 0xb1, 0xd8, 0x89, 0x85, 0x7b, 0x7b, 0x72, 0x4e, 0x40, 0xef, 0x40, 0x81, 0x16, - 0xdc, 0x68, 0x31, 0xbe, 0xab, 0xd2, 0x3e, 0x9f, 0x50, 0xba, 0xa3, 0xc7, 0xd0, 0x60, 0x20, 0xcf, - 0x45, 0x3f, 0xe8, 0x1b, 0x31, 0x4b, 0x0a, 0x7d, 0xe0, 0x15, 0xb3, 0xa4, 0xc8, 0x17, 0x4e, 0xff, - 0x0b, 0x8d, 0x80, 0xb3, 0x12, 0xda, 0x95, 0x74, 0x7f, 0x25, 0x92, 0x95, 0x09, 0x2e, 0x4b, 0xc4, - 0xec, 0xc1, 0x9c, 0xf4, 0x65, 0x07, 0xfd, 0x4b, 0x7b, 0x64, 0x56, 0xf0, 0x93, 0x92, 0xf6, 0xe5, - 0x04, 0x06, 0x5f, 0xa8, 0x06, 0x28, 0x64, 0x1a, 0x42, 0xbd, 0x3a, 0xc9, 0x3a, 0x44, 0xf8, 0xb5, - 0x89, 0x06, 0xe2, 0x0a, 0x09, 0xb8, 0x69, 0xbc, 0x42, 0xc2, 0xdf, 0x98, 0xc4, 0x28, 0x24, 0xfa, - 0x91, 0xc8, 0xc7, 0x50, 0x97, 0x7d, 0x34, 0x64, 0xc3, 0xf8, 0x4f, 0x37, 0x64, 0x1b, 0x26, 0x7d, - 0xfe, 0xf0, 0x09, 0x34, 0x83, 0x39, 0x8c, 0x10, 0x03, 0x0b, 0x8a, 0xff, 0xc4, 0x20, 0x08, 0x0f, - 0x09, 0x9f, 0x0a, 0x90, 0x3c, 0x28, 0x7d, 0x14, 0x20, 0x07, 0x56, 0xf4, 0x0b, 0x02, 0x39, 0xb0, - 0x62, 0xbe, 0x24, 0xd8, 0xc8, 0x3f, 0xcd, 0x8e, 0xf6, 0xf7, 0x8b, 0xf4, 0x32, 0xf1, 0xed, 0x7f, - 0x05, 0x00, 0x00, 0xff, 0xff, 0x8b, 0xc6, 0x7e, 0x14, 0x4e, 0x3f, 0x00, 0x00, + // 3712 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xd4, 0x5b, 0x4f, 0x6c, 0x1c, 0x57, + 0x19, 0xf7, 0xfe, 0xdf, 0xfd, 0x76, 0xed, 0x5d, 0x3f, 0x3b, 0xf6, 0x66, 0x1c, 0xc7, 0xc9, 0x24, + 0x69, 0x8d, 0x68, 0x9d, 0xca, 0x05, 0x54, 0x94, 0x94, 0x62, 0x67, 0xdd, 0x78, 0x9b, 0xd8, 0x71, + 0xc7, 0x49, 0x13, 0x42, 0x61, 0x35, 0xde, 0x79, 0xb6, 0x87, 0xec, 0xee, 0x2c, 0x33, 0xb3, 0xad, + 0x53, 0x4e, 0x48, 0x95, 0x10, 0x02, 0xa1, 0x8a, 0x33, 0x42, 0x1c, 0x7a, 0xe3, 0xc4, 0x11, 0xa9, + 0x70, 0x05, 0x24, 0x04, 0x52, 0x85, 0x38, 0x70, 0x28, 0x9c, 0xb8, 0xc1, 0x85, 0x1b, 0x08, 0x09, + 0xbd, 0x7f, 0xf3, 0x7f, 0x66, 0xd7, 0xf6, 0xba, 0xa1, 0xb7, 0x99, 0xef, 0x7d, 0xef, 0x9b, 0xf7, + 0x7e, 0xdf, 0xf7, 0x7e, 0xef, 0x9b, 0xef, 0xcd, 0xc0, 0x54, 0x17, 0xdb, 0xaa, 0xde, 0xdb, 0x37, + 0x56, 0xfa, 0xa6, 0x61, 0x1b, 0xa8, 0x28, 0xee, 0xa5, 0x1a, 0xee, 0xb5, 0xcd, 0xa7, 0x7d, 0x5b, + 0x37, 0x7a, 0xac, 0x4d, 0x82, 0x03, 0xe3, 0x80, 0xeb, 0x49, 0x4b, 0x07, 0x86, 0x71, 0xd0, 0xc1, + 0xd7, 0xe9, 0xdd, 0xde, 0x60, 0xff, 0xba, 0xad, 0x77, 0xb1, 0x65, 0xab, 0xdd, 0xbe, 0x50, 0xee, + 0x19, 0x1a, 0xe6, 0xd7, 0xd5, 0xbe, 0xa1, 0xf7, 0x6c, 0x6c, 0x6a, 0x7b, 0x5c, 0x50, 0x31, 0x4c, + 0x0d, 0x9b, 0x16, 0xbb, 0x93, 0x97, 0x61, 0x52, 0xc1, 0xdf, 0x1e, 0x60, 0xcb, 0xde, 0xc4, 0xaa, + 0x86, 0x4d, 0x34, 0x0f, 0x05, 0xb5, 0xaf, 0xb7, 0x9e, 0xe0, 0xa7, 0xf5, 0xd4, 0xa5, 0xd4, 0x72, + 0x45, 0xc9, 0xab, 0x7d, 0xfd, 0x0e, 0x7e, 0x2a, 0xff, 0x3c, 0x03, 0xf9, 0xf5, 0x41, 0xfb, 0x09, + 0xb6, 0x11, 0x82, 0x6c, 0x4f, 0xed, 0x62, 0xae, 0x40, 0xaf, 0xd1, 0x2b, 0x50, 0xee, 0xab, 0xf6, + 0x61, 0xab, 0xad, 0xf7, 0x0f, 0xb1, 0x59, 0x4f, 0x5f, 0x4a, 0x2d, 0x4f, 0xad, 0xce, 0xaf, 0x78, + 0x26, 0x72, 0x8b, 0xb6, 0xec, 0x0e, 0x74, 0x1b, 0x2b, 0x40, 0x74, 0x99, 0x00, 0xdd, 0x02, 0x68, + 0x9b, 0x58, 0xb5, 0xb1, 0xd6, 0x52, 0xed, 0x7a, 0xe6, 0x52, 0x6a, 0xb9, 0xbc, 0x2a, 0xad, 0xb0, + 0x39, 0xae, 0x88, 0x39, 0xae, 0xdc, 0x17, 0x73, 0x5c, 0x2f, 0xfe, 0xf6, 0x93, 0xa5, 0x89, 0x0f, + 0xfe, 0xba, 0x94, 0x52, 0x4a, 0xbc, 0xdf, 0x9a, 0x8d, 0x5e, 0x82, 0x59, 0x0d, 0xef, 0xab, 0x83, + 0x8e, 0xdd, 0xb2, 0xf0, 0x41, 0x17, 0xf7, 0xec, 0x96, 0xa5, 0xbf, 0x87, 0xeb, 0xd9, 0x4b, 0xa9, + 0xe5, 0x8c, 0x82, 0x78, 0xdb, 0x2e, 0x6b, 0xda, 0xd5, 0xdf, 0xc3, 0xe8, 0x21, 0x9c, 0x17, 0x3d, + 0x4c, 0xac, 0x0d, 0x7a, 0x9a, 0xda, 0x6b, 0x3f, 0x6d, 0x59, 0xed, 0x43, 0xdc, 0xc5, 0xf5, 0x1c, + 0x1d, 0xc5, 0xc2, 0x8a, 0x0b, 0x9e, 0xe2, 0xe8, 0xec, 0x52, 0x15, 0x65, 0x9e, 0xf7, 0x0e, 0x36, + 0x20, 0x0d, 0x16, 0x85, 0x61, 0x77, 0xf6, 0xad, 0xbe, 0x6a, 0xaa, 0x5d, 0x6c, 0x63, 0xd3, 0xaa, + 0xe7, 0xa9, 0xf1, 0x4b, 0x5e, 0x6c, 0x36, 0x9c, 0xcb, 0x1d, 0x47, 0x4f, 0x59, 0xe0, 0x66, 0xa2, + 0x1a, 0xd1, 0x22, 0x40, 0x5f, 0x35, 0xed, 0x1e, 0x36, 0x5b, 0xba, 0x56, 0x2f, 0x50, 0x4f, 0x94, + 0xb8, 0xa4, 0xa9, 0xc9, 0x3a, 0x4c, 0x31, 0x67, 0xdd, 0xd5, 0x2d, 0xbb, 0x69, 0xe3, 0x6e, 0xa4, + 0xd3, 0xfc, 0xd0, 0xa7, 0x4f, 0x04, 0xbd, 0xfc, 0x61, 0x06, 0x66, 0xd8, 0xb3, 0x6e, 0x51, 0x19, + 0x8f, 0x27, 0x74, 0x1d, 0xf2, 0x87, 0x34, 0xa6, 0xea, 0x55, 0x6a, 0x78, 0x7e, 0xc5, 0x89, 0x77, + 0x5f, 0xc8, 0x29, 0x5c, 0x6d, 0xcc, 0x61, 0x15, 0x17, 0x11, 0x99, 0x93, 0x45, 0x44, 0xf6, 0x2c, + 0x23, 0x22, 0x37, 0xfe, 0x88, 0xc8, 0x07, 0x23, 0xe2, 0xab, 0x30, 0xeb, 0xf7, 0x92, 0xd5, 0x37, + 0x7a, 0x16, 0x46, 0xcb, 0x90, 0xdf, 0xa3, 0x72, 0x8a, 0x7b, 0x79, 0xb5, 0xe6, 0xba, 0x89, 0xe9, + 0x2b, 0xbc, 0x5d, 0x7e, 0x08, 0x35, 0x26, 0xb9, 0x8d, 0xed, 0x71, 0x3a, 0x59, 0x7e, 0x15, 0xa6, + 0x3d, 0x86, 0x8f, 0x3d, 0xae, 0xc7, 0x22, 0xfe, 0x1a, 0xb8, 0x83, 0xc7, 0x1b, 0x7f, 0xf2, 0x9c, + 0x40, 0x4d, 0xd8, 0x66, 0xa3, 0x93, 0x3f, 0x48, 0x89, 0x31, 0x93, 0x05, 0x76, 0xe2, 0x47, 0xce, + 0x41, 0xbe, 0x3d, 0x30, 0x2d, 0xc3, 0x14, 0x64, 0xcb, 0xee, 0xd0, 0x2c, 0xe4, 0x3a, 0x7a, 0x57, + 0x67, 0x6b, 0x32, 0xa7, 0xb0, 0x1b, 0x74, 0x01, 0x4a, 0x9a, 0x6e, 0xe2, 0x36, 0x71, 0x3c, 0x8d, + 0xe3, 0x9c, 0xe2, 0x0a, 0xe4, 0x47, 0x80, 0xbc, 0x23, 0xe2, 0x30, 0xae, 0x40, 0x4e, 0xb7, 0x71, + 0xd7, 0xaa, 0xa7, 0x2e, 0x65, 0x96, 0xcb, 0xab, 0xf5, 0x20, 0x8a, 0x82, 0x1f, 0x14, 0xa6, 0x46, + 0x40, 0xe8, 0x1a, 0x26, 0xa6, 0x0f, 0x2e, 0x2a, 0xf4, 0x5a, 0xfe, 0x6e, 0x0a, 0x16, 0x98, 0xf6, + 0x2e, 0xb6, 0xd7, 0x6c, 0xdb, 0xd4, 0xf7, 0x06, 0xe4, 0x91, 0x63, 0x5d, 0xe9, 0xfe, 0xf0, 0x4d, + 0x07, 0xc3, 0xf7, 0x22, 0x5c, 0x88, 0x1e, 0x02, 0x77, 0xc8, 0xfb, 0x29, 0x98, 0x59, 0xd3, 0x34, + 0x13, 0x5b, 0x16, 0xd6, 0xee, 0x91, 0x2d, 0xee, 0x2e, 0xc5, 0x6c, 0x59, 0x20, 0xc9, 0xa2, 0x08, + 0xad, 0xf0, 0xed, 0xcf, 0x55, 0x11, 0xe8, 0xde, 0x82, 0x59, 0xcb, 0x36, 0x4c, 0xf5, 0x00, 0xb7, + 0xc8, 0xfe, 0xd9, 0x52, 0x99, 0x35, 0x4e, 0x8b, 0xd3, 0x2b, 0x74, 0x53, 0xdd, 0x36, 0x34, 0xcc, + 0x1f, 0xa3, 0x20, 0xae, 0xee, 0x91, 0xc9, 0x7f, 0x4c, 0xc3, 0x1c, 0xe7, 0x94, 0x87, 0xa6, 0xee, + 0x04, 0xe3, 0xbd, 0x8e, 0x76, 0xa2, 0xe0, 0xf0, 0xac, 0x80, 0x8a, 0x88, 0x77, 0x82, 0x1e, 0xe1, + 0x39, 0x8e, 0x11, 0xbd, 0x46, 0x75, 0x28, 0x70, 0x96, 0xe3, 0x04, 0x27, 0x6e, 0xd1, 0x0d, 0x00, + 0x97, 0xcd, 0x46, 0xa1, 0x31, 0x8f, 0x3a, 0xba, 0x01, 0x52, 0x57, 0x3d, 0x12, 0xac, 0x85, 0x35, + 0x3f, 0x95, 0xe6, 0xe8, 0x93, 0xe6, 0xbb, 0xea, 0xd1, 0x86, 0x50, 0xf0, 0xf2, 0x69, 0x03, 0x00, + 0x1f, 0xf5, 0x75, 0x53, 0xa5, 0xf1, 0x9a, 0x3f, 0xc6, 0xee, 0xe2, 0xe9, 0x27, 0x7f, 0x9c, 0x82, + 0x79, 0x3f, 0xa2, 0xcc, 0xe3, 0x04, 0xd2, 0x4d, 0xa8, 0xa9, 0xc2, 0xe7, 0x2d, 0xea, 0x45, 0x11, + 0xe7, 0x8b, 0x2e, 0xb8, 0x11, 0x51, 0xa1, 0x54, 0x9d, 0x6e, 0xf4, 0xde, 0x42, 0x2f, 0xc3, 0xa4, + 0x69, 0x18, 0x76, 0xab, 0xaf, 0xe3, 0x36, 0x76, 0x02, 0x70, 0xbd, 0x4a, 0x86, 0xf4, 0x97, 0x4f, + 0x96, 0x0a, 0x3b, 0x44, 0xde, 0x6c, 0x28, 0x65, 0xa2, 0xc5, 0x6e, 0x34, 0xba, 0x39, 0x99, 0xfa, + 0x3b, 0xaa, 0x8d, 0x69, 0xbe, 0x94, 0xa1, 0x5d, 0xe6, 0x79, 0x97, 0x2a, 0xd5, 0xda, 0x61, 0xed, + 0x77, 0xf0, 0x53, 0x05, 0xfa, 0xce, 0xb5, 0xfc, 0x1f, 0x77, 0x52, 0xb7, 0x8c, 0x2e, 0x19, 0xd1, + 0x33, 0x8f, 0x93, 0x17, 0xa0, 0xc0, 0x83, 0x82, 0x07, 0x09, 0xf2, 0x04, 0xc9, 0x0e, 0xbb, 0x52, + 0x84, 0x0a, 0xba, 0x01, 0x55, 0xc3, 0xd4, 0x0f, 0xf4, 0x9e, 0xda, 0x11, 0xc0, 0xe7, 0x28, 0xf0, + 0x51, 0x0b, 0x6c, 0x4a, 0xa8, 0x32, 0xb0, 0xe5, 0x4d, 0xa8, 0x07, 0x26, 0xef, 0xba, 0xd4, 0x33, + 0x8c, 0xd4, 0xd0, 0x61, 0xc8, 0x3f, 0x4e, 0xc1, 0x79, 0x6e, 0xaa, 0x61, 0xbc, 0xdb, 0xeb, 0x18, + 0xaa, 0xf6, 0xcc, 0x91, 0x94, 0xff, 0x90, 0x02, 0x29, 0x34, 0xa8, 0xb3, 0x08, 0x5a, 0x0f, 0x56, + 0xe9, 0xe1, 0x2e, 0x3b, 0x79, 0xb4, 0xfe, 0x28, 0x05, 0xe7, 0xf8, 0x84, 0x9a, 0xbd, 0x7d, 0xe3, + 0xd9, 0x23, 0xfc, 0xba, 0x43, 0xb2, 0x6c, 0x3c, 0x91, 0xe1, 0x33, 0x1c, 0x12, 0xb2, 0x8b, 0x8b, + 0x65, 0xe8, 0xcb, 0x1d, 0x9e, 0xe1, 0xd4, 0x7e, 0x9a, 0x72, 0x16, 0x87, 0x3f, 0xe5, 0x18, 0x6f, + 0xe8, 0x04, 0x82, 0x21, 0x3d, 0x7a, 0x30, 0xfc, 0x30, 0x0d, 0x73, 0x24, 0x69, 0xe0, 0x83, 0xb4, + 0xce, 0x02, 0xb2, 0x39, 0xc8, 0xf7, 0x4d, 0xbc, 0xaf, 0x1f, 0x71, 0xd0, 0xf8, 0x1d, 0x5a, 0x82, + 0xb2, 0x65, 0xab, 0xa6, 0xdd, 0x52, 0xf7, 0x89, 0x87, 0x69, 0x08, 0x2b, 0x40, 0x45, 0x6b, 0x44, + 0x42, 0x92, 0x08, 0xdc, 0xd3, 0x5a, 0x7b, 0x78, 0x9f, 0xe4, 0x30, 0x59, 0x96, 0x44, 0xe0, 0x9e, + 0xb6, 0x4e, 0x05, 0x24, 0x81, 0x32, 0x31, 0x49, 0xb1, 0xf4, 0x77, 0xd8, 0xee, 0x55, 0x54, 0x5c, + 0x81, 0x9b, 0x74, 0xe5, 0xbd, 0x49, 0xd7, 0x22, 0x00, 0x99, 0x45, 0x6b, 0xbf, 0xa3, 0x1e, 0x58, + 0xf4, 0x45, 0xab, 0xa0, 0x94, 0x88, 0xe4, 0x75, 0x22, 0xa0, 0xdb, 0x93, 0x1f, 0x0e, 0xd7, 0x5d, + 0x37, 0xfd, 0xb9, 0xd7, 0x73, 0x2e, 0x1c, 0x31, 0x3d, 0x56, 0x86, 0x64, 0x62, 0x12, 0x86, 0xac, + 0x78, 0x99, 0xa3, 0x31, 0x95, 0xf2, 0xc4, 0xd4, 0xf1, 0xd8, 0x60, 0x01, 0x4a, 0xba, 0xd5, 0xe2, + 0x28, 0x67, 0xe8, 0x23, 0x8a, 0xba, 0xb5, 0x43, 0xef, 0xe5, 0x1f, 0xd0, 0x20, 0x8c, 0x48, 0xf5, + 0x4e, 0xe4, 0xe5, 0x25, 0x28, 0x33, 0xbf, 0xb6, 0x3c, 0x49, 0x1f, 0x30, 0xd1, 0xf6, 0x08, 0xa9, + 0xdf, 0x02, 0xe1, 0xf8, 0xa8, 0xa4, 0xef, 0x5e, 0x47, 0x93, 0x37, 0x00, 0xed, 0x98, 0xc6, 0xb7, + 0x70, 0xdb, 0x4b, 0x4d, 0xc7, 0x1e, 0xa3, 0xfc, 0x0a, 0xcc, 0xf8, 0xcc, 0xf0, 0xec, 0xf9, 0x32, + 0x54, 0xfa, 0x4c, 0xdc, 0xb2, 0xd4, 0x8e, 0x08, 0xd3, 0x32, 0x97, 0xed, 0xaa, 0x1d, 0x5b, 0xfe, + 0x7e, 0x01, 0xf2, 0xf7, 0xf6, 0xc8, 0x6d, 0x6c, 0x38, 0x5f, 0x83, 0x29, 0x37, 0x83, 0xf2, 0x70, + 0xc1, 0xa4, 0x23, 0xdd, 0xe1, 0xa4, 0xf0, 0x0e, 0x36, 0x2d, 0x37, 0xb9, 0x17, 0xb7, 0x64, 0x3a, + 0x96, 0xad, 0xda, 0x03, 0x8b, 0x86, 0xf4, 0x94, 0x77, 0x3a, 0xec, 0xd1, 0x2b, 0xbb, 0xb4, 0x59, + 0xe1, 0x6a, 0xe8, 0x45, 0x28, 0x59, 0xb6, 0x89, 0xd5, 0x2e, 0x01, 0x34, 0x47, 0x17, 0x77, 0x8d, + 0x2f, 0xee, 0xe2, 0x2e, 0x6d, 0x68, 0x36, 0x94, 0x22, 0x53, 0x69, 0x6a, 0x81, 0x3a, 0x40, 0xfe, + 0x64, 0x25, 0x98, 0x35, 0xf2, 0x4c, 0xf2, 0x74, 0x62, 0xa3, 0x70, 0x0c, 0x1b, 0x45, 0xd6, 0x6d, + 0x8d, 0xa4, 0xe0, 0x2c, 0xf3, 0xc3, 0xd4, 0x46, 0xf1, 0x38, 0xe3, 0xe0, 0xfd, 0xd6, 0x6c, 0x74, + 0x1b, 0xea, 0x2e, 0xda, 0x04, 0x27, 0x4d, 0xb5, 0xd5, 0x56, 0xcf, 0xe8, 0xb5, 0x71, 0xbd, 0x44, + 0xa1, 0x98, 0xe4, 0x50, 0xe4, 0xb6, 0x89, 0x50, 0x99, 0x73, 0xd4, 0xb7, 0xb8, 0x36, 0x95, 0xa3, + 0x17, 0x01, 0x85, 0x0d, 0xd5, 0x81, 0xba, 0x6e, 0x3a, 0xd4, 0x07, 0xbd, 0x00, 0x68, 0x5f, 0x3f, + 0x0a, 0xe6, 0xc8, 0x65, 0x4a, 0xef, 0x35, 0xda, 0xe2, 0x4d, 0x8e, 0x37, 0x61, 0x3a, 0x5c, 0x64, + 0xa8, 0x0c, 0xcf, 0xce, 0x6b, 0x66, 0xb0, 0xba, 0xf0, 0x00, 0xce, 0x45, 0x57, 0x15, 0x26, 0x47, + 0xac, 0x2a, 0xcc, 0xe2, 0x98, 0x72, 0x82, 0x6d, 0xd8, 0x6a, 0x87, 0x4d, 0x63, 0x8a, 0x4e, 0xa3, + 0x44, 0x25, 0x74, 0xfc, 0x4b, 0x50, 0xd6, 0x7b, 0x1d, 0xbd, 0x87, 0x59, 0x7b, 0x95, 0xb6, 0x03, + 0x13, 0x09, 0x05, 0x13, 0x77, 0x0d, 0x9b, 0x2b, 0xd4, 0x98, 0x02, 0x13, 0x11, 0x05, 0xf9, 0x4d, + 0xc8, 0xb3, 0xa8, 0x45, 0x65, 0x28, 0x34, 0xb7, 0xdf, 0x5a, 0xbb, 0xdb, 0x6c, 0xd4, 0x26, 0xd0, + 0x24, 0x94, 0x1e, 0xec, 0xdc, 0xbd, 0xb7, 0xd6, 0x68, 0x6e, 0xdf, 0xae, 0xa5, 0xd0, 0x14, 0xc0, + 0xad, 0x7b, 0x5b, 0x5b, 0xcd, 0xfb, 0xf7, 0xc9, 0x7d, 0x9a, 0x34, 0xf3, 0xfb, 0x8d, 0x46, 0x2d, + 0x83, 0x2a, 0x50, 0x6c, 0x6c, 0xdc, 0xdd, 0xa0, 0x8d, 0x59, 0xf9, 0xfd, 0x0c, 0x20, 0xb6, 0x20, + 0xd6, 0xf1, 0x81, 0xde, 0x3b, 0xcd, 0x6b, 0xf9, 0xd9, 0x2c, 0x64, 0x7f, 0x80, 0x67, 0x4f, 0x16, + 0xe0, 0x91, 0xa1, 0x53, 0x18, 0x6b, 0xe8, 0x14, 0x4f, 0x13, 0x3a, 0xf2, 0xaf, 0xd3, 0x30, 0xe3, + 0x73, 0x03, 0x67, 0xd3, 0x33, 0x83, 0xd5, 0x47, 0x77, 0xd9, 0xa1, 0x74, 0x17, 0x09, 0x60, 0x6e, + 0xac, 0x00, 0xe6, 0x4f, 0x05, 0xe0, 0x3f, 0x52, 0x02, 0x40, 0xdf, 0xdb, 0xe1, 0xf1, 0x03, 0xd9, + 0x07, 0x4c, 0x6a, 0x28, 0x30, 0x49, 0xd4, 0x99, 0x3e, 0x3d, 0x75, 0x66, 0x62, 0xa8, 0x53, 0x9e, + 0x83, 0x59, 0xff, 0x74, 0x79, 0x51, 0xe7, 0x27, 0x29, 0xa8, 0xb1, 0x86, 0xd3, 0x94, 0x1c, 0xcf, + 0x2a, 0xec, 0xe4, 0x57, 0x61, 0xda, 0x33, 0x3a, 0xb7, 0x6e, 0x69, 0x50, 0x61, 0xb8, 0x6e, 0xc9, + 0x94, 0x15, 0xde, 0x2e, 0xff, 0x22, 0x2d, 0xfa, 0x9f, 0xb6, 0x86, 0x18, 0x39, 0xbd, 0xcf, 0x41, + 0xcd, 0x33, 0x3d, 0x6f, 0x3a, 0x5d, 0x75, 0x27, 0xc8, 0xf2, 0x6a, 0x9f, 0x2a, 0x2f, 0x48, 0x66, + 0x02, 0xaa, 0xb7, 0x58, 0x65, 0xd2, 0x97, 0x42, 0x67, 0x63, 0x53, 0xe8, 0x9c, 0x37, 0x85, 0x6e, + 0x42, 0x95, 0x4d, 0xb9, 0xa5, 0xf7, 0xda, 0x9d, 0x81, 0x86, 0xdd, 0xf5, 0x11, 0xc0, 0x46, 0x54, + 0x23, 0x9b, 0x5c, 0x4f, 0x99, 0x62, 0x1d, 0xc5, 0xbd, 0xfc, 0x48, 0x10, 0xfc, 0x88, 0x45, 0x4e, + 0xbf, 0xd9, 0xa4, 0x22, 0xe7, 0x6f, 0x32, 0x30, 0xe5, 0xd7, 0x8e, 0x08, 0x90, 0xd4, 0x90, 0x00, + 0x49, 0xc7, 0xe5, 0x6d, 0x99, 0xd1, 0xf2, 0x36, 0x7f, 0x22, 0x96, 0x1d, 0x43, 0x22, 0x96, 0x1b, + 0x43, 0x22, 0x96, 0x1f, 0x7f, 0x22, 0x56, 0x38, 0x3d, 0x9b, 0x14, 0xe3, 0xd8, 0xe4, 0x0b, 0x30, + 0x17, 0x1d, 0x4d, 0x48, 0x82, 0xa2, 0xd3, 0x3d, 0xc5, 0xde, 0x79, 0xc4, 0xbd, 0xfc, 0x61, 0x0a, + 0xea, 0x9e, 0x4d, 0xeb, 0x94, 0x67, 0x09, 0x67, 0xc6, 0x39, 0x6f, 0xc0, 0xf9, 0x88, 0x51, 0xf2, + 0x75, 0x70, 0x3c, 0xba, 0x97, 0xbf, 0x23, 0x6c, 0xbd, 0xae, 0xf7, 0x74, 0xeb, 0xf0, 0x94, 0x53, + 0x3e, 0xe6, 0xc3, 0x2f, 0x80, 0x14, 0xf5, 0x70, 0xce, 0xfc, 0xff, 0x4c, 0x43, 0x79, 0x57, 0xb5, + 0x45, 0xbf, 0xb3, 0x4b, 0x1d, 0x4e, 0x55, 0x1e, 0x6f, 0xc2, 0x24, 0x5d, 0x76, 0x64, 0xf3, 0xd7, + 0x54, 0x1b, 0x1f, 0x6b, 0xb5, 0x55, 0x44, 0xd7, 0x86, 0x6a, 0x63, 0xb4, 0x05, 0x55, 0xb7, 0xe8, + 0xcd, 0x8c, 0x1d, 0x67, 0xd9, 0x4d, 0xb9, 0x9d, 0xa9, 0xb9, 0xeb, 0x30, 0x63, 0xa9, 0x36, 0xee, + 0x74, 0x74, 0x9a, 0x80, 0x1f, 0xf4, 0x54, 0x7b, 0x60, 0xf2, 0xf7, 0x1f, 0x05, 0x39, 0x4d, 0xbb, + 0xa2, 0x45, 0xfe, 0x5b, 0x1a, 0x0a, 0xfc, 0xfd, 0xe4, 0xb8, 0x59, 0xc3, 0x17, 0xa1, 0xd8, 0x37, + 0x2c, 0xdd, 0x16, 0x04, 0x58, 0x5e, 0x3d, 0xef, 0xc6, 0x0a, 0xb7, 0xb9, 0xc3, 0x15, 0x14, 0x47, + 0x15, 0xbd, 0x0a, 0x33, 0xae, 0xeb, 0x9e, 0xe0, 0xa7, 0x9c, 0x19, 0x32, 0x51, 0xcc, 0xe0, 0xae, + 0xf2, 0x3b, 0xf8, 0x29, 0x23, 0x85, 0x2b, 0x30, 0xe9, 0xeb, 0xce, 0xab, 0x3d, 0x15, 0xaf, 0x26, + 0x5a, 0x81, 0x19, 0xf2, 0xf6, 0xe1, 0x39, 0xc0, 0xa0, 0x6b, 0x9f, 0x1d, 0x5c, 0x4c, 0x93, 0x26, + 0xe7, 0xe4, 0xa2, 0x41, 0xde, 0xe1, 0x56, 0x9d, 0x7c, 0x0e, 0x6b, 0x2d, 0xfe, 0x7e, 0x43, 0x7b, + 0xb0, 0xe3, 0x54, 0x77, 0xc0, 0x4d, 0xda, 0x46, 0xfb, 0x3c, 0x0f, 0x79, 0x7a, 0x6a, 0x60, 0xd5, + 0x0b, 0x74, 0xf7, 0xa9, 0xba, 0x93, 0xa7, 0x75, 0x34, 0x85, 0x37, 0xcb, 0x9b, 0x90, 0xa3, 0x02, + 0xb4, 0x00, 0x25, 0x76, 0xce, 0xd0, 0x1b, 0x74, 0x29, 0xbe, 0x39, 0xa5, 0x48, 0x05, 0xdb, 0x83, + 0x2e, 0x92, 0x21, 0xdb, 0x33, 0x34, 0x91, 0x6f, 0x4d, 0x71, 0x1c, 0xf2, 0xdb, 0x86, 0x86, 0x9b, + 0x0d, 0x85, 0xb6, 0xc9, 0x9b, 0x50, 0x0d, 0xe0, 0x4a, 0x5e, 0xb7, 0xfa, 0xaa, 0x69, 0x13, 0x93, + 0x7b, 0xbc, 0x76, 0x9e, 0x53, 0x68, 0x59, 0x65, 0x9b, 0x4a, 0xc8, 0xd6, 0xac, 0xf7, 0x34, 0x7c, + 0x24, 0x8e, 0x14, 0xe9, 0x8d, 0xfc, 0xa7, 0x14, 0xcc, 0x70, 0x53, 0xa7, 0x7b, 0x65, 0xfa, 0x74, + 0x62, 0xe6, 0x39, 0xa8, 0x76, 0xd5, 0xa3, 0x16, 0x3d, 0x62, 0x60, 0x05, 0x50, 0x5e, 0x3f, 0x9d, + 0xec, 0xaa, 0x47, 0x6e, 0xbd, 0x53, 0xfe, 0x7d, 0x0a, 0x66, 0xfd, 0xd3, 0xe2, 0x0c, 0xf9, 0x12, + 0x80, 0x78, 0x3d, 0x77, 0xc6, 0x39, 0xcd, 0xc7, 0x59, 0x12, 0x35, 0xe5, 0x86, 0x52, 0xe2, 0x4a, + 0xcd, 0xe8, 0x9a, 0x6b, 0x7a, 0x1c, 0x35, 0xd7, 0x63, 0x14, 0xe0, 0xff, 0x9c, 0x76, 0xa6, 0x73, + 0xca, 0x17, 0x82, 0xe3, 0xcf, 0x3f, 0x66, 0x99, 0xa6, 0x4f, 0xba, 0x4c, 0x33, 0xa3, 0x2f, 0xd3, + 0x6c, 0xdc, 0x32, 0xbd, 0x0d, 0x93, 0x83, 0x7e, 0xc7, 0x50, 0xb5, 0x96, 0x89, 0xad, 0x41, 0xc7, + 0xe6, 0x67, 0x4f, 0x72, 0x38, 0x84, 0x08, 0xa8, 0x0f, 0xfa, 0xfc, 0x08, 0x66, 0xd0, 0xb1, 0x95, + 0xca, 0xc0, 0x73, 0x27, 0x7f, 0xcf, 0xad, 0xb6, 0x87, 0x54, 0x93, 0x97, 0xe9, 0xf3, 0x50, 0xa0, + 0xa7, 0xc4, 0xce, 0x51, 0x61, 0x70, 0xa5, 0xe6, 0x49, 0x73, 0x53, 0x43, 0xd7, 0x20, 0x7b, 0xa8, + 0x5a, 0x87, 0xfc, 0xc3, 0xa6, 0x69, 0x71, 0x3c, 0x46, 0x1f, 0xb7, 0xa9, 0x5a, 0x87, 0x0a, 0x6d, + 0x96, 0xff, 0x9b, 0x86, 0x0a, 0xd9, 0xf0, 0x84, 0x0b, 0xd0, 0x6a, 0x70, 0x41, 0x95, 0x57, 0xcf, + 0x79, 0xe6, 0xe7, 0xee, 0x8d, 0x9e, 0x55, 0x15, 0x20, 0x81, 0x74, 0x3c, 0x09, 0x64, 0x3c, 0x24, + 0x10, 0x3e, 0xfc, 0xcc, 0x8d, 0x70, 0xf8, 0xf9, 0x26, 0x9c, 0x73, 0x4e, 0x00, 0x3d, 0xeb, 0x91, + 0xa4, 0xf6, 0x23, 0x2c, 0x8e, 0x19, 0xd1, 0xd7, 0x95, 0x59, 0xe1, 0xed, 0xb4, 0x70, 0xe2, 0xed, + 0x34, 0x66, 0xff, 0x2b, 0xc6, 0xee, 0x7f, 0x0d, 0xe7, 0x88, 0xcb, 0xff, 0x0e, 0x8a, 0x3e, 0x0f, + 0xd3, 0xd6, 0xa0, 0xdd, 0xc6, 0x96, 0xb5, 0x3f, 0xe8, 0xb4, 0x38, 0xd3, 0xb3, 0x68, 0xa8, 0xb9, + 0x0d, 0x3b, 0x8c, 0xe2, 0x7f, 0x97, 0x76, 0xe2, 0x69, 0x4b, 0x7d, 0x82, 0xd9, 0x2e, 0xf1, 0x7f, + 0xce, 0xa9, 0x9f, 0xc6, 0x3e, 0x1c, 0xbb, 0xaf, 0xe6, 0x62, 0xf7, 0x55, 0x56, 0xf6, 0x0f, 0x41, + 0xc9, 0xf3, 0xc3, 0x9f, 0xb9, 0x07, 0xbf, 0xe3, 0x48, 0xd7, 0x17, 0x42, 0x48, 0x9f, 0x1a, 0x57, + 0xf9, 0x63, 0xf7, 0x18, 0x38, 0x2a, 0x57, 0xff, 0x6c, 0xee, 0x44, 0xbf, 0x72, 0x27, 0x35, 0x96, + 0x97, 0x86, 0xe3, 0xa3, 0x70, 0x13, 0x0a, 0x8c, 0xf4, 0xc5, 0xe4, 0x63, 0x58, 0xdf, 0x81, 0x9b, + 0xb0, 0xbe, 0xe8, 0x12, 0x22, 0x7c, 0xaf, 0xd6, 0xa7, 0x4b, 0xf8, 0x8b, 0xb0, 0x10, 0x09, 0x24, + 0x0f, 0xf0, 0x8f, 0x52, 0x80, 0x78, 0xfb, 0xa9, 0xaa, 0x43, 0x89, 0x91, 0xbd, 0x0e, 0x55, 0x56, + 0xed, 0x69, 0x8d, 0x1e, 0xe0, 0x53, 0xac, 0x87, 0x93, 0x78, 0x3a, 0x25, 0x9f, 0x8c, 0xa7, 0xe4, + 0x23, 0x3f, 0x76, 0xd2, 0x4a, 0x5f, 0xa1, 0xe6, 0xba, 0xbf, 0x50, 0x13, 0x7e, 0xcc, 0x28, 0x95, + 0x1a, 0x37, 0xfb, 0x75, 0x2a, 0x35, 0xde, 0x25, 0x9a, 0x1a, 0x7d, 0x89, 0x7e, 0x94, 0x72, 0x3e, + 0x24, 0x08, 0x7c, 0x3e, 0x72, 0xe6, 0x64, 0x3d, 0x06, 0xe8, 0xe5, 0x5f, 0x66, 0xdc, 0xcf, 0x17, + 0x02, 0x1f, 0x9a, 0x7c, 0x36, 0xe9, 0x25, 0x7e, 0x9f, 0xc8, 0xc6, 0xbf, 0x7f, 0x5d, 0x86, 0x4a, + 0xc4, 0x57, 0x69, 0x65, 0xcb, 0x73, 0xd8, 0x16, 0xb3, 0xc5, 0xe5, 0x4f, 0xba, 0xc5, 0x15, 0x22, + 0xb6, 0xb8, 0x17, 0x21, 0xdb, 0xc3, 0x47, 0xe2, 0xd4, 0x32, 0xc1, 0x8b, 0x54, 0x4d, 0x7e, 0x17, + 0x2a, 0xeb, 0xaa, 0xdd, 0x3e, 0x3c, 0x71, 0xbc, 0x7d, 0x09, 0x8a, 0x26, 0x6b, 0x10, 0xab, 0x49, + 0xf2, 0x7c, 0xdb, 0xe9, 0x31, 0x4d, 0x97, 0x93, 0xa3, 0x2b, 0xff, 0x1d, 0xa0, 0x16, 0x6c, 0x46, + 0x0d, 0x98, 0xe4, 0x47, 0xf4, 0xac, 0x8c, 0xc8, 0x17, 0xd1, 0x62, 0xf0, 0x6b, 0x51, 0xdf, 0x17, + 0xde, 0x9b, 0x13, 0x4a, 0x65, 0xcf, 0x23, 0x46, 0x37, 0x80, 0x9f, 0xea, 0xb7, 0x0e, 0xb0, 0xfb, + 0x39, 0x79, 0xc0, 0x84, 0x5b, 0xc9, 0xdf, 0x9c, 0x50, 0x4a, 0x7b, 0x42, 0xe6, 0x19, 0x82, 0x46, + 0x99, 0x90, 0xf3, 0x67, 0x68, 0x08, 0xbe, 0x0d, 0xc7, 0x1d, 0x02, 0x13, 0xa3, 0xaf, 0x38, 0xdf, + 0x1a, 0x74, 0x74, 0xcb, 0x76, 0xea, 0x39, 0x11, 0x1f, 0xbd, 0xba, 0x16, 0xf8, 0xa0, 0x89, 0x10, + 0x7d, 0x03, 0xe6, 0x78, 0x7f, 0x0b, 0xdb, 0x2d, 0xd5, 0xfd, 0xe6, 0x80, 0x97, 0x76, 0xae, 0x05, + 0x4d, 0x45, 0x7e, 0x26, 0xb1, 0x39, 0xa1, 0xcc, 0xee, 0x45, 0x34, 0xa3, 0x35, 0xa8, 0xf0, 0x4a, + 0xf8, 0x1e, 0x49, 0x09, 0x78, 0x89, 0xe7, 0x42, 0xb0, 0x2c, 0xec, 0x7d, 0x15, 0xdf, 0x9c, 0x50, + 0xca, 0x86, 0x2b, 0x25, 0x38, 0x71, 0x13, 0x6d, 0x9a, 0xa8, 0xf2, 0x24, 0x79, 0x31, 0x68, 0xc3, + 0xf7, 0xa2, 0x48, 0x70, 0x32, 0x3c, 0x62, 0xe2, 0x2a, 0x6e, 0x85, 0xb8, 0xaa, 0x18, 0x74, 0x55, + 0xf0, 0xd0, 0x85, 0xb8, 0xca, 0x10, 0x32, 0x02, 0x32, 0xef, 0x4c, 0x41, 0x2e, 0x05, 0x41, 0x0e, + 0x1d, 0x6a, 0x10, 0x90, 0x0d, 0x47, 0x88, 0xee, 0xc3, 0x8c, 0x17, 0x05, 0xe1, 0x70, 0xa0, 0x76, + 0xe4, 0x48, 0x30, 0x82, 0x5e, 0x9f, 0x36, 0x82, 0x6d, 0xe8, 0x21, 0xcc, 0x72, 0xab, 0xfb, 0x74, + 0x43, 0x15, 0x66, 0xcb, 0xd4, 0xec, 0x95, 0xa0, 0xd9, 0x88, 0xf4, 0x65, 0x73, 0x42, 0x41, 0x46, + 0xa8, 0x91, 0x20, 0x2e, 0x08, 0x86, 0x79, 0xad, 0x12, 0x44, 0x3c, 0xa2, 0x82, 0x42, 0x10, 0xb7, + 0x3c, 0x62, 0x74, 0x1b, 0xa6, 0x84, 0x15, 0xee, 0x38, 0x76, 0x3e, 0x7f, 0x31, 0x64, 0x26, 0xe8, + 0x39, 0xf1, 0x74, 0xee, 0xba, 0xfb, 0x30, 0x23, 0x0c, 0x75, 0xd5, 0x27, 0x98, 0xd3, 0x24, 0x3d, + 0xa1, 0x8f, 0x4a, 0x86, 0x42, 0xef, 0x21, 0x04, 0x3d, 0x2b, 0xd8, 0x46, 0xd0, 0xf3, 0x4d, 0x52, + 0xa0, 0x57, 0x0d, 0xa2, 0x17, 0x9b, 0x75, 0x13, 0xf4, 0xac, 0x50, 0x23, 0x7a, 0x0c, 0xe7, 0x84, + 0x61, 0xbf, 0x5f, 0x6a, 0xd4, 0xf2, 0xd5, 0x90, 0xe5, 0x68, 0xc7, 0x88, 0x39, 0xfb, 0x3c, 0xb3, + 0xe6, 0x52, 0x3f, 0x8d, 0xc4, 0xe9, 0xe0, 0x72, 0x0a, 0x67, 0x50, 0x64, 0x39, 0x59, 0xae, 0x14, + 0x6d, 0x41, 0x4d, 0x98, 0xd0, 0xf8, 0x1e, 0x5a, 0x47, 0xc1, 0xc3, 0xa9, 0xe8, 0x1c, 0x61, 0x73, + 0x42, 0xa9, 0x5a, 0xfe, 0x96, 0xf5, 0x12, 0x14, 0x78, 0xab, 0xfc, 0x06, 0x4c, 0x72, 0x9e, 0xe5, + 0x5b, 0xf2, 0x97, 0xa1, 0x64, 0xf2, 0x6b, 0x41, 0xd9, 0x0b, 0x21, 0xca, 0x66, 0xed, 0x94, 0xb3, + 0x5d, 0x6d, 0xf9, 0xdf, 0x00, 0xd3, 0x21, 0x05, 0xb4, 0x11, 0xcd, 0xda, 0x17, 0xe3, 0x58, 0x9b, + 0x75, 0x0d, 0xd1, 0xf6, 0xcd, 0x08, 0xda, 0x5e, 0x88, 0xa4, 0x6d, 0xc7, 0x80, 0x87, 0xb7, 0x37, + 0xa2, 0x79, 0xfb, 0x62, 0x1c, 0x6f, 0x07, 0x07, 0xc1, 0x5d, 0xf9, 0x5a, 0x14, 0x71, 0x5f, 0x88, + 0x26, 0x6e, 0xc7, 0x84, 0x97, 0xb9, 0xbf, 0x39, 0x84, 0xb9, 0x9f, 0x1b, 0xc6, 0xdc, 0x8e, 0xd5, + 0x68, 0xea, 0x5e, 0x8f, 0xa4, 0xee, 0xc5, 0x18, 0xea, 0x76, 0x8c, 0xf9, 0xb8, 0x7b, 0x23, 0x9a, + 0xbb, 0x2f, 0xc6, 0x71, 0xb7, 0x8b, 0x95, 0x8f, 0xbc, 0x6f, 0x46, 0x90, 0xf7, 0x42, 0x24, 0x79, + 0xbb, 0x0e, 0x73, 0xd9, 0xfb, 0xb5, 0x28, 0xf6, 0xbe, 0x10, 0xcd, 0xde, 0x2e, 0xd2, 0x1e, 0xfa, + 0x7e, 0x90, 0x44, 0xdf, 0x57, 0x12, 0xe9, 0xdb, 0xb1, 0x17, 0xc1, 0xdf, 0x8f, 0x12, 0xf9, 0xfb, + 0x6a, 0x32, 0x7f, 0x3b, 0x86, 0xa3, 0x08, 0x7c, 0x23, 0x9a, 0xc0, 0x2f, 0xc6, 0x11, 0xb8, 0x0b, + 0xbb, 0x8f, 0xc1, 0x37, 0x63, 0x18, 0x7c, 0x29, 0x96, 0xc1, 0x1d, 0x43, 0x01, 0x0a, 0x7f, 0x90, + 0x44, 0xe1, 0x57, 0x12, 0x29, 0xdc, 0x45, 0x30, 0xcc, 0xe1, 0x8f, 0x12, 0x39, 0xfc, 0x6a, 0x32, + 0x87, 0xbb, 0x08, 0x46, 0x90, 0xf8, 0xd7, 0x93, 0x49, 0xfc, 0xda, 0x10, 0x12, 0x77, 0x6c, 0x47, + 0xb2, 0xf8, 0x7a, 0x24, 0x8b, 0x2f, 0xc6, 0xb0, 0xb8, 0xbb, 0xb2, 0xbc, 0x34, 0xbe, 0x1d, 0x4b, + 0xe3, 0x97, 0x13, 0x68, 0xdc, 0xb1, 0x15, 0xe2, 0x71, 0x80, 0xa2, 0x68, 0x5e, 0xfd, 0xd7, 0x34, + 0x14, 0xb7, 0xb8, 0x0d, 0xb4, 0x05, 0x15, 0x46, 0x9b, 0xfc, 0x5f, 0xd8, 0xe4, 0x14, 0x59, 0x1a, + 0xc2, 0xc5, 0xa8, 0x01, 0xa5, 0xdb, 0xd8, 0xe6, 0xb6, 0x12, 0x72, 0x65, 0x29, 0x89, 0x90, 0xc9, + 0xa0, 0x18, 0x96, 0x71, 0x83, 0xf2, 0xed, 0xa6, 0xd2, 0x10, 0x6e, 0x46, 0x9b, 0x50, 0x26, 0xa0, + 0xb2, 0x36, 0x0b, 0x25, 0xa5, 0xcf, 0x52, 0x22, 0x45, 0x23, 0x0c, 0xb3, 0xbb, 0x62, 0x7a, 0x5e, + 0x32, 0x1d, 0x2d, 0x8d, 0x96, 0x46, 0xe4, 0x6c, 0xf4, 0x06, 0x94, 0x69, 0xb4, 0xf2, 0xef, 0x70, + 0x13, 0xf3, 0x69, 0x29, 0x99, 0xb2, 0xa9, 0x83, 0xe9, 0x2a, 0xe5, 0xc6, 0x92, 0x13, 0x6b, 0x69, + 0x08, 0x77, 0x73, 0x07, 0x73, 0x5b, 0x09, 0x19, 0xb6, 0x94, 0x44, 0xe0, 0xc2, 0x23, 0xac, 0xc1, + 0xe7, 0x91, 0x50, 0xae, 0x2d, 0x25, 0x52, 0x39, 0x7a, 0x1b, 0xa6, 0x3d, 0x0b, 0x9b, 0x8f, 0x6b, + 0x84, 0x9c, 0x5b, 0x1a, 0x85, 0xd8, 0x51, 0x0b, 0x90, 0x77, 0x69, 0x73, 0xf3, 0xa3, 0xe4, 0xde, + 0xd2, 0x48, 0x04, 0x4f, 0xbc, 0x43, 0x9f, 0x2b, 0x8e, 0xaa, 0x93, 0x93, 0x70, 0x69, 0x08, 0xc5, + 0xa3, 0x1d, 0x98, 0x64, 0xfe, 0x12, 0xf6, 0x86, 0x64, 0xe3, 0xd2, 0x30, 0xae, 0x27, 0xf8, 0xba, + 0x8c, 0x2c, 0xac, 0x8e, 0x90, 0x95, 0x4b, 0xa3, 0xd0, 0x3e, 0xc1, 0xd7, 0x03, 0xbb, 0x30, 0x3f, + 0x4a, 0x76, 0x2e, 0x8d, 0x44, 0xff, 0x68, 0x0f, 0x66, 0xbc, 0xb8, 0x8b, 0x27, 0x8c, 0x94, 0xa5, + 0x4b, 0xa3, 0x6d, 0x03, 0xe8, 0x0e, 0x54, 0xbc, 0xff, 0x3f, 0xa0, 0xc4, 0x7c, 0x5d, 0x4a, 0xde, + 0x07, 0xd0, 0x5b, 0x50, 0x15, 0xa4, 0x2d, 0x06, 0x3b, 0x34, 0x71, 0x97, 0x86, 0xef, 0x09, 0xe8, + 0x15, 0xc8, 0xd1, 0x84, 0x1b, 0xcd, 0x45, 0x57, 0x55, 0xa4, 0xf9, 0x98, 0xd4, 0x1d, 0x3d, 0x84, + 0x1a, 0x23, 0x79, 0x6e, 0xfa, 0x5e, 0x47, 0x8b, 0x18, 0x52, 0xe0, 0xef, 0xd0, 0x88, 0x21, 0x85, + 0xfe, 0x76, 0xfc, 0x1a, 0xd4, 0x7c, 0xc1, 0x4a, 0x64, 0x97, 0x93, 0xe3, 0x95, 0x58, 0x96, 0x87, + 0x84, 0x2c, 0x31, 0xb3, 0x0b, 0x53, 0x9e, 0x1f, 0xaa, 0x88, 0x24, 0x1c, 0xe8, 0xfe, 0x5f, 0xbf, + 0xa4, 0x4b, 0x31, 0x0a, 0xae, 0xd1, 0x16, 0xa0, 0x80, 0x6b, 0x88, 0xf4, 0xca, 0x30, 0xef, 0x10, + 0xe3, 0x57, 0x87, 0x3a, 0x88, 0x03, 0xe2, 0x0b, 0xd3, 0x68, 0x40, 0x82, 0x7f, 0x76, 0x45, 0x00, + 0x12, 0xfe, 0xd3, 0xea, 0x2d, 0xa8, 0x7a, 0x63, 0x34, 0xe0, 0xc3, 0xe8, 0xff, 0x9f, 0xbc, 0x3e, + 0x8c, 0xfb, 0x25, 0xe8, 0x6d, 0x98, 0xf6, 0xef, 0x61, 0x44, 0xe8, 0x1b, 0x50, 0xf4, 0x5f, 0x37, + 0x7e, 0x7a, 0x88, 0xf9, 0x19, 0x86, 0xec, 0x83, 0x9e, 0xbf, 0x58, 0xbc, 0x0b, 0x2b, 0xfc, 0x8f, + 0x8c, 0x77, 0x61, 0x45, 0xfc, 0xfa, 0xb2, 0x9e, 0x7d, 0x9c, 0xee, 0xef, 0xed, 0xe5, 0xe9, 0x99, + 0xeb, 0xcb, 0xff, 0x0b, 0x00, 0x00, 0xff, 0xff, 0x70, 0x11, 0x7f, 0x45, 0xac, 0x44, 0x00, 0x00, } type DRPCMetainfoClient interface { diff --git a/pkg/pb/metainfo.proto b/pkg/pb/metainfo.proto index 1dd809c90..0fb261580 100644 --- a/pkg/pb/metainfo.proto +++ b/pkg/pb/metainfo.proto @@ -46,10 +46,14 @@ service Metainfo { rpc DeleteSegmentOld(SegmentDeleteRequestOld) returns (SegmentDeleteResponseOld); rpc ListSegmentsOld(ListSegmentsRequestOld) returns (ListSegmentsResponseOld); rpc SetAttributionOld(SetAttributionRequestOld) returns (SetAttributionResponseOld); - + rpc ProjectInfo(ProjectInfoRequest) returns (ProjectInfoResponse); } +message RequestHeader { + bytes api_key = 1; +} + message Bucket { bytes name = 1; encryption.CipherSuite path_cipher = 2; @@ -69,6 +73,8 @@ message BucketListItem { } message BucketCreateRequest { + RequestHeader header = 15; + bytes name = 1; encryption.CipherSuite path_cipher = 2; @@ -83,6 +89,8 @@ message BucketCreateResponse { } message BucketGetRequest { + RequestHeader header = 15; + bytes name = 1; } @@ -91,6 +99,8 @@ message BucketGetResponse { } message BucketDeleteRequest { + RequestHeader header = 15; + bytes name = 1; } @@ -98,6 +108,8 @@ message BucketDeleteResponse { } message BucketListRequest { + RequestHeader header = 15; + bytes cursor = 1; int32 limit = 2; int32 direction = 3; @@ -109,6 +121,8 @@ message BucketListResponse { } message BucketSetAttributionRequest { + RequestHeader header = 15; + bytes name = 1; bytes partner_id = 2; } @@ -122,6 +136,8 @@ message AddressedOrderLimit { } message SegmentWriteRequestOld { + RequestHeader header = 15; + bytes bucket = 1; bytes path = 2; int64 segment = 3; @@ -137,6 +153,8 @@ message SegmentWriteResponseOld { } message SegmentCommitRequestOld { + RequestHeader header = 15; + bytes bucket = 1; bytes path = 2; int64 segment = 3; @@ -149,6 +167,8 @@ message SegmentCommitResponseOld { } message SegmentDownloadRequestOld { + RequestHeader header = 15; + bytes bucket = 1; bytes path = 2; int64 segment = 3; @@ -161,6 +181,8 @@ message SegmentDownloadResponseOld { } message SegmentInfoRequestOld { + RequestHeader header = 15; + bytes bucket = 1; bytes path = 2; int64 segment = 3; @@ -171,6 +193,8 @@ message SegmentInfoResponseOld { } message SegmentDeleteRequestOld { + RequestHeader header = 15; + bytes bucket = 1; bytes path = 2; int64 segment = 3; @@ -182,6 +206,8 @@ message SegmentDeleteResponseOld { } message ListSegmentsRequestOld { + RequestHeader header = 15; + bytes bucket = 1; bytes prefix = 2; bytes start_after = 3; @@ -203,6 +229,8 @@ message ListSegmentsResponseOld { } message SetAttributionRequestOld { + RequestHeader header = 15; + bytes bucket_name = 1; bytes partner_id = 2 ; } @@ -211,6 +239,7 @@ message SetAttributionResponseOld { } message ProjectInfoRequest { + RequestHeader header = 15; } message ProjectInfoResponse { @@ -254,6 +283,8 @@ message Object { } message ObjectBeginRequest { + RequestHeader header = 15; + bytes bucket = 1; bytes encrypted_path = 2; int32 version = 3; @@ -276,6 +307,8 @@ message ObjectBeginResponse { } message ObjectCommitRequest { + RequestHeader header = 15; + bytes stream_id = 1 [(gogoproto.customtype) = "StreamID", (gogoproto.nullable) = false]; bytes encrypted_metadata_nonce = 2 [(gogoproto.customtype) = "Nonce", (gogoproto.nullable) = false]; @@ -286,6 +319,8 @@ message ObjectCommitResponse { } message ObjectGetRequest { + RequestHeader header = 15; + bytes bucket = 1; bytes encrypted_path = 2; int32 version = 3; @@ -296,6 +331,8 @@ message ObjectGetResponse { } message ObjectListRequest { + RequestHeader header = 15; + bytes bucket = 1; bytes encrypted_prefix = 2; bytes encrypted_cursor = 3; @@ -303,8 +340,6 @@ message ObjectListRequest { int32 limit = 5; ObjectListItemIncludes object_includes = 6; - - } message ObjectListResponse { @@ -330,6 +365,8 @@ message ObjectListItemIncludes { } message ObjectBeginDeleteRequest { + RequestHeader header = 15; + bytes bucket = 1; bytes encrypted_path = 2; int32 version = 3; @@ -340,6 +377,8 @@ message ObjectBeginDeleteResponse { } message ObjectFinishDeleteRequest { + RequestHeader header = 15; + bytes stream_id = 1 [(gogoproto.customtype) = "StreamID", (gogoproto.nullable) = false]; } @@ -388,6 +427,8 @@ message SegmentPosition { } message SegmentBeginRequest { + RequestHeader header = 15; + bytes stream_id = 1 [(gogoproto.customtype) = "StreamID", (gogoproto.nullable) = false]; SegmentPosition position = 2; @@ -401,6 +442,8 @@ message SegmentBeginResponse { } message SegmentCommitRequest { + RequestHeader header = 15; + bytes segment_id = 1 [(gogoproto.customtype) = "SegmentID", (gogoproto.nullable) = false]; bytes encrypted_key_nonce = 2 [(gogoproto.customtype) = "Nonce", (gogoproto.nullable) = false]; @@ -437,6 +480,8 @@ message SegmentCommitResponse { } message SegmentMakeInlineRequest { + RequestHeader header = 15; + bytes stream_id = 1 [(gogoproto.customtype) = "StreamID", (gogoproto.nullable) = false]; SegmentPosition position = 2; @@ -449,6 +494,8 @@ message SegmentMakeInlineRequest { message SegmentMakeInlineResponse {} message SegmentBeginDeleteRequest { + RequestHeader header = 15; + bytes stream_id = 1; SegmentPosition position = 2; } @@ -460,6 +507,8 @@ message SegmentBeginDeleteResponse { } message SegmentFinishDeleteRequest { + RequestHeader header = 15; + bytes segment_id = 1 [(gogoproto.customtype) = "SegmentID", (gogoproto.nullable) = false]; repeated SegmentPieceDeleteResult results = 2; } @@ -473,6 +522,8 @@ message SegmentPieceDeleteResult { message SegmentFinishDeleteResponse {} message SegmentListRequest { + RequestHeader header = 15; + bytes stream_id = 1; SegmentPosition cursor_position = 2; int32 limit = 3; @@ -488,6 +539,8 @@ message SegmentListItem { } message SegmentDownloadRequest { + RequestHeader header = 15; + bytes stream_id = 1 [(gogoproto.customtype) = "StreamID", (gogoproto.nullable) = false]; SegmentPosition cursor_position = 2; } @@ -507,6 +560,9 @@ message SegmentDownloadResponse { } message BatchRequest { + RequestHeader header = 15; // the only header that matters in a batch. + + // headers for specific BatchRequestItems are ignored entirely repeated BatchRequestItem requests = 1; } @@ -566,4 +622,4 @@ message BatchResponseItem { SegmentListResponse segment_list = 17; SegmentDownloadResponse segment_download = 18; } -} \ No newline at end of file +} diff --git a/proto.lock b/proto.lock index b3211dae6..b69bea216 100644 --- a/proto.lock +++ b/proto.lock @@ -1701,6 +1701,16 @@ } ], "messages": [ + { + "name": "RequestHeader", + "fields": [ + { + "id": 1, + "name": "api_key", + "type": "bytes" + } + ] + }, { "name": "Bucket", "fields": [ @@ -1779,6 +1789,11 @@ { "name": "BucketCreateRequest", "fields": [ + { + "id": 15, + "name": "header", + "type": "RequestHeader" + }, { "id": 1, "name": "name", @@ -1824,6 +1839,11 @@ { "name": "BucketGetRequest", "fields": [ + { + "id": 15, + "name": "header", + "type": "RequestHeader" + }, { "id": 1, "name": "name", @@ -1844,6 +1864,11 @@ { "name": "BucketDeleteRequest", "fields": [ + { + "id": 15, + "name": "header", + "type": "RequestHeader" + }, { "id": 1, "name": "name", @@ -1857,6 +1882,11 @@ { "name": "BucketListRequest", "fields": [ + { + "id": 15, + "name": "header", + "type": "RequestHeader" + }, { "id": 1, "name": "cursor", @@ -1893,6 +1923,11 @@ { "name": "BucketSetAttributionRequest", "fields": [ + { + "id": 15, + "name": "header", + "type": "RequestHeader" + }, { "id": 1, "name": "name", @@ -1926,6 +1961,11 @@ { "name": "SegmentWriteRequestOld", "fields": [ + { + "id": 15, + "name": "header", + "type": "RequestHeader" + }, { "id": 1, "name": "bucket", @@ -2012,6 +2052,11 @@ { "name": "SegmentCommitRequestOld", "fields": [ + { + "id": 15, + "name": "header", + "type": "RequestHeader" + }, { "id": 1, "name": "bucket", @@ -2053,6 +2098,11 @@ { "name": "SegmentDownloadRequestOld", "fields": [ + { + "id": 15, + "name": "header", + "type": "RequestHeader" + }, { "id": 1, "name": "bucket", @@ -2104,6 +2154,11 @@ { "name": "SegmentInfoRequestOld", "fields": [ + { + "id": 15, + "name": "header", + "type": "RequestHeader" + }, { "id": 1, "name": "bucket", @@ -2134,6 +2189,11 @@ { "name": "SegmentDeleteRequestOld", "fields": [ + { + "id": 15, + "name": "header", + "type": "RequestHeader" + }, { "id": 1, "name": "bucket", @@ -2180,6 +2240,11 @@ { "name": "ListSegmentsRequestOld", "fields": [ + { + "id": 15, + "name": "header", + "type": "RequestHeader" + }, { "id": 1, "name": "bucket", @@ -2258,6 +2323,11 @@ { "name": "SetAttributionRequestOld", "fields": [ + { + "id": 15, + "name": "header", + "type": "RequestHeader" + }, { "id": 1, "name": "bucket_name", @@ -2274,7 +2344,14 @@ "name": "SetAttributionResponseOld" }, { - "name": "ProjectInfoRequest" + "name": "ProjectInfoRequest", + "fields": [ + { + "id": 15, + "name": "header", + "type": "RequestHeader" + } + ] }, { "name": "ProjectInfoResponse", @@ -2424,6 +2501,11 @@ { "name": "ObjectBeginRequest", "fields": [ + { + "id": 15, + "name": "header", + "type": "RequestHeader" + }, { "id": 1, "name": "bucket", @@ -2514,6 +2596,11 @@ { "name": "ObjectCommitRequest", "fields": [ + { + "id": 15, + "name": "header", + "type": "RequestHeader" + }, { "id": 1, "name": "stream_id", @@ -2557,6 +2644,11 @@ { "name": "ObjectGetRequest", "fields": [ + { + "id": 15, + "name": "header", + "type": "RequestHeader" + }, { "id": 1, "name": "bucket", @@ -2587,6 +2679,11 @@ { "name": "ObjectListRequest", "fields": [ + { + "id": 15, + "name": "header", + "type": "RequestHeader" + }, { "id": 1, "name": "bucket", @@ -2733,6 +2830,11 @@ { "name": "ObjectBeginDeleteRequest", "fields": [ + { + "id": 15, + "name": "header", + "type": "RequestHeader" + }, { "id": 1, "name": "bucket", @@ -2773,6 +2875,11 @@ { "name": "ObjectFinishDeleteRequest", "fields": [ + { + "id": 15, + "name": "header", + "type": "RequestHeader" + }, { "id": 1, "name": "stream_id", @@ -2957,6 +3064,11 @@ { "name": "SegmentBeginRequest", "fields": [ + { + "id": 15, + "name": "header", + "type": "RequestHeader" + }, { "id": 1, "name": "stream_id", @@ -3028,6 +3140,11 @@ { "name": "SegmentCommitRequest", "fields": [ + { + "id": 15, + "name": "header", + "type": "RequestHeader" + }, { "id": 1, "name": "segment_id", @@ -3180,6 +3297,11 @@ { "name": "SegmentMakeInlineRequest", "fields": [ + { + "id": 15, + "name": "header", + "type": "RequestHeader" + }, { "id": 1, "name": "stream_id", @@ -3233,6 +3355,11 @@ { "name": "SegmentBeginDeleteRequest", "fields": [ + { + "id": 15, + "name": "header", + "type": "RequestHeader" + }, { "id": 1, "name": "stream_id", @@ -3289,6 +3416,11 @@ { "name": "SegmentFinishDeleteRequest", "fields": [ + { + "id": 15, + "name": "header", + "type": "RequestHeader" + }, { "id": 1, "name": "segment_id", @@ -3348,6 +3480,11 @@ { "name": "SegmentListRequest", "fields": [ + { + "id": 15, + "name": "header", + "type": "RequestHeader" + }, { "id": 1, "name": "stream_id", @@ -3394,6 +3531,11 @@ { "name": "SegmentDownloadRequest", "fields": [ + { + "id": 15, + "name": "header", + "type": "RequestHeader" + }, { "id": 1, "name": "stream_id", @@ -3495,6 +3637,11 @@ { "name": "BatchRequest", "fields": [ + { + "id": 15, + "name": "header", + "type": "RequestHeader" + }, { "id": 1, "name": "requests", diff --git a/satellite/metainfo/batch.go b/satellite/metainfo/batch.go index e3de32fbc..5b68ddef6 100644 --- a/satellite/metainfo/batch.go +++ b/satellite/metainfo/batch.go @@ -25,6 +25,7 @@ func (endpoint *Endpoint) Batch(ctx context.Context, req *pb.BatchRequest) (resp switch singleRequest := request.Request.(type) { // BUCKET case *pb.BatchRequestItem_BucketCreate: + singleRequest.BucketCreate.Header = req.Header response, err := endpoint.CreateBucket(ctx, singleRequest.BucketCreate) if err != nil { return resp, err @@ -35,6 +36,7 @@ func (endpoint *Endpoint) Batch(ctx context.Context, req *pb.BatchRequest) (resp }, }) case *pb.BatchRequestItem_BucketGet: + singleRequest.BucketGet.Header = req.Header response, err := endpoint.GetBucket(ctx, singleRequest.BucketGet) if err != nil { return resp, err @@ -45,6 +47,7 @@ func (endpoint *Endpoint) Batch(ctx context.Context, req *pb.BatchRequest) (resp }, }) case *pb.BatchRequestItem_BucketDelete: + singleRequest.BucketDelete.Header = req.Header response, err := endpoint.DeleteBucket(ctx, singleRequest.BucketDelete) if err != nil { return resp, err @@ -55,6 +58,7 @@ func (endpoint *Endpoint) Batch(ctx context.Context, req *pb.BatchRequest) (resp }, }) case *pb.BatchRequestItem_BucketList: + singleRequest.BucketList.Header = req.Header response, err := endpoint.ListBuckets(ctx, singleRequest.BucketList) if err != nil { return resp, err @@ -65,6 +69,7 @@ func (endpoint *Endpoint) Batch(ctx context.Context, req *pb.BatchRequest) (resp }, }) case *pb.BatchRequestItem_BucketSetAttribution: + singleRequest.BucketSetAttribution.Header = req.Header response, err := endpoint.SetBucketAttribution(ctx, singleRequest.BucketSetAttribution) if err != nil { return resp, err @@ -76,6 +81,7 @@ func (endpoint *Endpoint) Batch(ctx context.Context, req *pb.BatchRequest) (resp }) //OBJECT case *pb.BatchRequestItem_ObjectBegin: + singleRequest.ObjectBegin.Header = req.Header response, err := endpoint.BeginObject(ctx, singleRequest.ObjectBegin) if err != nil { return resp, err @@ -86,6 +92,7 @@ func (endpoint *Endpoint) Batch(ctx context.Context, req *pb.BatchRequest) (resp }, }) case *pb.BatchRequestItem_ObjectCommit: + singleRequest.ObjectCommit.Header = req.Header response, err := endpoint.CommitObject(ctx, singleRequest.ObjectCommit) if err != nil { return resp, err @@ -96,6 +103,7 @@ func (endpoint *Endpoint) Batch(ctx context.Context, req *pb.BatchRequest) (resp }, }) case *pb.BatchRequestItem_ObjectGet: + singleRequest.ObjectGet.Header = req.Header response, err := endpoint.GetObject(ctx, singleRequest.ObjectGet) if err != nil { return resp, err @@ -106,6 +114,7 @@ func (endpoint *Endpoint) Batch(ctx context.Context, req *pb.BatchRequest) (resp }, }) case *pb.BatchRequestItem_ObjectList: + singleRequest.ObjectList.Header = req.Header response, err := endpoint.ListObjects(ctx, singleRequest.ObjectList) if err != nil { return resp, err @@ -116,6 +125,7 @@ func (endpoint *Endpoint) Batch(ctx context.Context, req *pb.BatchRequest) (resp }, }) case *pb.BatchRequestItem_ObjectBeginDelete: + singleRequest.ObjectBeginDelete.Header = req.Header response, err := endpoint.BeginDeleteObject(ctx, singleRequest.ObjectBeginDelete) if err != nil { return resp, err @@ -126,6 +136,7 @@ func (endpoint *Endpoint) Batch(ctx context.Context, req *pb.BatchRequest) (resp }, }) case *pb.BatchRequestItem_ObjectFinishDelete: + singleRequest.ObjectFinishDelete.Header = req.Header response, err := endpoint.FinishDeleteObject(ctx, singleRequest.ObjectFinishDelete) if err != nil { return resp, err @@ -137,6 +148,7 @@ func (endpoint *Endpoint) Batch(ctx context.Context, req *pb.BatchRequest) (resp }) // SEGMENT case *pb.BatchRequestItem_SegmentBegin: + singleRequest.SegmentBegin.Header = req.Header response, err := endpoint.BeginSegment(ctx, singleRequest.SegmentBegin) if err != nil { return resp, err @@ -147,6 +159,7 @@ func (endpoint *Endpoint) Batch(ctx context.Context, req *pb.BatchRequest) (resp }, }) case *pb.BatchRequestItem_SegmentCommit: + singleRequest.SegmentCommit.Header = req.Header response, err := endpoint.CommitSegment(ctx, singleRequest.SegmentCommit) if err != nil { return resp, err @@ -157,6 +170,7 @@ func (endpoint *Endpoint) Batch(ctx context.Context, req *pb.BatchRequest) (resp }, }) case *pb.BatchRequestItem_SegmentList: + singleRequest.SegmentList.Header = req.Header response, err := endpoint.ListSegments(ctx, singleRequest.SegmentList) if err != nil { return resp, err @@ -167,6 +181,7 @@ func (endpoint *Endpoint) Batch(ctx context.Context, req *pb.BatchRequest) (resp }, }) case *pb.BatchRequestItem_SegmentMakeInline: + singleRequest.SegmentMakeInline.Header = req.Header response, err := endpoint.MakeInlineSegment(ctx, singleRequest.SegmentMakeInline) if err != nil { return resp, err @@ -177,6 +192,7 @@ func (endpoint *Endpoint) Batch(ctx context.Context, req *pb.BatchRequest) (resp }, }) case *pb.BatchRequestItem_SegmentDownload: + singleRequest.SegmentDownload.Header = req.Header response, err := endpoint.DownloadSegment(ctx, singleRequest.SegmentDownload) if err != nil { return resp, err @@ -187,6 +203,7 @@ func (endpoint *Endpoint) Batch(ctx context.Context, req *pb.BatchRequest) (resp }, }) case *pb.BatchRequestItem_SegmentBeginDelete: + singleRequest.SegmentBeginDelete.Header = req.Header response, err := endpoint.BeginDeleteSegment(ctx, singleRequest.SegmentBeginDelete) if err != nil { return resp, err @@ -197,6 +214,7 @@ func (endpoint *Endpoint) Batch(ctx context.Context, req *pb.BatchRequest) (resp }, }) case *pb.BatchRequestItem_SegmentFinishDelete: + singleRequest.SegmentFinishDelete.Header = req.Header response, err := endpoint.FinishDeleteSegment(ctx, singleRequest.SegmentFinishDelete) if err != nil { return resp, err diff --git a/satellite/metainfo/metainfo.go b/satellite/metainfo/metainfo.go index 2e7e32dbb..500a9bae0 100644 --- a/satellite/metainfo/metainfo.go +++ b/satellite/metainfo/metainfo.go @@ -18,7 +18,6 @@ import ( "google.golang.org/grpc/status" monkit "gopkg.in/spacemonkeygo/monkit.v2" - "storj.io/storj/pkg/auth" "storj.io/storj/pkg/identity" "storj.io/storj/pkg/macaroon" "storj.io/storj/pkg/pb" @@ -113,7 +112,7 @@ func (endpoint *Endpoint) Close() error { return nil } func (endpoint *Endpoint) SegmentInfoOld(ctx context.Context, req *pb.SegmentInfoRequestOld) (resp *pb.SegmentInfoResponseOld, err error) { defer mon.Task()(&ctx)(&err) - keyInfo, err := endpoint.validateAuth(ctx, macaroon.Action{ + keyInfo, err := endpoint.validateAuth(ctx, req.Header, macaroon.Action{ Op: macaroon.ActionRead, Bucket: req.Bucket, EncryptedPath: req.Path, @@ -140,7 +139,7 @@ func (endpoint *Endpoint) SegmentInfoOld(ctx context.Context, req *pb.SegmentInf func (endpoint *Endpoint) CreateSegmentOld(ctx context.Context, req *pb.SegmentWriteRequestOld) (resp *pb.SegmentWriteResponseOld, err error) { defer mon.Task()(&ctx)(&err) - keyInfo, err := endpoint.validateAuth(ctx, macaroon.Action{ + keyInfo, err := endpoint.validateAuth(ctx, req.Header, macaroon.Action{ Op: macaroon.ActionWrite, Bucket: req.Bucket, EncryptedPath: req.Path, @@ -228,7 +227,7 @@ func calculateSpaceUsed(ptr *pb.Pointer) (inlineSpace, remoteSpace int64) { func (endpoint *Endpoint) CommitSegmentOld(ctx context.Context, req *pb.SegmentCommitRequestOld) (resp *pb.SegmentCommitResponseOld, err error) { defer mon.Task()(&ctx)(&err) - keyInfo, err := endpoint.validateAuth(ctx, macaroon.Action{ + keyInfo, err := endpoint.validateAuth(ctx, req.Header, macaroon.Action{ Op: macaroon.ActionWrite, Bucket: req.Bucket, EncryptedPath: req.Path, @@ -322,7 +321,7 @@ func (endpoint *Endpoint) CommitSegmentOld(ctx context.Context, req *pb.SegmentC func (endpoint *Endpoint) DownloadSegmentOld(ctx context.Context, req *pb.SegmentDownloadRequestOld) (resp *pb.SegmentDownloadResponseOld, err error) { defer mon.Task()(&ctx)(&err) - keyInfo, err := endpoint.validateAuth(ctx, macaroon.Action{ + keyInfo, err := endpoint.validateAuth(ctx, req.Header, macaroon.Action{ Op: macaroon.ActionRead, Bucket: req.Bucket, EncryptedPath: req.Path, @@ -377,7 +376,7 @@ func (endpoint *Endpoint) DownloadSegmentOld(ctx context.Context, req *pb.Segmen func (endpoint *Endpoint) DeleteSegmentOld(ctx context.Context, req *pb.SegmentDeleteRequestOld) (resp *pb.SegmentDeleteResponseOld, err error) { defer mon.Task()(&ctx)(&err) - keyInfo, err := endpoint.validateAuth(ctx, macaroon.Action{ + keyInfo, err := endpoint.validateAuth(ctx, req.Header, macaroon.Action{ Op: macaroon.ActionDelete, Bucket: req.Bucket, EncryptedPath: req.Path, @@ -436,7 +435,7 @@ func (endpoint *Endpoint) DeleteSegmentOld(ctx context.Context, req *pb.SegmentD func (endpoint *Endpoint) ListSegmentsOld(ctx context.Context, req *pb.ListSegmentsRequestOld) (resp *pb.ListSegmentsResponseOld, err error) { defer mon.Task()(&ctx)(&err) - keyInfo, err := endpoint.validateAuth(ctx, macaroon.Action{ + keyInfo, err := endpoint.validateAuth(ctx, req.Header, macaroon.Action{ Op: macaroon.ActionList, Bucket: req.Bucket, EncryptedPath: req.Prefix, @@ -594,7 +593,7 @@ func CreatePath(ctx context.Context, projectID uuid.UUID, segmentIndex int64, bu func (endpoint *Endpoint) SetAttributionOld(ctx context.Context, req *pb.SetAttributionRequestOld) (_ *pb.SetAttributionResponseOld, err error) { defer mon.Task()(&ctx)(&err) - err = endpoint.setBucketAttribution(ctx, req.BucketName, req.PartnerId) + err = endpoint.setBucketAttribution(ctx, req.Header, req.BucketName, req.PartnerId) return &pb.SetAttributionResponseOld{}, err } @@ -615,7 +614,7 @@ func bytesToUUID(data []byte) (uuid.UUID, error) { func (endpoint *Endpoint) ProjectInfo(ctx context.Context, req *pb.ProjectInfoRequest) (_ *pb.ProjectInfoResponse, err error) { defer mon.Task()(&ctx)(&err) - keyInfo, err := endpoint.validateAuth(ctx, macaroon.Action{ + keyInfo, err := endpoint.validateAuth(ctx, req.Header, macaroon.Action{ Op: macaroon.ActionProjectInfo, Time: time.Now(), }) @@ -634,7 +633,7 @@ func (endpoint *Endpoint) ProjectInfo(ctx context.Context, req *pb.ProjectInfoRe func (endpoint *Endpoint) GetBucket(ctx context.Context, req *pb.BucketGetRequest) (resp *pb.BucketGetResponse, err error) { defer mon.Task()(&ctx)(&err) - keyInfo, err := endpoint.validateAuth(ctx, macaroon.Action{ + keyInfo, err := endpoint.validateAuth(ctx, req.Header, macaroon.Action{ Op: macaroon.ActionRead, Bucket: req.Name, Time: time.Now(), @@ -665,7 +664,7 @@ func (endpoint *Endpoint) GetBucket(ctx context.Context, req *pb.BucketGetReques func (endpoint *Endpoint) CreateBucket(ctx context.Context, req *pb.BucketCreateRequest) (resp *pb.BucketCreateResponse, err error) { defer mon.Task()(&ctx)(&err) - keyInfo, err := endpoint.validateAuth(ctx, macaroon.Action{ + keyInfo, err := endpoint.validateAuth(ctx, req.Header, macaroon.Action{ Op: macaroon.ActionWrite, Bucket: req.Name, Time: time.Now(), @@ -742,7 +741,7 @@ func (endpoint *Endpoint) CreateBucket(ctx context.Context, req *pb.BucketCreate func (endpoint *Endpoint) DeleteBucket(ctx context.Context, req *pb.BucketDeleteRequest) (resp *pb.BucketDeleteResponse, err error) { defer mon.Task()(&ctx)(&err) - keyInfo, err := endpoint.validateAuth(ctx, macaroon.Action{ + keyInfo, err := endpoint.validateAuth(ctx, req.Header, macaroon.Action{ Op: macaroon.ActionDelete, Bucket: req.Name, Time: time.Now(), @@ -771,12 +770,12 @@ func (endpoint *Endpoint) ListBuckets(ctx context.Context, req *pb.BucketListReq Op: macaroon.ActionRead, Time: time.Now(), } - keyInfo, err := endpoint.validateAuth(ctx, action) + keyInfo, err := endpoint.validateAuth(ctx, req.Header, action) if err != nil { return nil, status.Error(codes.Unauthenticated, err.Error()) } - allowedBuckets, err := getAllowedBuckets(ctx, action) + allowedBuckets, err := getAllowedBuckets(ctx, req.Header, action) if err != nil { return nil, err } @@ -805,12 +804,8 @@ func (endpoint *Endpoint) ListBuckets(ctx context.Context, req *pb.BucketListReq }, nil } -func getAllowedBuckets(ctx context.Context, action macaroon.Action) (_ macaroon.AllowedBuckets, err error) { - keyData, ok := auth.GetAPIKey(ctx) - if !ok { - return macaroon.AllowedBuckets{}, status.Errorf(codes.Unauthenticated, "Missing API credentials: %v", err) - } - key, err := macaroon.ParseAPIKey(string(keyData)) +func getAllowedBuckets(ctx context.Context, header *pb.RequestHeader, action macaroon.Action) (_ macaroon.AllowedBuckets, err error) { + key, err := getAPIKey(ctx, header) if err != nil { return macaroon.AllowedBuckets{}, status.Errorf(codes.InvalidArgument, "Invalid API credentials: %v", err) } @@ -825,13 +820,13 @@ func getAllowedBuckets(ctx context.Context, action macaroon.Action) (_ macaroon. func (endpoint *Endpoint) SetBucketAttribution(ctx context.Context, req *pb.BucketSetAttributionRequest) (resp *pb.BucketSetAttributionResponse, err error) { defer mon.Task()(&ctx)(&err) - err = endpoint.setBucketAttribution(ctx, req.Name, req.PartnerId) + err = endpoint.setBucketAttribution(ctx, req.Header, req.Name, req.PartnerId) return &pb.BucketSetAttributionResponse{}, err } -func (endpoint *Endpoint) setBucketAttribution(ctx context.Context, bucketName []byte, parterID []byte) error { - keyInfo, err := endpoint.validateAuth(ctx, macaroon.Action{ +func (endpoint *Endpoint) setBucketAttribution(ctx context.Context, header *pb.RequestHeader, bucketName []byte, parterID []byte) error { + keyInfo, err := endpoint.validateAuth(ctx, header, macaroon.Action{ Op: macaroon.ActionList, Bucket: bucketName, EncryptedPath: []byte(""), @@ -957,7 +952,7 @@ func convertBucketToProto(ctx context.Context, bucket storj.Bucket) (pbBucket *p func (endpoint *Endpoint) BeginObject(ctx context.Context, req *pb.ObjectBeginRequest) (resp *pb.ObjectBeginResponse, err error) { defer mon.Task()(&ctx)(&err) - keyInfo, err := endpoint.validateAuth(ctx, macaroon.Action{ + keyInfo, err := endpoint.validateAuth(ctx, req.Header, macaroon.Action{ Op: macaroon.ActionWrite, Bucket: req.Bucket, EncryptedPath: req.EncryptedPath, @@ -1047,7 +1042,7 @@ func (endpoint *Endpoint) CommitObject(ctx context.Context, req *pb.ObjectCommit return nil, status.Error(codes.InvalidArgument, "stream ID expired") } - keyInfo, err := endpoint.validateAuth(ctx, macaroon.Action{ + keyInfo, err := endpoint.validateAuth(ctx, req.Header, macaroon.Action{ Op: macaroon.ActionWrite, Bucket: streamID.Bucket, EncryptedPath: streamID.EncryptedPath, @@ -1111,7 +1106,7 @@ func (endpoint *Endpoint) CommitObject(ctx context.Context, req *pb.ObjectCommit func (endpoint *Endpoint) GetObject(ctx context.Context, req *pb.ObjectGetRequest) (resp *pb.ObjectGetResponse, err error) { defer mon.Task()(&ctx)(&err) - keyInfo, err := endpoint.validateAuth(ctx, macaroon.Action{ + keyInfo, err := endpoint.validateAuth(ctx, req.Header, macaroon.Action{ Op: macaroon.ActionRead, Bucket: req.Bucket, EncryptedPath: req.EncryptedPath, @@ -1208,7 +1203,7 @@ func (endpoint *Endpoint) GetObject(ctx context.Context, req *pb.ObjectGetReques func (endpoint *Endpoint) ListObjects(ctx context.Context, req *pb.ObjectListRequest) (resp *pb.ObjectListResponse, err error) { defer mon.Task()(&ctx)(&err) - keyInfo, err := endpoint.validateAuth(ctx, macaroon.Action{ + keyInfo, err := endpoint.validateAuth(ctx, req.Header, macaroon.Action{ Op: macaroon.ActionList, Bucket: req.Bucket, EncryptedPath: []byte{}, @@ -1258,7 +1253,7 @@ func (endpoint *Endpoint) ListObjects(ctx context.Context, req *pb.ObjectListReq func (endpoint *Endpoint) BeginDeleteObject(ctx context.Context, req *pb.ObjectBeginDeleteRequest) (resp *pb.ObjectBeginDeleteResponse, err error) { defer mon.Task()(&ctx)(&err) - keyInfo, err := endpoint.validateAuth(ctx, macaroon.Action{ + keyInfo, err := endpoint.validateAuth(ctx, req.Header, macaroon.Action{ Op: macaroon.ActionDelete, Bucket: req.Bucket, EncryptedPath: req.EncryptedPath, @@ -1324,7 +1319,7 @@ func (endpoint *Endpoint) FinishDeleteObject(ctx context.Context, req *pb.Object return nil, status.Error(codes.InvalidArgument, "stream ID expired") } - _, err = endpoint.validateAuth(ctx, macaroon.Action{ + _, err = endpoint.validateAuth(ctx, req.Header, macaroon.Action{ Op: macaroon.ActionDelete, Bucket: streamID.Bucket, EncryptedPath: streamID.EncryptedPath, @@ -1348,7 +1343,7 @@ func (endpoint *Endpoint) BeginSegment(ctx context.Context, req *pb.SegmentBegin return nil, status.Error(codes.InvalidArgument, err.Error()) } - keyInfo, err := endpoint.validateAuth(ctx, macaroon.Action{ + keyInfo, err := endpoint.validateAuth(ctx, req.Header, macaroon.Action{ Op: macaroon.ActionWrite, Bucket: streamID.Bucket, EncryptedPath: streamID.EncryptedPath, @@ -1424,7 +1419,7 @@ func (endpoint *Endpoint) CommitSegment(ctx context.Context, req *pb.SegmentComm streamID := segmentID.StreamId - keyInfo, err := endpoint.validateAuth(ctx, macaroon.Action{ + keyInfo, err := endpoint.validateAuth(ctx, req.Header, macaroon.Action{ Op: macaroon.ActionWrite, Bucket: streamID.Bucket, EncryptedPath: streamID.EncryptedPath, @@ -1542,7 +1537,7 @@ func (endpoint *Endpoint) MakeInlineSegment(ctx context.Context, req *pb.Segment return nil, status.Error(codes.InvalidArgument, err.Error()) } - keyInfo, err := endpoint.validateAuth(ctx, macaroon.Action{ + keyInfo, err := endpoint.validateAuth(ctx, req.Header, macaroon.Action{ Op: macaroon.ActionWrite, Bucket: streamID.Bucket, EncryptedPath: streamID.EncryptedPath, @@ -1616,7 +1611,7 @@ func (endpoint *Endpoint) BeginDeleteSegment(ctx context.Context, req *pb.Segmen return nil, status.Error(codes.InvalidArgument, err.Error()) } - keyInfo, err := endpoint.validateAuth(ctx, macaroon.Action{ + keyInfo, err := endpoint.validateAuth(ctx, req.Header, macaroon.Action{ Op: macaroon.ActionDelete, Bucket: streamID.Bucket, EncryptedPath: streamID.EncryptedPath, @@ -1666,7 +1661,7 @@ func (endpoint *Endpoint) FinishDeleteSegment(ctx context.Context, req *pb.Segme streamID := segmentID.StreamId - keyInfo, err := endpoint.validateAuth(ctx, macaroon.Action{ + keyInfo, err := endpoint.validateAuth(ctx, req.Header, macaroon.Action{ Op: macaroon.ActionDelete, Bucket: streamID.Bucket, EncryptedPath: streamID.EncryptedPath, @@ -1705,7 +1700,7 @@ func (endpoint *Endpoint) ListSegments(ctx context.Context, req *pb.SegmentListR return nil, status.Error(codes.InvalidArgument, err.Error()) } - keyInfo, err := endpoint.validateAuth(ctx, macaroon.Action{ + keyInfo, err := endpoint.validateAuth(ctx, req.Header, macaroon.Action{ Op: macaroon.ActionList, Bucket: streamID.Bucket, EncryptedPath: streamID.EncryptedPath, @@ -1843,7 +1838,7 @@ func (endpoint *Endpoint) DownloadSegment(ctx context.Context, req *pb.SegmentDo return nil, status.Error(codes.InvalidArgument, err.Error()) } - keyInfo, err := endpoint.validateAuth(ctx, macaroon.Action{ + keyInfo, err := endpoint.validateAuth(ctx, req.Header, macaroon.Action{ Op: macaroon.ActionRead, Bucket: streamID.Bucket, EncryptedPath: streamID.EncryptedPath, diff --git a/satellite/metainfo/metainfo_test.go b/satellite/metainfo/metainfo_test.go index dc8652cd8..8dae83d86 100644 --- a/satellite/metainfo/metainfo_test.go +++ b/satellite/metainfo/metainfo_test.go @@ -41,13 +41,18 @@ func TestInvalidAPIKey(t *testing.T) { require.NoError(t, err) defer ctx.Check(planet.Shutdown) + throwawayKey, err := macaroon.NewAPIKey([]byte("secret")) + require.NoError(t, err) + planet.Start(ctx) for _, invalidAPIKey := range []string{"", "invalid", "testKey"} { - client, err := planet.Uplinks[0].DialMetainfo(ctx, planet.Satellites[0], invalidAPIKey) + client, err := planet.Uplinks[0].DialMetainfo(ctx, planet.Satellites[0], throwawayKey) require.NoError(t, err) defer ctx.Check(client.Close) + client.SetRawAPIKey([]byte(invalidAPIKey)) + _, _, _, err = client.CreateSegment(ctx, "hello", "world", 1, &pb.RedundancyScheme{}, 123, time.Now().Add(time.Hour)) assertUnauthenticated(t, err, false) @@ -78,8 +83,7 @@ func TestRestrictedAPIKey(t *testing.T) { planet.Start(ctx) - key, err := macaroon.ParseAPIKey(planet.Uplinks[0].APIKey[planet.Satellites[0].ID()]) - require.NoError(t, err) + key := planet.Uplinks[0].APIKey[planet.Satellites[0].ID()] tests := []struct { Caveat macaroon.Caveat @@ -158,7 +162,7 @@ func TestRestrictedAPIKey(t *testing.T) { restrictedKey, err := key.Restrict(test.Caveat) require.NoError(t, err) - client, err := planet.Uplinks[0].DialMetainfo(ctx, planet.Satellites[0], restrictedKey.Serialize()) + client, err := planet.Uplinks[0].DialMetainfo(ctx, planet.Satellites[0], restrictedKey) require.NoError(t, err) defer ctx.Check(client.Close) diff --git a/satellite/metainfo/validation.go b/satellite/metainfo/validation.go index b637c3b70..b05ecacc1 100644 --- a/satellite/metainfo/validation.go +++ b/satellite/metainfo/validation.go @@ -121,15 +121,24 @@ func (requests *createRequests) cleanup() { } } -func (endpoint *Endpoint) validateAuth(ctx context.Context, action macaroon.Action) (_ *console.APIKeyInfo, err error) { +func getAPIKey(ctx context.Context, header *pb.RequestHeader) (key *macaroon.APIKey, err error) { defer mon.Task()(&ctx)(&err) - keyData, ok := auth.GetAPIKey(ctx) - if !ok { - endpoint.log.Debug("unauthorized request") - return nil, status.Error(codes.Unauthenticated, "Missing API credentials") + if header != nil { + return macaroon.ParseRawAPIKey(header.ApiKey) } - key, err := macaroon.ParseAPIKey(string(keyData)) + keyData, ok := auth.GetAPIKey(ctx) + if !ok { + return nil, errs.New("missing credentials") + } + + return macaroon.ParseAPIKey(string(keyData)) +} + +func (endpoint *Endpoint) validateAuth(ctx context.Context, header *pb.RequestHeader, action macaroon.Action) (_ *console.APIKeyInfo, err error) { + defer mon.Task()(&ctx)(&err) + + key, err := getAPIKey(ctx, header) if err != nil { endpoint.log.Debug("invalid request", zap.Error(err)) return nil, status.Error(codes.InvalidArgument, "Invalid API credentials") diff --git a/uplink/metainfo/client.go b/uplink/metainfo/client.go index 4b07ab922..8430eab6d 100644 --- a/uplink/metainfo/client.go +++ b/uplink/metainfo/client.go @@ -15,7 +15,7 @@ import ( "google.golang.org/grpc/status" "gopkg.in/spacemonkeygo/monkit.v2" - "storj.io/storj/pkg/auth/grpcauth" + "storj.io/storj/pkg/macaroon" "storj.io/storj/pkg/pb" "storj.io/storj/pkg/storj" "storj.io/storj/pkg/transport" @@ -31,8 +31,9 @@ var ( // Client creates a grpcClient type Client struct { - client pb.MetainfoClient - conn *grpc.ClientConn + client pb.MetainfoClient + conn *grpc.ClientConn + apiKeyRaw []byte } // ListItem is a single item in a listing @@ -43,26 +44,24 @@ type ListItem struct { } // New used as a public function -func New(client pb.MetainfoClient) *Client { +func New(client pb.MetainfoClient, apiKey *macaroon.APIKey) *Client { return &Client{ - client: client, + client: client, + apiKeyRaw: apiKey.SerializeRaw(), } } // Dial dials to metainfo endpoint with the specified api key. -func Dial(ctx context.Context, tc transport.Client, address string, apikey string) (*Client, error) { - conn, err := tc.DialAddress( - ctx, - address, - grpc.WithPerRPCCredentials(grpcauth.NewAPIKeyCredentials(apikey)), - ) +func Dial(ctx context.Context, tc transport.Client, address string, apiKey *macaroon.APIKey) (*Client, error) { + conn, err := tc.DialAddress(ctx, address) if err != nil { return nil, Error.Wrap(err) } return &Client{ - client: pb.NewMetainfoClient(conn), - conn: conn, + client: pb.NewMetainfoClient(conn), + conn: conn, + apiKeyRaw: apiKey.SerializeRaw(), }, nil } @@ -74,11 +73,18 @@ func (client *Client) Close() error { return nil } +func (client *Client) header() *pb.RequestHeader { + return &pb.RequestHeader{ + ApiKey: client.apiKeyRaw, + } +} + // CreateSegment requests the order limits for creating a new segment func (client *Client) CreateSegment(ctx context.Context, bucket string, path storj.Path, segmentIndex int64, redundancy *pb.RedundancyScheme, maxEncryptedSegmentSize int64, expiration time.Time) (limits []*pb.AddressedOrderLimit, rootPieceID storj.PieceID, piecePrivateKey storj.PiecePrivateKey, err error) { defer mon.Task()(&ctx)(&err) response, err := client.client.CreateSegmentOld(ctx, &pb.SegmentWriteRequestOld{ + Header: client.header(), Bucket: []byte(bucket), Path: []byte(path), Segment: segmentIndex, @@ -98,6 +104,7 @@ func (client *Client) CommitSegment(ctx context.Context, bucket string, path sto defer mon.Task()(&ctx)(&err) response, err := client.client.CommitSegmentOld(ctx, &pb.SegmentCommitRequestOld{ + Header: client.header(), Bucket: []byte(bucket), Path: []byte(path), Segment: segmentIndex, @@ -116,6 +123,7 @@ func (client *Client) SegmentInfo(ctx context.Context, bucket string, path storj defer mon.Task()(&ctx)(&err) response, err := client.client.SegmentInfoOld(ctx, &pb.SegmentInfoRequestOld{ + Header: client.header(), Bucket: []byte(bucket), Path: []byte(path), Segment: segmentIndex, @@ -135,6 +143,7 @@ func (client *Client) ReadSegment(ctx context.Context, bucket string, path storj defer mon.Task()(&ctx)(&err) response, err := client.client.DownloadSegmentOld(ctx, &pb.SegmentDownloadRequestOld{ + Header: client.header(), Bucket: []byte(bucket), Path: []byte(path), Segment: segmentIndex, @@ -172,6 +181,7 @@ func (client *Client) DeleteSegment(ctx context.Context, bucket string, path sto defer mon.Task()(&ctx)(&err) response, err := client.client.DeleteSegmentOld(ctx, &pb.SegmentDeleteRequestOld{ + Header: client.header(), Bucket: []byte(bucket), Path: []byte(path), Segment: segmentIndex, @@ -191,6 +201,7 @@ func (client *Client) ListSegments(ctx context.Context, bucket string, prefix, s defer mon.Task()(&ctx)(&err) response, err := client.client.ListSegmentsOld(ctx, &pb.ListSegmentsRequestOld{ + Header: client.header(), Bucket: []byte(bucket), Prefix: []byte(prefix), StartAfter: []byte(startAfter), @@ -221,6 +232,7 @@ func (client *Client) SetAttribution(ctx context.Context, bucket string, partner defer mon.Task()(&ctx)(&err) _, err = client.client.SetAttributionOld(ctx, &pb.SetAttributionRequestOld{ + Header: client.header(), PartnerId: partnerID[:], // TODO: implement storj.UUID that can be sent using pb BucketName: []byte(bucket), }) @@ -232,7 +244,9 @@ func (client *Client) SetAttribution(ctx context.Context, bucket string, partner func (client *Client) GetProjectInfo(ctx context.Context) (resp *pb.ProjectInfoResponse, err error) { defer mon.Task()(&ctx)(&err) - return client.client.ProjectInfo(ctx, &pb.ProjectInfoRequest{}) + return client.client.ProjectInfo(ctx, &pb.ProjectInfoRequest{ + Header: client.header(), + }) } // CreateBucketParams parameters for CreateBucket method @@ -245,11 +259,12 @@ type CreateBucketParams struct { DefaultEncryptionParameters storj.EncryptionParameters } -func (params *CreateBucketParams) toRequest() *pb.BucketCreateRequest { +func (params *CreateBucketParams) toRequest(header *pb.RequestHeader) *pb.BucketCreateRequest { defaultRS := params.DefaultRedundancyScheme defaultEP := params.DefaultEncryptionParameters return &pb.BucketCreateRequest{ + Header: header, Name: params.Name, PathCipher: pb.CipherSuite(params.PathCipher), PartnerId: params.PartnerID, @@ -273,7 +288,7 @@ func (params *CreateBucketParams) toRequest() *pb.BucketCreateRequest { func (params *CreateBucketParams) BatchItem() *pb.BatchRequestItem { return &pb.BatchRequestItem{ Request: &pb.BatchRequestItem_BucketCreate{ - BucketCreate: params.toRequest(), + BucketCreate: params.toRequest(nil), }, } } @@ -299,7 +314,7 @@ func newCreateBucketResponse(response *pb.BucketCreateResponse) (CreateBucketRes func (client *Client) CreateBucket(ctx context.Context, params CreateBucketParams) (respBucket storj.Bucket, err error) { defer mon.Task()(&ctx)(&err) - response, err := client.client.CreateBucket(ctx, params.toRequest()) + response, err := client.client.CreateBucket(ctx, params.toRequest(client.header())) if err != nil { return storj.Bucket{}, Error.Wrap(err) } @@ -316,15 +331,18 @@ type GetBucketParams struct { Name []byte } -func (params *GetBucketParams) toRequest() *pb.BucketGetRequest { - return &pb.BucketGetRequest{Name: params.Name} +func (params *GetBucketParams) toRequest(header *pb.RequestHeader) *pb.BucketGetRequest { + return &pb.BucketGetRequest{ + Header: header, + Name: params.Name, + } } // BatchItem returns single item for batch request func (params *GetBucketParams) BatchItem() *pb.BatchRequestItem { return &pb.BatchRequestItem{ Request: &pb.BatchRequestItem_BucketGet{ - BucketGet: params.toRequest(), + BucketGet: params.toRequest(nil), }, } } @@ -348,7 +366,7 @@ func newGetBucketResponse(response *pb.BucketGetResponse) (GetBucketResponse, er func (client *Client) GetBucket(ctx context.Context, params GetBucketParams) (respBucket storj.Bucket, err error) { defer mon.Task()(&ctx)(&err) - resp, err := client.client.GetBucket(ctx, params.toRequest()) + resp, err := client.client.GetBucket(ctx, params.toRequest(client.header())) if err != nil { if status.Code(err) == codes.NotFound { return storj.Bucket{}, storj.ErrBucketNotFound.Wrap(err) @@ -368,15 +386,18 @@ type DeleteBucketParams struct { Name []byte } -func (params *DeleteBucketParams) toRequest() *pb.BucketDeleteRequest { - return &pb.BucketDeleteRequest{Name: params.Name} +func (params *DeleteBucketParams) toRequest(header *pb.RequestHeader) *pb.BucketDeleteRequest { + return &pb.BucketDeleteRequest{ + Header: header, + Name: params.Name, + } } // BatchItem returns single item for batch request func (params *DeleteBucketParams) BatchItem() *pb.BatchRequestItem { return &pb.BatchRequestItem{ Request: &pb.BatchRequestItem_BucketDelete{ - BucketDelete: params.toRequest(), + BucketDelete: params.toRequest(nil), }, } } @@ -384,7 +405,7 @@ func (params *DeleteBucketParams) BatchItem() *pb.BatchRequestItem { // DeleteBucket deletes a bucket func (client *Client) DeleteBucket(ctx context.Context, params DeleteBucketParams) (err error) { defer mon.Task()(&ctx)(&err) - _, err = client.client.DeleteBucket(ctx, params.toRequest()) + _, err = client.client.DeleteBucket(ctx, params.toRequest(client.header())) if err != nil { if status.Code(err) == codes.NotFound { return storj.ErrBucketNotFound.Wrap(err) @@ -399,8 +420,9 @@ type ListBucketsParams struct { ListOpts storj.BucketListOptions } -func (params *ListBucketsParams) toRequest() *pb.BucketListRequest { +func (params *ListBucketsParams) toRequest(header *pb.RequestHeader) *pb.BucketListRequest { return &pb.BucketListRequest{ + Header: header, Cursor: []byte(params.ListOpts.Cursor), Limit: int32(params.ListOpts.Limit), Direction: int32(params.ListOpts.Direction), @@ -411,7 +433,7 @@ func (params *ListBucketsParams) toRequest() *pb.BucketListRequest { func (params *ListBucketsParams) BatchItem() *pb.BatchRequestItem { return &pb.BatchRequestItem{ Request: &pb.BatchRequestItem_BucketList{ - BucketList: params.toRequest(), + BucketList: params.toRequest(nil), }, } } @@ -441,7 +463,7 @@ func newListBucketsResponse(response *pb.BucketListResponse) ListBucketsResponse func (client *Client) ListBuckets(ctx context.Context, params ListBucketsParams) (_ storj.BucketList, err error) { defer mon.Task()(&ctx)(&err) - resp, err := client.client.ListBuckets(ctx, params.toRequest()) + resp, err := client.client.ListBuckets(ctx, params.toRequest(client.header())) if err != nil { return storj.BucketList{}, Error.Wrap(err) } @@ -493,8 +515,9 @@ type SetBucketAttributionParams struct { PartnerID uuid.UUID } -func (params *SetBucketAttributionParams) toRequest() *pb.BucketSetAttributionRequest { +func (params *SetBucketAttributionParams) toRequest(header *pb.RequestHeader) *pb.BucketSetAttributionRequest { return &pb.BucketSetAttributionRequest{ + Header: header, Name: []byte(params.Bucket), PartnerId: params.PartnerID[:], } @@ -504,7 +527,7 @@ func (params *SetBucketAttributionParams) toRequest() *pb.BucketSetAttributionRe func (params *SetBucketAttributionParams) BatchItem() *pb.BatchRequestItem { return &pb.BatchRequestItem{ Request: &pb.BatchRequestItem_BucketSetAttribution{ - BucketSetAttribution: params.toRequest(), + BucketSetAttribution: params.toRequest(nil), }, } } @@ -513,7 +536,7 @@ func (params *SetBucketAttributionParams) BatchItem() *pb.BatchRequestItem { func (client *Client) SetBucketAttribution(ctx context.Context, params SetBucketAttributionParams) (err error) { defer mon.Task()(&ctx)(&err) - _, err = client.client.SetBucketAttribution(ctx, params.toRequest()) + _, err = client.client.SetBucketAttribution(ctx, params.toRequest(client.header())) return Error.Wrap(err) } @@ -528,8 +551,9 @@ type BeginObjectParams struct { ExpiresAt time.Time } -func (params *BeginObjectParams) toRequest() *pb.ObjectBeginRequest { +func (params *BeginObjectParams) toRequest(header *pb.RequestHeader) *pb.ObjectBeginRequest { return &pb.ObjectBeginRequest{ + Header: header, Bucket: params.Bucket, EncryptedPath: params.EncryptedPath, Version: params.Version, @@ -553,7 +577,7 @@ func (params *BeginObjectParams) toRequest() *pb.ObjectBeginRequest { func (params *BeginObjectParams) BatchItem() *pb.BatchRequestItem { return &pb.BatchRequestItem{ Request: &pb.BatchRequestItem_ObjectBegin{ - ObjectBegin: params.toRequest(), + ObjectBegin: params.toRequest(nil), }, } } @@ -573,7 +597,7 @@ func newBeginObjectResponse(response *pb.ObjectBeginResponse) BeginObjectRespons func (client *Client) BeginObject(ctx context.Context, params BeginObjectParams) (_ storj.StreamID, err error) { defer mon.Task()(&ctx)(&err) - response, err := client.client.BeginObject(ctx, params.toRequest()) + response, err := client.client.BeginObject(ctx, params.toRequest(client.header())) if err != nil { return nil, Error.Wrap(err) } @@ -589,8 +613,9 @@ type CommitObjectParams struct { EncryptedMetadata []byte } -func (params *CommitObjectParams) toRequest() *pb.ObjectCommitRequest { +func (params *CommitObjectParams) toRequest(header *pb.RequestHeader) *pb.ObjectCommitRequest { return &pb.ObjectCommitRequest{ + Header: header, StreamId: params.StreamID, EncryptedMetadataNonce: params.EncryptedMetadataNonce, EncryptedMetadata: params.EncryptedMetadata, @@ -601,7 +626,7 @@ func (params *CommitObjectParams) toRequest() *pb.ObjectCommitRequest { func (params *CommitObjectParams) BatchItem() *pb.BatchRequestItem { return &pb.BatchRequestItem{ Request: &pb.BatchRequestItem_ObjectCommit{ - ObjectCommit: params.toRequest(), + ObjectCommit: params.toRequest(nil), }, } } @@ -610,7 +635,7 @@ func (params *CommitObjectParams) BatchItem() *pb.BatchRequestItem { func (client *Client) CommitObject(ctx context.Context, params CommitObjectParams) (err error) { defer mon.Task()(&ctx)(&err) - _, err = client.client.CommitObject(ctx, params.toRequest()) + _, err = client.client.CommitObject(ctx, params.toRequest(client.header())) return Error.Wrap(err) } @@ -622,8 +647,9 @@ type GetObjectParams struct { Version int32 } -func (params *GetObjectParams) toRequest() *pb.ObjectGetRequest { +func (params *GetObjectParams) toRequest(header *pb.RequestHeader) *pb.ObjectGetRequest { return &pb.ObjectGetRequest{ + Header: header, Bucket: params.Bucket, EncryptedPath: params.EncryptedPath, Version: params.Version, @@ -634,7 +660,7 @@ func (params *GetObjectParams) toRequest() *pb.ObjectGetRequest { func (params *GetObjectParams) BatchItem() *pb.BatchRequestItem { return &pb.BatchRequestItem{ Request: &pb.BatchRequestItem_ObjectGet{ - ObjectGet: params.toRequest(), + ObjectGet: params.toRequest(nil), }, } } @@ -684,7 +710,7 @@ func newGetObjectResponse(response *pb.ObjectGetResponse) GetObjectResponse { func (client *Client) GetObject(ctx context.Context, params GetObjectParams) (_ storj.ObjectInfo, err error) { defer mon.Task()(&ctx)(&err) - response, err := client.client.GetObject(ctx, params.toRequest()) + response, err := client.client.GetObject(ctx, params.toRequest(client.header())) if err != nil { if status.Code(err) == codes.NotFound { @@ -704,8 +730,9 @@ type BeginDeleteObjectParams struct { Version int32 } -func (params *BeginDeleteObjectParams) toRequest() *pb.ObjectBeginDeleteRequest { +func (params *BeginDeleteObjectParams) toRequest(header *pb.RequestHeader) *pb.ObjectBeginDeleteRequest { return &pb.ObjectBeginDeleteRequest{ + Header: header, Bucket: params.Bucket, EncryptedPath: params.EncryptedPath, Version: params.Version, @@ -716,7 +743,7 @@ func (params *BeginDeleteObjectParams) toRequest() *pb.ObjectBeginDeleteRequest func (params *BeginDeleteObjectParams) BatchItem() *pb.BatchRequestItem { return &pb.BatchRequestItem{ Request: &pb.BatchRequestItem_ObjectBeginDelete{ - ObjectBeginDelete: params.toRequest(), + ObjectBeginDelete: params.toRequest(nil), }, } } @@ -736,7 +763,7 @@ func newBeginDeleteObjectResponse(response *pb.ObjectBeginDeleteResponse) BeginD func (client *Client) BeginDeleteObject(ctx context.Context, params BeginDeleteObjectParams) (_ storj.StreamID, err error) { defer mon.Task()(&ctx)(&err) - response, err := client.client.BeginDeleteObject(ctx, params.toRequest()) + response, err := client.client.BeginDeleteObject(ctx, params.toRequest(client.header())) if err != nil { if status.Code(err) == codes.NotFound { return storj.StreamID{}, storj.ErrObjectNotFound.Wrap(err) @@ -752,8 +779,9 @@ type FinishDeleteObjectParams struct { StreamID storj.StreamID } -func (params *FinishDeleteObjectParams) toRequest() *pb.ObjectFinishDeleteRequest { +func (params *FinishDeleteObjectParams) toRequest(header *pb.RequestHeader) *pb.ObjectFinishDeleteRequest { return &pb.ObjectFinishDeleteRequest{ + Header: header, StreamId: params.StreamID, } } @@ -762,7 +790,7 @@ func (params *FinishDeleteObjectParams) toRequest() *pb.ObjectFinishDeleteReques func (params *FinishDeleteObjectParams) BatchItem() *pb.BatchRequestItem { return &pb.BatchRequestItem{ Request: &pb.BatchRequestItem_ObjectFinishDelete{ - ObjectFinishDelete: params.toRequest(), + ObjectFinishDelete: params.toRequest(nil), }, } } @@ -771,7 +799,7 @@ func (params *FinishDeleteObjectParams) BatchItem() *pb.BatchRequestItem { func (client *Client) FinishDeleteObject(ctx context.Context, params FinishDeleteObjectParams) (err error) { defer mon.Task()(&ctx)(&err) - _, err = client.client.FinishDeleteObject(ctx, params.toRequest()) + _, err = client.client.FinishDeleteObject(ctx, params.toRequest(client.header())) return Error.Wrap(err) } @@ -786,8 +814,9 @@ type ListObjectsParams struct { Recursive bool } -func (params *ListObjectsParams) toRequest() *pb.ObjectListRequest { +func (params *ListObjectsParams) toRequest(header *pb.RequestHeader) *pb.ObjectListRequest { return &pb.ObjectListRequest{ + Header: header, Bucket: params.Bucket, EncryptedPrefix: params.EncryptedPrefix, EncryptedCursor: params.EncryptedCursor, @@ -803,7 +832,7 @@ func (params *ListObjectsParams) toRequest() *pb.ObjectListRequest { func (params *ListObjectsParams) BatchItem() *pb.BatchRequestItem { return &pb.BatchRequestItem{ Request: &pb.BatchRequestItem_ObjectList{ - ObjectList: params.toRequest(), + ObjectList: params.toRequest(nil), }, } } @@ -847,7 +876,7 @@ func newListObjectsResponse(response *pb.ObjectListResponse, encryptedPrefix []b func (client *Client) ListObjects(ctx context.Context, params ListObjectsParams) (_ []storj.ObjectListItem, more bool, err error) { defer mon.Task()(&ctx)(&err) - response, err := client.client.ListObjects(ctx, params.toRequest()) + response, err := client.client.ListObjects(ctx, params.toRequest(client.header())) if err != nil { return []storj.ObjectListItem{}, false, Error.Wrap(err) } @@ -863,8 +892,9 @@ type BeginSegmentParams struct { MaxOrderLimit int64 } -func (params *BeginSegmentParams) toRequest() *pb.SegmentBeginRequest { +func (params *BeginSegmentParams) toRequest(header *pb.RequestHeader) *pb.SegmentBeginRequest { return &pb.SegmentBeginRequest{ + Header: header, StreamId: params.StreamID, Position: &pb.SegmentPosition{ PartNumber: params.Position.PartNumber, @@ -878,7 +908,7 @@ func (params *BeginSegmentParams) toRequest() *pb.SegmentBeginRequest { func (params *BeginSegmentParams) BatchItem() *pb.BatchRequestItem { return &pb.BatchRequestItem{ Request: &pb.BatchRequestItem_SegmentBegin{ - SegmentBegin: params.toRequest(), + SegmentBegin: params.toRequest(nil), }, } } @@ -902,7 +932,7 @@ func newBeginSegmentResponse(response *pb.SegmentBeginResponse) BeginSegmentResp func (client *Client) BeginSegment(ctx context.Context, params BeginSegmentParams) (_ storj.SegmentID, limits []*pb.AddressedOrderLimit, piecePrivateKey storj.PiecePrivateKey, err error) { defer mon.Task()(&ctx)(&err) - response, err := client.client.BeginSegment(ctx, params.toRequest()) + response, err := client.client.BeginSegment(ctx, params.toRequest(client.header())) if err != nil { return storj.SegmentID{}, nil, storj.PiecePrivateKey{}, Error.Wrap(err) } @@ -919,8 +949,9 @@ type CommitSegmentParams struct { UploadResult []*pb.SegmentPieceUploadResult } -func (params *CommitSegmentParams) toRequest() *pb.SegmentCommitRequest { +func (params *CommitSegmentParams) toRequest(header *pb.RequestHeader) *pb.SegmentCommitRequest { return &pb.SegmentCommitRequest{ + Header: header, SegmentId: params.SegmentID, EncryptedKeyNonce: params.Encryption.EncryptedKeyNonce, @@ -934,7 +965,7 @@ func (params *CommitSegmentParams) toRequest() *pb.SegmentCommitRequest { func (params *CommitSegmentParams) BatchItem() *pb.BatchRequestItem { return &pb.BatchRequestItem{ Request: &pb.BatchRequestItem_SegmentCommit{ - SegmentCommit: params.toRequest(), + SegmentCommit: params.toRequest(nil), }, } } @@ -943,7 +974,7 @@ func (params *CommitSegmentParams) BatchItem() *pb.BatchRequestItem { func (client *Client) CommitSegmentNew(ctx context.Context, params CommitSegmentParams) (err error) { defer mon.Task()(&ctx)(&err) - _, err = client.client.CommitSegment(ctx, params.toRequest()) + _, err = client.client.CommitSegment(ctx, params.toRequest(client.header())) return Error.Wrap(err) } @@ -956,8 +987,9 @@ type MakeInlineSegmentParams struct { EncryptedInlineData []byte } -func (params *MakeInlineSegmentParams) toRequest() *pb.SegmentMakeInlineRequest { +func (params *MakeInlineSegmentParams) toRequest(header *pb.RequestHeader) *pb.SegmentMakeInlineRequest { return &pb.SegmentMakeInlineRequest{ + Header: header, StreamId: params.StreamID, Position: &pb.SegmentPosition{ PartNumber: params.Position.PartNumber, @@ -973,7 +1005,7 @@ func (params *MakeInlineSegmentParams) toRequest() *pb.SegmentMakeInlineRequest func (params *MakeInlineSegmentParams) BatchItem() *pb.BatchRequestItem { return &pb.BatchRequestItem{ Request: &pb.BatchRequestItem_SegmentMakeInline{ - SegmentMakeInline: params.toRequest(), + SegmentMakeInline: params.toRequest(nil), }, } } @@ -982,7 +1014,7 @@ func (params *MakeInlineSegmentParams) BatchItem() *pb.BatchRequestItem { func (client *Client) MakeInlineSegment(ctx context.Context, params MakeInlineSegmentParams) (err error) { defer mon.Task()(&ctx)(&err) - _, err = client.client.MakeInlineSegment(ctx, params.toRequest()) + _, err = client.client.MakeInlineSegment(ctx, params.toRequest(client.header())) return Error.Wrap(err) } @@ -993,8 +1025,9 @@ type BeginDeleteSegmentParams struct { Position storj.SegmentPosition } -func (params *BeginDeleteSegmentParams) toRequest() *pb.SegmentBeginDeleteRequest { +func (params *BeginDeleteSegmentParams) toRequest(header *pb.RequestHeader) *pb.SegmentBeginDeleteRequest { return &pb.SegmentBeginDeleteRequest{ + Header: header, StreamId: params.StreamID, Position: &pb.SegmentPosition{ PartNumber: params.Position.PartNumber, @@ -1007,7 +1040,7 @@ func (params *BeginDeleteSegmentParams) toRequest() *pb.SegmentBeginDeleteReques func (params *BeginDeleteSegmentParams) BatchItem() *pb.BatchRequestItem { return &pb.BatchRequestItem{ Request: &pb.BatchRequestItem_SegmentBeginDelete{ - SegmentBeginDelete: params.toRequest(), + SegmentBeginDelete: params.toRequest(nil), }, } } @@ -1031,7 +1064,7 @@ func newBeginDeleteSegmentResponse(response *pb.SegmentBeginDeleteResponse) Begi func (client *Client) BeginDeleteSegment(ctx context.Context, params BeginDeleteSegmentParams) (_ storj.SegmentID, limits []*pb.AddressedOrderLimit, _ storj.PiecePrivateKey, err error) { defer mon.Task()(&ctx)(&err) - response, err := client.client.BeginDeleteSegment(ctx, params.toRequest()) + response, err := client.client.BeginDeleteSegment(ctx, params.toRequest(client.header())) if err != nil { return storj.SegmentID{}, nil, storj.PiecePrivateKey{}, Error.Wrap(err) } @@ -1046,8 +1079,9 @@ type FinishDeleteSegmentParams struct { DeleteResults []*pb.SegmentPieceDeleteResult } -func (params *FinishDeleteSegmentParams) toRequest() *pb.SegmentFinishDeleteRequest { +func (params *FinishDeleteSegmentParams) toRequest(header *pb.RequestHeader) *pb.SegmentFinishDeleteRequest { return &pb.SegmentFinishDeleteRequest{ + Header: header, SegmentId: params.SegmentID, Results: params.DeleteResults, } @@ -1057,7 +1091,7 @@ func (params *FinishDeleteSegmentParams) toRequest() *pb.SegmentFinishDeleteRequ func (params *FinishDeleteSegmentParams) BatchItem() *pb.BatchRequestItem { return &pb.BatchRequestItem{ Request: &pb.BatchRequestItem_SegmentFinishDelete{ - SegmentFinishDelete: params.toRequest(), + SegmentFinishDelete: params.toRequest(nil), }, } } @@ -1066,7 +1100,7 @@ func (params *FinishDeleteSegmentParams) BatchItem() *pb.BatchRequestItem { func (client *Client) FinishDeleteSegment(ctx context.Context, params FinishDeleteSegmentParams) (err error) { defer mon.Task()(&ctx)(&err) - _, err = client.client.FinishDeleteSegment(ctx, params.toRequest()) + _, err = client.client.FinishDeleteSegment(ctx, params.toRequest(client.header())) return Error.Wrap(err) } @@ -1077,8 +1111,9 @@ type DownloadSegmentParams struct { Position storj.SegmentPosition } -func (params *DownloadSegmentParams) toRequest() *pb.SegmentDownloadRequest { +func (params *DownloadSegmentParams) toRequest(header *pb.RequestHeader) *pb.SegmentDownloadRequest { return &pb.SegmentDownloadRequest{ + Header: header, StreamId: params.StreamID, CursorPosition: &pb.SegmentPosition{ PartNumber: params.Position.PartNumber, @@ -1091,7 +1126,7 @@ func (params *DownloadSegmentParams) toRequest() *pb.SegmentDownloadRequest { func (params *DownloadSegmentParams) BatchItem() *pb.BatchRequestItem { return &pb.BatchRequestItem{ Request: &pb.BatchRequestItem_SegmentDownload{ - SegmentDownload: params.toRequest(), + SegmentDownload: params.toRequest(nil), }, } } @@ -1136,7 +1171,7 @@ func newDownloadSegmentResponse(response *pb.SegmentDownloadResponse) DownloadSe func (client *Client) DownloadSegment(ctx context.Context, params DownloadSegmentParams) (_ storj.SegmentDownloadInfo, _ []*pb.AddressedOrderLimit, err error) { defer mon.Task()(&ctx)(&err) - response, err := client.client.DownloadSegment(ctx, params.toRequest()) + response, err := client.client.DownloadSegment(ctx, params.toRequest(client.header())) if err != nil { return storj.SegmentDownloadInfo{}, nil, Error.Wrap(err) } @@ -1158,8 +1193,9 @@ type ListSegmentsResponse struct { More bool } -func (params *ListSegmentsParams) toRequest() *pb.SegmentListRequest { +func (params *ListSegmentsParams) toRequest(header *pb.RequestHeader) *pb.SegmentListRequest { return &pb.SegmentListRequest{ + Header: header, StreamId: params.StreamID, CursorPosition: &pb.SegmentPosition{ PartNumber: params.CursorPosition.PartNumber, @@ -1173,7 +1209,7 @@ func (params *ListSegmentsParams) toRequest() *pb.SegmentListRequest { func (params *ListSegmentsParams) BatchItem() *pb.BatchRequestItem { return &pb.BatchRequestItem{ Request: &pb.BatchRequestItem_SegmentList{ - SegmentList: params.toRequest(), + SegmentList: params.toRequest(nil), }, } } @@ -1198,7 +1234,7 @@ func newListSegmentsResponse(response *pb.SegmentListResponse) ListSegmentsRespo func (client *Client) ListSegmentsNew(ctx context.Context, params ListSegmentsParams) (_ []storj.SegmentListItem, more bool, err error) { defer mon.Task()(&ctx)(&err) - response, err := client.client.ListSegments(ctx, params.toRequest()) + response, err := client.client.ListSegments(ctx, params.toRequest(client.header())) if err != nil { if status.Code(err) == codes.NotFound { return []storj.SegmentListItem{}, false, storj.ErrObjectNotFound.Wrap(err) @@ -1219,6 +1255,7 @@ func (client *Client) Batch(ctx context.Context, requests ...BatchItem) (resp [] batchItems[i] = request.BatchItem() } response, err := client.client.Batch(ctx, &pb.BatchRequest{ + Header: client.header(), Requests: batchItems, }) if err != nil { @@ -1235,3 +1272,8 @@ func (client *Client) Batch(ctx context.Context, requests ...BatchItem) (resp [] return resp, nil } + +// SetRawAPIKey sets the client's raw API key. Mainly used for testing. +func (client *Client) SetRawAPIKey(key []byte) { + client.apiKeyRaw = key +} diff --git a/uplink/metainfo/kvmetainfo/buckets_test.go b/uplink/metainfo/kvmetainfo/buckets_test.go index 767466826..0d80a5ee1 100644 --- a/uplink/metainfo/kvmetainfo/buckets_test.go +++ b/uplink/metainfo/kvmetainfo/buckets_test.go @@ -250,7 +250,7 @@ func newMetainfoParts(planet *testplanet.Planet) (*kvmetainfo.DB, streams.Store, return nil, nil, err } - metainfo, err := planet.Uplinks[0].DialMetainfo(context.Background(), planet.Satellites[0], apiKey.Serialize()) + metainfo, err := planet.Uplinks[0].DialMetainfo(context.Background(), planet.Satellites[0], apiKey) if err != nil { return nil, nil, err } diff --git a/uplink/storage/streams/store_test.go b/uplink/storage/streams/store_test.go index 3bbee2463..305dc5686 100644 --- a/uplink/storage/streams/store_test.go +++ b/uplink/storage/streams/store_test.go @@ -270,7 +270,7 @@ func storeTestSetup(t *testing.T, ctx *testcontext.Context, planet *testplanet.P _, err = planet.Satellites[0].DB.Console().APIKeys().Create(context.Background(), apiKey.Head(), apiKeyInfo) require.NoError(t, err) - TestAPIKey := apiKey.Serialize() + TestAPIKey := apiKey metainfo, err := planet.Uplinks[0].DialMetainfo(context.Background(), planet.Satellites[0], TestAPIKey) require.NoError(t, err)