[WIP] MVP of Kad inspection tools (#596)

* WIP starting to wire up the kademlia CLI tool

* WIP wiring up kad cli tools

* WIP starting to wire up the kademlia CLI tool

* WIP wiring up kad cli tools

* Got everything wired up

* WIP starting to wire up the kademlia CLI tool

* WIP wiring up kad cli tools

* merge in upstream

* WIP wiring up kad cli tools

* Got everything wired up

* WIP trying to get CLI to connect

* Inspector connects to overlay now

* Some refactoring

* Linter fixes

* Linter fixes

* Switch to pkg/process instead of using rootCmd.Execute
This commit is contained in:
Dylan Lott 2018-11-09 11:40:15 -07:00 committed by GitHub
parent 6d401a4351
commit c77ca2b161
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 396 additions and 90 deletions

92
cmd/kad/main.go Normal file
View File

@ -0,0 +1,92 @@
package main
import (
"context"
"fmt"
"github.com/spf13/cobra"
"storj.io/storj/pkg/node"
"storj.io/storj/pkg/overlay"
"storj.io/storj/pkg/process"
"storj.io/storj/pkg/provider"
)
var (
rootCmd = &cobra.Command{
Use: "inspector",
Short: "CLI for interacting with Storj Kademlia network",
}
getNodeCmd = &cobra.Command{
Use: "get",
Short: "get node with `id`",
RunE: GetNode,
}
listNodeCmd = &cobra.Command{
Use: "list-nodes",
Short: "get all nodes in cache",
RunE: ListNodes,
}
)
// Inspector gives access to kademlia and overlay cache
type Inspector struct {
overlay overlay.Client
identity *provider.FullIdentity
}
// NewInspector returns an Inspector client
func NewInspector(address string) (*Inspector, error) {
id, err := node.NewFullIdentity(context.Background(), 12, 4)
if err != nil {
return &Inspector{}, nil
}
overlay, err := overlay.NewOverlayClient(id, address)
if err != nil {
return &Inspector{}, nil
}
return &Inspector{
overlay: overlay,
identity: id,
}, nil
}
// GetNode returns a node with the requested ID or nothing at all
func GetNode(cmd *cobra.Command, args []string) (err error) {
i, err := NewInspector("127.0.0.1:7778")
if err != nil {
fmt.Printf("error dialing inspector: %+v\n", err)
return err
}
n := node.IDFromString("testnode")
found, err := i.overlay.Lookup(context.Background(), n)
if err != nil {
return err
}
fmt.Printf("### FOUND: %+v\n", found)
return nil
}
// ListNodes returns the nodes in the cache
func ListNodes(cmd *cobra.Command, args []string) (err error) {
i, err := NewInspector("127.0.0.1:7778")
if err != nil {
fmt.Printf("error dialing inspector: %+v\n", err)
return err
}
fmt.Printf("Inspector: %+v\n", i)
return nil
}
func init() {
rootCmd.AddCommand(getNodeCmd)
rootCmd.AddCommand(listNodeCmd)
}
func main() {
process.Exec(rootCmd)
}

View File

@ -5,9 +5,8 @@
package logging
import (
reflect "reflect"
gomock "github.com/golang/mock/gomock"
reflect "reflect"
)
// MockErrorLogger is a mock of ErrorLogger interface

View File

@ -8,3 +8,4 @@ package pb
//go:generate protoc --go_out=plugins=grpc:. pointerdb.proto
//go:generate protoc --go_out=plugins=grpc:. piecestore.proto
//go:generate protoc --go_out=plugins=grpc:. bandwidth.proto
//go:generate protoc --go_out=plugins=grpc:. kadcli.proto

195
pkg/pb/kadcli.pb.go Normal file
View File

@ -0,0 +1,195 @@
// Code generated by protoc-gen-go. DO NOT EDIT.
// source: kadcli.proto
package pb
import proto "github.com/golang/protobuf/proto"
import fmt "fmt"
import math "math"
import (
context "golang.org/x/net/context"
grpc "google.golang.org/grpc"
)
// Reference imports to suppress errors if they are not otherwise used.
var _ = proto.Marshal
var _ = fmt.Errorf
var _ = math.Inf
// This is a compile-time assertion to ensure that this generated file
// is compatible with the proto package it is being compiled against.
// A compilation error at this line likely means your copy of the
// proto package needs to be updated.
const _ = proto.ProtoPackageIsVersion2 // please upgrade the proto package
type CountNodesResponse struct {
Kademlia int64 `protobuf:"varint,1,opt,name=kademlia,proto3" json:"kademlia,omitempty"`
Overlay int64 `protobuf:"varint,2,opt,name=overlay,proto3" json:"overlay,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
}
func (m *CountNodesResponse) Reset() { *m = CountNodesResponse{} }
func (m *CountNodesResponse) String() string { return proto.CompactTextString(m) }
func (*CountNodesResponse) ProtoMessage() {}
func (*CountNodesResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_kadcli_876a2f6c9e943bb8, []int{0}
}
func (m *CountNodesResponse) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_CountNodesResponse.Unmarshal(m, b)
}
func (m *CountNodesResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
return xxx_messageInfo_CountNodesResponse.Marshal(b, m, deterministic)
}
func (dst *CountNodesResponse) XXX_Merge(src proto.Message) {
xxx_messageInfo_CountNodesResponse.Merge(dst, src)
}
func (m *CountNodesResponse) XXX_Size() int {
return xxx_messageInfo_CountNodesResponse.Size(m)
}
func (m *CountNodesResponse) XXX_DiscardUnknown() {
xxx_messageInfo_CountNodesResponse.DiscardUnknown(m)
}
var xxx_messageInfo_CountNodesResponse proto.InternalMessageInfo
func (m *CountNodesResponse) GetKademlia() int64 {
if m != nil {
return m.Kademlia
}
return 0
}
func (m *CountNodesResponse) GetOverlay() int64 {
if m != nil {
return m.Overlay
}
return 0
}
type CountNodesRequest struct {
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
}
func (m *CountNodesRequest) Reset() { *m = CountNodesRequest{} }
func (m *CountNodesRequest) String() string { return proto.CompactTextString(m) }
func (*CountNodesRequest) ProtoMessage() {}
func (*CountNodesRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_kadcli_876a2f6c9e943bb8, []int{1}
}
func (m *CountNodesRequest) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_CountNodesRequest.Unmarshal(m, b)
}
func (m *CountNodesRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
return xxx_messageInfo_CountNodesRequest.Marshal(b, m, deterministic)
}
func (dst *CountNodesRequest) XXX_Merge(src proto.Message) {
xxx_messageInfo_CountNodesRequest.Merge(dst, src)
}
func (m *CountNodesRequest) XXX_Size() int {
return xxx_messageInfo_CountNodesRequest.Size(m)
}
func (m *CountNodesRequest) XXX_DiscardUnknown() {
xxx_messageInfo_CountNodesRequest.DiscardUnknown(m)
}
var xxx_messageInfo_CountNodesRequest proto.InternalMessageInfo
func init() {
proto.RegisterType((*CountNodesResponse)(nil), "kadcli.CountNodesResponse")
proto.RegisterType((*CountNodesRequest)(nil), "kadcli.CountNodesRequest")
}
// Reference imports to suppress errors if they are not otherwise used.
var _ context.Context
var _ grpc.ClientConn
// This is a compile-time assertion to ensure that this generated file
// is compatible with the grpc package it is being compiled against.
const _ = grpc.SupportPackageIsVersion4
// KadCliClient is the client API for KadCli service.
//
// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream.
type KadCliClient interface {
// CountNodes returns the number of nodes in the cache and in the routing table
CountNodes(ctx context.Context, in *CountNodesRequest, opts ...grpc.CallOption) (*CountNodesResponse, error)
}
type kadCliClient struct {
cc *grpc.ClientConn
}
func NewKadCliClient(cc *grpc.ClientConn) KadCliClient {
return &kadCliClient{cc}
}
func (c *kadCliClient) CountNodes(ctx context.Context, in *CountNodesRequest, opts ...grpc.CallOption) (*CountNodesResponse, error) {
out := new(CountNodesResponse)
err := c.cc.Invoke(ctx, "/kadcli.KadCli/CountNodes", in, out, opts...)
if err != nil {
return nil, err
}
return out, nil
}
// KadCliServer is the server API for KadCli service.
type KadCliServer interface {
// CountNodes returns the number of nodes in the cache and in the routing table
CountNodes(context.Context, *CountNodesRequest) (*CountNodesResponse, error)
}
func RegisterKadCliServer(s *grpc.Server, srv KadCliServer) {
s.RegisterService(&_KadCli_serviceDesc, srv)
}
func _KadCli_CountNodes_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
in := new(CountNodesRequest)
if err := dec(in); err != nil {
return nil, err
}
if interceptor == nil {
return srv.(KadCliServer).CountNodes(ctx, in)
}
info := &grpc.UnaryServerInfo{
Server: srv,
FullMethod: "/kadcli.KadCli/CountNodes",
}
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
return srv.(KadCliServer).CountNodes(ctx, req.(*CountNodesRequest))
}
return interceptor(ctx, in, info, handler)
}
var _KadCli_serviceDesc = grpc.ServiceDesc{
ServiceName: "kadcli.KadCli",
HandlerType: (*KadCliServer)(nil),
Methods: []grpc.MethodDesc{
{
MethodName: "CountNodes",
Handler: _KadCli_CountNodes_Handler,
},
},
Streams: []grpc.StreamDesc{},
Metadata: "kadcli.proto",
}
func init() { proto.RegisterFile("kadcli.proto", fileDescriptor_kadcli_876a2f6c9e943bb8) }
var fileDescriptor_kadcli_876a2f6c9e943bb8 = []byte{
// 153 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0xe2, 0xc9, 0x4e, 0x4c, 0x49,
0xce, 0xc9, 0xd4, 0x2b, 0x28, 0xca, 0x2f, 0xc9, 0x17, 0x62, 0x83, 0xf0, 0x94, 0xbc, 0xb8, 0x84,
0x9c, 0xf3, 0x4b, 0xf3, 0x4a, 0xfc, 0xf2, 0x53, 0x52, 0x8b, 0x83, 0x52, 0x8b, 0x0b, 0xf2, 0xf3,
0x8a, 0x53, 0x85, 0xa4, 0xb8, 0x38, 0xb2, 0x13, 0x53, 0x52, 0x73, 0x73, 0x32, 0x13, 0x25, 0x18,
0x15, 0x18, 0x35, 0x98, 0x83, 0xe0, 0x7c, 0x21, 0x09, 0x2e, 0xf6, 0xfc, 0xb2, 0xd4, 0xa2, 0x9c,
0xc4, 0x4a, 0x09, 0x26, 0xb0, 0x14, 0x8c, 0xab, 0x24, 0xcc, 0x25, 0x88, 0x6c, 0x56, 0x61, 0x69,
0x6a, 0x71, 0x89, 0x91, 0x2f, 0x17, 0x9b, 0x77, 0x62, 0x8a, 0x73, 0x4e, 0xa6, 0x90, 0x33, 0x17,
0x17, 0x42, 0x5a, 0x48, 0x52, 0x0f, 0xea, 0x1e, 0x0c, 0x2d, 0x52, 0x52, 0xd8, 0xa4, 0x20, 0x2e,
0x73, 0x62, 0x89, 0x62, 0x2a, 0x48, 0x4a, 0x62, 0x03, 0x7b, 0xc2, 0x18, 0x10, 0x00, 0x00, 0xff,
0xff, 0x53, 0xe2, 0x81, 0xad, 0xd4, 0x00, 0x00, 0x00,
}

20
pkg/pb/kadcli.proto Normal file
View File

@ -0,0 +1,20 @@
// Copyright (C) 2018 Storj Labs, Inc.
// See LICENSE for copying information.
syntax = "proto3";
option go_package = "pb";
package kadcli;
service KadCli {
// CountNodes returns the number of nodes in the cache and in the routing table
rpc CountNodes(CountNodesRequest) returns (CountNodesResponse);
}
message CountNodesResponse {
int64 kademlia = 1;
int64 overlay = 2;
}
message CountNodesRequest {
}

View File

@ -1,5 +1,5 @@
// Code generated by protoc-gen-go. DO NOT EDIT.
// source: pkg/pb/overlay.proto
// source: overlay.proto
package pb
@ -42,7 +42,7 @@ func (x NodeTransport) String() string {
return proto.EnumName(NodeTransport_name, int32(x))
}
func (NodeTransport) EnumDescriptor() ([]byte, []int) {
return fileDescriptor_overlay_3299686c77e632f1, []int{0}
return fileDescriptor_overlay_b41771f04c080ed6, []int{0}
}
// NodeType is an enum of possible node types
@ -66,7 +66,7 @@ func (x NodeType) String() string {
return proto.EnumName(NodeType_name, int32(x))
}
func (NodeType) EnumDescriptor() ([]byte, []int) {
return fileDescriptor_overlay_3299686c77e632f1, []int{1}
return fileDescriptor_overlay_b41771f04c080ed6, []int{1}
}
type Restriction_Operator int32
@ -98,7 +98,7 @@ func (x Restriction_Operator) String() string {
return proto.EnumName(Restriction_Operator_name, int32(x))
}
func (Restriction_Operator) EnumDescriptor() ([]byte, []int) {
return fileDescriptor_overlay_3299686c77e632f1, []int{15, 0}
return fileDescriptor_overlay_b41771f04c080ed6, []int{15, 0}
}
type Restriction_Operand int32
@ -121,7 +121,7 @@ func (x Restriction_Operand) String() string {
return proto.EnumName(Restriction_Operand_name, int32(x))
}
func (Restriction_Operand) EnumDescriptor() ([]byte, []int) {
return fileDescriptor_overlay_3299686c77e632f1, []int{15, 1}
return fileDescriptor_overlay_b41771f04c080ed6, []int{15, 1}
}
// LookupRequest is is request message for the lookup rpc call
@ -136,7 +136,7 @@ func (m *LookupRequest) Reset() { *m = LookupRequest{} }
func (m *LookupRequest) String() string { return proto.CompactTextString(m) }
func (*LookupRequest) ProtoMessage() {}
func (*LookupRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_overlay_3299686c77e632f1, []int{0}
return fileDescriptor_overlay_b41771f04c080ed6, []int{0}
}
func (m *LookupRequest) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_LookupRequest.Unmarshal(m, b)
@ -175,7 +175,7 @@ func (m *LookupResponse) Reset() { *m = LookupResponse{} }
func (m *LookupResponse) String() string { return proto.CompactTextString(m) }
func (*LookupResponse) ProtoMessage() {}
func (*LookupResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_overlay_3299686c77e632f1, []int{1}
return fileDescriptor_overlay_b41771f04c080ed6, []int{1}
}
func (m *LookupResponse) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_LookupResponse.Unmarshal(m, b)
@ -214,7 +214,7 @@ func (m *LookupRequests) Reset() { *m = LookupRequests{} }
func (m *LookupRequests) String() string { return proto.CompactTextString(m) }
func (*LookupRequests) ProtoMessage() {}
func (*LookupRequests) Descriptor() ([]byte, []int) {
return fileDescriptor_overlay_3299686c77e632f1, []int{2}
return fileDescriptor_overlay_b41771f04c080ed6, []int{2}
}
func (m *LookupRequests) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_LookupRequests.Unmarshal(m, b)
@ -253,7 +253,7 @@ func (m *LookupResponses) Reset() { *m = LookupResponses{} }
func (m *LookupResponses) String() string { return proto.CompactTextString(m) }
func (*LookupResponses) ProtoMessage() {}
func (*LookupResponses) Descriptor() ([]byte, []int) {
return fileDescriptor_overlay_3299686c77e632f1, []int{3}
return fileDescriptor_overlay_b41771f04c080ed6, []int{3}
}
func (m *LookupResponses) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_LookupResponses.Unmarshal(m, b)
@ -292,7 +292,7 @@ func (m *FindStorageNodesResponse) Reset() { *m = FindStorageNodesRespon
func (m *FindStorageNodesResponse) String() string { return proto.CompactTextString(m) }
func (*FindStorageNodesResponse) ProtoMessage() {}
func (*FindStorageNodesResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_overlay_3299686c77e632f1, []int{4}
return fileDescriptor_overlay_b41771f04c080ed6, []int{4}
}
func (m *FindStorageNodesResponse) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_FindStorageNodesResponse.Unmarshal(m, b)
@ -335,7 +335,7 @@ func (m *FindStorageNodesRequest) Reset() { *m = FindStorageNodesRequest
func (m *FindStorageNodesRequest) String() string { return proto.CompactTextString(m) }
func (*FindStorageNodesRequest) ProtoMessage() {}
func (*FindStorageNodesRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_overlay_3299686c77e632f1, []int{5}
return fileDescriptor_overlay_b41771f04c080ed6, []int{5}
}
func (m *FindStorageNodesRequest) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_FindStorageNodesRequest.Unmarshal(m, b)
@ -403,7 +403,7 @@ func (m *NodeAddress) Reset() { *m = NodeAddress{} }
func (m *NodeAddress) String() string { return proto.CompactTextString(m) }
func (*NodeAddress) ProtoMessage() {}
func (*NodeAddress) Descriptor() ([]byte, []int) {
return fileDescriptor_overlay_3299686c77e632f1, []int{6}
return fileDescriptor_overlay_b41771f04c080ed6, []int{6}
}
func (m *NodeAddress) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_NodeAddress.Unmarshal(m, b)
@ -454,7 +454,7 @@ func (m *OverlayOptions) Reset() { *m = OverlayOptions{} }
func (m *OverlayOptions) String() string { return proto.CompactTextString(m) }
func (*OverlayOptions) ProtoMessage() {}
func (*OverlayOptions) Descriptor() ([]byte, []int) {
return fileDescriptor_overlay_3299686c77e632f1, []int{7}
return fileDescriptor_overlay_b41771f04c080ed6, []int{7}
}
func (m *OverlayOptions) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_OverlayOptions.Unmarshal(m, b)
@ -530,7 +530,7 @@ func (m *NodeRep) Reset() { *m = NodeRep{} }
func (m *NodeRep) String() string { return proto.CompactTextString(m) }
func (*NodeRep) ProtoMessage() {}
func (*NodeRep) Descriptor() ([]byte, []int) {
return fileDescriptor_overlay_3299686c77e632f1, []int{8}
return fileDescriptor_overlay_b41771f04c080ed6, []int{8}
}
func (m *NodeRep) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_NodeRep.Unmarshal(m, b)
@ -584,7 +584,7 @@ func (m *NodeRestrictions) Reset() { *m = NodeRestrictions{} }
func (m *NodeRestrictions) String() string { return proto.CompactTextString(m) }
func (*NodeRestrictions) ProtoMessage() {}
func (*NodeRestrictions) Descriptor() ([]byte, []int) {
return fileDescriptor_overlay_3299686c77e632f1, []int{9}
return fileDescriptor_overlay_b41771f04c080ed6, []int{9}
}
func (m *NodeRestrictions) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_NodeRestrictions.Unmarshal(m, b)
@ -633,7 +633,7 @@ func (m *Node) Reset() { *m = Node{} }
func (m *Node) String() string { return proto.CompactTextString(m) }
func (*Node) ProtoMessage() {}
func (*Node) Descriptor() ([]byte, []int) {
return fileDescriptor_overlay_3299686c77e632f1, []int{10}
return fileDescriptor_overlay_b41771f04c080ed6, []int{10}
}
func (m *Node) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_Node.Unmarshal(m, b)
@ -695,7 +695,7 @@ func (m *QueryRequest) Reset() { *m = QueryRequest{} }
func (m *QueryRequest) String() string { return proto.CompactTextString(m) }
func (*QueryRequest) ProtoMessage() {}
func (*QueryRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_overlay_3299686c77e632f1, []int{11}
return fileDescriptor_overlay_b41771f04c080ed6, []int{11}
}
func (m *QueryRequest) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_QueryRequest.Unmarshal(m, b)
@ -755,7 +755,7 @@ func (m *QueryResponse) Reset() { *m = QueryResponse{} }
func (m *QueryResponse) String() string { return proto.CompactTextString(m) }
func (*QueryResponse) ProtoMessage() {}
func (*QueryResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_overlay_3299686c77e632f1, []int{12}
return fileDescriptor_overlay_b41771f04c080ed6, []int{12}
}
func (m *QueryResponse) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_QueryResponse.Unmarshal(m, b)
@ -799,7 +799,7 @@ func (m *PingRequest) Reset() { *m = PingRequest{} }
func (m *PingRequest) String() string { return proto.CompactTextString(m) }
func (*PingRequest) ProtoMessage() {}
func (*PingRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_overlay_3299686c77e632f1, []int{13}
return fileDescriptor_overlay_b41771f04c080ed6, []int{13}
}
func (m *PingRequest) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_PingRequest.Unmarshal(m, b)
@ -829,7 +829,7 @@ func (m *PingResponse) Reset() { *m = PingResponse{} }
func (m *PingResponse) String() string { return proto.CompactTextString(m) }
func (*PingResponse) ProtoMessage() {}
func (*PingResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_overlay_3299686c77e632f1, []int{14}
return fileDescriptor_overlay_b41771f04c080ed6, []int{14}
}
func (m *PingResponse) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_PingResponse.Unmarshal(m, b)
@ -862,7 +862,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_overlay_3299686c77e632f1, []int{15}
return fileDescriptor_overlay_b41771f04c080ed6, []int{15}
}
func (m *Restriction) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_Restriction.Unmarshal(m, b)
@ -1067,7 +1067,7 @@ var _Overlay_serviceDesc = grpc.ServiceDesc{
},
},
Streams: []grpc.StreamDesc{},
Metadata: "pkg/pb/overlay.proto",
Metadata: "overlay.proto",
}
// NodesClient is the client API for Nodes service.
@ -1164,74 +1164,73 @@ var _Nodes_serviceDesc = grpc.ServiceDesc{
},
},
Streams: []grpc.StreamDesc{},
Metadata: "pkg/pb/overlay.proto",
Metadata: "overlay.proto",
}
func init() { proto.RegisterFile("pkg/pb/overlay.proto", fileDescriptor_overlay_3299686c77e632f1) }
func init() { proto.RegisterFile("overlay.proto", fileDescriptor_overlay_b41771f04c080ed6) }
var fileDescriptor_overlay_3299686c77e632f1 = []byte{
// 998 bytes of a gzipped FileDescriptorProto
var fileDescriptor_overlay_b41771f04c080ed6 = []byte{
// 991 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x94, 0x55, 0x6d, 0x6f, 0xe3, 0x44,
0x10, 0xae, 0x9d, 0xf7, 0x49, 0xe2, 0xf3, 0x8d, 0xee, 0xda, 0x10, 0x1d, 0xa7, 0xd6, 0x50, 0x11,
0x8a, 0x94, 0x4a, 0xe9, 0xa9, 0x52, 0x25, 0x50, 0x95, 0xbe, 0x50, 0x9d, 0x08, 0x6d, 0x6f, 0x13,
0x84, 0x84, 0x84, 0x2a, 0x27, 0xde, 0xcb, 0x99, 0x24, 0xb6, 0xb1, 0xd7, 0x77, 0x0d, 0x3f, 0x82,
0x7f, 0xc1, 0x37, 0xfe, 0x11, 0x12, 0xbf, 0x83, 0x8f, 0x68, 0x5f, 0xec, 0xc4, 0x6e, 0x73, 0x82,
0x4f, 0xde, 0x99, 0x79, 0x66, 0x3c, 0xf3, 0xcc, 0xec, 0x2c, 0x3c, 0x0b, 0x66, 0xd3, 0xc3, 0x60,
0x7c, 0xe8, 0xbf, 0xa7, 0xe1, 0xdc, 0x5e, 0x76, 0x83, 0xd0, 0x67, 0x3e, 0x56, 0x94, 0xd8, 0x7e,
0x39, 0xf5, 0xfd, 0xe9, 0x9c, 0x1e, 0x0a, 0xf5, 0x38, 0x7e, 0x7b, 0xe8, 0xc4, 0xa1, 0xcd, 0x5c,
0xdf, 0x93, 0x40, 0xeb, 0x0b, 0x68, 0x0e, 0x7c, 0x7f, 0x16, 0x07, 0x84, 0xfe, 0x1a, 0xd3, 0x88,
0xe1, 0x36, 0x94, 0x3d, 0xdf, 0xa1, 0xaf, 0x2f, 0x5a, 0xda, 0xae, 0xd6, 0xa9, 0x11, 0x25, 0x59,
0x47, 0x60, 0x24, 0xc0, 0x28, 0xf0, 0xbd, 0x88, 0xe2, 0x1e, 0x14, 0xb9, 0x4d, 0xe0, 0xea, 0xbd,
0x66, 0x37, 0xc9, 0xe0, 0xda, 0x77, 0x28, 0x11, 0x26, 0xeb, 0x7a, 0xe5, 0x24, 0xa2, 0x47, 0xf8,
0x35, 0x34, 0xe7, 0x42, 0x13, 0x4a, 0x4d, 0x4b, 0xdb, 0x2d, 0x74, 0xea, 0xbd, 0xed, 0xd4, 0x3b,
0x83, 0x27, 0x59, 0xb0, 0x45, 0xe0, 0x49, 0x36, 0x89, 0x08, 0x4f, 0xc1, 0x48, 0x30, 0x52, 0xa5,
0x22, 0xee, 0x3c, 0x88, 0x28, 0xcd, 0x24, 0x07, 0xb7, 0x4e, 0xa1, 0xf5, 0xad, 0xeb, 0x39, 0x43,
0xe6, 0x87, 0xf6, 0x94, 0xf2, 0xe4, 0xa3, 0xb4, 0xc4, 0xcf, 0xa0, 0xc4, 0xeb, 0x88, 0x54, 0xcc,
0x5c, 0x8d, 0xd2, 0x66, 0xfd, 0xa5, 0xc1, 0xce, 0xc3, 0x08, 0x92, 0xcd, 0x97, 0x00, 0xfe, 0xf8,
0x17, 0x3a, 0x61, 0x43, 0xf7, 0x37, 0xc9, 0x54, 0x81, 0xac, 0x69, 0xb0, 0x0f, 0xc6, 0xc4, 0xf7,
0x58, 0x68, 0x4f, 0xd8, 0x80, 0x7a, 0x53, 0xf6, 0xae, 0xa5, 0x0b, 0x36, 0x3f, 0xe9, 0xca, 0xbe,
0x75, 0x93, 0xbe, 0x75, 0x2f, 0x54, 0xdf, 0x48, 0xce, 0x01, 0xbf, 0x82, 0xa2, 0x1f, 0xb0, 0xa8,
0x55, 0x10, 0x8e, 0xab, 0xb2, 0x6f, 0xe4, 0xf7, 0x26, 0xe0, 0x5e, 0x11, 0x11, 0x20, 0x7c, 0x06,
0xa5, 0x88, 0xd9, 0x21, 0x6b, 0x15, 0x77, 0xb5, 0x4e, 0x83, 0x48, 0x01, 0xdb, 0x50, 0x5d, 0xd8,
0xf7, 0x22, 0xf1, 0x56, 0x49, 0xe4, 0x98, 0xca, 0xd6, 0xcf, 0x50, 0xe7, 0x87, 0xbe, 0xe3, 0x84,
0x34, 0x8a, 0xf0, 0x15, 0xd4, 0x58, 0x68, 0x7b, 0x51, 0xe0, 0x87, 0x4c, 0xd4, 0x63, 0xac, 0xf5,
0x8e, 0x03, 0x47, 0x89, 0x95, 0xac, 0x80, 0xd8, 0x82, 0x8a, 0x2d, 0x03, 0x88, 0xfa, 0x6a, 0x24,
0x11, 0xad, 0x3f, 0x74, 0x30, 0xb2, 0x99, 0xe2, 0x09, 0xc0, 0xc2, 0xbe, 0x1f, 0xd8, 0x8c, 0x7a,
0x93, 0xa5, 0x9a, 0xae, 0x8f, 0xf0, 0xb1, 0x06, 0xc6, 0x63, 0x68, 0x2e, 0x5c, 0x8f, 0xd0, 0x20,
0x66, 0xc2, 0xa8, 0xd8, 0x34, 0xb3, 0x7d, 0xa3, 0x01, 0xc9, 0xc2, 0xd0, 0x82, 0xc6, 0xc2, 0xf5,
0x86, 0x01, 0xa5, 0xce, 0x77, 0xe3, 0x40, 0x72, 0x59, 0x20, 0x19, 0x1d, 0xbf, 0x18, 0xf6, 0xc2,
0x8f, 0x3d, 0xc9, 0x5d, 0x81, 0x28, 0x09, 0xbf, 0x81, 0x46, 0x48, 0x23, 0x16, 0xba, 0x13, 0x91,
0xbe, 0x20, 0x90, 0x27, 0x9c, 0xfd, 0xe5, 0x0a, 0x40, 0x32, 0x70, 0xdc, 0x07, 0x83, 0xde, 0x4f,
0xe6, 0xb1, 0x43, 0x9d, 0x3b, 0x39, 0x6b, 0xe5, 0xdd, 0x42, 0xa7, 0x46, 0x9a, 0x89, 0x56, 0xb6,
0xe1, 0x03, 0x54, 0x54, 0xee, 0xf8, 0x02, 0x6a, 0x0b, 0xd7, 0xfb, 0x21, 0x60, 0xee, 0x42, 0x8e,
0x94, 0x4e, 0x56, 0x0a, 0xec, 0xc0, 0x93, 0x85, 0xeb, 0xf5, 0x63, 0xc7, 0x65, 0xc3, 0x78, 0x32,
0x49, 0x28, 0xd7, 0x49, 0x5e, 0x8d, 0x9f, 0x0b, 0xb2, 0x84, 0xea, 0x5c, 0xd4, 0x25, 0xab, 0xce,
0x2a, 0xad, 0x11, 0x98, 0xf9, 0x0a, 0xb8, 0xe7, 0xdb, 0x90, 0xd2, 0x33, 0xdb, 0x73, 0x3e, 0xb8,
0x0e, 0x7b, 0xa7, 0x06, 0x3b, 0xab, 0xe4, 0x53, 0xc5, 0x15, 0x17, 0x6e, 0x34, 0x13, 0x29, 0x14,
0x48, 0x2a, 0x5b, 0x7f, 0x6a, 0x50, 0xe4, 0x61, 0xd1, 0x00, 0xdd, 0x75, 0xd4, 0xaa, 0xd1, 0x5d,
0x07, 0xbb, 0xd9, 0x49, 0xa9, 0xf7, 0x9e, 0x65, 0x88, 0x54, 0x63, 0x98, 0xce, 0x0f, 0xee, 0x43,
0x91, 0x2d, 0x03, 0x2a, 0x72, 0x37, 0x7a, 0x4f, 0xb3, 0xa3, 0xb8, 0x0c, 0x28, 0x11, 0xe6, 0x07,
0x4d, 0x2a, 0xfe, 0xaf, 0x26, 0x59, 0xbf, 0x6b, 0xd0, 0x78, 0x13, 0xd3, 0x70, 0x99, 0xdc, 0xeb,
0x7d, 0x28, 0x47, 0xd4, 0x73, 0x68, 0xf8, 0xf8, 0xf6, 0x53, 0x46, 0x0e, 0x63, 0x76, 0x38, 0xa5,
0x4c, 0x15, 0x93, 0x87, 0x49, 0x23, 0xbf, 0x95, 0x73, 0x77, 0xe1, 0x26, 0x1d, 0x90, 0x02, 0xe7,
0x2f, 0x70, 0xbd, 0xe9, 0xd8, 0x9e, 0xcc, 0x44, 0xbe, 0x55, 0x92, 0xca, 0x96, 0x0d, 0x4d, 0x95,
0x8f, 0xda, 0x54, 0xff, 0x31, 0xa1, 0x2f, 0xa1, 0x9a, 0xee, 0x49, 0xfd, 0xb1, 0x9d, 0x96, 0x9a,
0xad, 0x26, 0xd4, 0x6f, 0x5d, 0x6f, 0xaa, 0x2a, 0xb6, 0x0c, 0x68, 0x48, 0x51, 0x99, 0xff, 0xd1,
0xa0, 0xbe, 0xc6, 0x18, 0x9e, 0x40, 0xd5, 0x0f, 0x68, 0x68, 0x33, 0x3f, 0x54, 0x7b, 0xe1, 0xd3,
0x34, 0xf2, 0x1a, 0xae, 0x7b, 0xa3, 0x40, 0x24, 0x85, 0xe3, 0x31, 0x54, 0xc4, 0xd9, 0x73, 0x04,
0x4d, 0x46, 0xef, 0xc5, 0x66, 0x4f, 0xcf, 0x21, 0x09, 0x98, 0xd3, 0xf6, 0xde, 0x9e, 0xc7, 0x34,
0xa1, 0x4d, 0x08, 0xd6, 0x2b, 0xa8, 0x26, 0xff, 0xc0, 0x32, 0xe8, 0x83, 0x91, 0xb9, 0xc5, 0xbf,
0x97, 0x6f, 0x4c, 0x8d, 0x7f, 0xaf, 0x46, 0xa6, 0x8e, 0x15, 0x28, 0x0c, 0x46, 0x97, 0x66, 0x81,
0x1f, 0xae, 0x46, 0x97, 0x66, 0xd1, 0x3a, 0x80, 0x8a, 0x8a, 0x8f, 0x4f, 0x73, 0xd3, 0x6d, 0x6e,
0x61, 0x63, 0x35, 0xca, 0xa6, 0x76, 0xb0, 0x07, 0xcd, 0xcc, 0xa6, 0x43, 0x13, 0x1a, 0xa3, 0xf3,
0xdb, 0xbb, 0xd1, 0x60, 0x78, 0x77, 0x45, 0x6e, 0xcf, 0xcd, 0xad, 0x03, 0x0b, 0xaa, 0xc9, 0x04,
0x62, 0x0d, 0x4a, 0xfd, 0x8b, 0xef, 0x5f, 0x5f, 0x9b, 0x5b, 0x58, 0x87, 0xca, 0x70, 0x74, 0x43,
0xfa, 0x57, 0x97, 0xa6, 0xd6, 0xfb, 0x5b, 0x83, 0x8a, 0x5a, 0x7d, 0x78, 0x02, 0x65, 0xf9, 0x4c,
0xe1, 0x86, 0x97, 0xb0, 0xbd, 0xe9, 0x3d, 0xc3, 0x53, 0x80, 0xb3, 0x78, 0x3e, 0x53, 0xee, 0x3b,
0x8f, 0xbb, 0x47, 0xed, 0xd6, 0x06, 0xff, 0x08, 0x7f, 0x04, 0x33, 0xff, 0x7c, 0xe1, 0x6e, 0x8a,
0xde, 0xf0, 0xb2, 0xb5, 0xf7, 0x3e, 0x82, 0x90, 0x91, 0x7b, 0x0c, 0x4a, 0x32, 0xda, 0x31, 0x94,
0xc4, 0xb4, 0xe2, 0xf3, 0xd4, 0x69, 0xfd, 0x36, 0xb5, 0xb7, 0xf3, 0x6a, 0x55, 0xda, 0x11, 0x14,
0xf9, 0xcc, 0xe1, 0x6a, 0x07, 0xac, 0x4d, 0x64, 0xfb, 0x79, 0x4e, 0x2b, 0x9d, 0xce, 0x8a, 0x3f,
0xe9, 0xc1, 0x78, 0x5c, 0x16, 0x0f, 0xc5, 0xd1, 0xbf, 0x01, 0x00, 0x00, 0xff, 0xff, 0x62, 0xb0,
0x59, 0x85, 0x1f, 0x09, 0x00, 0x00,
0x10, 0xae, 0x9d, 0xf7, 0x49, 0xe2, 0xf3, 0x8d, 0xee, 0xda, 0x10, 0x1d, 0xa7, 0xd4, 0x50, 0x11,
0x8a, 0x94, 0x93, 0xd2, 0x53, 0xa5, 0x4a, 0xa0, 0x2a, 0x7d, 0xa1, 0x3a, 0x11, 0xda, 0xde, 0x26,
0x08, 0x09, 0x09, 0x55, 0x4e, 0xbc, 0x97, 0x33, 0x4d, 0x6c, 0x63, 0xaf, 0xef, 0x1a, 0x7e, 0x04,
0xff, 0x82, 0x6f, 0xfc, 0x23, 0x24, 0x7e, 0x07, 0x1f, 0xd1, 0xbe, 0xd8, 0x89, 0xdd, 0xa6, 0x82,
0x4f, 0xde, 0x99, 0x79, 0x66, 0x3c, 0xf3, 0xcc, 0xec, 0x2c, 0x34, 0xfd, 0x0f, 0x34, 0x9c, 0xdb,
0xcb, 0x5e, 0x10, 0xfa, 0xcc, 0xc7, 0x8a, 0x12, 0xdb, 0x2f, 0x67, 0xbe, 0x3f, 0x9b, 0xd3, 0x57,
0x42, 0x3d, 0x89, 0xdf, 0xbd, 0x72, 0xe2, 0xd0, 0x66, 0xae, 0xef, 0x49, 0xa0, 0xf5, 0x05, 0x34,
0x87, 0xbe, 0x7f, 0x1b, 0x07, 0x84, 0xfe, 0x1a, 0xd3, 0x88, 0xe1, 0x36, 0x94, 0x3d, 0xdf, 0xa1,
0x6f, 0xce, 0x5a, 0x5a, 0x47, 0xeb, 0xd6, 0x88, 0x92, 0xac, 0x03, 0x30, 0x12, 0x60, 0x14, 0xf8,
0x5e, 0x44, 0x71, 0x17, 0x8a, 0xdc, 0x26, 0x70, 0xf5, 0x7e, 0xb3, 0x97, 0x64, 0x70, 0xe9, 0x3b,
0x94, 0x08, 0x93, 0x75, 0xb9, 0x72, 0x12, 0xd1, 0x23, 0xfc, 0x1a, 0x9a, 0x73, 0xa1, 0x09, 0xa5,
0xa6, 0xa5, 0x75, 0x0a, 0xdd, 0x7a, 0x7f, 0x3b, 0xf5, 0xce, 0xe0, 0x49, 0x16, 0x6c, 0x11, 0x78,
0x92, 0x4d, 0x22, 0xc2, 0x63, 0x30, 0x12, 0x8c, 0x54, 0xa9, 0x88, 0x3b, 0xf7, 0x22, 0x4a, 0x33,
0xc9, 0xc1, 0xad, 0x63, 0x68, 0x7d, 0xeb, 0x7a, 0xce, 0x88, 0xf9, 0xa1, 0x3d, 0xa3, 0x3c, 0xf9,
0x28, 0x2d, 0xf1, 0x33, 0x28, 0xf1, 0x3a, 0x22, 0x15, 0x33, 0x57, 0xa3, 0xb4, 0x59, 0x7f, 0x69,
0xb0, 0x73, 0x3f, 0x82, 0x64, 0xf3, 0x25, 0x80, 0x3f, 0xf9, 0x85, 0x4e, 0xd9, 0xc8, 0xfd, 0x4d,
0x32, 0x55, 0x20, 0x6b, 0x1a, 0x1c, 0x80, 0x31, 0xf5, 0x3d, 0x16, 0xda, 0x53, 0x36, 0xa4, 0xde,
0x8c, 0xbd, 0x6f, 0xe9, 0x82, 0xcd, 0x4f, 0x7a, 0xb2, 0x6f, 0xbd, 0xa4, 0x6f, 0xbd, 0x33, 0xd5,
0x37, 0x92, 0x73, 0xc0, 0xaf, 0xa0, 0xe8, 0x07, 0x2c, 0x6a, 0x15, 0x84, 0xe3, 0xaa, 0xec, 0x2b,
0xf9, 0xbd, 0x0a, 0xb8, 0x57, 0x44, 0x04, 0x08, 0x9f, 0x41, 0x29, 0x62, 0x76, 0xc8, 0x5a, 0xc5,
0x8e, 0xd6, 0x6d, 0x10, 0x29, 0x60, 0x1b, 0xaa, 0x0b, 0xfb, 0x4e, 0x24, 0xde, 0x2a, 0x89, 0x1c,
0x53, 0xd9, 0xfa, 0x19, 0xea, 0xfc, 0x30, 0x70, 0x9c, 0x90, 0x46, 0x11, 0xbe, 0x86, 0x1a, 0x0b,
0x6d, 0x2f, 0x0a, 0xfc, 0x90, 0x89, 0x7a, 0x8c, 0xb5, 0xde, 0x71, 0xe0, 0x38, 0xb1, 0x92, 0x15,
0x10, 0x5b, 0x50, 0xb1, 0x65, 0x00, 0x51, 0x5f, 0x8d, 0x24, 0xa2, 0xf5, 0x87, 0x0e, 0x46, 0x36,
0x53, 0x3c, 0x02, 0x58, 0xd8, 0x77, 0x43, 0x9b, 0x51, 0x6f, 0xba, 0x54, 0xd3, 0xf5, 0x08, 0x1f,
0x6b, 0x60, 0x3c, 0x84, 0xe6, 0xc2, 0xf5, 0x08, 0x0d, 0x62, 0x26, 0x8c, 0x8a, 0x4d, 0x33, 0xdb,
0x37, 0x1a, 0x90, 0x2c, 0x0c, 0x2d, 0x68, 0x2c, 0x5c, 0x6f, 0x14, 0x50, 0xea, 0x7c, 0x37, 0x09,
0x24, 0x97, 0x05, 0x92, 0xd1, 0xf1, 0x8b, 0x61, 0x2f, 0xfc, 0xd8, 0x93, 0xdc, 0x15, 0x88, 0x92,
0xf0, 0x1b, 0x68, 0x84, 0x34, 0x62, 0xa1, 0x3b, 0x15, 0xe9, 0x0b, 0x02, 0x79, 0xc2, 0xd9, 0x5f,
0xae, 0x00, 0x24, 0x03, 0xc7, 0x3d, 0x30, 0xe8, 0xdd, 0x74, 0x1e, 0x3b, 0xd4, 0xb9, 0x91, 0xb3,
0x56, 0xee, 0x14, 0xba, 0x35, 0xd2, 0x4c, 0xb4, 0xb2, 0x0d, 0x1f, 0xa1, 0xa2, 0x72, 0xc7, 0x17,
0x50, 0x5b, 0xb8, 0xde, 0x0f, 0x01, 0x73, 0x17, 0x72, 0xa4, 0x74, 0xb2, 0x52, 0x60, 0x17, 0x9e,
0x2c, 0x5c, 0x6f, 0x10, 0x3b, 0x2e, 0x1b, 0xc5, 0xd3, 0x69, 0x42, 0xb9, 0x4e, 0xf2, 0x6a, 0xfc,
0x5c, 0x90, 0x25, 0x54, 0xa7, 0xa2, 0x2e, 0x59, 0x75, 0x56, 0x69, 0x8d, 0xc1, 0xcc, 0x57, 0xc0,
0x3d, 0xdf, 0x85, 0x94, 0x9e, 0xd8, 0x9e, 0xf3, 0xd1, 0x75, 0xd8, 0x7b, 0x35, 0xd8, 0x59, 0x25,
0x9f, 0x2a, 0xae, 0x38, 0x73, 0xa3, 0x5b, 0x91, 0x42, 0x81, 0xa4, 0xb2, 0xf5, 0xa7, 0x06, 0x45,
0x1e, 0x16, 0x0d, 0xd0, 0x5d, 0x47, 0xad, 0x1a, 0xdd, 0x75, 0xb0, 0x97, 0x9d, 0x94, 0x7a, 0xff,
0x59, 0x86, 0x48, 0x35, 0x86, 0xe9, 0xfc, 0xe0, 0x1e, 0x14, 0xd9, 0x32, 0xa0, 0x22, 0x77, 0xa3,
0xff, 0x34, 0x3b, 0x8a, 0xcb, 0x80, 0x12, 0x61, 0xbe, 0xd7, 0xa4, 0xe2, 0xff, 0x6a, 0x92, 0xf5,
0xbb, 0x06, 0x8d, 0xb7, 0x31, 0x0d, 0x97, 0xc9, 0xbd, 0xde, 0x83, 0x72, 0x44, 0x3d, 0x87, 0x86,
0x0f, 0x6f, 0x3f, 0x65, 0xe4, 0x30, 0x66, 0x87, 0x33, 0xca, 0x54, 0x31, 0x79, 0x98, 0x34, 0xf2,
0x5b, 0x39, 0x77, 0x17, 0x6e, 0xd2, 0x01, 0x29, 0x70, 0xfe, 0x02, 0xd7, 0x9b, 0x4d, 0xec, 0xe9,
0xad, 0xc8, 0xb7, 0x4a, 0x52, 0xd9, 0xb2, 0xa1, 0xa9, 0xf2, 0x51, 0x9b, 0xea, 0x3f, 0x26, 0xf4,
0x25, 0x54, 0xd3, 0x3d, 0xa9, 0x3f, 0xb4, 0xd3, 0x52, 0xb3, 0xd5, 0x84, 0xfa, 0xb5, 0xeb, 0xcd,
0x54, 0xc5, 0x96, 0x01, 0x0d, 0x29, 0x2a, 0xf3, 0x3f, 0x1a, 0xd4, 0xd7, 0x18, 0xc3, 0x23, 0xa8,
0xfa, 0x01, 0x0d, 0x6d, 0xe6, 0x87, 0x6a, 0x2f, 0x7c, 0x9a, 0x46, 0x5e, 0xc3, 0xf5, 0xae, 0x14,
0x88, 0xa4, 0x70, 0x3c, 0x84, 0x8a, 0x38, 0x7b, 0x8e, 0xa0, 0xc9, 0xe8, 0xbf, 0xd8, 0xec, 0xe9,
0x39, 0x24, 0x01, 0x73, 0xda, 0x3e, 0xd8, 0xf3, 0x98, 0x26, 0xb4, 0x09, 0xc1, 0x7a, 0x0d, 0xd5,
0xe4, 0x1f, 0x58, 0x06, 0x7d, 0x38, 0x36, 0xb7, 0xf8, 0xf7, 0xfc, 0xad, 0xa9, 0xf1, 0xef, 0xc5,
0xd8, 0xd4, 0xb1, 0x02, 0x85, 0xe1, 0xf8, 0xdc, 0x2c, 0xf0, 0xc3, 0xc5, 0xf8, 0xdc, 0x2c, 0x5a,
0xfb, 0x50, 0x51, 0xf1, 0xf1, 0x69, 0x6e, 0xba, 0xcd, 0x2d, 0x6c, 0xac, 0x46, 0xd9, 0xd4, 0xf6,
0x77, 0xa1, 0x99, 0xd9, 0x74, 0x68, 0x42, 0x63, 0x7c, 0x7a, 0x7d, 0x33, 0x1e, 0x8e, 0x6e, 0x2e,
0xc8, 0xf5, 0xa9, 0xb9, 0xb5, 0x6f, 0x41, 0x35, 0x99, 0x40, 0xac, 0x41, 0x69, 0x70, 0xf6, 0xfd,
0x9b, 0x4b, 0x73, 0x0b, 0xeb, 0x50, 0x19, 0x8d, 0xaf, 0xc8, 0xe0, 0xe2, 0xdc, 0xd4, 0xfa, 0x7f,
0x6b, 0x50, 0x51, 0xab, 0x0f, 0x8f, 0xa0, 0x2c, 0x9f, 0x29, 0xdc, 0xf0, 0x12, 0xb6, 0x37, 0xbd,
0x67, 0x78, 0x0c, 0x70, 0x12, 0xcf, 0x6f, 0x95, 0xfb, 0xce, 0xc3, 0xee, 0x51, 0xbb, 0xb5, 0xc1,
0x3f, 0xc2, 0x1f, 0xc1, 0xcc, 0x3f, 0x5f, 0xd8, 0x49, 0xd1, 0x1b, 0x5e, 0xb6, 0xf6, 0xee, 0x23,
0x08, 0x19, 0xb9, 0xcf, 0xa0, 0x24, 0xa3, 0x1d, 0x42, 0x49, 0x4c, 0x2b, 0x3e, 0x4f, 0x9d, 0xd6,
0x6f, 0x53, 0x7b, 0x3b, 0xaf, 0x56, 0xa5, 0x1d, 0x40, 0x91, 0xcf, 0x1c, 0xae, 0x76, 0xc0, 0xda,
0x44, 0xb6, 0x9f, 0xe7, 0xb4, 0xd2, 0xe9, 0xa4, 0xf8, 0x93, 0x1e, 0x4c, 0x26, 0x65, 0xf1, 0x50,
0x1c, 0xfc, 0x1b, 0x00, 0x00, 0xff, 0xff, 0x9f, 0x40, 0x48, 0x85, 0x18, 0x09, 0x00, 0x00,
}