Inspector draw routing table (#1732)

This commit is contained in:
Fadila 2019-04-22 10:34:11 +02:00 committed by Kaloyan Raev
parent b29d875326
commit 123bf291f2
7 changed files with 578 additions and 166 deletions

View File

@ -23,6 +23,7 @@ import (
"storj.io/storj/pkg/eestream"
"storj.io/storj/pkg/identity"
"storj.io/storj/pkg/kademlia/routinggraph"
"storj.io/storj/pkg/pb"
"storj.io/storj/pkg/process"
"storj.io/storj/pkg/storj"
@ -103,6 +104,11 @@ var (
Short: "dump all nodes in the routing table",
RunE: DumpNodes,
}
drawTableCmd = &cobra.Command{
Use: "routing-graph",
Short: "Dumps a graph of the routing table in the dot format",
RunE: DrawTableAsGraph,
}
getStatsCmd = &cobra.Command{
Use: "getstats <node_id>",
Short: "Get node stats",
@ -244,6 +250,26 @@ func NodeInfo(cmd *cobra.Command, args []string) (err error) {
return nil
}
// DrawTableAsGraph outputs the table routing as a graph
func DrawTableAsGraph(cmd *cobra.Command, args []string) (err error) {
i, err := NewInspector(*Addr, *IdentityPath)
if err != nil {
return ErrInspectorDial.Wrap(err)
}
// retrieve buckets
info, err := i.kadclient.GetBucketList(context.Background(), &pb.GetBucketListRequest{})
if err != nil {
return ErrRequest.Wrap(err)
}
err = routinggraph.Draw(os.Stdout, info)
if err != nil {
return ErrRequest.Wrap(err)
}
return nil
}
// DumpNodes outputs a json list of every node in every bucket in the satellite
func DumpNodes(cmd *cobra.Command, args []string) (err error) {
i, err := NewInspector(*Addr, *IdentityPath)
@ -732,6 +758,7 @@ func init() {
kadCmd.AddCommand(lookupNodeCmd)
kadCmd.AddCommand(nodeInfoCmd)
kadCmd.AddCommand(dumpNodesCmd)
kadCmd.AddCommand(drawTableCmd)
statsCmd.AddCommand(getStatsCmd)
statsCmd.AddCommand(getCSVStatsCmd)

View File

@ -136,3 +136,31 @@ func (srv *Inspector) NodeInfo(ctx context.Context, req *pb.NodeInfoRequest) (*p
Version: info.GetVersion(),
}, nil
}
// GetBucketList returns the list of buckets with their routing nodes and their cached nodes
func (srv *Inspector) GetBucketList(ctx context.Context, req *pb.GetBucketListRequest) (*pb.GetBucketListResponse, error) {
bucketIds, err := srv.dht.GetBucketIds()
if err != nil {
return nil, err
}
buckets := make([]*pb.GetBucketListResponse_Bucket, len(bucketIds))
for i, b := range bucketIds {
bucketID := keyToBucketID(b)
routingNodes, err := srv.dht.GetNodesWithinKBucket(bucketID)
if err != nil {
return nil, err
}
cachedNodes := srv.dht.GetCachedNodesWithinKBucket(bucketID)
buckets[i] = &pb.GetBucketListResponse_Bucket{
BucketId: keyToBucketID(b),
RoutingNodes: routingNodes,
CachedNodes: cachedNodes,
}
}
return &pb.GetBucketListResponse{
Buckets: buckets,
}, nil
}

View File

@ -312,6 +312,16 @@ func (k *Kademlia) Seen() []*pb.Node {
return nodes
}
// GetNodesWithinKBucket returns all the routing nodes in the specified k-bucket
func (k *Kademlia) GetNodesWithinKBucket(bID bucketID) ([]*pb.Node, error) {
return k.routingTable.getUnmarshaledNodesFromBucket(bID)
}
// GetCachedNodesWithinKBucket returns all the cached nodes in the specified k-bucket
func (k *Kademlia) GetCachedNodesWithinKBucket(bID bucketID) []*pb.Node {
return k.routingTable.replacementCache[bID]
}
// SetBucketRefreshThreshold changes the threshold when buckets are considered stale and need refreshing.
func (k *Kademlia) SetBucketRefreshThreshold(threshold time.Duration) {
atomic.StoreInt64(&k.refreshThreshold, int64(threshold))

View File

@ -0,0 +1,102 @@
// Copyright (C) 2019 Storj Labs, Inc.
// See LICENSE for copying information.
package routinggraph
import (
"fmt"
"io"
"storj.io/storj/pkg/pb"
)
type dot struct {
out io.Writer
err error
}
func (dot *dot) printf(format string, args ...interface{}) {
if dot.err != nil {
return
}
_, dot.err = fmt.Fprintf(dot.out, format, args...)
}
// Draw writes the routing graph obtained using a GetBucketListResponse in the specified file
func Draw(w io.Writer, info *pb.GetBucketListResponse) (err error) {
dot := dot{out: w}
dot.printf(`digraph{node [shape=plaintext, fontname="Courier"];edge [dir=none];`)
defer dot.printf("}")
buckets := info.GetBuckets()
dot.addBuckets(buckets, 0, "")
return dot.err
}
func (dot *dot) addBuckets(b []*pb.GetBucketListResponse_Bucket, depth int, inPrefix string) {
if len(b) == 1 {
dot.Leaf(b[0], inPrefix)
return
}
left, right := splitBucket(b, depth)
outPrefix := extendPrefix(inPrefix, false)
dot.printf("b%s [shape=point];", inPrefix)
dot.addBuckets(left, depth+1, outPrefix)
dot.Edge(inPrefix, outPrefix, "0")
outPrefix = extendPrefix(inPrefix, true)
dot.addBuckets(right, depth+1, outPrefix)
dot.Edge(inPrefix, outPrefix, "1")
}
func (dot *dot) Edge(inPrefix, outPrefix, label string) {
dot.printf(`b%s -> b%s [label=<<b><font point-size="18">%s</font></b>>];`, inPrefix, outPrefix, label)
}
func (dot *dot) Leaf(b *pb.GetBucketListResponse_Bucket, prefix string) {
dot.printf(`b%s [label=< <table cellborder="0"><tr><td cellspacing="0" sides="b" border="1" colspan="2"><b><font point-size="18"> %s </font></b></td></tr>`, prefix, prefix)
defer dot.printf("</table>>];")
dot.printf(`<tr><td colspan="2" align="left"><i><b><font point-size="16">routing:</font></b></i></td></tr>`)
routingNodes := b.GetRoutingNodes()
for _, n := range routingNodes {
dot.Node(n)
}
dot.printf(`<tr><td colspan="2"></td></tr>`)
dot.printf(`<tr><td colspan="2" align="left"><i><b><font point-size="16">cache:</font></b></i></td></tr>`)
cachedNodes := b.GetCachedNodes()
for _, c := range cachedNodes {
dot.Node(c)
}
}
func (dot *dot) Node(node *pb.Node) {
dot.printf(`<tr><td align="left"><font point-size="14">%s</font></td><td sides="r" align="left"><i>(%s)</i></td></tr>`, node.Id, node.Address.Address)
}
func splitBucket(buckets []*pb.GetBucketListResponse_Bucket, bitDepth int) (left, right []*pb.GetBucketListResponse_Bucket) {
for _, bucket := range buckets {
bID := bucket.BucketId
byteDepth := bitDepth / 8
bitOffset := bitDepth % 8
power := uint(7 - bitOffset)
bitMask := byte(1 << power)
b := bID[byteDepth]
if b&bitMask > 0 {
right = append(right, bucket)
} else {
left = append(left, bucket)
}
}
return
}
func extendPrefix(prefix string, bit bool) string {
if bit {
return prefix + "1"
}
return prefix + "0"
}

View File

@ -437,6 +437,121 @@ func (m *CountNodesRequest) XXX_DiscardUnknown() {
var xxx_messageInfo_CountNodesRequest proto.InternalMessageInfo
type GetBucketListRequest struct {
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
}
func (m *GetBucketListRequest) Reset() { *m = GetBucketListRequest{} }
func (m *GetBucketListRequest) String() string { return proto.CompactTextString(m) }
func (*GetBucketListRequest) ProtoMessage() {}
func (*GetBucketListRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_a07d9034b2dd9d26, []int{9}
}
func (m *GetBucketListRequest) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_GetBucketListRequest.Unmarshal(m, b)
}
func (m *GetBucketListRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
return xxx_messageInfo_GetBucketListRequest.Marshal(b, m, deterministic)
}
func (m *GetBucketListRequest) XXX_Merge(src proto.Message) {
xxx_messageInfo_GetBucketListRequest.Merge(m, src)
}
func (m *GetBucketListRequest) XXX_Size() int {
return xxx_messageInfo_GetBucketListRequest.Size(m)
}
func (m *GetBucketListRequest) XXX_DiscardUnknown() {
xxx_messageInfo_GetBucketListRequest.DiscardUnknown(m)
}
var xxx_messageInfo_GetBucketListRequest proto.InternalMessageInfo
type GetBucketListResponse struct {
Buckets []*GetBucketListResponse_Bucket `protobuf:"bytes,1,rep,name=buckets,proto3" json:"buckets,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
}
func (m *GetBucketListResponse) Reset() { *m = GetBucketListResponse{} }
func (m *GetBucketListResponse) String() string { return proto.CompactTextString(m) }
func (*GetBucketListResponse) ProtoMessage() {}
func (*GetBucketListResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_a07d9034b2dd9d26, []int{10}
}
func (m *GetBucketListResponse) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_GetBucketListResponse.Unmarshal(m, b)
}
func (m *GetBucketListResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
return xxx_messageInfo_GetBucketListResponse.Marshal(b, m, deterministic)
}
func (m *GetBucketListResponse) XXX_Merge(src proto.Message) {
xxx_messageInfo_GetBucketListResponse.Merge(m, src)
}
func (m *GetBucketListResponse) XXX_Size() int {
return xxx_messageInfo_GetBucketListResponse.Size(m)
}
func (m *GetBucketListResponse) XXX_DiscardUnknown() {
xxx_messageInfo_GetBucketListResponse.DiscardUnknown(m)
}
var xxx_messageInfo_GetBucketListResponse proto.InternalMessageInfo
func (m *GetBucketListResponse) GetBuckets() []*GetBucketListResponse_Bucket {
if m != nil {
return m.Buckets
}
return nil
}
type GetBucketListResponse_Bucket struct {
BucketId NodeID `protobuf:"bytes,1,opt,name=bucket_id,json=bucketId,proto3,customtype=NodeID" json:"bucket_id"`
RoutingNodes []*Node `protobuf:"bytes,2,rep,name=routing_nodes,json=routingNodes,proto3" json:"routing_nodes,omitempty"`
CachedNodes []*Node `protobuf:"bytes,3,rep,name=cached_nodes,json=cachedNodes,proto3" json:"cached_nodes,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
}
func (m *GetBucketListResponse_Bucket) Reset() { *m = GetBucketListResponse_Bucket{} }
func (m *GetBucketListResponse_Bucket) String() string { return proto.CompactTextString(m) }
func (*GetBucketListResponse_Bucket) ProtoMessage() {}
func (*GetBucketListResponse_Bucket) Descriptor() ([]byte, []int) {
return fileDescriptor_a07d9034b2dd9d26, []int{10, 0}
}
func (m *GetBucketListResponse_Bucket) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_GetBucketListResponse_Bucket.Unmarshal(m, b)
}
func (m *GetBucketListResponse_Bucket) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
return xxx_messageInfo_GetBucketListResponse_Bucket.Marshal(b, m, deterministic)
}
func (m *GetBucketListResponse_Bucket) XXX_Merge(src proto.Message) {
xxx_messageInfo_GetBucketListResponse_Bucket.Merge(m, src)
}
func (m *GetBucketListResponse_Bucket) XXX_Size() int {
return xxx_messageInfo_GetBucketListResponse_Bucket.Size(m)
}
func (m *GetBucketListResponse_Bucket) XXX_DiscardUnknown() {
xxx_messageInfo_GetBucketListResponse_Bucket.DiscardUnknown(m)
}
var xxx_messageInfo_GetBucketListResponse_Bucket proto.InternalMessageInfo
func (m *GetBucketListResponse_Bucket) GetRoutingNodes() []*Node {
if m != nil {
return m.RoutingNodes
}
return nil
}
func (m *GetBucketListResponse_Bucket) GetCachedNodes() []*Node {
if m != nil {
return m.CachedNodes
}
return nil
}
// GetBuckets
type GetBucketsRequest struct {
XXX_NoUnkeyedLiteral struct{} `json:"-"`
@ -448,7 +563,7 @@ func (m *GetBucketsRequest) Reset() { *m = GetBucketsRequest{} }
func (m *GetBucketsRequest) String() string { return proto.CompactTextString(m) }
func (*GetBucketsRequest) ProtoMessage() {}
func (*GetBucketsRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_a07d9034b2dd9d26, []int{9}
return fileDescriptor_a07d9034b2dd9d26, []int{11}
}
func (m *GetBucketsRequest) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_GetBucketsRequest.Unmarshal(m, b)
@ -480,7 +595,7 @@ func (m *GetBucketsResponse) Reset() { *m = GetBucketsResponse{} }
func (m *GetBucketsResponse) String() string { return proto.CompactTextString(m) }
func (*GetBucketsResponse) ProtoMessage() {}
func (*GetBucketsResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_a07d9034b2dd9d26, []int{10}
return fileDescriptor_a07d9034b2dd9d26, []int{12}
}
func (m *GetBucketsResponse) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_GetBucketsResponse.Unmarshal(m, b)
@ -519,7 +634,7 @@ func (m *GetBucketRequest) Reset() { *m = GetBucketRequest{} }
func (m *GetBucketRequest) String() string { return proto.CompactTextString(m) }
func (*GetBucketRequest) ProtoMessage() {}
func (*GetBucketRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_a07d9034b2dd9d26, []int{11}
return fileDescriptor_a07d9034b2dd9d26, []int{13}
}
func (m *GetBucketRequest) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_GetBucketRequest.Unmarshal(m, b)
@ -551,7 +666,7 @@ func (m *GetBucketResponse) Reset() { *m = GetBucketResponse{} }
func (m *GetBucketResponse) String() string { return proto.CompactTextString(m) }
func (*GetBucketResponse) ProtoMessage() {}
func (*GetBucketResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_a07d9034b2dd9d26, []int{12}
return fileDescriptor_a07d9034b2dd9d26, []int{14}
}
func (m *GetBucketResponse) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_GetBucketResponse.Unmarshal(m, b)
@ -589,7 +704,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_a07d9034b2dd9d26, []int{13}
return fileDescriptor_a07d9034b2dd9d26, []int{15}
}
func (m *Bucket) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_Bucket.Unmarshal(m, b)
@ -627,7 +742,7 @@ func (m *BucketList) Reset() { *m = BucketList{} }
func (m *BucketList) String() string { return proto.CompactTextString(m) }
func (*BucketList) ProtoMessage() {}
func (*BucketList) Descriptor() ([]byte, []int) {
return fileDescriptor_a07d9034b2dd9d26, []int{14}
return fileDescriptor_a07d9034b2dd9d26, []int{16}
}
func (m *BucketList) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_BucketList.Unmarshal(m, b)
@ -667,7 +782,7 @@ func (m *PingNodeRequest) Reset() { *m = PingNodeRequest{} }
func (m *PingNodeRequest) String() string { return proto.CompactTextString(m) }
func (*PingNodeRequest) ProtoMessage() {}
func (*PingNodeRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_a07d9034b2dd9d26, []int{15}
return fileDescriptor_a07d9034b2dd9d26, []int{17}
}
func (m *PingNodeRequest) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_PingNodeRequest.Unmarshal(m, b)
@ -705,7 +820,7 @@ func (m *PingNodeResponse) Reset() { *m = PingNodeResponse{} }
func (m *PingNodeResponse) String() string { return proto.CompactTextString(m) }
func (*PingNodeResponse) ProtoMessage() {}
func (*PingNodeResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_a07d9034b2dd9d26, []int{16}
return fileDescriptor_a07d9034b2dd9d26, []int{18}
}
func (m *PingNodeResponse) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_PingNodeResponse.Unmarshal(m, b)
@ -744,7 +859,7 @@ func (m *LookupNodeRequest) Reset() { *m = LookupNodeRequest{} }
func (m *LookupNodeRequest) String() string { return proto.CompactTextString(m) }
func (*LookupNodeRequest) ProtoMessage() {}
func (*LookupNodeRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_a07d9034b2dd9d26, []int{17}
return fileDescriptor_a07d9034b2dd9d26, []int{19}
}
func (m *LookupNodeRequest) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_LookupNodeRequest.Unmarshal(m, b)
@ -790,7 +905,7 @@ func (m *LookupNodeResponse) Reset() { *m = LookupNodeResponse{} }
func (m *LookupNodeResponse) String() string { return proto.CompactTextString(m) }
func (*LookupNodeResponse) ProtoMessage() {}
func (*LookupNodeResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_a07d9034b2dd9d26, []int{18}
return fileDescriptor_a07d9034b2dd9d26, []int{20}
}
func (m *LookupNodeResponse) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_LookupNodeResponse.Unmarshal(m, b)
@ -836,7 +951,7 @@ func (m *NodeInfoRequest) Reset() { *m = NodeInfoRequest{} }
func (m *NodeInfoRequest) String() string { return proto.CompactTextString(m) }
func (*NodeInfoRequest) ProtoMessage() {}
func (*NodeInfoRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_a07d9034b2dd9d26, []int{19}
return fileDescriptor_a07d9034b2dd9d26, []int{21}
}
func (m *NodeInfoRequest) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_NodeInfoRequest.Unmarshal(m, b)
@ -877,7 +992,7 @@ func (m *NodeInfoResponse) Reset() { *m = NodeInfoResponse{} }
func (m *NodeInfoResponse) String() string { return proto.CompactTextString(m) }
func (*NodeInfoResponse) ProtoMessage() {}
func (*NodeInfoResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_a07d9034b2dd9d26, []int{20}
return fileDescriptor_a07d9034b2dd9d26, []int{22}
}
func (m *NodeInfoResponse) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_NodeInfoResponse.Unmarshal(m, b)
@ -938,7 +1053,7 @@ func (m *FindNearRequest) Reset() { *m = FindNearRequest{} }
func (m *FindNearRequest) String() string { return proto.CompactTextString(m) }
func (*FindNearRequest) ProtoMessage() {}
func (*FindNearRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_a07d9034b2dd9d26, []int{21}
return fileDescriptor_a07d9034b2dd9d26, []int{23}
}
func (m *FindNearRequest) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_FindNearRequest.Unmarshal(m, b)
@ -976,7 +1091,7 @@ func (m *FindNearResponse) Reset() { *m = FindNearResponse{} }
func (m *FindNearResponse) String() string { return proto.CompactTextString(m) }
func (*FindNearResponse) ProtoMessage() {}
func (*FindNearResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_a07d9034b2dd9d26, []int{22}
return fileDescriptor_a07d9034b2dd9d26, []int{24}
}
func (m *FindNearResponse) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_FindNearResponse.Unmarshal(m, b)
@ -1013,7 +1128,7 @@ func (m *DumpNodesRequest) Reset() { *m = DumpNodesRequest{} }
func (m *DumpNodesRequest) String() string { return proto.CompactTextString(m) }
func (*DumpNodesRequest) ProtoMessage() {}
func (*DumpNodesRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_a07d9034b2dd9d26, []int{23}
return fileDescriptor_a07d9034b2dd9d26, []int{25}
}
func (m *DumpNodesRequest) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_DumpNodesRequest.Unmarshal(m, b)
@ -1044,7 +1159,7 @@ func (m *DumpNodesResponse) Reset() { *m = DumpNodesResponse{} }
func (m *DumpNodesResponse) String() string { return proto.CompactTextString(m) }
func (*DumpNodesResponse) ProtoMessage() {}
func (*DumpNodesResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_a07d9034b2dd9d26, []int{24}
return fileDescriptor_a07d9034b2dd9d26, []int{26}
}
func (m *DumpNodesResponse) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_DumpNodesResponse.Unmarshal(m, b)
@ -1081,7 +1196,7 @@ func (m *StatsRequest) Reset() { *m = StatsRequest{} }
func (m *StatsRequest) String() string { return proto.CompactTextString(m) }
func (*StatsRequest) ProtoMessage() {}
func (*StatsRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_a07d9034b2dd9d26, []int{25}
return fileDescriptor_a07d9034b2dd9d26, []int{27}
}
func (m *StatsRequest) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_StatsRequest.Unmarshal(m, b)
@ -1117,7 +1232,7 @@ func (m *StatSummaryResponse) Reset() { *m = StatSummaryResponse{} }
func (m *StatSummaryResponse) String() string { return proto.CompactTextString(m) }
func (*StatSummaryResponse) ProtoMessage() {}
func (*StatSummaryResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_a07d9034b2dd9d26, []int{26}
return fileDescriptor_a07d9034b2dd9d26, []int{28}
}
func (m *StatSummaryResponse) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_StatSummaryResponse.Unmarshal(m, b)
@ -1189,7 +1304,7 @@ func (m *DashboardRequest) Reset() { *m = DashboardRequest{} }
func (m *DashboardRequest) String() string { return proto.CompactTextString(m) }
func (*DashboardRequest) ProtoMessage() {}
func (*DashboardRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_a07d9034b2dd9d26, []int{27}
return fileDescriptor_a07d9034b2dd9d26, []int{29}
}
func (m *DashboardRequest) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_DashboardRequest.Unmarshal(m, b)
@ -1228,7 +1343,7 @@ func (m *DashboardResponse) Reset() { *m = DashboardResponse{} }
func (m *DashboardResponse) String() string { return proto.CompactTextString(m) }
func (*DashboardResponse) ProtoMessage() {}
func (*DashboardResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_a07d9034b2dd9d26, []int{28}
return fileDescriptor_a07d9034b2dd9d26, []int{30}
}
func (m *DashboardResponse) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_DashboardResponse.Unmarshal(m, b)
@ -1318,7 +1433,7 @@ func (m *SegmentHealthRequest) Reset() { *m = SegmentHealthRequest{} }
func (m *SegmentHealthRequest) String() string { return proto.CompactTextString(m) }
func (*SegmentHealthRequest) ProtoMessage() {}
func (*SegmentHealthRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_a07d9034b2dd9d26, []int{29}
return fileDescriptor_a07d9034b2dd9d26, []int{31}
}
func (m *SegmentHealthRequest) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_SegmentHealthRequest.Unmarshal(m, b)
@ -1378,7 +1493,7 @@ func (m *SegmentHealth) Reset() { *m = SegmentHealth{} }
func (m *SegmentHealth) String() string { return proto.CompactTextString(m) }
func (*SegmentHealth) ProtoMessage() {}
func (*SegmentHealth) Descriptor() ([]byte, []int) {
return fileDescriptor_a07d9034b2dd9d26, []int{30}
return fileDescriptor_a07d9034b2dd9d26, []int{32}
}
func (m *SegmentHealth) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_SegmentHealth.Unmarshal(m, b)
@ -1424,7 +1539,7 @@ func (m *SegmentHealthResponse) Reset() { *m = SegmentHealthResponse{} }
func (m *SegmentHealthResponse) String() string { return proto.CompactTextString(m) }
func (*SegmentHealthResponse) ProtoMessage() {}
func (*SegmentHealthResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_a07d9034b2dd9d26, []int{31}
return fileDescriptor_a07d9034b2dd9d26, []int{33}
}
func (m *SegmentHealthResponse) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_SegmentHealthResponse.Unmarshal(m, b)
@ -1474,7 +1589,7 @@ func (m *ObjectHealthRequest) Reset() { *m = ObjectHealthRequest{} }
func (m *ObjectHealthRequest) String() string { return proto.CompactTextString(m) }
func (*ObjectHealthRequest) ProtoMessage() {}
func (*ObjectHealthRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_a07d9034b2dd9d26, []int{32}
return fileDescriptor_a07d9034b2dd9d26, []int{34}
}
func (m *ObjectHealthRequest) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_ObjectHealthRequest.Unmarshal(m, b)
@ -1548,7 +1663,7 @@ func (m *ObjectHealthResponse) Reset() { *m = ObjectHealthResponse{} }
func (m *ObjectHealthResponse) String() string { return proto.CompactTextString(m) }
func (*ObjectHealthResponse) ProtoMessage() {}
func (*ObjectHealthResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_a07d9034b2dd9d26, []int{33}
return fileDescriptor_a07d9034b2dd9d26, []int{35}
}
func (m *ObjectHealthResponse) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_ObjectHealthResponse.Unmarshal(m, b)
@ -1592,6 +1707,9 @@ func init() {
proto.RegisterType((*CreateStatsResponse)(nil), "inspector.CreateStatsResponse")
proto.RegisterType((*CountNodesResponse)(nil), "inspector.CountNodesResponse")
proto.RegisterType((*CountNodesRequest)(nil), "inspector.CountNodesRequest")
proto.RegisterType((*GetBucketListRequest)(nil), "inspector.GetBucketListRequest")
proto.RegisterType((*GetBucketListResponse)(nil), "inspector.GetBucketListResponse")
proto.RegisterType((*GetBucketListResponse_Bucket)(nil), "inspector.GetBucketListResponse.Bucket")
proto.RegisterType((*GetBucketsRequest)(nil), "inspector.GetBucketsRequest")
proto.RegisterType((*GetBucketsResponse)(nil), "inspector.GetBucketsResponse")
proto.RegisterType((*GetBucketRequest)(nil), "inspector.GetBucketRequest")
@ -1622,113 +1740,119 @@ func init() {
func init() { proto.RegisterFile("inspector.proto", fileDescriptor_a07d9034b2dd9d26) }
var fileDescriptor_a07d9034b2dd9d26 = []byte{
// 1688 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xb4, 0x58, 0x4b, 0x73, 0x1b, 0xc7,
0x11, 0xd6, 0xe2, 0x25, 0xa2, 0x01, 0xe2, 0x31, 0xa0, 0x24, 0x04, 0x92, 0x08, 0x66, 0xf3, 0x10,
0x25, 0xa5, 0x20, 0x05, 0x51, 0x0e, 0x8a, 0x4a, 0x07, 0x91, 0x8c, 0x24, 0x94, 0x18, 0x89, 0x5a,
0x2a, 0x39, 0xa4, 0x54, 0x41, 0x0d, 0xb0, 0x43, 0x70, 0x43, 0x60, 0x67, 0xb5, 0x3b, 0x50, 0xc4,
0x3f, 0x90, 0xb2, 0x7f, 0x82, 0x7d, 0xf5, 0x9f, 0x70, 0xd9, 0x47, 0x5f, 0x7c, 0xf3, 0xdd, 0x07,
0x5d, 0x5c, 0x65, 0xff, 0x06, 0xdf, 0x5c, 0xd3, 0x33, 0xfb, 0x04, 0x60, 0xb2, 0xfc, 0xb8, 0x61,
0xbf, 0xfe, 0xa6, 0xa7, 0xfb, 0x9b, 0x99, 0x9e, 0x1e, 0x40, 0xdd, 0x71, 0x03, 0x8f, 0x8d, 0x05,
0xf7, 0x7b, 0x9e, 0xcf, 0x05, 0x27, 0xe5, 0x08, 0xe8, 0xc0, 0x84, 0x4f, 0xb8, 0x82, 0x3b, 0xe0,
0x72, 0x9b, 0xe9, 0xdf, 0x75, 0x8f, 0x3b, 0xae, 0x60, 0xbe, 0x3d, 0xd2, 0xc0, 0xe6, 0x84, 0xf3,
0xc9, 0x94, 0xdd, 0xc1, 0xaf, 0xd1, 0xfc, 0xe8, 0x8e, 0x3d, 0xf7, 0xa9, 0x70, 0xb8, 0xab, 0xed,
0xdd, 0xac, 0x5d, 0x38, 0x33, 0x16, 0x08, 0x3a, 0xf3, 0x14, 0xc1, 0x7c, 0x0e, 0x9b, 0xfb, 0x4e,
0x20, 0x06, 0xbe, 0xcf, 0x3c, 0xea, 0xd3, 0xd1, 0x94, 0x1d, 0xb2, 0xc9, 0x8c, 0xb9, 0x22, 0xb0,
0xd8, 0x9b, 0x39, 0x0b, 0x04, 0xd9, 0x80, 0xe2, 0xd4, 0x99, 0x39, 0xa2, 0x6d, 0x6c, 0x19, 0xdb,
0x45, 0x4b, 0x7d, 0x90, 0xcb, 0x50, 0xe2, 0x47, 0x47, 0x01, 0x13, 0xed, 0x1c, 0xc2, 0xfa, 0xcb,
0xfc, 0xd6, 0x00, 0xb2, 0xe8, 0x8c, 0x10, 0x28, 0x78, 0x54, 0x1c, 0xa3, 0x8f, 0xaa, 0x85, 0xbf,
0xc9, 0x7d, 0xa8, 0x05, 0xca, 0x3c, 0xb4, 0x99, 0xa0, 0xce, 0x14, 0x5d, 0x55, 0xfa, 0xa4, 0x17,
0x67, 0x79, 0xa0, 0x7e, 0x59, 0xeb, 0x9a, 0xb9, 0x87, 0x44, 0xd2, 0x85, 0xca, 0x94, 0x07, 0x62,
0xe8, 0x39, 0x6c, 0xcc, 0x82, 0x76, 0x1e, 0x43, 0x00, 0x09, 0x1d, 0x20, 0x42, 0x7a, 0xd0, 0x9a,
0xd2, 0x40, 0x0c, 0x65, 0x20, 0x8e, 0x3f, 0xa4, 0x42, 0xb0, 0x99, 0x27, 0xda, 0x85, 0x2d, 0x63,
0x3b, 0x6f, 0x35, 0xa5, 0xc9, 0x42, 0xcb, 0x23, 0x65, 0x20, 0x77, 0x61, 0x23, 0x4d, 0x1d, 0x8e,
0xf9, 0xdc, 0x15, 0xed, 0x22, 0x0e, 0x20, 0x7e, 0x92, 0xbc, 0x2b, 0x2d, 0xe6, 0x6b, 0xe8, 0xae,
0x14, 0x2e, 0xf0, 0xb8, 0x1b, 0x30, 0x72, 0x1f, 0xd6, 0x74, 0xd8, 0x41, 0xdb, 0xd8, 0xca, 0x6f,
0x57, 0xfa, 0xd7, 0x7b, 0xf1, 0xa2, 0x2f, 0x8e, 0xb4, 0x22, 0xba, 0xf9, 0x37, 0xa8, 0x3f, 0x61,
0xe2, 0x50, 0xd0, 0x78, 0x1d, 0x6e, 0xc0, 0x45, 0xb9, 0x13, 0x86, 0x8e, 0xad, 0x54, 0xdc, 0xa9,
0x7d, 0xf9, 0xbe, 0x7b, 0xe1, 0xeb, 0xf7, 0xdd, 0xd2, 0x73, 0x6e, 0xb3, 0xc1, 0x9e, 0x55, 0x92,
0xe6, 0x81, 0x6d, 0x7e, 0x6c, 0x40, 0x23, 0x1e, 0xac, 0x63, 0xe9, 0x42, 0x85, 0xce, 0x6d, 0x27,
0xcc, 0xcb, 0xc0, 0xbc, 0x00, 0x21, 0xcc, 0x27, 0x26, 0xe0, 0xfe, 0xc1, 0xa5, 0x30, 0x34, 0xc1,
0x92, 0x08, 0xf9, 0x2d, 0x54, 0xe7, 0x9e, 0xdc, 0x3e, 0xda, 0x45, 0x1e, 0x5d, 0x54, 0x14, 0xa6,
0x7c, 0xc4, 0x14, 0xe5, 0xa4, 0x80, 0x4e, 0x34, 0x05, 0xbd, 0x98, 0xdf, 0x18, 0x40, 0x76, 0x7d,
0x46, 0x05, 0xfb, 0x49, 0xc9, 0x65, 0xf3, 0xc8, 0x2d, 0xe4, 0xd1, 0x83, 0x96, 0x22, 0x04, 0xf3,
0xf1, 0x98, 0x05, 0x41, 0x2a, 0xda, 0x26, 0x9a, 0x0e, 0x95, 0x25, 0x1b, 0xb3, 0x22, 0x16, 0x16,
0xd3, 0xba, 0x0b, 0x1b, 0x9a, 0x92, 0xf6, 0xa9, 0x37, 0x87, 0xb2, 0x25, 0x9d, 0x9a, 0x97, 0xa0,
0x95, 0x4a, 0x52, 0x2d, 0x82, 0x79, 0x0b, 0x08, 0xda, 0x65, 0x4e, 0xf1, 0xd2, 0x6c, 0x40, 0x31,
0xb9, 0x28, 0xea, 0xc3, 0x6c, 0x41, 0x33, 0xc9, 0x45, 0x99, 0x24, 0xf8, 0x84, 0x89, 0x9d, 0xf9,
0xf8, 0x84, 0x45, 0xda, 0x99, 0x4f, 0x81, 0x24, 0xc1, 0xd8, 0xab, 0xe0, 0x82, 0x4e, 0x43, 0xaf,
0xf8, 0x41, 0xae, 0x41, 0xde, 0xb1, 0x83, 0x76, 0x6e, 0x2b, 0xbf, 0x5d, 0xdd, 0x81, 0x84, 0xbe,
0x12, 0x36, 0xfb, 0xb8, 0x71, 0x94, 0xa7, 0x70, 0x65, 0x36, 0x21, 0xb7, 0x72, 0x51, 0x72, 0x8e,
0x6d, 0xfe, 0x33, 0x11, 0x52, 0x34, 0xf9, 0x19, 0x83, 0xc8, 0x16, 0x14, 0xe5, 0x7a, 0xaa, 0x40,
0x2a, 0x7d, 0xe8, 0x61, 0x8d, 0x93, 0x04, 0x4b, 0x19, 0xcc, 0x5b, 0x50, 0x52, 0x3e, 0xcf, 0xc1,
0xed, 0x01, 0x28, 0xae, 0x3c, 0x90, 0x31, 0xdf, 0x58, 0xc5, 0x7f, 0x06, 0xf5, 0x03, 0xc7, 0x9d,
0x20, 0x74, 0xbe, 0x2c, 0x49, 0x1b, 0x2e, 0x52, 0xdb, 0xf6, 0x59, 0x10, 0xe0, 0x96, 0x2b, 0x5b,
0xe1, 0xa7, 0x69, 0x42, 0x23, 0x76, 0xa6, 0xd3, 0xaf, 0x41, 0x8e, 0x9f, 0xa0, 0xb7, 0x35, 0x2b,
0xc7, 0x4f, 0xcc, 0x87, 0xd0, 0xdc, 0xe7, 0xfc, 0x64, 0xee, 0x25, 0xa7, 0xac, 0x45, 0x53, 0x96,
0xcf, 0x98, 0xe2, 0x35, 0x90, 0xe4, 0xf0, 0x48, 0xe3, 0x82, 0x4c, 0x07, 0x3d, 0xa4, 0xd3, 0x44,
0x9c, 0xfc, 0x11, 0x0a, 0x33, 0x26, 0x68, 0x54, 0x54, 0x23, 0xfb, 0x3f, 0x98, 0xa0, 0x36, 0x15,
0xd4, 0x42, 0xbb, 0xf9, 0x1f, 0xa8, 0x63, 0xa2, 0xee, 0x11, 0x3f, 0xaf, 0x1a, 0xb7, 0xd3, 0xa1,
0x56, 0xfa, 0xcd, 0xd8, 0xfb, 0x23, 0x65, 0x88, 0xa3, 0xff, 0xc2, 0x80, 0x46, 0x3c, 0x81, 0x0e,
0xde, 0x84, 0x82, 0x38, 0xf5, 0x54, 0xf0, 0xb5, 0x7e, 0x2d, 0x1e, 0xfe, 0xea, 0xd4, 0x63, 0x16,
0xda, 0x48, 0x0f, 0xd6, 0xb8, 0xc7, 0x7c, 0x2a, 0xb8, 0xbf, 0x98, 0xc4, 0x0b, 0x6d, 0xb1, 0x22,
0x8e, 0xe4, 0x8f, 0xa9, 0x47, 0xc7, 0x8e, 0x38, 0xc5, 0xe3, 0x9e, 0xe2, 0xef, 0x6a, 0x8b, 0x15,
0x71, 0x64, 0x16, 0x6f, 0x99, 0x1f, 0x38, 0xdc, 0xc5, 0x43, 0x9f, 0xca, 0xe2, 0x5f, 0xca, 0x60,
0x85, 0x0c, 0x73, 0x06, 0xf5, 0xc7, 0x8e, 0x6b, 0x3f, 0x67, 0xd4, 0x3f, 0xaf, 0x4a, 0xbf, 0x87,
0x62, 0x20, 0xa8, 0xaf, 0x8a, 0xd4, 0x22, 0x45, 0x19, 0xe3, 0xeb, 0x55, 0x55, 0x28, 0xf5, 0x61,
0xde, 0x83, 0x46, 0x3c, 0x9d, 0xd6, 0xec, 0xec, 0x83, 0x40, 0xa0, 0xb1, 0x37, 0x9f, 0x79, 0xa9,
0x92, 0xf1, 0x57, 0x68, 0x26, 0xb0, 0xac, 0xab, 0x95, 0x67, 0xa4, 0x06, 0xd5, 0x64, 0x81, 0x36,
0xbf, 0x37, 0xa0, 0x25, 0x81, 0xc3, 0xf9, 0x6c, 0x46, 0xfd, 0xd3, 0xc8, 0xd3, 0x75, 0x80, 0x79,
0xc0, 0xec, 0x61, 0xe0, 0xd1, 0x31, 0xd3, 0xb5, 0xa6, 0x2c, 0x91, 0x43, 0x09, 0x90, 0x1b, 0x50,
0xa7, 0x6f, 0xa9, 0x33, 0x95, 0xb7, 0x9c, 0xe6, 0xa8, 0x92, 0x5d, 0x8b, 0x60, 0x45, 0x94, 0x65,
0x58, 0xfa, 0x71, 0xdc, 0x09, 0xee, 0xab, 0xf0, 0x76, 0x09, 0x98, 0x3d, 0x50, 0x90, 0x2c, 0xfd,
0x48, 0x61, 0x8a, 0xa1, 0x0a, 0x35, 0xce, 0xfe, 0x77, 0x45, 0xf8, 0x03, 0xd4, 0x90, 0x30, 0xa2,
0xae, 0xfd, 0x3f, 0xc7, 0x16, 0xc7, 0xba, 0x42, 0xaf, 0x4b, 0x74, 0x27, 0x04, 0xc9, 0x1d, 0x68,
0xc5, 0x31, 0xc5, 0xdc, 0x92, 0xaa, 0xe6, 0x91, 0x29, 0x1a, 0x80, 0xb2, 0xd2, 0xe0, 0x78, 0xc4,
0xa9, 0x6f, 0x87, 0x7a, 0x7c, 0x95, 0x87, 0x66, 0x02, 0xd4, 0x6a, 0x9c, 0xfb, 0x1a, 0xbb, 0x09,
0x0d, 0x24, 0x8e, 0xb9, 0xeb, 0xb2, 0xb1, 0x6c, 0xd8, 0x02, 0x2d, 0x4c, 0x5d, 0xe2, 0xbb, 0x31,
0x4c, 0x6e, 0x43, 0x73, 0xc4, 0xb9, 0x08, 0x84, 0x4f, 0xbd, 0x61, 0x78, 0xec, 0xf2, 0x58, 0x21,
0x1a, 0x91, 0x41, 0x9f, 0x3a, 0xe9, 0x17, 0x1b, 0x26, 0x97, 0x4e, 0x23, 0x6e, 0x01, 0xb9, 0xf5,
0x10, 0x4f, 0x50, 0xd9, 0xbb, 0x0c, 0xb5, 0xa8, 0xa8, 0x21, 0x1e, 0x52, 0xef, 0xe1, 0x4e, 0x16,
0x01, 0x6a, 0x54, 0xe9, 0x6f, 0x26, 0xba, 0x98, 0x25, 0x7b, 0xc2, 0x52, 0x64, 0xf2, 0x67, 0x28,
0xa9, 0xab, 0xb1, 0x7d, 0x11, 0x87, 0xfd, 0xa6, 0xa7, 0x9a, 0xd1, 0x5e, 0xd8, 0x8c, 0xf6, 0xf6,
0x74, 0xb3, 0x6a, 0x69, 0x22, 0x79, 0x00, 0x15, 0x6c, 0xdb, 0x3c, 0xc7, 0x9d, 0x30, 0xbb, 0xbd,
0x86, 0xe3, 0x3a, 0x0b, 0xe3, 0x5e, 0x85, 0x4d, 0xac, 0x05, 0x92, 0x7e, 0x80, 0x6c, 0xf2, 0x10,
0xaa, 0x38, 0xf8, 0xcd, 0x9c, 0xf9, 0x0e, 0xb3, 0xdb, 0xe5, 0x33, 0x47, 0xe3, 0x64, 0x2f, 0x15,
0xdd, 0xfc, 0xc8, 0x80, 0x0d, 0xdd, 0x88, 0x3d, 0x65, 0x74, 0x2a, 0x8e, 0xc3, 0x73, 0x7e, 0x19,
0x4a, 0x23, 0xbc, 0x5e, 0x74, 0xf7, 0xaa, 0xbf, 0xe4, 0x76, 0x63, 0xee, 0xd8, 0x3f, 0xf5, 0x04,
0xb3, 0x87, 0xd8, 0xdd, 0xe2, 0x41, 0xb7, 0xd6, 0x23, 0xf4, 0x40, 0xb6, 0xb9, 0xbf, 0x83, 0xb0,
0x79, 0x1d, 0x3a, 0xae, 0xcd, 0xde, 0xe9, 0xad, 0x5d, 0xd5, 0xe0, 0x40, 0x62, 0xf2, 0x18, 0x79,
0x3e, 0xff, 0x2f, 0x1b, 0x0b, 0xb9, 0x77, 0x0a, 0xe8, 0xa7, 0xac, 0x91, 0x81, 0x6d, 0xee, 0xc3,
0x7a, 0x2a, 0x34, 0x79, 0x5c, 0xb8, 0x3b, 0x75, 0x5c, 0x36, 0x0c, 0xcf, 0xb1, 0xec, 0x80, 0x2b,
0x0a, 0xc3, 0xb3, 0x2e, 0xef, 0x13, 0x3d, 0x85, 0x8e, 0x2b, 0xfc, 0x34, 0xff, 0x6f, 0xc0, 0xa5,
0x4c, 0xa6, 0x7a, 0xff, 0xde, 0x85, 0xd2, 0x31, 0x22, 0xfa, 0x56, 0x69, 0x27, 0x57, 0x3a, 0x35,
0x42, 0xf3, 0xc8, 0x03, 0x00, 0x9f, 0xd9, 0x73, 0xd7, 0xa6, 0xee, 0xf8, 0x54, 0x97, 0xe9, 0xab,
0x89, 0x06, 0xde, 0x8a, 0x8c, 0x87, 0xe3, 0x63, 0x36, 0x63, 0x56, 0x82, 0x6e, 0x7e, 0x67, 0x40,
0xeb, 0xc5, 0x48, 0xe6, 0x98, 0x56, 0x7c, 0x51, 0x59, 0x63, 0x99, 0xb2, 0xf1, 0xc2, 0xe4, 0x52,
0x0b, 0x93, 0x16, 0x33, 0x9f, 0x11, 0x53, 0x76, 0x88, 0x58, 0x7a, 0x87, 0xf4, 0x48, 0x30, 0x7f,
0x18, 0x8a, 0xa4, 0xdf, 0x06, 0x68, 0x7a, 0x24, 0x2d, 0xe1, 0xdb, 0xe5, 0x4f, 0x40, 0x98, 0x6b,
0x0f, 0x47, 0xec, 0x88, 0xfb, 0x2c, 0xa2, 0xab, 0xd2, 0xd2, 0x60, 0xae, 0xbd, 0x83, 0x86, 0x90,
0x1d, 0xd5, 0xf3, 0x52, 0xe2, 0xb9, 0x64, 0x7e, 0x68, 0xc0, 0x46, 0x3a, 0x53, 0xad, 0xf8, 0xbd,
0x85, 0x37, 0xc2, 0x6a, 0xcd, 0x23, 0xe6, 0xcf, 0x52, 0xbd, 0xff, 0x79, 0x1e, 0xaa, 0xcf, 0xa8,
0x3d, 0x08, 0x67, 0x21, 0x03, 0x80, 0xb8, 0xd5, 0x24, 0xd7, 0x12, 0xf3, 0x2f, 0x74, 0xa0, 0x9d,
0xeb, 0x2b, 0xac, 0x3a, 0x9d, 0x5d, 0x58, 0x0b, 0xbb, 0x21, 0xd2, 0x49, 0x50, 0x33, 0xfd, 0x56,
0xe7, 0xea, 0x52, 0x9b, 0x76, 0x32, 0x00, 0x88, 0xfb, 0x9d, 0x54, 0x3c, 0x0b, 0x5d, 0x54, 0x2a,
0x9e, 0x25, 0x4d, 0xd2, 0x2e, 0xac, 0x85, 0xbd, 0x47, 0x2a, 0x9e, 0x4c, 0xc7, 0x93, 0x8a, 0x67,
0xa1, 0x59, 0xd9, 0x85, 0xb5, 0xf0, 0x32, 0x4e, 0x39, 0xc9, 0x34, 0x04, 0x29, 0x27, 0x0b, 0xb7,
0xf7, 0x63, 0x28, 0x47, 0xf7, 0x30, 0x49, 0x32, 0xb3, 0x37, 0x76, 0xe7, 0xda, 0x72, 0xa3, 0xf2,
0xd3, 0xff, 0x34, 0x07, 0x8d, 0x17, 0x6f, 0x99, 0x3f, 0xa5, 0xa7, 0xbf, 0xca, 0x0a, 0xfe, 0x42,
0x71, 0x4a, 0xd1, 0xc2, 0x47, 0x68, 0x4a, 0xb4, 0xcc, 0xb3, 0x36, 0x25, 0xda, 0xc2, 0xab, 0x75,
0x1f, 0x2a, 0x89, 0x77, 0x14, 0x49, 0x85, 0xbe, 0xf0, 0x88, 0xec, 0x6c, 0xae, 0x32, 0x6b, 0xe9,
0x3e, 0x31, 0xa0, 0x85, 0xff, 0x0f, 0x1c, 0x0a, 0xee, 0xb3, 0x58, 0xbd, 0x1d, 0x28, 0x2a, 0xff,
0x57, 0x32, 0x17, 0xdb, 0x52, 0xcf, 0x4b, 0x6e, 0x3c, 0xf3, 0x02, 0x79, 0x0a, 0xe5, 0xa8, 0x1d,
0x48, 0xcb, 0x96, 0xe9, 0x1c, 0xd2, 0xb2, 0x65, 0x3b, 0x08, 0xf3, 0x42, 0xff, 0x03, 0x03, 0x36,
0x12, 0xff, 0x0d, 0xc4, 0x61, 0x7a, 0x70, 0x65, 0xc5, 0x3f, 0x0e, 0xe4, 0x66, 0xf2, 0x14, 0xfc,
0xe8, 0xdf, 0x39, 0x9d, 0x5b, 0xe7, 0xa1, 0x6a, 0xc1, 0x3e, 0x33, 0xa0, 0xae, 0x6a, 0x4f, 0x1c,
0xc5, 0x4b, 0xa8, 0x26, 0x0b, 0x19, 0x49, 0x4a, 0xb3, 0xa4, 0x96, 0x77, 0xba, 0x2b, 0xed, 0x91,
0x76, 0xaf, 0xb2, 0xb7, 0x5b, 0x77, 0x65, 0x09, 0xd4, 0x4e, 0xb7, 0x56, 0x13, 0x42, 0xaf, 0x3b,
0x85, 0x7f, 0xe7, 0xbc, 0xd1, 0xa8, 0x84, 0xd7, 0xfe, 0x5f, 0x7e, 0x08, 0x00, 0x00, 0xff, 0xff,
0x9d, 0x4f, 0x03, 0xcd, 0x6e, 0x13, 0x00, 0x00,
// 1782 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xb4, 0x58, 0x4b, 0x93, 0x1b, 0x49,
0x11, 0x76, 0xeb, 0x35, 0x52, 0x4a, 0xa3, 0x47, 0x49, 0xf6, 0x0a, 0xad, 0x3d, 0x1a, 0x9a, 0x87,
0xbd, 0x36, 0xc8, 0x46, 0x98, 0xc3, 0xb2, 0xb1, 0x07, 0x8f, 0xcc, 0xae, 0x15, 0x6b, 0xec, 0xd9,
0x1e, 0xc3, 0x81, 0xd8, 0x40, 0x51, 0xea, 0xae, 0xd1, 0x34, 0x96, 0xba, 0x7a, 0xbb, 0x4b, 0x66,
0xe7, 0x0f, 0x10, 0x70, 0xe2, 0xc4, 0x01, 0xae, 0xfc, 0x09, 0x82, 0x2b, 0x17, 0x6e, 0xdc, 0x39,
0xf8, 0x42, 0x04, 0xdc, 0xb9, 0x71, 0x23, 0x2a, 0xab, 0xfa, 0x2d, 0x31, 0x13, 0xc0, 0xde, 0xd4,
0x5f, 0x7e, 0x95, 0x95, 0xf9, 0xd5, 0x23, 0xb3, 0x04, 0x1d, 0xd7, 0x0b, 0x7d, 0x66, 0x0b, 0x1e,
0x4c, 0xfc, 0x80, 0x0b, 0x4e, 0x1a, 0x31, 0x30, 0x82, 0x15, 0x5f, 0x71, 0x05, 0x8f, 0xc0, 0xe3,
0x0e, 0xd3, 0xbf, 0x3b, 0x3e, 0x77, 0x3d, 0xc1, 0x02, 0x67, 0xa9, 0x81, 0xa3, 0x15, 0xe7, 0xab,
0x35, 0x7b, 0x88, 0x5f, 0xcb, 0xed, 0xf9, 0x43, 0x67, 0x1b, 0x50, 0xe1, 0x72, 0x4f, 0xdb, 0xc7,
0x79, 0xbb, 0x70, 0x37, 0x2c, 0x14, 0x74, 0xe3, 0x2b, 0x82, 0xf9, 0x02, 0x8e, 0x9e, 0xbb, 0xa1,
0x98, 0x07, 0x01, 0xf3, 0x69, 0x40, 0x97, 0x6b, 0x76, 0xc6, 0x56, 0x1b, 0xe6, 0x89, 0xd0, 0x62,
0x9f, 0x6f, 0x59, 0x28, 0xc8, 0x00, 0xaa, 0x6b, 0x77, 0xe3, 0x8a, 0xa1, 0x71, 0x6c, 0xdc, 0xab,
0x5a, 0xea, 0x83, 0xdc, 0x82, 0x1a, 0x3f, 0x3f, 0x0f, 0x99, 0x18, 0x96, 0x10, 0xd6, 0x5f, 0xe6,
0xdf, 0x0d, 0x20, 0x45, 0x67, 0x84, 0x40, 0xc5, 0xa7, 0xe2, 0x02, 0x7d, 0xb4, 0x2c, 0xfc, 0x4d,
0xde, 0x87, 0x76, 0xa8, 0xcc, 0x0b, 0x87, 0x09, 0xea, 0xae, 0xd1, 0x55, 0x73, 0x4a, 0x26, 0x49,
0x96, 0xa7, 0xea, 0x97, 0x75, 0xa8, 0x99, 0x4f, 0x91, 0x48, 0xc6, 0xd0, 0x5c, 0xf3, 0x50, 0x2c,
0x7c, 0x97, 0xd9, 0x2c, 0x1c, 0x96, 0x31, 0x04, 0x90, 0xd0, 0x29, 0x22, 0x64, 0x02, 0xfd, 0x35,
0x0d, 0xc5, 0x42, 0x06, 0xe2, 0x06, 0x0b, 0x2a, 0x04, 0xdb, 0xf8, 0x62, 0x58, 0x39, 0x36, 0xee,
0x95, 0xad, 0x9e, 0x34, 0x59, 0x68, 0x79, 0xa2, 0x0c, 0xe4, 0x11, 0x0c, 0xb2, 0xd4, 0x85, 0xcd,
0xb7, 0x9e, 0x18, 0x56, 0x71, 0x00, 0x09, 0xd2, 0xe4, 0x99, 0xb4, 0x98, 0x9f, 0xc1, 0x78, 0xaf,
0x70, 0xa1, 0xcf, 0xbd, 0x90, 0x91, 0xf7, 0xa1, 0xae, 0xc3, 0x0e, 0x87, 0xc6, 0x71, 0xf9, 0x5e,
0x73, 0x7a, 0x67, 0x92, 0x2c, 0x7a, 0x71, 0xa4, 0x15, 0xd3, 0xcd, 0xef, 0x43, 0xe7, 0x63, 0x26,
0xce, 0x04, 0x4d, 0xd6, 0xe1, 0x2e, 0x1c, 0xc8, 0x9d, 0xb0, 0x70, 0x1d, 0xa5, 0xe2, 0x49, 0xfb,
0xcf, 0x6f, 0xc7, 0x37, 0xfe, 0xfa, 0x76, 0x5c, 0x7b, 0xc1, 0x1d, 0x36, 0x7f, 0x6a, 0xd5, 0xa4,
0x79, 0xee, 0x98, 0xbf, 0x33, 0xa0, 0x9b, 0x0c, 0xd6, 0xb1, 0x8c, 0xa1, 0x49, 0xb7, 0x8e, 0x1b,
0xe5, 0x65, 0x60, 0x5e, 0x80, 0x10, 0xe6, 0x93, 0x10, 0x70, 0xff, 0xe0, 0x52, 0x18, 0x9a, 0x60,
0x49, 0x84, 0x7c, 0x15, 0x5a, 0x5b, 0x5f, 0x6e, 0x1f, 0xed, 0xa2, 0x8c, 0x2e, 0x9a, 0x0a, 0x53,
0x3e, 0x12, 0x8a, 0x72, 0x52, 0x41, 0x27, 0x9a, 0x82, 0x5e, 0xcc, 0xbf, 0x19, 0x40, 0x66, 0x01,
0xa3, 0x82, 0xfd, 0x57, 0xc9, 0xe5, 0xf3, 0x28, 0x15, 0xf2, 0x98, 0x40, 0x5f, 0x11, 0xc2, 0xad,
0x6d, 0xb3, 0x30, 0xcc, 0x44, 0xdb, 0x43, 0xd3, 0x99, 0xb2, 0xe4, 0x63, 0x56, 0xc4, 0x4a, 0x31,
0xad, 0x47, 0x30, 0xd0, 0x94, 0xac, 0x4f, 0xbd, 0x39, 0x94, 0x2d, 0xed, 0xd4, 0xbc, 0x09, 0xfd,
0x4c, 0x92, 0x6a, 0x11, 0xcc, 0xfb, 0x40, 0xd0, 0x2e, 0x73, 0x4a, 0x96, 0x66, 0x00, 0xd5, 0xf4,
0xa2, 0xa8, 0x0f, 0xb3, 0x0f, 0xbd, 0x34, 0x17, 0x65, 0x32, 0x6f, 0xc1, 0xe0, 0x63, 0x26, 0x4e,
0xb6, 0xf6, 0x6b, 0x26, 0xe4, 0xee, 0x8b, 0xf0, 0x7f, 0x1a, 0x70, 0x33, 0x67, 0xd0, 0xce, 0x9f,
0xc0, 0xc1, 0x12, 0xd1, 0x68, 0x0b, 0xde, 0x4d, 0x6d, 0xc1, 0x9d, 0x43, 0x26, 0x0a, 0xb2, 0xa2,
0x71, 0xa3, 0xdf, 0x18, 0x50, 0x53, 0x18, 0x79, 0x00, 0x0d, 0x85, 0xee, 0x5f, 0xa8, 0xba, 0x22,
0xcc, 0x1d, 0xf2, 0x10, 0x0e, 0x03, 0xbe, 0x15, 0xae, 0xb7, 0x5a, 0xc8, 0xc5, 0x0b, 0x87, 0x25,
0x0c, 0x00, 0x26, 0x78, 0xa1, 0x49, 0xba, 0xd5, 0xd2, 0x04, 0x4c, 0x92, 0x7c, 0x1b, 0x5a, 0x36,
0xb5, 0x2f, 0x98, 0xa3, 0xf9, 0xe5, 0x02, 0xbf, 0xa9, 0xec, 0x48, 0x97, 0x0a, 0xc5, 0x09, 0xc4,
0x0a, 0x3d, 0x03, 0x92, 0x06, 0x13, 0x89, 0x05, 0x17, 0x74, 0x1d, 0x49, 0x8c, 0x1f, 0xe4, 0x36,
0x94, 0x5d, 0x47, 0x85, 0xd5, 0x3a, 0x81, 0x54, 0x0e, 0x12, 0x36, 0xa7, 0x78, 0x8a, 0xb4, 0x18,
0x7a, 0x9b, 0x1e, 0x41, 0x69, 0x6f, 0xe2, 0x25, 0xd7, 0x31, 0x7f, 0x94, 0x0a, 0x29, 0x9e, 0xfc,
0x8a, 0x41, 0xe4, 0x18, 0xaa, 0xfb, 0xf4, 0x51, 0x06, 0xf3, 0x7e, 0xbc, 0x00, 0x57, 0x73, 0x27,
0x00, 0xc9, 0x9a, 0x26, 0x7c, 0x63, 0x1f, 0xff, 0x13, 0xe8, 0x9c, 0xea, 0x15, 0xb8, 0x66, 0x96,
0x64, 0x08, 0x07, 0xd4, 0x71, 0x02, 0x16, 0x86, 0x78, 0xfe, 0x1a, 0x56, 0xf4, 0x69, 0x9a, 0xd0,
0x4d, 0x9c, 0xe9, 0xf4, 0xdb, 0x50, 0xe2, 0xaf, 0xd1, 0x5b, 0xdd, 0x2a, 0xf1, 0xd7, 0xe6, 0x87,
0xd0, 0x7b, 0xce, 0xf9, 0xeb, 0xad, 0x9f, 0x9e, 0xb2, 0x1d, 0x4f, 0xd9, 0xb8, 0x62, 0x8a, 0xcf,
0x80, 0xa4, 0x87, 0xc7, 0x1a, 0x57, 0x64, 0x3a, 0xe8, 0x21, 0x9b, 0x26, 0xe2, 0xe4, 0x9b, 0x50,
0xd9, 0x30, 0x41, 0xe3, 0x0a, 0x13, 0xdb, 0x7f, 0xc8, 0x04, 0x75, 0xa8, 0xa0, 0x16, 0xda, 0xcd,
0x9f, 0x42, 0x07, 0x13, 0xf5, 0xce, 0xf9, 0x75, 0xd5, 0x78, 0x90, 0x0d, 0xb5, 0x39, 0xed, 0x25,
0xde, 0x9f, 0x28, 0x43, 0x12, 0xfd, 0x9f, 0x0c, 0xe8, 0x26, 0x13, 0xe8, 0xe0, 0x4d, 0xa8, 0x88,
0x4b, 0x5f, 0x05, 0xdf, 0x9e, 0xb6, 0x93, 0xe1, 0xaf, 0x2e, 0x7d, 0x66, 0xa1, 0x8d, 0x4c, 0xa0,
0xce, 0x7d, 0x16, 0x50, 0xc1, 0x83, 0x62, 0x12, 0x2f, 0xb5, 0xc5, 0x8a, 0x39, 0x92, 0x6f, 0x53,
0x9f, 0xda, 0xae, 0xb8, 0xc4, 0xbb, 0x2f, 0xc3, 0x9f, 0x69, 0x8b, 0x15, 0x73, 0x64, 0x16, 0x6f,
0x58, 0x10, 0xba, 0xdc, 0xc3, 0x1b, 0x30, 0x93, 0xc5, 0x8f, 0x95, 0xc1, 0x8a, 0x18, 0xe6, 0x06,
0x3a, 0x1f, 0xb9, 0x9e, 0xf3, 0x82, 0xd1, 0xe0, 0xba, 0x2a, 0x7d, 0x1d, 0xaa, 0xa1, 0xa0, 0x81,
0xba, 0xb1, 0x8b, 0x14, 0x65, 0x4c, 0x7a, 0x0d, 0x75, 0x5d, 0xab, 0x0f, 0xf3, 0x31, 0x74, 0x93,
0xe9, 0xb4, 0x66, 0x57, 0x1f, 0x04, 0x02, 0xdd, 0xa7, 0xdb, 0x8d, 0x9f, 0xb9, 0x3f, 0xbf, 0x07,
0xbd, 0x14, 0x96, 0x77, 0xb5, 0xf7, 0x8c, 0xb4, 0xa1, 0x95, 0xae, 0x56, 0xe6, 0xbf, 0x0c, 0xe8,
0x4b, 0xe0, 0x6c, 0xbb, 0xd9, 0xd0, 0xe0, 0x32, 0xf6, 0x74, 0x07, 0x60, 0x1b, 0x32, 0x67, 0x11,
0xfa, 0xd4, 0x66, 0xfa, 0xae, 0x69, 0x48, 0xe4, 0x4c, 0x02, 0xe4, 0x2e, 0x74, 0xe8, 0x1b, 0xea,
0xae, 0x65, 0xc9, 0xd7, 0x1c, 0x55, 0xbf, 0xda, 0x31, 0xac, 0x88, 0xb2, 0x26, 0x49, 0x3f, 0xae,
0xb7, 0xc2, 0x7d, 0x15, 0x95, 0xda, 0x90, 0x39, 0x73, 0x05, 0xc9, 0x3a, 0x88, 0x14, 0xa6, 0x18,
0xaa, 0x6a, 0xe1, 0xec, 0x3f, 0x50, 0x84, 0x6f, 0x40, 0x1b, 0x09, 0x4b, 0xea, 0x39, 0x3f, 0x77,
0x1d, 0x71, 0xa1, 0xcb, 0xd5, 0xa1, 0x44, 0x4f, 0x22, 0x90, 0x3c, 0x84, 0x7e, 0x12, 0x53, 0xc2,
0xad, 0xa9, 0xd2, 0x16, 0x9b, 0xe2, 0x01, 0x28, 0x2b, 0x0d, 0x2f, 0x96, 0x9c, 0x06, 0x4e, 0xa4,
0xc7, 0x5f, 0xca, 0xd0, 0x4b, 0x81, 0x5a, 0x8d, 0x6b, 0xd7, 0xf4, 0xf7, 0xa0, 0x8b, 0x44, 0x9b,
0x7b, 0x1e, 0xb3, 0x65, 0xf7, 0x1a, 0x6a, 0x61, 0x3a, 0x12, 0x9f, 0x25, 0x30, 0x79, 0x00, 0xbd,
0x25, 0xe7, 0x22, 0x14, 0x01, 0xf5, 0x17, 0xd1, 0xb1, 0x2b, 0xe3, 0x0d, 0xd1, 0x8d, 0x0d, 0xfa,
0xd4, 0x49, 0xbf, 0xd8, 0x3d, 0x7a, 0x74, 0x1d, 0x73, 0x2b, 0xc8, 0xed, 0x44, 0x78, 0x8a, 0xca,
0xbe, 0xc8, 0x51, 0xab, 0x8a, 0x1a, 0xe1, 0x11, 0xf5, 0x31, 0xee, 0x64, 0x11, 0xa2, 0x46, 0xcd,
0xe9, 0x51, 0xaa, 0x9e, 0xee, 0xd8, 0x13, 0x96, 0x22, 0x93, 0xef, 0x40, 0x4d, 0xf5, 0x09, 0xc3,
0x03, 0x1c, 0xf6, 0x95, 0x89, 0xea, 0xcc, 0x27, 0x51, 0x67, 0x3e, 0x79, 0xaa, 0x3b, 0x77, 0x4b,
0x13, 0xc9, 0x07, 0xd0, 0xc4, 0x1e, 0xd6, 0x77, 0xbd, 0x15, 0x73, 0x86, 0x75, 0x1c, 0x37, 0x2a,
0x8c, 0x7b, 0x15, 0x75, 0xf4, 0x16, 0x48, 0xfa, 0x29, 0xb2, 0xc9, 0x87, 0xd0, 0xc2, 0xc1, 0x9f,
0x6f, 0x59, 0xe0, 0x32, 0x67, 0xd8, 0xb8, 0x72, 0x34, 0x4e, 0xf6, 0xa9, 0xa2, 0x9b, 0xbf, 0x35,
0x60, 0xa0, 0xbb, 0xd2, 0x67, 0x8c, 0xae, 0xc5, 0x45, 0x74, 0xce, 0x6f, 0x41, 0x4d, 0x15, 0x78,
0xdd, 0xca, 0xeb, 0x2f, 0xb9, 0xdd, 0x98, 0x67, 0x07, 0x97, 0xbe, 0x60, 0xce, 0x02, 0x5b, 0x7d,
0x3c, 0xe8, 0xd6, 0x61, 0x8c, 0x9e, 0xca, 0x9e, 0xff, 0x6b, 0x10, 0x75, 0xf2, 0x0b, 0xd7, 0x73,
0xd8, 0x17, 0x7a, 0x6b, 0xb7, 0x34, 0x38, 0x97, 0x98, 0x3c, 0x46, 0x7e, 0xc0, 0x7f, 0xc6, 0x6c,
0x6c, 0x33, 0x2a, 0xe8, 0xa7, 0xa1, 0x91, 0xb9, 0x63, 0x3e, 0x87, 0xc3, 0x4c, 0x68, 0xf2, 0xb8,
0x70, 0x6f, 0xed, 0x7a, 0x6c, 0x11, 0x9d, 0x63, 0xf9, 0x1c, 0x68, 0x2a, 0x4c, 0xb5, 0x16, 0x43,
0x38, 0xd0, 0x53, 0xe8, 0xb8, 0xa2, 0x4f, 0xf3, 0x17, 0x06, 0xdc, 0xcc, 0x65, 0xaa, 0xf7, 0xef,
0x23, 0xa8, 0x5d, 0x20, 0xa2, 0xab, 0xca, 0x30, 0xbd, 0xd2, 0x99, 0x11, 0x9a, 0x47, 0x3e, 0x00,
0x08, 0x98, 0xb3, 0xf5, 0x1c, 0xea, 0xd9, 0x97, 0xfa, 0x9a, 0x7e, 0x37, 0xf5, 0x9a, 0xb1, 0x62,
0xe3, 0x99, 0x7d, 0xc1, 0x36, 0xcc, 0x4a, 0xd1, 0xcd, 0x7f, 0x18, 0xd0, 0x7f, 0xb9, 0x94, 0x39,
0x66, 0x15, 0x2f, 0x2a, 0x6b, 0xec, 0x52, 0x36, 0x59, 0x98, 0x52, 0x66, 0x61, 0xb2, 0x62, 0x96,
0x73, 0x62, 0xca, 0x76, 0x19, 0xaf, 0xde, 0x05, 0x3d, 0x17, 0x2c, 0x58, 0x44, 0x22, 0xe9, 0x87,
0x12, 0x9a, 0x9e, 0x48, 0x4b, 0xf4, 0x90, 0xfb, 0x16, 0x10, 0xe6, 0x39, 0x8b, 0x25, 0x3b, 0xe7,
0x01, 0x8b, 0xe9, 0xea, 0x6a, 0xe9, 0x32, 0xcf, 0x39, 0x41, 0x43, 0xc4, 0x8e, 0xef, 0xf3, 0x5a,
0xea, 0xed, 0x68, 0xfe, 0xca, 0x80, 0x41, 0x36, 0x53, 0xad, 0xf8, 0xe3, 0xc2, 0x83, 0x69, 0xbf,
0xe6, 0x31, 0xf3, 0x7f, 0x52, 0x7d, 0xfa, 0xeb, 0x0a, 0xb4, 0x3e, 0xa1, 0xce, 0x3c, 0x9a, 0x85,
0xcc, 0x01, 0x92, 0xbe, 0x9b, 0xdc, 0x4e, 0xcd, 0x5f, 0x68, 0xc7, 0x47, 0x77, 0xf6, 0x58, 0x75,
0x3a, 0x33, 0xa8, 0x47, 0xdd, 0x10, 0x19, 0xa5, 0xa8, 0xb9, 0x7e, 0x6b, 0xf4, 0xee, 0x4e, 0x9b,
0x76, 0x32, 0x07, 0x48, 0xfa, 0x9d, 0x4c, 0x3c, 0x85, 0x2e, 0x2a, 0x13, 0xcf, 0x8e, 0x26, 0x69,
0x06, 0xf5, 0xa8, 0xf7, 0xc8, 0xc4, 0x93, 0xeb, 0x78, 0x32, 0xf1, 0x14, 0x9a, 0x95, 0x19, 0xd4,
0xa3, 0x62, 0x9c, 0x71, 0x92, 0x6b, 0x08, 0x32, 0x4e, 0x0a, 0xd5, 0xfb, 0x23, 0x68, 0xc4, 0x75,
0x98, 0xa4, 0x99, 0xf9, 0x8a, 0x3d, 0xba, 0xbd, 0xdb, 0xa8, 0xfd, 0x58, 0x70, 0x98, 0x79, 0xc3,
0x90, 0xf1, 0xfe, 0xd7, 0x8d, 0xf2, 0x77, 0x7c, 0xd5, 0xf3, 0x67, 0xfa, 0x87, 0x12, 0x74, 0x5f,
0xbe, 0x61, 0xc1, 0x9a, 0x5e, 0x7e, 0x29, 0xbb, 0xe2, 0xff, 0x95, 0xfb, 0x0c, 0xea, 0xd1, 0x2b,
0x3f, 0xb3, 0x10, 0xb9, 0xff, 0x0d, 0x32, 0x0b, 0x51, 0xf8, 0x5b, 0xe0, 0x39, 0x34, 0x53, 0x0f,
0x55, 0x92, 0x09, 0xbd, 0xf0, 0x4a, 0x1f, 0x1d, 0xed, 0x33, 0x6b, 0xe9, 0x7e, 0x6f, 0x40, 0x1f,
0xff, 0x80, 0x39, 0x13, 0x3c, 0x60, 0x89, 0x7a, 0x27, 0x50, 0x55, 0xfe, 0xdf, 0xc9, 0x15, 0xcb,
0x9d, 0x9e, 0x77, 0x54, 0x51, 0xf3, 0x06, 0x79, 0x06, 0x8d, 0xb8, 0xc5, 0xc8, 0xca, 0x96, 0xeb,
0x46, 0xb2, 0xb2, 0xe5, 0xbb, 0x12, 0xf3, 0xc6, 0xf4, 0x97, 0x06, 0x0c, 0x52, 0x7f, 0xbe, 0x24,
0x61, 0xfa, 0xf0, 0xce, 0x9e, 0xbf, 0x74, 0xc8, 0x7b, 0xe9, 0x93, 0xf5, 0x1f, 0xff, 0x2f, 0x1b,
0xdd, 0xbf, 0x0e, 0x55, 0x0b, 0xf6, 0x47, 0x03, 0x3a, 0xea, 0x3e, 0x4b, 0xa2, 0xf8, 0x14, 0x5a,
0xe9, 0xcb, 0x91, 0xa4, 0xa5, 0xd9, 0x51, 0x1f, 0x46, 0xe3, 0xbd, 0xf6, 0x58, 0xbb, 0x57, 0xf9,
0x8a, 0x39, 0xde, 0x7b, 0xad, 0xee, 0x38, 0x26, 0x3b, 0xab, 0xa3, 0x79, 0xe3, 0xa4, 0xf2, 0x93,
0x92, 0xbf, 0x5c, 0xd6, 0xb0, 0x95, 0xf8, 0xee, 0xbf, 0x03, 0x00, 0x00, 0xff, 0xff, 0x8f, 0x28,
0x82, 0xe5, 0xcf, 0x14, 0x00, 0x00,
}
// Reference imports to suppress errors if they are not otherwise used.
@ -1755,6 +1879,8 @@ type KadInspectorClient interface {
FindNear(ctx context.Context, in *FindNearRequest, opts ...grpc.CallOption) (*FindNearResponse, error)
// DumpNodes returns all the nodes in the node database
DumpNodes(ctx context.Context, in *DumpNodesRequest, opts ...grpc.CallOption) (*DumpNodesResponse, error)
// GetBucketList returns all the buckets with all their nodes
GetBucketList(ctx context.Context, in *GetBucketListRequest, opts ...grpc.CallOption) (*GetBucketListResponse, error)
}
type kadInspectorClient struct {
@ -1819,6 +1945,15 @@ func (c *kadInspectorClient) DumpNodes(ctx context.Context, in *DumpNodesRequest
return out, nil
}
func (c *kadInspectorClient) GetBucketList(ctx context.Context, in *GetBucketListRequest, opts ...grpc.CallOption) (*GetBucketListResponse, error) {
out := new(GetBucketListResponse)
err := c.cc.Invoke(ctx, "/inspector.KadInspector/GetBucketList", in, out, opts...)
if err != nil {
return nil, err
}
return out, nil
}
// KadInspectorServer is the server API for KadInspector service.
type KadInspectorServer interface {
// CountNodes returns the number of nodes in the routing table
@ -1833,6 +1968,8 @@ type KadInspectorServer interface {
FindNear(context.Context, *FindNearRequest) (*FindNearResponse, error)
// DumpNodes returns all the nodes in the node database
DumpNodes(context.Context, *DumpNodesRequest) (*DumpNodesResponse, error)
// GetBucketList returns all the buckets with all their nodes
GetBucketList(context.Context, *GetBucketListRequest) (*GetBucketListResponse, error)
}
func RegisterKadInspectorServer(s *grpc.Server, srv KadInspectorServer) {
@ -1947,6 +2084,24 @@ func _KadInspector_DumpNodes_Handler(srv interface{}, ctx context.Context, dec f
return interceptor(ctx, in, info, handler)
}
func _KadInspector_GetBucketList_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
in := new(GetBucketListRequest)
if err := dec(in); err != nil {
return nil, err
}
if interceptor == nil {
return srv.(KadInspectorServer).GetBucketList(ctx, in)
}
info := &grpc.UnaryServerInfo{
Server: srv,
FullMethod: "/inspector.KadInspector/GetBucketList",
}
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
return srv.(KadInspectorServer).GetBucketList(ctx, req.(*GetBucketListRequest))
}
return interceptor(ctx, in, info, handler)
}
var _KadInspector_serviceDesc = grpc.ServiceDesc{
ServiceName: "inspector.KadInspector",
HandlerType: (*KadInspectorServer)(nil),
@ -1975,6 +2130,10 @@ var _KadInspector_serviceDesc = grpc.ServiceDesc{
MethodName: "DumpNodes",
Handler: _KadInspector_DumpNodes_Handler,
},
{
MethodName: "GetBucketList",
Handler: _KadInspector_GetBucketList_Handler,
},
},
Streams: []grpc.StreamDesc{},
Metadata: "inspector.proto",

View File

@ -25,6 +25,8 @@ service KadInspector {
rpc FindNear(FindNearRequest) returns (FindNearResponse);
// DumpNodes returns all the nodes in the node database
rpc DumpNodes(DumpNodesRequest) returns (DumpNodesResponse);
// GetBucketList returns all the buckets with all their nodes
rpc GetBucketList(GetBucketListRequest) returns (GetBucketListResponse);
}
service OverlayInspector {
@ -108,6 +110,18 @@ message CountNodesResponse {
message CountNodesRequest {
}
message GetBucketListRequest {
}
message GetBucketListResponse {
message Bucket {
bytes bucket_id = 1 [(gogoproto.customtype) = "NodeID", (gogoproto.nullable) = false];
repeated node.Node routing_nodes = 2;
repeated node.Node cached_nodes = 3;
}
repeated Bucket buckets = 1;
}
// GetBuckets
message GetBucketsRequest {
}

View File

@ -54,7 +54,7 @@ func (x Restriction_Operator) String() string {
}
func (Restriction_Operator) EnumDescriptor() ([]byte, []int) {
return fileDescriptor_61fc82527fbe24ad, []int{6, 0}
return fileDescriptor_61fc82527fbe24ad, []int{8, 0}
}
type Restriction_Operand int32
@ -79,7 +79,7 @@ func (x Restriction_Operand) String() string {
}
func (Restriction_Operand) EnumDescriptor() ([]byte, []int) {
return fileDescriptor_61fc82527fbe24ad, []int{6, 1}
return fileDescriptor_61fc82527fbe24ad, []int{8, 1}
}
type QueryRequest struct {
@ -343,6 +343,74 @@ func (m *InfoResponse) GetVersion() *NodeVersion {
return nil
}
type GraphRequest struct {
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
}
func (m *GraphRequest) Reset() { *m = GraphRequest{} }
func (m *GraphRequest) String() string { return proto.CompactTextString(m) }
func (*GraphRequest) ProtoMessage() {}
func (*GraphRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_61fc82527fbe24ad, []int{6}
}
func (m *GraphRequest) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_GraphRequest.Unmarshal(m, b)
}
func (m *GraphRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
return xxx_messageInfo_GraphRequest.Marshal(b, m, deterministic)
}
func (m *GraphRequest) XXX_Merge(src proto.Message) {
xxx_messageInfo_GraphRequest.Merge(m, src)
}
func (m *GraphRequest) XXX_Size() int {
return xxx_messageInfo_GraphRequest.Size(m)
}
func (m *GraphRequest) XXX_DiscardUnknown() {
xxx_messageInfo_GraphRequest.DiscardUnknown(m)
}
var xxx_messageInfo_GraphRequest proto.InternalMessageInfo
type GraphResponse struct {
Graph [][]byte `protobuf:"bytes,1,rep,name=graph,proto3" json:"graph,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
}
func (m *GraphResponse) Reset() { *m = GraphResponse{} }
func (m *GraphResponse) String() string { return proto.CompactTextString(m) }
func (*GraphResponse) ProtoMessage() {}
func (*GraphResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_61fc82527fbe24ad, []int{7}
}
func (m *GraphResponse) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_GraphResponse.Unmarshal(m, b)
}
func (m *GraphResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
return xxx_messageInfo_GraphResponse.Marshal(b, m, deterministic)
}
func (m *GraphResponse) XXX_Merge(src proto.Message) {
xxx_messageInfo_GraphResponse.Merge(m, src)
}
func (m *GraphResponse) XXX_Size() int {
return xxx_messageInfo_GraphResponse.Size(m)
}
func (m *GraphResponse) XXX_DiscardUnknown() {
xxx_messageInfo_GraphResponse.DiscardUnknown(m)
}
var xxx_messageInfo_GraphResponse proto.InternalMessageInfo
func (m *GraphResponse) GetGraph() [][]byte {
if m != nil {
return m.Graph
}
return nil
}
type Restriction struct {
Operator Restriction_Operator `protobuf:"varint,1,opt,name=operator,proto3,enum=overlay.Restriction_Operator" json:"operator,omitempty"`
Operand Restriction_Operand `protobuf:"varint,2,opt,name=operand,proto3,enum=overlay.Restriction_Operand" json:"operand,omitempty"`
@ -356,7 +424,7 @@ func (m *Restriction) Reset() { *m = Restriction{} }
func (m *Restriction) String() string { return proto.CompactTextString(m) }
func (*Restriction) ProtoMessage() {}
func (*Restriction) Descriptor() ([]byte, []int) {
return fileDescriptor_61fc82527fbe24ad, []int{6}
return fileDescriptor_61fc82527fbe24ad, []int{8}
}
func (m *Restriction) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_Restriction.Unmarshal(m, b)
@ -406,44 +474,48 @@ func init() {
proto.RegisterType((*PingResponse)(nil), "overlay.PingResponse")
proto.RegisterType((*InfoRequest)(nil), "overlay.InfoRequest")
proto.RegisterType((*InfoResponse)(nil), "overlay.InfoResponse")
proto.RegisterType((*GraphRequest)(nil), "overlay.GraphRequest")
proto.RegisterType((*GraphResponse)(nil), "overlay.GraphResponse")
proto.RegisterType((*Restriction)(nil), "overlay.Restriction")
}
func init() { proto.RegisterFile("overlay.proto", fileDescriptor_61fc82527fbe24ad) }
var fileDescriptor_61fc82527fbe24ad = []byte{
// 491 bytes of a gzipped FileDescriptorProto
// 514 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x8c, 0x93, 0xdf, 0x8a, 0xd3, 0x40,
0x14, 0xc6, 0x77, 0xda, 0x74, 0x13, 0x4f, 0xff, 0x10, 0x87, 0x5d, 0x09, 0x41, 0xa1, 0xe4, 0x42,
0x0a, 0x4a, 0x2e, 0xba, 0xb2, 0xa0, 0x77, 0xae, 0x8d, 0x6b, 0x71, 0x59, 0xdd, 0x31, 0x28, 0xe8,
0x85, 0xa4, 0xcd, 0x18, 0x82, 0x75, 0x26, 0x4e, 0xa6, 0x85, 0xbc, 0x81, 0x8f, 0xe3, 0x1b, 0xf8,
0x5e, 0x5e, 0xc9, 0x4c, 0x26, 0x69, 0xac, 0x0a, 0x5e, 0xcd, 0x9c, 0xf3, 0xfd, 0x4e, 0xe7, 0x9c,
0xd3, 0x2f, 0x30, 0xe6, 0x3b, 0x2a, 0x36, 0x49, 0x15, 0x16, 0x82, 0x4b, 0x8e, 0x6d, 0x13, 0xfa,
0x90, 0xf1, 0x8c, 0xd7, 0x49, 0x1f, 0x18, 0x4f, 0x69, 0x7d, 0x0f, 0xbe, 0x21, 0x18, 0xdd, 0x6c,
0xa9, 0xa8, 0x08, 0xfd, 0xba, 0xa5, 0xa5, 0xc4, 0x01, 0x1c, 0x97, 0x94, 0xa5, 0x54, 0x78, 0x68,
0x8a, 0x66, 0xc3, 0x39, 0x84, 0x9a, 0xbe, 0xe6, 0x29, 0x25, 0x46, 0x51, 0x8c, 0x4c, 0x44, 0x46,
0xa5, 0xd7, 0xfb, 0x93, 0xa9, 0x15, 0x7c, 0x02, 0x83, 0x4d, 0xfe, 0x25, 0x97, 0x5e, 0x7f, 0x8a,
0x66, 0x7d, 0x52, 0x07, 0xd8, 0x07, 0xa7, 0xc8, 0x59, 0xb6, 0x4a, 0xd6, 0x9f, 0x3d, 0x6b, 0x8a,
0x66, 0x0e, 0x69, 0xe3, 0xe0, 0x03, 0x8c, 0x4d, 0x27, 0x65, 0xc1, 0x59, 0x49, 0xff, 0xab, 0x95,
0xfb, 0xe0, 0x08, 0xc3, 0x7b, 0xbd, 0x69, 0xff, 0x80, 0x6a, 0xb5, 0x60, 0x0c, 0xc3, 0xd7, 0x39,
0xcb, 0xcc, 0x94, 0xc1, 0x04, 0x46, 0x75, 0xb8, 0x97, 0x97, 0xec, 0x13, 0x6f, 0xe4, 0x1f, 0x08,
0x46, 0x75, 0xdc, 0xb6, 0x62, 0xc9, 0xaa, 0xa0, 0x7a, 0xde, 0xc9, 0x7c, 0xb2, 0x7f, 0x22, 0xae,
0x0a, 0x4a, 0xb4, 0x86, 0x43, 0x70, 0x78, 0x41, 0x45, 0x22, 0xb9, 0xd0, 0x43, 0x0f, 0xe7, 0x78,
0xcf, 0xbd, 0x32, 0x0a, 0x69, 0x19, 0xc5, 0xaf, 0x93, 0x22, 0x59, 0xe7, 0xb2, 0xd2, 0xbb, 0xf8,
0x8d, 0x7f, 0x66, 0x14, 0xd2, 0x32, 0xf8, 0x01, 0xd8, 0x3b, 0x2a, 0xca, 0x9c, 0x33, 0x6f, 0xa0,
0xf1, 0xdb, 0x7b, 0xfc, 0x6d, 0x2d, 0x90, 0x86, 0x08, 0x7e, 0x22, 0x18, 0x12, 0x5a, 0x4a, 0x91,
0xaf, 0x65, 0xce, 0x19, 0x7e, 0xdc, 0x69, 0x0e, 0xe9, 0x21, 0xee, 0x85, 0x8d, 0x55, 0x3a, 0x5c,
0xf8, 0x97, 0x3e, 0xcf, 0xc1, 0xd6, 0x77, 0x96, 0x9a, 0xf1, 0xef, 0xfe, 0xbb, 0x92, 0xa5, 0xa4,
0x81, 0x95, 0x03, 0x76, 0xc9, 0x66, 0x4b, 0x1b, 0x07, 0xe8, 0x20, 0x78, 0x04, 0x4e, 0xf3, 0x06,
0x3e, 0x86, 0xde, 0x55, 0xec, 0x1e, 0xa9, 0x33, 0xba, 0x71, 0x91, 0x3a, 0x2f, 0x63, 0xb7, 0x87,
0x6d, 0xe8, 0x5f, 0xc5, 0x91, 0xdb, 0x57, 0x97, 0xcb, 0x38, 0x72, 0xad, 0xe0, 0x21, 0xd8, 0xe6,
0xf7, 0x31, 0x86, 0xc9, 0x73, 0x12, 0x45, 0x1f, 0x2f, 0x9e, 0x5e, 0x2f, 0xde, 0x2d, 0x17, 0xf1,
0x0b, 0xf7, 0x08, 0x8f, 0xe1, 0x96, 0xce, 0x2d, 0x96, 0x6f, 0x5e, 0xba, 0x68, 0xfe, 0x1d, 0xc1,
0x40, 0x6d, 0xa5, 0xc4, 0xe7, 0x30, 0xd0, 0x9e, 0xc2, 0xa7, 0x6d, 0xcf, 0x5d, 0xb7, 0xfb, 0x77,
0x0e, 0xd3, 0xe6, 0xff, 0x3e, 0x03, 0x4b, 0xf9, 0x03, 0x9f, 0xb4, 0x7a, 0xc7, 0x3d, 0xfe, 0xe9,
0x41, 0xd6, 0x14, 0x3d, 0x51, 0x2b, 0xd7, 0x84, 0xf2, 0x4e, 0xa7, 0xb6, 0x63, 0xad, 0x4e, 0x6d,
0xd7, 0x60, 0x17, 0xd6, 0xfb, 0x5e, 0xb1, 0x5a, 0x1d, 0xeb, 0x8f, 0xf2, 0xec, 0x57, 0x00, 0x00,
0x00, 0xff, 0xff, 0x6b, 0xb9, 0x2c, 0xac, 0xc6, 0x03, 0x00, 0x00,
0x14, 0xc6, 0x77, 0x9a, 0xfe, 0xf3, 0xf4, 0x0f, 0x71, 0xe8, 0x4a, 0x28, 0x0a, 0x21, 0xa0, 0x14,
0x94, 0x5c, 0x74, 0x65, 0x41, 0xef, 0x5c, 0x1b, 0x6b, 0x71, 0x59, 0xdd, 0x31, 0x28, 0xe8, 0x85,
0xa4, 0xcd, 0x18, 0x83, 0x75, 0x26, 0x4e, 0xa6, 0x85, 0xbc, 0x81, 0x8f, 0xe3, 0x1b, 0xf8, 0x5e,
0x5e, 0xc9, 0x4c, 0x26, 0x69, 0xac, 0x0a, 0x5e, 0x65, 0xce, 0xf9, 0x7e, 0x93, 0x9c, 0xef, 0xf0,
0x05, 0x46, 0x7c, 0x4f, 0xc5, 0x36, 0x2a, 0xfc, 0x4c, 0x70, 0xc9, 0x71, 0xcf, 0x94, 0x53, 0x48,
0x78, 0xc2, 0xcb, 0xe6, 0x14, 0x18, 0x8f, 0x69, 0x79, 0xf6, 0xbe, 0x21, 0x18, 0x5e, 0xef, 0xa8,
0x28, 0x08, 0xfd, 0xba, 0xa3, 0xb9, 0xc4, 0x1e, 0x74, 0x73, 0xca, 0x62, 0x2a, 0x1c, 0xe4, 0xa2,
0xd9, 0x60, 0x0e, 0xbe, 0xa6, 0xaf, 0x78, 0x4c, 0x89, 0x51, 0x14, 0x23, 0x23, 0x91, 0x50, 0xe9,
0xb4, 0xfe, 0x64, 0x4a, 0x05, 0x4f, 0xa0, 0xb3, 0x4d, 0xbf, 0xa4, 0xd2, 0xb1, 0x5c, 0x34, 0xb3,
0x48, 0x59, 0xe0, 0x29, 0xf4, 0xb3, 0x94, 0x25, 0xeb, 0x68, 0xf3, 0xd9, 0x69, 0xbb, 0x68, 0xd6,
0x27, 0x75, 0xed, 0xbd, 0x87, 0x91, 0x99, 0x24, 0xcf, 0x38, 0xcb, 0xe9, 0x7f, 0x8d, 0x72, 0x0f,
0xfa, 0xc2, 0xf0, 0x4e, 0xcb, 0xb5, 0x8e, 0xa8, 0x5a, 0xf3, 0x46, 0x30, 0x78, 0x95, 0xb2, 0xc4,
0xb8, 0xf4, 0xc6, 0x30, 0x2c, 0xcb, 0x83, 0xbc, 0x62, 0x1f, 0x79, 0x25, 0xff, 0x40, 0x30, 0x2c,
0xeb, 0x7a, 0x94, 0xb6, 0x2c, 0x32, 0xaa, 0xfd, 0x8e, 0xe7, 0xe3, 0xc3, 0x27, 0xc2, 0x22, 0xa3,
0x44, 0x6b, 0xd8, 0x87, 0x3e, 0xcf, 0xa8, 0x88, 0x24, 0x17, 0xda, 0xf4, 0x60, 0x8e, 0x0f, 0xdc,
0x4b, 0xa3, 0x90, 0x9a, 0x51, 0xfc, 0x26, 0xca, 0xa2, 0x4d, 0x2a, 0x0b, 0xbd, 0x8b, 0xdf, 0xf8,
0xa7, 0x46, 0x21, 0x35, 0x83, 0xef, 0x43, 0x6f, 0x4f, 0x45, 0x9e, 0x72, 0xe6, 0x74, 0x34, 0x7e,
0xf3, 0x80, 0xbf, 0x29, 0x05, 0x52, 0x11, 0xca, 0xe0, 0x52, 0x44, 0xd9, 0xa7, 0xca, 0xd1, 0x5d,
0x18, 0x99, 0xda, 0x38, 0x9a, 0x40, 0x27, 0x51, 0x0d, 0x07, 0xb9, 0xd6, 0x6c, 0x48, 0xca, 0xc2,
0xfb, 0x89, 0x60, 0x40, 0x68, 0x2e, 0x45, 0xba, 0x91, 0x29, 0x67, 0xf8, 0x51, 0xc3, 0x13, 0xd2,
0xde, 0xef, 0xf8, 0x55, 0xc2, 0x1a, 0x9c, 0xff, 0x17, 0x7b, 0xe7, 0xd0, 0xd3, 0x67, 0x16, 0x9b,
0xad, 0xdd, 0xfe, 0xf7, 0x4d, 0x16, 0x93, 0x0a, 0x56, 0x83, 0xed, 0xa3, 0xed, 0x8e, 0x56, 0xc1,
0xd1, 0x85, 0xf7, 0x10, 0xfa, 0xd5, 0x37, 0x70, 0x17, 0x5a, 0x97, 0xa1, 0x7d, 0xa2, 0x9e, 0xc1,
0xb5, 0x8d, 0xd4, 0x73, 0x19, 0xda, 0x2d, 0xdc, 0x03, 0xeb, 0x32, 0x0c, 0x6c, 0x4b, 0x1d, 0x96,
0x61, 0x60, 0xb7, 0xbd, 0x07, 0xd0, 0x33, 0xef, 0xc7, 0x18, 0xc6, 0xcf, 0x48, 0x10, 0x7c, 0xb8,
0x78, 0x72, 0xb5, 0x78, 0xbb, 0x5a, 0x84, 0xcf, 0xed, 0x13, 0x3c, 0x82, 0x1b, 0xba, 0xb7, 0x58,
0xbd, 0x7e, 0x61, 0xa3, 0xf9, 0x77, 0x04, 0x1d, 0xb5, 0xcc, 0x1c, 0x9f, 0x43, 0x47, 0x47, 0x11,
0x9f, 0xd6, 0x33, 0x37, 0x7f, 0x92, 0xe9, 0xad, 0xe3, 0xb6, 0x59, 0xea, 0x19, 0xb4, 0x55, 0xac,
0xf0, 0xa4, 0xd6, 0x1b, 0xa1, 0x9b, 0x9e, 0x1e, 0x75, 0xcd, 0xa5, 0xc7, 0x6a, 0xe5, 0x9a, 0x50,
0x91, 0x6b, 0xdc, 0x6d, 0x24, 0xb2, 0x71, 0xb7, 0x99, 0xcb, 0x8b, 0xf6, 0xbb, 0x56, 0xb6, 0x5e,
0x77, 0xf5, 0xbf, 0x7c, 0xf6, 0x2b, 0x00, 0x00, 0xff, 0xff, 0xea, 0x68, 0x2a, 0x74, 0xfd, 0x03,
0x00, 0x00,
}
// Reference imports to suppress errors if they are not otherwise used.