update messaging proto

This commit is contained in:
Chris Lu 2020-04-16 03:29:57 -07:00
parent f5a748d33c
commit 508f3490a0
3 changed files with 360 additions and 133 deletions

View file

@ -14,7 +14,7 @@ import (
"github.com/chrislusf/seaweedfs/weed/util/log_buffer" "github.com/chrislusf/seaweedfs/weed/util/log_buffer"
) )
func (broker *MessageBroker) Subscribe(request *messaging_pb.SubscribeRequest, server messaging_pb.SeaweedMessaging_SubscribeServer) error { func (broker *MessageBroker) Subscribe(server messaging_pb.SeaweedMessaging_SubscribeServer) error {
panic("implement me") panic("implement me")
} }
@ -28,14 +28,16 @@ func (broker *MessageBroker) Publish(stream messaging_pb.SeaweedMessaging_Publis
if err != nil { if err != nil {
return err return err
} }
namespace, topic, partition := in.Namespace, in.Topic, in.Partition namespace, topic, partition := in.Init.Namespace, in.Init.Topic, in.Init.Partition
updatesChan := make(chan int32) updatesChan := make(chan int32)
go func() { go func() {
for update := range updatesChan { for update := range updatesChan {
if err := stream.Send(&messaging_pb.PublishResponse{ if err := stream.Send(&messaging_pb.PublishResponse{
PartitionCount: update, Config: &messaging_pb.PublishResponse_ConfigMessage{
PartitionCount: update,
},
}); err != nil { }); err != nil {
glog.V(0).Infof("err sending publish response: %v", err) glog.V(0).Infof("err sending publish response: %v", err)
return return
@ -73,9 +75,9 @@ func (broker *MessageBroker) Publish(stream messaging_pb.SeaweedMessaging_Publis
m := &messaging_pb.Message{ m := &messaging_pb.Message{
Timestamp: time.Now().UnixNano(), Timestamp: time.Now().UnixNano(),
Key: in.Key, Key: in.Data.Key,
Value: in.Value, Value: in.Data.Value,
Headers: in.Headers, Headers: in.Data.Headers,
} }
data, err := proto.Marshal(m) data, err := proto.Marshal(m)
@ -84,7 +86,7 @@ func (broker *MessageBroker) Publish(stream messaging_pb.SeaweedMessaging_Publis
continue continue
} }
logBuffer.AddToBuffer(in.Key, data) logBuffer.AddToBuffer(in.Data.Key, data)
} }
} }

View file

@ -9,7 +9,7 @@ option java_outer_classname = "MessagingProto";
service SeaweedMessaging { service SeaweedMessaging {
rpc Subscribe (SubscribeRequest) returns (stream Message) { rpc Subscribe (stream SubscriberMessage) returns (stream BrokerMessage) {
} }
rpc Publish (stream PublishRequest) returns (stream PublishResponse) { rpc Publish (stream PublishRequest) returns (stream PublishResponse) {
@ -25,17 +25,25 @@ service SeaweedMessaging {
////////////////////////////////////////////////// //////////////////////////////////////////////////
message SubscribeRequest { message SubscriberMessage {
string namespace = 1; message InitMessage {
string topic = 2; string namespace = 1;
int32 partition = 3; string topic = 2;
enum StartPosition { int32 partition = 3;
LATEST = 0; // Start at the newest message enum StartPosition {
EARLIEST = 1; // Start at the oldest message LATEST = 0; // Start at the newest message
TIMESTAMP = 2; // Start after a specified timestamp, exclusive EARLIEST = 1; // Start at the oldest message
TIMESTAMP = 2; // Start after a specified timestamp, exclusive
}
StartPosition startPosition = 4; // Where to begin consuming from
int64 timestampNs = 5; // timestamp in nano seconds
string subscriber_id = 6; // uniquely identify a subscriber to track consumption
} }
StartPosition startPosition = 4; // Where to begin consuming from InitMessage init = 1;
int64 timestampNs = 5; // timestamp in nano seconds message AckMessage {
int64 message_id = 1;
}
AckMessage ack = 2;
} }
message Message { message Message {
@ -45,17 +53,38 @@ message Message {
map<string, bytes> headers = 4; // Message headers map<string, bytes> headers = 4; // Message headers
} }
message BrokerMessage {
Message data = 1;
message RedirectMessage {
string new_broker = 1;
}
RedirectMessage redirect = 2;
}
message PublishRequest { message PublishRequest {
string namespace = 1; // only needed on the initial request message InitMessage {
string topic = 2; // only needed on the initial request string namespace = 1; // only needed on the initial request
int32 partition = 4; string topic = 2; // only needed on the initial request
bytes key = 5; // Message key int32 partition = 3;
bytes value = 6; // Message payload }
map<string, bytes> headers = 7; // Message headers InitMessage init = 1;
message DataMessage {
bytes key = 1; // Message key
bytes value = 2; // Message payload
map<string, bytes> headers = 3; // Message headers
}
DataMessage data = 2;
} }
message PublishResponse { message PublishResponse {
int32 partition_count = 1; message ConfigMessage {
int32 partition_count = 1;
}
ConfigMessage config = 1;
message RedirectMessage {
string new_broker = 1;
}
RedirectMessage redirect = 2;
} }
message ConfigureTopicRequest { message ConfigureTopicRequest {

View file

@ -9,8 +9,9 @@ It is generated from these files:
messaging.proto messaging.proto
It has these top-level messages: It has these top-level messages:
SubscribeRequest SubscriberMessage
Message Message
BrokerMessage
PublishRequest PublishRequest
PublishResponse PublishResponse
ConfigureTopicRequest ConfigureTopicRequest
@ -40,80 +41,130 @@ var _ = math.Inf
// proto package needs to be updated. // proto package needs to be updated.
const _ = proto.ProtoPackageIsVersion2 // please upgrade the proto package const _ = proto.ProtoPackageIsVersion2 // please upgrade the proto package
type SubscribeRequest_StartPosition int32 type SubscriberMessage_InitMessage_StartPosition int32
const ( const (
SubscribeRequest_LATEST SubscribeRequest_StartPosition = 0 SubscriberMessage_InitMessage_LATEST SubscriberMessage_InitMessage_StartPosition = 0
SubscribeRequest_EARLIEST SubscribeRequest_StartPosition = 1 SubscriberMessage_InitMessage_EARLIEST SubscriberMessage_InitMessage_StartPosition = 1
SubscribeRequest_TIMESTAMP SubscribeRequest_StartPosition = 2 SubscriberMessage_InitMessage_TIMESTAMP SubscriberMessage_InitMessage_StartPosition = 2
) )
var SubscribeRequest_StartPosition_name = map[int32]string{ var SubscriberMessage_InitMessage_StartPosition_name = map[int32]string{
0: "LATEST", 0: "LATEST",
1: "EARLIEST", 1: "EARLIEST",
2: "TIMESTAMP", 2: "TIMESTAMP",
} }
var SubscribeRequest_StartPosition_value = map[string]int32{ var SubscriberMessage_InitMessage_StartPosition_value = map[string]int32{
"LATEST": 0, "LATEST": 0,
"EARLIEST": 1, "EARLIEST": 1,
"TIMESTAMP": 2, "TIMESTAMP": 2,
} }
func (x SubscribeRequest_StartPosition) String() string { func (x SubscriberMessage_InitMessage_StartPosition) String() string {
return proto.EnumName(SubscribeRequest_StartPosition_name, int32(x)) return proto.EnumName(SubscriberMessage_InitMessage_StartPosition_name, int32(x))
} }
func (SubscribeRequest_StartPosition) EnumDescriptor() ([]byte, []int) { func (SubscriberMessage_InitMessage_StartPosition) EnumDescriptor() ([]byte, []int) {
return fileDescriptor0, []int{0, 0, 0}
}
type SubscriberMessage struct {
Init *SubscriberMessage_InitMessage `protobuf:"bytes,1,opt,name=init" json:"init,omitempty"`
Ack *SubscriberMessage_AckMessage `protobuf:"bytes,2,opt,name=ack" json:"ack,omitempty"`
}
func (m *SubscriberMessage) Reset() { *m = SubscriberMessage{} }
func (m *SubscriberMessage) String() string { return proto.CompactTextString(m) }
func (*SubscriberMessage) ProtoMessage() {}
func (*SubscriberMessage) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{0} }
func (m *SubscriberMessage) GetInit() *SubscriberMessage_InitMessage {
if m != nil {
return m.Init
}
return nil
}
func (m *SubscriberMessage) GetAck() *SubscriberMessage_AckMessage {
if m != nil {
return m.Ack
}
return nil
}
type SubscriberMessage_InitMessage struct {
Namespace string `protobuf:"bytes,1,opt,name=namespace" json:"namespace,omitempty"`
Topic string `protobuf:"bytes,2,opt,name=topic" json:"topic,omitempty"`
Partition int32 `protobuf:"varint,3,opt,name=partition" json:"partition,omitempty"`
StartPosition SubscriberMessage_InitMessage_StartPosition `protobuf:"varint,4,opt,name=startPosition,enum=messaging_pb.SubscriberMessage_InitMessage_StartPosition" json:"startPosition,omitempty"`
TimestampNs int64 `protobuf:"varint,5,opt,name=timestampNs" json:"timestampNs,omitempty"`
SubscriberId string `protobuf:"bytes,6,opt,name=subscriber_id,json=subscriberId" json:"subscriber_id,omitempty"`
}
func (m *SubscriberMessage_InitMessage) Reset() { *m = SubscriberMessage_InitMessage{} }
func (m *SubscriberMessage_InitMessage) String() string { return proto.CompactTextString(m) }
func (*SubscriberMessage_InitMessage) ProtoMessage() {}
func (*SubscriberMessage_InitMessage) Descriptor() ([]byte, []int) {
return fileDescriptor0, []int{0, 0} return fileDescriptor0, []int{0, 0}
} }
type SubscribeRequest struct { func (m *SubscriberMessage_InitMessage) GetNamespace() string {
Namespace string `protobuf:"bytes,1,opt,name=namespace" json:"namespace,omitempty"`
Topic string `protobuf:"bytes,2,opt,name=topic" json:"topic,omitempty"`
Partition int32 `protobuf:"varint,3,opt,name=partition" json:"partition,omitempty"`
StartPosition SubscribeRequest_StartPosition `protobuf:"varint,4,opt,name=startPosition,enum=messaging_pb.SubscribeRequest_StartPosition" json:"startPosition,omitempty"`
TimestampNs int64 `protobuf:"varint,5,opt,name=timestampNs" json:"timestampNs,omitempty"`
}
func (m *SubscribeRequest) Reset() { *m = SubscribeRequest{} }
func (m *SubscribeRequest) String() string { return proto.CompactTextString(m) }
func (*SubscribeRequest) ProtoMessage() {}
func (*SubscribeRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{0} }
func (m *SubscribeRequest) GetNamespace() string {
if m != nil { if m != nil {
return m.Namespace return m.Namespace
} }
return "" return ""
} }
func (m *SubscribeRequest) GetTopic() string { func (m *SubscriberMessage_InitMessage) GetTopic() string {
if m != nil { if m != nil {
return m.Topic return m.Topic
} }
return "" return ""
} }
func (m *SubscribeRequest) GetPartition() int32 { func (m *SubscriberMessage_InitMessage) GetPartition() int32 {
if m != nil { if m != nil {
return m.Partition return m.Partition
} }
return 0 return 0
} }
func (m *SubscribeRequest) GetStartPosition() SubscribeRequest_StartPosition { func (m *SubscriberMessage_InitMessage) GetStartPosition() SubscriberMessage_InitMessage_StartPosition {
if m != nil { if m != nil {
return m.StartPosition return m.StartPosition
} }
return SubscribeRequest_LATEST return SubscriberMessage_InitMessage_LATEST
} }
func (m *SubscribeRequest) GetTimestampNs() int64 { func (m *SubscriberMessage_InitMessage) GetTimestampNs() int64 {
if m != nil { if m != nil {
return m.TimestampNs return m.TimestampNs
} }
return 0 return 0
} }
func (m *SubscriberMessage_InitMessage) GetSubscriberId() string {
if m != nil {
return m.SubscriberId
}
return ""
}
type SubscriberMessage_AckMessage struct {
MessageId int64 `protobuf:"varint,1,opt,name=message_id,json=messageId" json:"message_id,omitempty"`
}
func (m *SubscriberMessage_AckMessage) Reset() { *m = SubscriberMessage_AckMessage{} }
func (m *SubscriberMessage_AckMessage) String() string { return proto.CompactTextString(m) }
func (*SubscriberMessage_AckMessage) ProtoMessage() {}
func (*SubscriberMessage_AckMessage) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{0, 1} }
func (m *SubscriberMessage_AckMessage) GetMessageId() int64 {
if m != nil {
return m.MessageId
}
return 0
}
type Message struct { type Message struct {
Timestamp int64 `protobuf:"varint,1,opt,name=timestamp" json:"timestamp,omitempty"` Timestamp int64 `protobuf:"varint,1,opt,name=timestamp" json:"timestamp,omitempty"`
Key []byte `protobuf:"bytes,2,opt,name=key,proto3" json:"key,omitempty"` Key []byte `protobuf:"bytes,2,opt,name=key,proto3" json:"key,omitempty"`
@ -154,56 +205,130 @@ func (m *Message) GetHeaders() map[string][]byte {
return nil return nil
} }
type BrokerMessage struct {
Data *Message `protobuf:"bytes,1,opt,name=data" json:"data,omitempty"`
Redirect *BrokerMessage_RedirectMessage `protobuf:"bytes,2,opt,name=redirect" json:"redirect,omitempty"`
}
func (m *BrokerMessage) Reset() { *m = BrokerMessage{} }
func (m *BrokerMessage) String() string { return proto.CompactTextString(m) }
func (*BrokerMessage) ProtoMessage() {}
func (*BrokerMessage) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{2} }
func (m *BrokerMessage) GetData() *Message {
if m != nil {
return m.Data
}
return nil
}
func (m *BrokerMessage) GetRedirect() *BrokerMessage_RedirectMessage {
if m != nil {
return m.Redirect
}
return nil
}
type BrokerMessage_RedirectMessage struct {
NewBroker string `protobuf:"bytes,1,opt,name=new_broker,json=newBroker" json:"new_broker,omitempty"`
}
func (m *BrokerMessage_RedirectMessage) Reset() { *m = BrokerMessage_RedirectMessage{} }
func (m *BrokerMessage_RedirectMessage) String() string { return proto.CompactTextString(m) }
func (*BrokerMessage_RedirectMessage) ProtoMessage() {}
func (*BrokerMessage_RedirectMessage) Descriptor() ([]byte, []int) {
return fileDescriptor0, []int{2, 0}
}
func (m *BrokerMessage_RedirectMessage) GetNewBroker() string {
if m != nil {
return m.NewBroker
}
return ""
}
type PublishRequest struct { type PublishRequest struct {
Namespace string `protobuf:"bytes,1,opt,name=namespace" json:"namespace,omitempty"` Init *PublishRequest_InitMessage `protobuf:"bytes,1,opt,name=init" json:"init,omitempty"`
Topic string `protobuf:"bytes,2,opt,name=topic" json:"topic,omitempty"` Data *PublishRequest_DataMessage `protobuf:"bytes,2,opt,name=data" json:"data,omitempty"`
Partition int32 `protobuf:"varint,4,opt,name=partition" json:"partition,omitempty"`
Key []byte `protobuf:"bytes,5,opt,name=key,proto3" json:"key,omitempty"`
Value []byte `protobuf:"bytes,6,opt,name=value,proto3" json:"value,omitempty"`
Headers map[string][]byte `protobuf:"bytes,7,rep,name=headers" json:"headers,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value,proto3"`
} }
func (m *PublishRequest) Reset() { *m = PublishRequest{} } func (m *PublishRequest) Reset() { *m = PublishRequest{} }
func (m *PublishRequest) String() string { return proto.CompactTextString(m) } func (m *PublishRequest) String() string { return proto.CompactTextString(m) }
func (*PublishRequest) ProtoMessage() {} func (*PublishRequest) ProtoMessage() {}
func (*PublishRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{2} } func (*PublishRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{3} }
func (m *PublishRequest) GetNamespace() string { func (m *PublishRequest) GetInit() *PublishRequest_InitMessage {
if m != nil {
return m.Init
}
return nil
}
func (m *PublishRequest) GetData() *PublishRequest_DataMessage {
if m != nil {
return m.Data
}
return nil
}
type PublishRequest_InitMessage struct {
Namespace string `protobuf:"bytes,1,opt,name=namespace" json:"namespace,omitempty"`
Topic string `protobuf:"bytes,2,opt,name=topic" json:"topic,omitempty"`
Partition int32 `protobuf:"varint,3,opt,name=partition" json:"partition,omitempty"`
}
func (m *PublishRequest_InitMessage) Reset() { *m = PublishRequest_InitMessage{} }
func (m *PublishRequest_InitMessage) String() string { return proto.CompactTextString(m) }
func (*PublishRequest_InitMessage) ProtoMessage() {}
func (*PublishRequest_InitMessage) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{3, 0} }
func (m *PublishRequest_InitMessage) GetNamespace() string {
if m != nil { if m != nil {
return m.Namespace return m.Namespace
} }
return "" return ""
} }
func (m *PublishRequest) GetTopic() string { func (m *PublishRequest_InitMessage) GetTopic() string {
if m != nil { if m != nil {
return m.Topic return m.Topic
} }
return "" return ""
} }
func (m *PublishRequest) GetPartition() int32 { func (m *PublishRequest_InitMessage) GetPartition() int32 {
if m != nil { if m != nil {
return m.Partition return m.Partition
} }
return 0 return 0
} }
func (m *PublishRequest) GetKey() []byte { type PublishRequest_DataMessage struct {
Key []byte `protobuf:"bytes,1,opt,name=key,proto3" json:"key,omitempty"`
Value []byte `protobuf:"bytes,2,opt,name=value,proto3" json:"value,omitempty"`
Headers map[string][]byte `protobuf:"bytes,3,rep,name=headers" json:"headers,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value,proto3"`
}
func (m *PublishRequest_DataMessage) Reset() { *m = PublishRequest_DataMessage{} }
func (m *PublishRequest_DataMessage) String() string { return proto.CompactTextString(m) }
func (*PublishRequest_DataMessage) ProtoMessage() {}
func (*PublishRequest_DataMessage) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{3, 1} }
func (m *PublishRequest_DataMessage) GetKey() []byte {
if m != nil { if m != nil {
return m.Key return m.Key
} }
return nil return nil
} }
func (m *PublishRequest) GetValue() []byte { func (m *PublishRequest_DataMessage) GetValue() []byte {
if m != nil { if m != nil {
return m.Value return m.Value
} }
return nil return nil
} }
func (m *PublishRequest) GetHeaders() map[string][]byte { func (m *PublishRequest_DataMessage) GetHeaders() map[string][]byte {
if m != nil { if m != nil {
return m.Headers return m.Headers
} }
@ -211,21 +336,65 @@ func (m *PublishRequest) GetHeaders() map[string][]byte {
} }
type PublishResponse struct { type PublishResponse struct {
PartitionCount int32 `protobuf:"varint,1,opt,name=partition_count,json=partitionCount" json:"partition_count,omitempty"` Config *PublishResponse_ConfigMessage `protobuf:"bytes,1,opt,name=config" json:"config,omitempty"`
Redirect *PublishResponse_RedirectMessage `protobuf:"bytes,2,opt,name=redirect" json:"redirect,omitempty"`
} }
func (m *PublishResponse) Reset() { *m = PublishResponse{} } func (m *PublishResponse) Reset() { *m = PublishResponse{} }
func (m *PublishResponse) String() string { return proto.CompactTextString(m) } func (m *PublishResponse) String() string { return proto.CompactTextString(m) }
func (*PublishResponse) ProtoMessage() {} func (*PublishResponse) ProtoMessage() {}
func (*PublishResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{3} } func (*PublishResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{4} }
func (m *PublishResponse) GetPartitionCount() int32 { func (m *PublishResponse) GetConfig() *PublishResponse_ConfigMessage {
if m != nil {
return m.Config
}
return nil
}
func (m *PublishResponse) GetRedirect() *PublishResponse_RedirectMessage {
if m != nil {
return m.Redirect
}
return nil
}
type PublishResponse_ConfigMessage struct {
PartitionCount int32 `protobuf:"varint,1,opt,name=partition_count,json=partitionCount" json:"partition_count,omitempty"`
}
func (m *PublishResponse_ConfigMessage) Reset() { *m = PublishResponse_ConfigMessage{} }
func (m *PublishResponse_ConfigMessage) String() string { return proto.CompactTextString(m) }
func (*PublishResponse_ConfigMessage) ProtoMessage() {}
func (*PublishResponse_ConfigMessage) Descriptor() ([]byte, []int) {
return fileDescriptor0, []int{4, 0}
}
func (m *PublishResponse_ConfigMessage) GetPartitionCount() int32 {
if m != nil { if m != nil {
return m.PartitionCount return m.PartitionCount
} }
return 0 return 0
} }
type PublishResponse_RedirectMessage struct {
NewBroker string `protobuf:"bytes,1,opt,name=new_broker,json=newBroker" json:"new_broker,omitempty"`
}
func (m *PublishResponse_RedirectMessage) Reset() { *m = PublishResponse_RedirectMessage{} }
func (m *PublishResponse_RedirectMessage) String() string { return proto.CompactTextString(m) }
func (*PublishResponse_RedirectMessage) ProtoMessage() {}
func (*PublishResponse_RedirectMessage) Descriptor() ([]byte, []int) {
return fileDescriptor0, []int{4, 1}
}
func (m *PublishResponse_RedirectMessage) GetNewBroker() string {
if m != nil {
return m.NewBroker
}
return ""
}
type ConfigureTopicRequest struct { type ConfigureTopicRequest struct {
Namespace string `protobuf:"bytes,1,opt,name=namespace" json:"namespace,omitempty"` Namespace string `protobuf:"bytes,1,opt,name=namespace" json:"namespace,omitempty"`
Topic string `protobuf:"bytes,2,opt,name=topic" json:"topic,omitempty"` Topic string `protobuf:"bytes,2,opt,name=topic" json:"topic,omitempty"`
@ -236,7 +405,7 @@ type ConfigureTopicRequest struct {
func (m *ConfigureTopicRequest) Reset() { *m = ConfigureTopicRequest{} } func (m *ConfigureTopicRequest) Reset() { *m = ConfigureTopicRequest{} }
func (m *ConfigureTopicRequest) String() string { return proto.CompactTextString(m) } func (m *ConfigureTopicRequest) String() string { return proto.CompactTextString(m) }
func (*ConfigureTopicRequest) ProtoMessage() {} func (*ConfigureTopicRequest) ProtoMessage() {}
func (*ConfigureTopicRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{4} } func (*ConfigureTopicRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{5} }
func (m *ConfigureTopicRequest) GetNamespace() string { func (m *ConfigureTopicRequest) GetNamespace() string {
if m != nil { if m != nil {
@ -272,7 +441,7 @@ type ConfigureTopicResponse struct {
func (m *ConfigureTopicResponse) Reset() { *m = ConfigureTopicResponse{} } func (m *ConfigureTopicResponse) Reset() { *m = ConfigureTopicResponse{} }
func (m *ConfigureTopicResponse) String() string { return proto.CompactTextString(m) } func (m *ConfigureTopicResponse) String() string { return proto.CompactTextString(m) }
func (*ConfigureTopicResponse) ProtoMessage() {} func (*ConfigureTopicResponse) ProtoMessage() {}
func (*ConfigureTopicResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{5} } func (*ConfigureTopicResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{6} }
type GetTopicConfigurationRequest struct { type GetTopicConfigurationRequest struct {
Namespace string `protobuf:"bytes,1,opt,name=namespace" json:"namespace,omitempty"` Namespace string `protobuf:"bytes,1,opt,name=namespace" json:"namespace,omitempty"`
@ -282,7 +451,7 @@ type GetTopicConfigurationRequest struct {
func (m *GetTopicConfigurationRequest) Reset() { *m = GetTopicConfigurationRequest{} } func (m *GetTopicConfigurationRequest) Reset() { *m = GetTopicConfigurationRequest{} }
func (m *GetTopicConfigurationRequest) String() string { return proto.CompactTextString(m) } func (m *GetTopicConfigurationRequest) String() string { return proto.CompactTextString(m) }
func (*GetTopicConfigurationRequest) ProtoMessage() {} func (*GetTopicConfigurationRequest) ProtoMessage() {}
func (*GetTopicConfigurationRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{6} } func (*GetTopicConfigurationRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{7} }
func (m *GetTopicConfigurationRequest) GetNamespace() string { func (m *GetTopicConfigurationRequest) GetNamespace() string {
if m != nil { if m != nil {
@ -305,7 +474,7 @@ type GetTopicConfigurationResponse struct {
func (m *GetTopicConfigurationResponse) Reset() { *m = GetTopicConfigurationResponse{} } func (m *GetTopicConfigurationResponse) Reset() { *m = GetTopicConfigurationResponse{} }
func (m *GetTopicConfigurationResponse) String() string { return proto.CompactTextString(m) } func (m *GetTopicConfigurationResponse) String() string { return proto.CompactTextString(m) }
func (*GetTopicConfigurationResponse) ProtoMessage() {} func (*GetTopicConfigurationResponse) ProtoMessage() {}
func (*GetTopicConfigurationResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{7} } func (*GetTopicConfigurationResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{8} }
func (m *GetTopicConfigurationResponse) GetPartitions() int32 { func (m *GetTopicConfigurationResponse) GetPartitions() int32 {
if m != nil { if m != nil {
@ -315,15 +484,23 @@ func (m *GetTopicConfigurationResponse) GetPartitions() int32 {
} }
func init() { func init() {
proto.RegisterType((*SubscribeRequest)(nil), "messaging_pb.SubscribeRequest") proto.RegisterType((*SubscriberMessage)(nil), "messaging_pb.SubscriberMessage")
proto.RegisterType((*SubscriberMessage_InitMessage)(nil), "messaging_pb.SubscriberMessage.InitMessage")
proto.RegisterType((*SubscriberMessage_AckMessage)(nil), "messaging_pb.SubscriberMessage.AckMessage")
proto.RegisterType((*Message)(nil), "messaging_pb.Message") proto.RegisterType((*Message)(nil), "messaging_pb.Message")
proto.RegisterType((*BrokerMessage)(nil), "messaging_pb.BrokerMessage")
proto.RegisterType((*BrokerMessage_RedirectMessage)(nil), "messaging_pb.BrokerMessage.RedirectMessage")
proto.RegisterType((*PublishRequest)(nil), "messaging_pb.PublishRequest") proto.RegisterType((*PublishRequest)(nil), "messaging_pb.PublishRequest")
proto.RegisterType((*PublishRequest_InitMessage)(nil), "messaging_pb.PublishRequest.InitMessage")
proto.RegisterType((*PublishRequest_DataMessage)(nil), "messaging_pb.PublishRequest.DataMessage")
proto.RegisterType((*PublishResponse)(nil), "messaging_pb.PublishResponse") proto.RegisterType((*PublishResponse)(nil), "messaging_pb.PublishResponse")
proto.RegisterType((*PublishResponse_ConfigMessage)(nil), "messaging_pb.PublishResponse.ConfigMessage")
proto.RegisterType((*PublishResponse_RedirectMessage)(nil), "messaging_pb.PublishResponse.RedirectMessage")
proto.RegisterType((*ConfigureTopicRequest)(nil), "messaging_pb.ConfigureTopicRequest") proto.RegisterType((*ConfigureTopicRequest)(nil), "messaging_pb.ConfigureTopicRequest")
proto.RegisterType((*ConfigureTopicResponse)(nil), "messaging_pb.ConfigureTopicResponse") proto.RegisterType((*ConfigureTopicResponse)(nil), "messaging_pb.ConfigureTopicResponse")
proto.RegisterType((*GetTopicConfigurationRequest)(nil), "messaging_pb.GetTopicConfigurationRequest") proto.RegisterType((*GetTopicConfigurationRequest)(nil), "messaging_pb.GetTopicConfigurationRequest")
proto.RegisterType((*GetTopicConfigurationResponse)(nil), "messaging_pb.GetTopicConfigurationResponse") proto.RegisterType((*GetTopicConfigurationResponse)(nil), "messaging_pb.GetTopicConfigurationResponse")
proto.RegisterEnum("messaging_pb.SubscribeRequest_StartPosition", SubscribeRequest_StartPosition_name, SubscribeRequest_StartPosition_value) proto.RegisterEnum("messaging_pb.SubscriberMessage_InitMessage_StartPosition", SubscriberMessage_InitMessage_StartPosition_name, SubscriberMessage_InitMessage_StartPosition_value)
} }
// Reference imports to suppress errors if they are not otherwise used. // Reference imports to suppress errors if they are not otherwise used.
@ -337,7 +514,7 @@ const _ = grpc.SupportPackageIsVersion4
// Client API for SeaweedMessaging service // Client API for SeaweedMessaging service
type SeaweedMessagingClient interface { type SeaweedMessagingClient interface {
Subscribe(ctx context.Context, in *SubscribeRequest, opts ...grpc.CallOption) (SeaweedMessaging_SubscribeClient, error) Subscribe(ctx context.Context, opts ...grpc.CallOption) (SeaweedMessaging_SubscribeClient, error)
Publish(ctx context.Context, opts ...grpc.CallOption) (SeaweedMessaging_PublishClient, error) Publish(ctx context.Context, opts ...grpc.CallOption) (SeaweedMessaging_PublishClient, error)
ConfigureTopic(ctx context.Context, in *ConfigureTopicRequest, opts ...grpc.CallOption) (*ConfigureTopicResponse, error) ConfigureTopic(ctx context.Context, in *ConfigureTopicRequest, opts ...grpc.CallOption) (*ConfigureTopicResponse, error)
GetTopicConfiguration(ctx context.Context, in *GetTopicConfigurationRequest, opts ...grpc.CallOption) (*GetTopicConfigurationResponse, error) GetTopicConfiguration(ctx context.Context, in *GetTopicConfigurationRequest, opts ...grpc.CallOption) (*GetTopicConfigurationResponse, error)
@ -351,23 +528,18 @@ func NewSeaweedMessagingClient(cc *grpc.ClientConn) SeaweedMessagingClient {
return &seaweedMessagingClient{cc} return &seaweedMessagingClient{cc}
} }
func (c *seaweedMessagingClient) Subscribe(ctx context.Context, in *SubscribeRequest, opts ...grpc.CallOption) (SeaweedMessaging_SubscribeClient, error) { func (c *seaweedMessagingClient) Subscribe(ctx context.Context, opts ...grpc.CallOption) (SeaweedMessaging_SubscribeClient, error) {
stream, err := grpc.NewClientStream(ctx, &_SeaweedMessaging_serviceDesc.Streams[0], c.cc, "/messaging_pb.SeaweedMessaging/Subscribe", opts...) stream, err := grpc.NewClientStream(ctx, &_SeaweedMessaging_serviceDesc.Streams[0], c.cc, "/messaging_pb.SeaweedMessaging/Subscribe", opts...)
if err != nil { if err != nil {
return nil, err return nil, err
} }
x := &seaweedMessagingSubscribeClient{stream} x := &seaweedMessagingSubscribeClient{stream}
if err := x.ClientStream.SendMsg(in); err != nil {
return nil, err
}
if err := x.ClientStream.CloseSend(); err != nil {
return nil, err
}
return x, nil return x, nil
} }
type SeaweedMessaging_SubscribeClient interface { type SeaweedMessaging_SubscribeClient interface {
Recv() (*Message, error) Send(*SubscriberMessage) error
Recv() (*BrokerMessage, error)
grpc.ClientStream grpc.ClientStream
} }
@ -375,8 +547,12 @@ type seaweedMessagingSubscribeClient struct {
grpc.ClientStream grpc.ClientStream
} }
func (x *seaweedMessagingSubscribeClient) Recv() (*Message, error) { func (x *seaweedMessagingSubscribeClient) Send(m *SubscriberMessage) error {
m := new(Message) return x.ClientStream.SendMsg(m)
}
func (x *seaweedMessagingSubscribeClient) Recv() (*BrokerMessage, error) {
m := new(BrokerMessage)
if err := x.ClientStream.RecvMsg(m); err != nil { if err := x.ClientStream.RecvMsg(m); err != nil {
return nil, err return nil, err
} }
@ -435,7 +611,7 @@ func (c *seaweedMessagingClient) GetTopicConfiguration(ctx context.Context, in *
// Server API for SeaweedMessaging service // Server API for SeaweedMessaging service
type SeaweedMessagingServer interface { type SeaweedMessagingServer interface {
Subscribe(*SubscribeRequest, SeaweedMessaging_SubscribeServer) error Subscribe(SeaweedMessaging_SubscribeServer) error
Publish(SeaweedMessaging_PublishServer) error Publish(SeaweedMessaging_PublishServer) error
ConfigureTopic(context.Context, *ConfigureTopicRequest) (*ConfigureTopicResponse, error) ConfigureTopic(context.Context, *ConfigureTopicRequest) (*ConfigureTopicResponse, error)
GetTopicConfiguration(context.Context, *GetTopicConfigurationRequest) (*GetTopicConfigurationResponse, error) GetTopicConfiguration(context.Context, *GetTopicConfigurationRequest) (*GetTopicConfigurationResponse, error)
@ -446,15 +622,12 @@ func RegisterSeaweedMessagingServer(s *grpc.Server, srv SeaweedMessagingServer)
} }
func _SeaweedMessaging_Subscribe_Handler(srv interface{}, stream grpc.ServerStream) error { func _SeaweedMessaging_Subscribe_Handler(srv interface{}, stream grpc.ServerStream) error {
m := new(SubscribeRequest) return srv.(SeaweedMessagingServer).Subscribe(&seaweedMessagingSubscribeServer{stream})
if err := stream.RecvMsg(m); err != nil {
return err
}
return srv.(SeaweedMessagingServer).Subscribe(m, &seaweedMessagingSubscribeServer{stream})
} }
type SeaweedMessaging_SubscribeServer interface { type SeaweedMessaging_SubscribeServer interface {
Send(*Message) error Send(*BrokerMessage) error
Recv() (*SubscriberMessage, error)
grpc.ServerStream grpc.ServerStream
} }
@ -462,10 +635,18 @@ type seaweedMessagingSubscribeServer struct {
grpc.ServerStream grpc.ServerStream
} }
func (x *seaweedMessagingSubscribeServer) Send(m *Message) error { func (x *seaweedMessagingSubscribeServer) Send(m *BrokerMessage) error {
return x.ServerStream.SendMsg(m) return x.ServerStream.SendMsg(m)
} }
func (x *seaweedMessagingSubscribeServer) Recv() (*SubscriberMessage, error) {
m := new(SubscriberMessage)
if err := x.ServerStream.RecvMsg(m); err != nil {
return nil, err
}
return m, nil
}
func _SeaweedMessaging_Publish_Handler(srv interface{}, stream grpc.ServerStream) error { func _SeaweedMessaging_Publish_Handler(srv interface{}, stream grpc.ServerStream) error {
return srv.(SeaweedMessagingServer).Publish(&seaweedMessagingPublishServer{stream}) return srv.(SeaweedMessagingServer).Publish(&seaweedMessagingPublishServer{stream})
} }
@ -546,6 +727,7 @@ var _SeaweedMessaging_serviceDesc = grpc.ServiceDesc{
StreamName: "Subscribe", StreamName: "Subscribe",
Handler: _SeaweedMessaging_Subscribe_Handler, Handler: _SeaweedMessaging_Subscribe_Handler,
ServerStreams: true, ServerStreams: true,
ClientStreams: true,
}, },
{ {
StreamName: "Publish", StreamName: "Publish",
@ -560,42 +742,56 @@ var _SeaweedMessaging_serviceDesc = grpc.ServiceDesc{
func init() { proto.RegisterFile("messaging.proto", fileDescriptor0) } func init() { proto.RegisterFile("messaging.proto", fileDescriptor0) }
var fileDescriptor0 = []byte{ var fileDescriptor0 = []byte{
// 586 bytes of a gzipped FileDescriptorProto // 802 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 0x02, 0xff, 0xb4, 0x95, 0xdb, 0x8b, 0xda, 0x4e, 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 0x02, 0xff, 0xb4, 0x56, 0x5d, 0x4f, 0xdb, 0x48,
0x14, 0xc7, 0x9d, 0xc4, 0xcb, 0x2f, 0x67, 0xbd, 0x31, 0xfc, 0x2c, 0x41, 0x5c, 0x09, 0x69, 0xa1, 0x14, 0xc5, 0x76, 0x12, 0xf0, 0xcd, 0xe7, 0x8e, 0x96, 0x55, 0xe4, 0x05, 0x36, 0x32, 0x2b, 0x6d,
0xe9, 0x85, 0x20, 0xf6, 0x65, 0x91, 0x42, 0x51, 0xb1, 0xed, 0x82, 0x16, 0x19, 0x7d, 0x2d, 0x4b, 0xb6, 0xa8, 0x16, 0x4a, 0x55, 0x89, 0x22, 0x24, 0x94, 0xd0, 0x88, 0x46, 0x22, 0x25, 0x9a, 0xe4,
0xcc, 0xce, 0xba, 0xa1, 0x9a, 0xa4, 0x99, 0x49, 0xcb, 0xfe, 0x0d, 0x7d, 0xdd, 0x7f, 0xab, 0x7f, 0xb5, 0x8a, 0x26, 0xce, 0x00, 0x56, 0x12, 0x3b, 0xf5, 0x4c, 0x8a, 0x78, 0x6e, 0x5f, 0xfb, 0xd6,
0x51, 0x5f, 0x4a, 0xae, 0x26, 0x92, 0x95, 0xd2, 0xcb, 0x5b, 0xe6, 0x3b, 0x67, 0xce, 0xf7, 0x9c, 0x5f, 0x52, 0xa9, 0x3f, 0xa0, 0x7d, 0xef, 0x7f, 0xaa, 0x3c, 0xfe, 0x88, 0x1d, 0x42, 0xa0, 0x48,
0xcf, 0x49, 0x26, 0xd0, 0xda, 0x53, 0xc6, 0x8c, 0xad, 0x65, 0x6f, 0x75, 0xd7, 0x73, 0xb8, 0x83, 0xbc, 0xd9, 0xd7, 0xe7, 0xdc, 0x73, 0xe7, 0xde, 0x33, 0xe3, 0x81, 0xe2, 0x84, 0x32, 0x46, 0x2e,
0xeb, 0xa9, 0x70, 0xe5, 0x6e, 0xd4, 0x7b, 0x01, 0xda, 0x2b, 0x7f, 0xc3, 0x4c, 0xcf, 0xda, 0x50, 0x2d, 0xfb, 0xd2, 0x98, 0xba, 0x0e, 0x77, 0x50, 0x2e, 0x0a, 0xf4, 0xa7, 0x03, 0xfd, 0x63, 0x0a,
0x42, 0x3f, 0xfb, 0x94, 0x71, 0xdc, 0x03, 0xc9, 0x36, 0xf6, 0x94, 0xb9, 0x86, 0x49, 0x65, 0xa4, 0xfe, 0xe8, 0xce, 0x06, 0xcc, 0x74, 0xad, 0x01, 0x75, 0xdb, 0xe2, 0x13, 0x45, 0xc7, 0x90, 0xb2,
0x20, 0x4d, 0x22, 0x07, 0x01, 0xff, 0x0f, 0x15, 0xee, 0xb8, 0x96, 0x29, 0x0b, 0xe1, 0x4e, 0xb4, 0x6c, 0x8b, 0x97, 0xa5, 0x8a, 0x54, 0xcd, 0xd6, 0xf6, 0x8c, 0x38, 0xc5, 0xb8, 0x05, 0x37, 0x5a,
0x08, 0xce, 0xb8, 0x86, 0xc7, 0x2d, 0x6e, 0x39, 0xb6, 0x2c, 0x2a, 0x48, 0xab, 0x90, 0x83, 0x80, 0xb6, 0xc5, 0x83, 0x67, 0x2c, 0x88, 0xe8, 0x08, 0x14, 0x62, 0x8e, 0xca, 0xb2, 0xe0, 0x3f, 0xbb,
0x09, 0x34, 0x18, 0x37, 0x3c, 0xbe, 0x74, 0x58, 0x14, 0x51, 0x56, 0x90, 0xd6, 0x1c, 0xbe, 0xd4, 0x8f, 0x5f, 0x37, 0x47, 0x21, 0xdd, 0xa3, 0x69, 0xdf, 0x65, 0xc8, 0xc6, 0x72, 0xa2, 0x2d, 0x50,
0xb3, 0xc5, 0xe8, 0xc7, 0x85, 0xe8, 0xab, 0xec, 0x19, 0x92, 0x4f, 0x81, 0x15, 0x38, 0xe3, 0xd6, 0x6d, 0x32, 0xa1, 0x6c, 0x4a, 0x4c, 0x2a, 0x6a, 0x52, 0xf1, 0x3c, 0x80, 0xfe, 0x84, 0x34, 0x77,
0x9e, 0x32, 0x6e, 0xec, 0xdd, 0x0f, 0x4c, 0xae, 0x28, 0x48, 0x13, 0x49, 0x56, 0x52, 0x2f, 0xa0, 0xa6, 0x96, 0x29, 0xd4, 0x54, 0xec, 0xbf, 0x78, 0x9c, 0x29, 0x71, 0xb9, 0xc5, 0x2d, 0xc7, 0x2e,
0x91, 0xcb, 0x80, 0x01, 0xaa, 0xf3, 0xf1, 0x7a, 0xb6, 0x5a, 0xb7, 0x4b, 0xb8, 0x0e, 0xff, 0xcd, 0x2b, 0x15, 0xa9, 0x9a, 0xc6, 0xf3, 0x00, 0xea, 0x43, 0x9e, 0x71, 0xe2, 0xf2, 0x8e, 0xc3, 0x7c,
0xc6, 0x64, 0x7e, 0x19, 0xac, 0x10, 0x6e, 0x80, 0xb4, 0xbe, 0x5c, 0xcc, 0x56, 0xeb, 0xf1, 0x62, 0x44, 0xaa, 0x22, 0x55, 0x0b, 0xb5, 0x57, 0xbf, 0xb1, 0x52, 0xa3, 0x1b, 0x4f, 0x80, 0x93, 0xf9,
0xd9, 0x16, 0xd4, 0xef, 0x08, 0x6a, 0x8b, 0xb0, 0x34, 0x8a, 0x15, 0x90, 0xd2, 0xa4, 0x21, 0x0d, 0x50, 0x05, 0xb2, 0xdc, 0x9a, 0x50, 0xc6, 0xc9, 0x64, 0xfa, 0x96, 0x95, 0xd3, 0x15, 0xa9, 0xaa,
0x71, 0x22, 0x0c, 0x10, 0x39, 0x88, 0xb8, 0x0d, 0xe2, 0x27, 0x7a, 0x17, 0xf2, 0xa8, 0x93, 0xe0, 0xe0, 0x78, 0x08, 0xed, 0x42, 0x9e, 0x45, 0xf9, 0xfb, 0xd6, 0xb0, 0x9c, 0x11, 0xe5, 0xe7, 0xe6,
0x31, 0x60, 0xf4, 0xc5, 0xd8, 0xf9, 0x34, 0x24, 0x51, 0x27, 0xd1, 0x02, 0xbf, 0x86, 0xda, 0x2d, 0xc1, 0xd6, 0x50, 0x3f, 0x80, 0x7c, 0x42, 0x06, 0x01, 0x64, 0xce, 0xea, 0xbd, 0x66, 0xb7, 0x57,
0x35, 0xae, 0xa9, 0xc7, 0xe4, 0xb2, 0x22, 0x6a, 0x67, 0x43, 0x35, 0xdf, 0x7f, 0xec, 0xa8, 0xbf, 0x5a, 0x43, 0x39, 0xd8, 0x68, 0xd6, 0xf1, 0x59, 0xcb, 0x7b, 0x93, 0x50, 0x1e, 0xd4, 0x5e, 0xab,
0x8f, 0x82, 0x66, 0x36, 0xf7, 0xee, 0x48, 0x72, 0xa4, 0x3b, 0x82, 0x7a, 0x76, 0x23, 0x71, 0x8d, 0xdd, 0xec, 0xf6, 0xea, 0xed, 0x4e, 0x49, 0xd6, 0xf6, 0x00, 0xe6, 0x6d, 0x45, 0xdb, 0x00, 0xfe,
0xe6, 0x93, 0x77, 0x15, 0x32, 0xae, 0x23, 0xe1, 0x02, 0xa9, 0xdf, 0x04, 0x68, 0x2e, 0xfd, 0xcd, 0xca, 0xa8, 0xa7, 0x24, 0x89, 0x6a, 0xd4, 0x20, 0xd2, 0x1a, 0xea, 0x3f, 0x25, 0x58, 0x0f, 0xa1,
0xce, 0x62, 0xb7, 0x7f, 0x6d, 0xc8, 0xe5, 0xe3, 0x21, 0xc7, 0x05, 0x55, 0x0a, 0x30, 0x54, 0xb3, 0x15, 0x50, 0xa3, 0x32, 0x7d, 0x64, 0x43, 0xde, 0x97, 0xf0, 0x3c, 0x88, 0x4a, 0xa0, 0x8c, 0xe8,
0x18, 0xa6, 0x07, 0x0c, 0xb5, 0x10, 0xc3, 0xb3, 0x3c, 0x86, 0x7c, 0xa1, 0xff, 0x80, 0xc6, 0x08, 0x8d, 0x68, 0x77, 0x0e, 0x7b, 0x8f, 0xde, 0x08, 0x3e, 0x90, 0xf1, 0x8c, 0x8a, 0x46, 0xe7, 0xb0,
0x5a, 0xa9, 0x07, 0x73, 0x1d, 0x9b, 0x51, 0xfc, 0x14, 0x5a, 0x69, 0x23, 0x57, 0xa6, 0xe3, 0xdb, 0xff, 0x82, 0x8e, 0x60, 0xfd, 0x8a, 0x92, 0x21, 0x75, 0x59, 0x39, 0x55, 0x51, 0xaa, 0xd9, 0x9a,
0x3c, 0x4c, 0x55, 0x21, 0xcd, 0x54, 0x9e, 0x06, 0xaa, 0x7a, 0x8f, 0xa0, 0x33, 0x75, 0xec, 0x1b, 0x9e, 0x6c, 0x6f, 0xd8, 0xc8, 0x37, 0x3e, 0xa8, 0x69, 0x73, 0xf7, 0x06, 0x87, 0x14, 0xed, 0x10,
0x6b, 0xeb, 0x7b, 0x74, 0x1d, 0x50, 0xf9, 0x13, 0xa0, 0x05, 0xb6, 0x62, 0x91, 0x2d, 0xee, 0x03, 0x72, 0xf1, 0x0f, 0xa1, 0xaa, 0x3f, 0xfe, 0xa4, 0xaa, 0x1c, 0x53, 0x3d, 0x94, 0x0f, 0x24, 0xfd,
0x98, 0xce, 0x6e, 0x47, 0xcd, 0x14, 0xbd, 0x44, 0x32, 0x8a, 0x2a, 0xc3, 0xa3, 0xe3, 0xaa, 0xa2, 0x9b, 0x04, 0xf9, 0x86, 0xeb, 0x8c, 0xe6, 0x8e, 0xfe, 0x1f, 0x52, 0x43, 0xc2, 0x49, 0xe0, 0xe8,
0xce, 0x54, 0x02, 0xbd, 0x77, 0x94, 0x87, 0x5a, 0x12, 0x61, 0x84, 0x9f, 0xd3, 0xef, 0x97, 0xad, 0xcd, 0xa5, 0x85, 0x60, 0x01, 0x41, 0xa7, 0xb0, 0xe1, 0xd2, 0xa1, 0xe5, 0x52, 0x93, 0x07, 0x06,
0xbe, 0x81, 0xf3, 0x07, 0x72, 0xc6, 0x38, 0xfb, 0x00, 0x69, 0x03, 0x2c, 0x6e, 0x29, 0xa3, 0x0c, 0x5e, 0xd8, 0x00, 0x89, 0xcc, 0x06, 0x0e, 0xb0, 0x61, 0x92, 0x88, 0xac, 0xed, 0x43, 0x71, 0xe1,
0x7f, 0x04, 0xd7, 0x0e, 0x35, 0xbe, 0x52, 0x7a, 0xbd, 0x48, 0x46, 0x8f, 0xdf, 0x82, 0x94, 0xde, 0xa3, 0x37, 0x07, 0x9b, 0x5e, 0xf7, 0x07, 0x22, 0x43, 0x64, 0x65, 0x7a, 0xed, 0xa7, 0xd4, 0xbf,
0x00, 0xb8, 0x7f, 0xfa, 0x6a, 0xe8, 0x76, 0x0a, 0x3f, 0x1d, 0xb5, 0x34, 0x40, 0x78, 0x0e, 0xb5, 0x2a, 0x50, 0xe8, 0xcc, 0x06, 0x63, 0x8b, 0x5d, 0x61, 0xfa, 0x7e, 0x46, 0x99, 0xb7, 0x93, 0xe2,
0x78, 0xbc, 0xb8, 0x77, 0xea, 0xcd, 0xea, 0x9e, 0x3f, 0xb0, 0x1b, 0x93, 0x2b, 0x69, 0x68, 0x80, 0x5b, 0xb1, 0x9a, 0xac, 0x24, 0x89, 0x5d, 0xba, 0x0f, 0xfd, 0x65, 0xcb, 0x0f, 0x60, 0xbf, 0x26,
0xf0, 0x47, 0x68, 0xe6, 0xc9, 0xe2, 0xc7, 0xf9, 0x63, 0x85, 0x6f, 0x43, 0xf7, 0xc9, 0xe9, 0xa0, 0x9c, 0x24, 0x3a, 0xa1, 0xf5, 0x9f, 0x78, 0x1b, 0x6a, 0x3f, 0x24, 0xc8, 0xc6, 0x64, 0xe3, 0x33,
0xc4, 0x02, 0x7b, 0xd0, 0x29, 0x44, 0x89, 0x9f, 0xe7, 0x13, 0x9c, 0x9a, 0x61, 0xf7, 0xc5, 0x2f, 0xce, 0xad, 0x98, 0x31, 0x3a, 0x9f, 0x3b, 0x4b, 0x11, 0xce, 0x7a, 0xf9, 0xd0, 0x95, 0x3d, 0x81,
0xc5, 0x26, 0x9e, 0x13, 0x15, 0xda, 0x2c, 0x82, 0x7f, 0xc3, 0x74, 0x73, 0x67, 0x51, 0x9b, 0x4f, 0xd9, 0x3e, 0xcb, 0x50, 0x8c, 0x04, 0xd9, 0xd4, 0xb1, 0x19, 0x45, 0x27, 0x90, 0x31, 0x1d, 0xfb,
0x9a, 0xe9, 0x1c, 0x96, 0xc1, 0x6f, 0x62, 0x53, 0x0d, 0xff, 0x16, 0xaf, 0x7e, 0x06, 0x00, 0x00, 0xc2, 0xba, 0x5c, 0x7e, 0x84, 0x2e, 0xc0, 0x8d, 0x13, 0x81, 0x0d, 0x9b, 0x1f, 0x50, 0x51, 0xeb,
0xff, 0xff, 0x83, 0x4f, 0x5b, 0x91, 0x40, 0x06, 0x00, 0x00, 0x96, 0x11, 0x9f, 0xaf, 0x4e, 0x73, 0xb7, 0x15, 0x0f, 0x20, 0x9f, 0xd0, 0x40, 0xff, 0x41, 0x31,
0x1a, 0x43, 0xdf, 0x74, 0x66, 0xb6, 0xef, 0xb0, 0x34, 0x2e, 0x44, 0xe1, 0x13, 0x2f, 0xfa, 0x08,
0x13, 0x7f, 0x91, 0x60, 0xd3, 0x17, 0x9b, 0xb9, 0xb4, 0xe7, 0xb9, 0x20, 0xf4, 0xf2, 0x63, 0x0c,
0xb4, 0xa4, 0x50, 0x65, 0x59, 0xa1, 0x68, 0x07, 0xc0, 0x74, 0xc6, 0x63, 0x6a, 0x46, 0xe7, 0xb9,
0x8a, 0x63, 0x11, 0xbd, 0x0c, 0x7f, 0x2d, 0x56, 0xe5, 0xb7, 0x4d, 0xc7, 0xb0, 0x75, 0x4a, 0xb9,
0x88, 0x85, 0x08, 0x22, 0xce, 0xf4, 0xc7, 0x97, 0xad, 0x1f, 0xc3, 0xf6, 0x1d, 0x39, 0x03, 0x87,
0xec, 0x00, 0x44, 0x0b, 0x60, 0xc1, 0x92, 0x62, 0x91, 0xda, 0x27, 0x05, 0x4a, 0x5d, 0x4a, 0xae,
0x29, 0x1d, 0xb6, 0xc3, 0x99, 0xa3, 0x73, 0x50, 0xa3, 0x7f, 0x12, 0xfa, 0xe7, 0x9e, 0x9f, 0x95,
0xf6, 0xf7, 0x8a, 0x63, 0x4b, 0x5f, 0xab, 0x4a, 0xfb, 0x12, 0x3a, 0x83, 0xf5, 0xc0, 0x44, 0x68,
0x6b, 0xd5, 0x16, 0xd2, 0xb6, 0x57, 0x3a, 0x2f, 0xc8, 0xf6, 0x0e, 0x0a, 0xc9, 0x16, 0xa3, 0xdd,
0x24, 0x6d, 0xa9, 0x2d, 0xb4, 0x7f, 0x57, 0x83, 0x42, 0x09, 0xe4, 0xc2, 0xe6, 0xd2, 0x9e, 0xa2,
0x85, 0x0b, 0xc6, 0xaa, 0x61, 0x6a, 0x7b, 0x0f, 0xc2, 0x86, 0x9a, 0x0d, 0x1d, 0x4a, 0xcc, 0x9f,
0xc2, 0x05, 0x33, 0xcc, 0xb1, 0x45, 0x6d, 0xde, 0x28, 0x44, 0x03, 0xe9, 0x78, 0x37, 0xaa, 0x41,
0x46, 0x5c, 0xac, 0x5e, 0xfc, 0x0a, 0x00, 0x00, 0xff, 0xff, 0x5f, 0x31, 0x28, 0xa2, 0x6b, 0x09,
0x00, 0x00,
} }