rpki: delete roa validation stream API

better to be implemented outside GoBGP.

Signed-off-by: FUJITA Tomonori <[email protected]>
This commit is contained in:
FUJITA Tomonori
2016-04-21 13:29:59 +09:00
parent 7e1b186819
commit 35efcd570d
7 changed files with 296 additions and 675 deletions
+278 -437
View File
@@ -61,7 +61,6 @@ It has these top-level messages:
RPKIState
RPKI
ROA
ROAResult
Vrf
Global
*/
@@ -378,64 +377,6 @@ func (ModBmpArguments_MonitoringPolicy) EnumDescriptor() ([]byte, []int) {
return fileDescriptor0, []int{8, 0}
}
type ROAResult_ValidationReason int32
const (
ROAResult_UPDATE ROAResult_ValidationReason = 0
ROAResult_WITHDRAW ROAResult_ValidationReason = 1
ROAResult_PEER_DOWN ROAResult_ValidationReason = 2
ROAResult_REVALIDATE ROAResult_ValidationReason = 3
)
var ROAResult_ValidationReason_name = map[int32]string{
0: "UPDATE",
1: "WITHDRAW",
2: "PEER_DOWN",
3: "REVALIDATE",
}
var ROAResult_ValidationReason_value = map[string]int32{
"UPDATE": 0,
"WITHDRAW": 1,
"PEER_DOWN": 2,
"REVALIDATE": 3,
}
func (x ROAResult_ValidationReason) String() string {
return proto.EnumName(ROAResult_ValidationReason_name, int32(x))
}
func (ROAResult_ValidationReason) EnumDescriptor() ([]byte, []int) {
return fileDescriptor0, []int{52, 0}
}
type ROAResult_ValidationResult int32
const (
ROAResult_NONE ROAResult_ValidationResult = 0
ROAResult_NOT_FOUND ROAResult_ValidationResult = 1
ROAResult_VALID ROAResult_ValidationResult = 2
ROAResult_INVALID ROAResult_ValidationResult = 3
)
var ROAResult_ValidationResult_name = map[int32]string{
0: "NONE",
1: "NOT_FOUND",
2: "VALID",
3: "INVALID",
}
var ROAResult_ValidationResult_value = map[string]int32{
"NONE": 0,
"NOT_FOUND": 1,
"VALID": 2,
"INVALID": 3,
}
func (x ROAResult_ValidationResult) String() string {
return proto.EnumName(ROAResult_ValidationResult_name, int32(x))
}
func (ROAResult_ValidationResult) EnumDescriptor() ([]byte, []int) {
return fileDescriptor0, []int{52, 1}
}
type Error struct {
Code Error_ErrorCode `protobuf:"varint,1,opt,name=code,enum=gobgpapi.Error_ErrorCode" json:"code,omitempty"`
Msg string `protobuf:"bytes,2,opt,name=msg" json:"msg,omitempty"`
@@ -1422,30 +1363,6 @@ func (m *ROA) GetConf() *RPKIConf {
return nil
}
type ROAResult struct {
Reason ROAResult_ValidationReason `protobuf:"varint,1,opt,name=reason,enum=gobgpapi.ROAResult_ValidationReason" json:"reason,omitempty"`
Address string `protobuf:"bytes,2,opt,name=address" json:"address,omitempty"`
Timestamp int64 `protobuf:"varint,3,opt,name=timestamp" json:"timestamp,omitempty"`
AspathAttr []byte `protobuf:"bytes,4,opt,name=aspath_attr,json=aspathAttr,proto3" json:"aspath_attr,omitempty"`
OriginAs uint32 `protobuf:"varint,5,opt,name=origin_as,json=originAs" json:"origin_as,omitempty"`
Prefix string `protobuf:"bytes,6,opt,name=prefix" json:"prefix,omitempty"`
OldResult ROAResult_ValidationResult `protobuf:"varint,7,opt,name=old_result,json=oldResult,enum=gobgpapi.ROAResult_ValidationResult" json:"old_result,omitempty"`
NewResult ROAResult_ValidationResult `protobuf:"varint,8,opt,name=new_result,json=newResult,enum=gobgpapi.ROAResult_ValidationResult" json:"new_result,omitempty"`
Roas []*ROA `protobuf:"bytes,9,rep,name=roas" json:"roas,omitempty"`
}
func (m *ROAResult) Reset() { *m = ROAResult{} }
func (m *ROAResult) String() string { return proto.CompactTextString(m) }
func (*ROAResult) ProtoMessage() {}
func (*ROAResult) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{52} }
func (m *ROAResult) GetRoas() []*ROA {
if m != nil {
return m.Roas
}
return nil
}
type Vrf struct {
Name string `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"`
Rd []byte `protobuf:"bytes,2,opt,name=rd,proto3" json:"rd,omitempty"`
@@ -1456,7 +1373,7 @@ type Vrf struct {
func (m *Vrf) Reset() { *m = Vrf{} }
func (m *Vrf) String() string { return proto.CompactTextString(m) }
func (*Vrf) ProtoMessage() {}
func (*Vrf) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{53} }
func (*Vrf) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{52} }
type Global struct {
As uint32 `protobuf:"varint,1,opt,name=as" json:"as,omitempty"`
@@ -1472,7 +1389,7 @@ type Global struct {
func (m *Global) Reset() { *m = Global{} }
func (m *Global) String() string { return proto.CompactTextString(m) }
func (*Global) ProtoMessage() {}
func (*Global) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{54} }
func (*Global) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{53} }
func init() {
proto.RegisterType((*Error)(nil), "gobgpapi.Error")
@@ -1527,7 +1444,6 @@ func init() {
proto.RegisterType((*RPKIState)(nil), "gobgpapi.RPKIState")
proto.RegisterType((*RPKI)(nil), "gobgpapi.RPKI")
proto.RegisterType((*ROA)(nil), "gobgpapi.ROA")
proto.RegisterType((*ROAResult)(nil), "gobgpapi.ROAResult")
proto.RegisterType((*Vrf)(nil), "gobgpapi.Vrf")
proto.RegisterType((*Global)(nil), "gobgpapi.Global")
proto.RegisterEnum("gobgpapi.Resource", Resource_name, Resource_value)
@@ -1541,8 +1457,6 @@ func init() {
proto.RegisterEnum("gobgpapi.PolicyType", PolicyType_name, PolicyType_value)
proto.RegisterEnum("gobgpapi.Error_ErrorCode", Error_ErrorCode_name, Error_ErrorCode_value)
proto.RegisterEnum("gobgpapi.ModBmpArguments_MonitoringPolicy", ModBmpArguments_MonitoringPolicy_name, ModBmpArguments_MonitoringPolicy_value)
proto.RegisterEnum("gobgpapi.ROAResult_ValidationReason", ROAResult_ValidationReason_name, ROAResult_ValidationReason_value)
proto.RegisterEnum("gobgpapi.ROAResult_ValidationResult", ROAResult_ValidationResult_name, ROAResult_ValidationResult_value)
}
// Reference imports to suppress errors if they are not otherwise used.
@@ -1574,7 +1488,6 @@ type GobgpApiClient interface {
MonitorRib(ctx context.Context, in *Table, opts ...grpc.CallOption) (GobgpApi_MonitorRibClient, error)
MonitorBestChanged(ctx context.Context, in *Arguments, opts ...grpc.CallOption) (GobgpApi_MonitorBestChangedClient, error)
MonitorPeerState(ctx context.Context, in *Arguments, opts ...grpc.CallOption) (GobgpApi_MonitorPeerStateClient, error)
MonitorROAValidation(ctx context.Context, in *Arguments, opts ...grpc.CallOption) (GobgpApi_MonitorROAValidationClient, error)
GetMrt(ctx context.Context, in *MrtArguments, opts ...grpc.CallOption) (GobgpApi_GetMrtClient, error)
ModMrt(ctx context.Context, in *ModMrtArguments, opts ...grpc.CallOption) (*Error, error)
ModBmp(ctx context.Context, in *ModBmpArguments, opts ...grpc.CallOption) (*Error, error)
@@ -1883,40 +1796,8 @@ func (x *gobgpApiMonitorPeerStateClient) Recv() (*Peer, error) {
return m, nil
}
func (c *gobgpApiClient) MonitorROAValidation(ctx context.Context, in *Arguments, opts ...grpc.CallOption) (GobgpApi_MonitorROAValidationClient, error) {
stream, err := grpc.NewClientStream(ctx, &_GobgpApi_serviceDesc.Streams[5], c.cc, "/gobgpapi.GobgpApi/MonitorROAValidation", opts...)
if err != nil {
return nil, err
}
x := &gobgpApiMonitorROAValidationClient{stream}
if err := x.ClientStream.SendMsg(in); err != nil {
return nil, err
}
if err := x.ClientStream.CloseSend(); err != nil {
return nil, err
}
return x, nil
}
type GobgpApi_MonitorROAValidationClient interface {
Recv() (*ROAResult, error)
grpc.ClientStream
}
type gobgpApiMonitorROAValidationClient struct {
grpc.ClientStream
}
func (x *gobgpApiMonitorROAValidationClient) Recv() (*ROAResult, error) {
m := new(ROAResult)
if err := x.ClientStream.RecvMsg(m); err != nil {
return nil, err
}
return m, nil
}
func (c *gobgpApiClient) GetMrt(ctx context.Context, in *MrtArguments, opts ...grpc.CallOption) (GobgpApi_GetMrtClient, error) {
stream, err := grpc.NewClientStream(ctx, &_GobgpApi_serviceDesc.Streams[6], c.cc, "/gobgpapi.GobgpApi/GetMrt", opts...)
stream, err := grpc.NewClientStream(ctx, &_GobgpApi_serviceDesc.Streams[5], c.cc, "/gobgpapi.GobgpApi/GetMrt", opts...)
if err != nil {
return nil, err
}
@@ -1966,7 +1847,7 @@ func (c *gobgpApiClient) ModBmp(ctx context.Context, in *ModBmpArguments, opts .
}
func (c *gobgpApiClient) GetRPKI(ctx context.Context, in *Arguments, opts ...grpc.CallOption) (GobgpApi_GetRPKIClient, error) {
stream, err := grpc.NewClientStream(ctx, &_GobgpApi_serviceDesc.Streams[7], c.cc, "/gobgpapi.GobgpApi/GetRPKI", opts...)
stream, err := grpc.NewClientStream(ctx, &_GobgpApi_serviceDesc.Streams[6], c.cc, "/gobgpapi.GobgpApi/GetRPKI", opts...)
if err != nil {
return nil, err
}
@@ -2007,7 +1888,7 @@ func (c *gobgpApiClient) ModRPKI(ctx context.Context, in *ModRpkiArguments, opts
}
func (c *gobgpApiClient) GetROA(ctx context.Context, in *Arguments, opts ...grpc.CallOption) (GobgpApi_GetROAClient, error) {
stream, err := grpc.NewClientStream(ctx, &_GobgpApi_serviceDesc.Streams[8], c.cc, "/gobgpapi.GobgpApi/GetROA", opts...)
stream, err := grpc.NewClientStream(ctx, &_GobgpApi_serviceDesc.Streams[7], c.cc, "/gobgpapi.GobgpApi/GetROA", opts...)
if err != nil {
return nil, err
}
@@ -2039,7 +1920,7 @@ func (x *gobgpApiGetROAClient) Recv() (*ROA, error) {
}
func (c *gobgpApiClient) GetVrfs(ctx context.Context, in *Arguments, opts ...grpc.CallOption) (GobgpApi_GetVrfsClient, error) {
stream, err := grpc.NewClientStream(ctx, &_GobgpApi_serviceDesc.Streams[9], c.cc, "/gobgpapi.GobgpApi/GetVrfs", opts...)
stream, err := grpc.NewClientStream(ctx, &_GobgpApi_serviceDesc.Streams[8], c.cc, "/gobgpapi.GobgpApi/GetVrfs", opts...)
if err != nil {
return nil, err
}
@@ -2089,7 +1970,7 @@ func (c *gobgpApiClient) GetDefinedSet(ctx context.Context, in *DefinedSet, opts
}
func (c *gobgpApiClient) GetDefinedSets(ctx context.Context, in *DefinedSet, opts ...grpc.CallOption) (GobgpApi_GetDefinedSetsClient, error) {
stream, err := grpc.NewClientStream(ctx, &_GobgpApi_serviceDesc.Streams[10], c.cc, "/gobgpapi.GobgpApi/GetDefinedSets", opts...)
stream, err := grpc.NewClientStream(ctx, &_GobgpApi_serviceDesc.Streams[9], c.cc, "/gobgpapi.GobgpApi/GetDefinedSets", opts...)
if err != nil {
return nil, err
}
@@ -2139,7 +2020,7 @@ func (c *gobgpApiClient) GetStatement(ctx context.Context, in *Statement, opts .
}
func (c *gobgpApiClient) GetStatements(ctx context.Context, in *Statement, opts ...grpc.CallOption) (GobgpApi_GetStatementsClient, error) {
stream, err := grpc.NewClientStream(ctx, &_GobgpApi_serviceDesc.Streams[11], c.cc, "/gobgpapi.GobgpApi/GetStatements", opts...)
stream, err := grpc.NewClientStream(ctx, &_GobgpApi_serviceDesc.Streams[10], c.cc, "/gobgpapi.GobgpApi/GetStatements", opts...)
if err != nil {
return nil, err
}
@@ -2189,7 +2070,7 @@ func (c *gobgpApiClient) GetPolicy(ctx context.Context, in *Policy, opts ...grpc
}
func (c *gobgpApiClient) GetPolicies(ctx context.Context, in *Policy, opts ...grpc.CallOption) (GobgpApi_GetPoliciesClient, error) {
stream, err := grpc.NewClientStream(ctx, &_GobgpApi_serviceDesc.Streams[12], c.cc, "/gobgpapi.GobgpApi/GetPolicies", opts...)
stream, err := grpc.NewClientStream(ctx, &_GobgpApi_serviceDesc.Streams[11], c.cc, "/gobgpapi.GobgpApi/GetPolicies", opts...)
if err != nil {
return nil, err
}
@@ -2268,7 +2149,6 @@ type GobgpApiServer interface {
MonitorRib(*Table, GobgpApi_MonitorRibServer) error
MonitorBestChanged(*Arguments, GobgpApi_MonitorBestChangedServer) error
MonitorPeerState(*Arguments, GobgpApi_MonitorPeerStateServer) error
MonitorROAValidation(*Arguments, GobgpApi_MonitorROAValidationServer) error
GetMrt(*MrtArguments, GobgpApi_GetMrtServer) error
ModMrt(context.Context, *ModMrtArguments) (*Error, error)
ModBmp(context.Context, *ModBmpArguments) (*Error, error)
@@ -2638,27 +2518,6 @@ func (x *gobgpApiMonitorPeerStateServer) Send(m *Peer) error {
return x.ServerStream.SendMsg(m)
}
func _GobgpApi_MonitorROAValidation_Handler(srv interface{}, stream grpc.ServerStream) error {
m := new(Arguments)
if err := stream.RecvMsg(m); err != nil {
return err
}
return srv.(GobgpApiServer).MonitorROAValidation(m, &gobgpApiMonitorROAValidationServer{stream})
}
type GobgpApi_MonitorROAValidationServer interface {
Send(*ROAResult) error
grpc.ServerStream
}
type gobgpApiMonitorROAValidationServer struct {
grpc.ServerStream
}
func (x *gobgpApiMonitorROAValidationServer) Send(m *ROAResult) error {
return x.ServerStream.SendMsg(m)
}
func _GobgpApi_GetMrt_Handler(srv interface{}, stream grpc.ServerStream) error {
m := new(MrtArguments)
if err := stream.RecvMsg(m); err != nil {
@@ -3153,11 +3012,6 @@ var _GobgpApi_serviceDesc = grpc.ServiceDesc{
Handler: _GobgpApi_MonitorPeerState_Handler,
ServerStreams: true,
},
{
StreamName: "MonitorROAValidation",
Handler: _GobgpApi_MonitorROAValidation_Handler,
ServerStreams: true,
},
{
StreamName: "GetMrt",
Handler: _GobgpApi_GetMrt_Handler,
@@ -3197,286 +3051,273 @@ var _GobgpApi_serviceDesc = grpc.ServiceDesc{
}
var fileDescriptor0 = []byte{
// 4496 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 0x02, 0xff, 0xd4, 0x3b, 0x4d, 0x73, 0x1b, 0x47,
0x76, 0x06, 0x01, 0x92, 0xc0, 0x03, 0x40, 0x82, 0x43, 0x4a, 0xa6, 0xb8, 0x5e, 0xaf, 0x77, 0x62,
0x7b, 0x6d, 0xae, 0x2d, 0xd9, 0xb2, 0x2d, 0x6f, 0xb4, 0xde, 0x4d, 0x20, 0x60, 0x24, 0x61, 0x4d,
0x12, 0x50, 0x13, 0x92, 0xed, 0x5c, 0x26, 0x23, 0x60, 0x40, 0x4e, 0x09, 0xc0, 0x8c, 0x67, 0x06,
0xfa, 0x48, 0x55, 0x72, 0xd8, 0x1c, 0x72, 0x48, 0xe5, 0x9a, 0xaa, 0x54, 0x6d, 0xfe, 0x40, 0xfe,
0x40, 0x2a, 0xf7, 0xa4, 0x2a, 0xc7, 0x5c, 0x73, 0x49, 0x0e, 0xa9, 0x5c, 0x72, 0x4f, 0x55, 0x8e,
0x79, 0xef, 0x75, 0xcf, 0x4c, 0x0f, 0x38, 0xa2, 0xa8, 0xe5, 0x56, 0xaa, 0x72, 0x21, 0xa6, 0xdf,
0x57, 0xbf, 0xee, 0x7e, 0x5f, 0xfd, 0x41, 0xa8, 0x9f, 0xf8, 0x8f, 0x4f, 0x82, 0xeb, 0x41, 0xe8,
0xc7, 0xbe, 0x51, 0xe5, 0x86, 0x13, 0x78, 0xe6, 0x14, 0x56, 0xad, 0x30, 0xf4, 0x43, 0xe3, 0x63,
0xa8, 0x8c, 0xfc, 0xb1, 0xbb, 0x5b, 0x7a, 0xa7, 0xf4, 0xc1, 0xc6, 0xcd, 0x6b, 0xd7, 0x13, 0x8a,
0xeb, 0x8c, 0x96, 0x7f, 0x3b, 0x48, 0x20, 0x98, 0xcc, 0x68, 0x41, 0x79, 0x16, 0x9d, 0xec, 0xae,
0x20, 0x75, 0x4d, 0xd0, 0xa7, 0x69, 0x42, 0x2d, 0x25, 0x32, 0xea, 0xb0, 0x7e, 0xfc, 0xb0, 0xd3,
0xb1, 0x8e, 0x8f, 0x5b, 0x6f, 0x18, 0x55, 0xa8, 0xdc, 0x6d, 0xf7, 0x0e, 0x5a, 0x25, 0xf3, 0x04,
0x6a, 0xed, 0xf0, 0x64, 0x31, 0x73, 0xe7, 0x71, 0x64, 0x5c, 0x87, 0x6a, 0xe8, 0x46, 0xfe, 0x22,
0x1c, 0x25, 0xbd, 0x1a, 0x59, 0xaf, 0x42, 0x61, 0x44, 0x4a, 0x63, 0x5c, 0x85, 0xb5, 0x89, 0x33,
0xf3, 0xa6, 0x2f, 0xb8, 0xd7, 0xa6, 0x50, 0x2d, 0xc3, 0x80, 0xca, 0xdc, 0x99, 0xb9, 0xbb, 0x65,
0xd6, 0x85, 0xbf, 0xcd, 0x7f, 0x2d, 0x41, 0xeb, 0xd0, 0x1f, 0x0f, 0x9c, 0xf8, 0x34, 0xeb, 0xf0,
0x53, 0xa8, 0xf9, 0x81, 0x1b, 0x3a, 0xb1, 0xe7, 0xcf, 0x55, 0x8f, 0xdb, 0x59, 0x8f, 0xfd, 0x04,
0x25, 0x32, 0xaa, 0x9c, 0x8e, 0x2b, 0x17, 0xd0, 0xb1, 0x40, 0x17, 0xc3, 0x84, 0x4a, 0x80, 0x7a,
0xec, 0x56, 0x10, 0x56, 0xbf, 0xb9, 0x91, 0xf1, 0x93, 0x76, 0x82, 0x71, 0xc4, 0xb7, 0x58, 0x78,
0xe3, 0xdd, 0x55, 0xa4, 0x69, 0x08, 0xfe, 0xd6, 0xc6, 0xbb, 0xa6, 0x8f, 0xd7, 0x7c, 0x0f, 0x36,
0xd5, 0xd0, 0x50, 0x81, 0xc0, 0x9f, 0x47, 0x6e, 0xca, 0x5e, 0xca, 0xd8, 0xcd, 0x3f, 0x85, 0x2d,
0x45, 0x16, 0xfd, 0xf6, 0x73, 0x9e, 0x8c, 0x67, 0x45, 0x1b, 0xcf, 0xbb, 0xb0, 0x4a, 0x3a, 0x47,
0x38, 0xc8, 0x72, 0xc1, 0x80, 0x24, 0xd2, 0x9c, 0xc1, 0x0e, 0x76, 0x7f, 0xe4, 0x7a, 0x27, 0xa7,
0x8f, 0xfd, 0xf0, 0x52, 0x8b, 0x40, 0x13, 0xe8, 0xba, 0x21, 0x2b, 0x91, 0xef, 0x0f, 0xa1, 0x82,
0x71, 0xe6, 0xdf, 0x96, 0xa0, 0x71, 0x18, 0xc6, 0xbf, 0x7b, 0xeb, 0xda, 0x83, 0xaa, 0x37, 0x8f,
0xdd, 0xf0, 0xa9, 0x33, 0xe5, 0x55, 0xad, 0x88, 0xb4, 0x6d, 0x7c, 0x08, 0xad, 0xb9, 0x1a, 0xa0,
0xed, 0x8c, 0xc7, 0x28, 0x2b, 0xe2, 0x55, 0xae, 0x89, 0xcd, 0x04, 0xde, 0x96, 0x60, 0xf3, 0x6f,
0x4a, 0xbc, 0x6a, 0x39, 0x15, 0x7f, 0x8b, 0xa9, 0xf8, 0x01, 0xd4, 0xc6, 0x8b, 0x59, 0x60, 0xc7,
0x2f, 0x02, 0xb9, 0x28, 0xab, 0xa2, 0x4a, 0x80, 0x21, 0xb6, 0x49, 0xd5, 0x89, 0x37, 0x75, 0x35,
0x03, 0x4c, 0xdb, 0xb9, 0x61, 0x54, 0xf2, 0xc3, 0x30, 0xff, 0x43, 0xea, 0x76, 0x67, 0x16, 0x5c,
0x4a, 0xb7, 0x5d, 0x58, 0x4f, 0x26, 0x41, 0x9a, 0x4b, 0xd2, 0x24, 0x2b, 0x0a, 0xfc, 0x30, 0x66,
0xa5, 0x9a, 0x82, 0xbf, 0x8d, 0x5f, 0x42, 0x85, 0x07, 0x51, 0x61, 0xd9, 0xfb, 0x99, 0xec, 0x25,
0x4d, 0xb0, 0x3d, 0xf7, 0x62, 0x3f, 0xf4, 0xe6, 0x27, 0x03, 0x7f, 0xea, 0x8d, 0x5e, 0x08, 0xe6,
0x33, 0x6f, 0x90, 0x83, 0xe7, 0x31, 0xc6, 0x3a, 0x94, 0x07, 0xc2, 0x92, 0x11, 0x67, 0xd0, 0x3f,
0x1e, 0xb6, 0x4a, 0xf4, 0x75, 0xa7, 0x3f, 0xbc, 0xdf, 0x5a, 0x31, 0xff, 0x41, 0x86, 0x04, 0x11,
0x3c, 0xf1, 0x2e, 0x35, 0x4c, 0x8c, 0x7c, 0x4e, 0x34, 0x57, 0x56, 0x42, 0x9f, 0xfa, 0xc0, 0xcb,
0xc5, 0x03, 0xaf, 0x68, 0x03, 0xc7, 0x95, 0x98, 0x7a, 0x13, 0x37, 0xf6, 0x70, 0x95, 0xc8, 0xdd,
0xcb, 0x22, 0x6d, 0x93, 0x11, 0x06, 0xa1, 0x3b, 0xf1, 0x9e, 0xb3, 0xcb, 0xd7, 0x84, 0x6a, 0x99,
0x2e, 0x2f, 0xd0, 0xa3, 0x70, 0x72, 0x29, 0xcd, 0x7f, 0x04, 0xe5, 0xa7, 0xe1, 0x44, 0xb9, 0x51,
0x33, 0x23, 0x46, 0xb9, 0x82, 0x30, 0x66, 0x04, 0x57, 0xb1, 0x9b, 0x2e, 0x76, 0x39, 0x77, 0xc7,
0xc7, 0xee, 0xe5, 0x4c, 0xf5, 0x7d, 0x28, 0x47, 0x6e, 0xac, 0x7a, 0xdb, 0xc9, 0x88, 0x33, 0xf1,
0x82, 0x08, 0x30, 0x4e, 0x5d, 0xc1, 0x4e, 0x8f, 0x63, 0x27, 0x76, 0xa9, 0xaf, 0x4b, 0xf5, 0x89,
0x2c, 0x51, 0x22, 0x48, 0xf5, 0xac, 0xb1, 0xa4, 0x7d, 0x88, 0x8c, 0xca, 0xfc, 0xb7, 0x12, 0x18,
0x14, 0x27, 0xd9, 0x82, 0x2e, 0xd5, 0xf9, 0x07, 0xb8, 0x78, 0x2c, 0x45, 0xf5, 0xdc, 0xd2, 0x02,
0x95, 0xb4, 0x5c, 0x85, 0x37, 0x6e, 0xc3, 0x35, 0x5c, 0x57, 0x37, 0xb4, 0xdd, 0xe7, 0x5e, 0x14,
0xa3, 0xfd, 0xda, 0xa9, 0x3e, 0xd2, 0x84, 0xaa, 0xe2, 0x4d, 0x26, 0xb0, 0x14, 0x3e, 0xd5, 0x3c,
0x32, 0x6e, 0xc0, 0x36, 0x1a, 0x45, 0x84, 0x9e, 0xeb, 0xea, 0x5c, 0x15, 0xe6, 0x32, 0x12, 0x54,
0xc6, 0x60, 0xfe, 0x55, 0x09, 0xde, 0xca, 0x06, 0x18, 0x45, 0xde, 0xc9, 0xfc, 0xd2, 0xf3, 0x7c,
0x1b, 0xc0, 0x49, 0x25, 0xa9, 0xe1, 0xee, 0x2d, 0x0f, 0x37, 0xeb, 0x4b, 0x68, 0xd4, 0xe6, 0x33,
0xd8, 0x45, 0x75, 0xee, 0x4d, 0xfd, 0xc7, 0xce, 0xb4, 0xe3, 0xcf, 0x27, 0xde, 0xc9, 0x65, 0x67,
0xfd, 0x84, 0x65, 0x9d, 0x9d, 0x75, 0xd9, 0x87, 0x50, 0x78, 0xf3, 0x37, 0x65, 0x8c, 0x0a, 0x2a,
0xd9, 0xce, 0xa7, 0xa1, 0x97, 0x64, 0x4b, 0xfa, 0x66, 0xcf, 0x73, 0xe2, 0x38, 0xa4, 0xd8, 0x55,
0x46, 0xa8, 0x6a, 0xb1, 0xb7, 0x9f, 0xc8, 0x70, 0x5a, 0x16, 0xf4, 0x49, 0xdc, 0x8f, 0xdd, 0x28,
0x56, 0x33, 0xce, 0xdf, 0xe8, 0x59, 0x75, 0x2f, 0xb2, 0x9f, 0x79, 0xf1, 0xe9, 0x38, 0x74, 0x9e,
0xb1, 0x5b, 0x57, 0x05, 0x78, 0xd1, 0x37, 0x0a, 0x62, 0xbc, 0x0d, 0x80, 0x91, 0xd6, 0x1b, 0xcb,
0x91, 0xad, 0x71, 0xe0, 0xd6, 0x20, 0xc6, 0x27, 0xb0, 0x33, 0xf7, 0x6d, 0x6f, 0x16, 0xe0, 0xc4,
0x79, 0x71, 0x26, 0x69, 0x5d, 0x2e, 0xeb, 0xdc, 0xef, 0x29, 0x54, 0x2a, 0x31, 0xcb, 0x57, 0xd5,
0x5c, 0xbe, 0xfa, 0x21, 0x80, 0xcc, 0x68, 0x36, 0x45, 0xa9, 0x1a, 0xe3, 0x6a, 0x12, 0xd2, 0x8e,
0x38, 0x81, 0x28, 0x34, 0x96, 0x0b, 0x20, 0x93, 0x84, 0x04, 0xf4, 0xc6, 0x2a, 0x81, 0x60, 0x56,
0x70, 0xc7, 0xbb, 0x75, 0xee, 0x39, 0x6d, 0x1b, 0x3b, 0xb0, 0x8a, 0xe6, 0x36, 0x75, 0x77, 0x1b,
0x8c, 0x90, 0x0d, 0x9c, 0xfd, 0x16, 0x0e, 0x7c, 0x12, 0xfa, 0x33, 0xb4, 0x65, 0x24, 0x9c, 0xe3,
0x3a, 0x34, 0x99, 0x60, 0xc3, 0x8b, 0xee, 0x22, 0xd8, 0x52, 0x50, 0x9a, 0xa2, 0x34, 0x57, 0x7a,
0xc1, 0xee, 0x06, 0x77, 0x0d, 0x09, 0xa8, 0x17, 0x98, 0x31, 0xd4, 0xbb, 0x2e, 0x59, 0xbb, 0x9c,
0x91, 0x2c, 0x14, 0x96, 0xf4, 0x50, 0x98, 0x55, 0x1f, 0x2b, 0xe7, 0x54, 0x1f, 0xc6, 0x4f, 0x60,
0x73, 0xea, 0xcf, 0x4f, 0xd0, 0xc5, 0x24, 0x9b, 0x9b, 0xf8, 0xd5, 0x86, 0x04, 0x0f, 0x14, 0xd4,
0xfc, 0xfb, 0x12, 0xac, 0x0e, 0x9d, 0xc7, 0x38, 0x94, 0xf7, 0x55, 0x42, 0x7a, 0x79, 0xb1, 0xc0,
0xf8, 0xc2, 0x92, 0x28, 0x5b, 0x8c, 0x72, 0x6e, 0x31, 0x7e, 0x1f, 0x1a, 0xe3, 0x6c, 0x4c, 0xe4,
0xa5, 0xa4, 0xf3, 0x15, 0x3d, 0x18, 0xa6, 0x58, 0x91, 0x23, 0xa5, 0xf9, 0x0a, 0xfc, 0x28, 0xb6,
0x55, 0x48, 0x51, 0x26, 0x45, 0x20, 0xe9, 0x5d, 0xe6, 0x3f, 0x92, 0x39, 0x63, 0xe9, 0xc3, 0xab,
0x46, 0xdd, 0x79, 0xae, 0x9c, 0x94, 0xa6, 0x48, 0xdb, 0xc6, 0xcf, 0xa0, 0xe1, 0x04, 0xc1, 0xf4,
0x45, 0x22, 0xa6, 0xcc, 0x3e, 0xa2, 0x29, 0xd0, 0x26, 0xac, 0x0a, 0x4f, 0x75, 0x27, 0x6b, 0xd0,
0x74, 0x8c, 0xd0, 0x3b, 0xb9, 0xe3, 0xba, 0x3e, 0x1d, 0xd4, 0x27, 0xf9, 0xad, 0x60, 0xbc, 0xf1,
0x73, 0x68, 0xba, 0x88, 0xb1, 0x67, 0x8b, 0x69, 0xec, 0x9d, 0xfa, 0x01, 0x1b, 0x77, 0xfd, 0xe6,
0x55, 0x6d, 0x03, 0x81, 0xbf, 0x87, 0x0a, 0x2b, 0x1a, 0xae, 0xd6, 0x32, 0xda, 0xb0, 0x19, 0xfa,
0x8b, 0xd8, 0xb5, 0x71, 0x39, 0xa6, 0xee, 0x08, 0x93, 0x39, 0xdb, 0x64, 0xfd, 0xe6, 0xae, 0x36,
0xfd, 0x44, 0x20, 0x12, 0xbc, 0xd8, 0x08, 0x73, 0x6d, 0x5c, 0xe9, 0x8a, 0x37, 0x9f, 0xf8, 0x6c,
0xaf, 0xb9, 0x68, 0x4f, 0x7a, 0x72, 0x18, 0x14, 0x4c, 0x40, 0x81, 0x82, 0x72, 0x2c, 0x7a, 0x78,
0x63, 0x39, 0x50, 0x0c, 0x19, 0x2e, 0x14, 0x9e, 0xa2, 0x50, 0x1c, 0x3a, 0xf3, 0x88, 0x53, 0x77,
0x73, 0x59, 0xee, 0x30, 0x41, 0x89, 0x8c, 0x8a, 0xe6, 0x59, 0x0e, 0x84, 0xa3, 0x6f, 0xb8, 0xbb,
0xb9, 0x3c, 0xcf, 0x3c, 0x8a, 0x63, 0x46, 0x8a, 0x7a, 0x98, 0x35, 0xcc, 0x7f, 0x2e, 0x41, 0x5d,
0x5b, 0x04, 0xe3, 0x4b, 0xa8, 0x79, 0xf3, 0x64, 0xb9, 0x4a, 0xaf, 0x8c, 0xac, 0x58, 0xc5, 0x29,
0xc6, 0x3f, 0xc0, 0x85, 0x78, 0x4e, 0xca, 0xd8, 0xb9, 0x2c, 0x74, 0x1e, 0x73, 0x43, 0x32, 0x64,
0x02, 0x30, 0x00, 0x69, 0x02, 0xca, 0xaf, 0x16, 0x20, 0x19, 0x94, 0x45, 0xfe, 0x19, 0xd4, 0xa5,
0x5f, 0x1d, 0x78, 0x33, 0x2f, 0xd6, 0x9c, 0xa2, 0x94, 0x73, 0x8a, 0x1f, 0x43, 0x63, 0xe6, 0x3c,
0xcf, 0x1c, 0x53, 0x56, 0x52, 0x75, 0x84, 0x25, 0x5e, 0x69, 0x7c, 0x0e, 0x57, 0xa3, 0xd3, 0x45,
0x3c, 0xf6, 0x9f, 0xcd, 0xed, 0xf8, 0x14, 0x73, 0xda, 0xa9, 0x3f, 0x1d, 0xdb, 0xc1, 0x28, 0x29,
0x21, 0x77, 0x12, 0xec, 0x30, 0x41, 0x0e, 0x46, 0xb1, 0xf9, 0xdf, 0x65, 0xa8, 0x26, 0xd6, 0x69,
0xfc, 0x1e, 0x34, 0x9d, 0x45, 0x7c, 0x6a, 0x07, 0x98, 0x7a, 0x9e, 0xf9, 0xe1, 0x58, 0x85, 0x91,
0x06, 0x01, 0x07, 0x0a, 0x66, 0xbc, 0x03, 0x75, 0x74, 0xba, 0x51, 0xe8, 0x05, 0x1c, 0x97, 0xa5,
0x4b, 0xeb, 0x20, 0xe3, 0x1a, 0x56, 0x6b, 0xfe, 0xc8, 0x99, 0x62, 0x34, 0x55, 0x7d, 0xaf, 0x73,
0xbb, 0x1d, 0xbd, 0x46, 0xf5, 0x6f, 0xbc, 0x09, 0xeb, 0xb4, 0x4b, 0x21, 0x21, 0xab, 0x72, 0x2e,
0xa8, 0x89, 0x32, 0x30, 0x5a, 0x33, 0xe2, 0x04, 0x4d, 0x22, 0x50, 0x45, 0x5f, 0x8d, 0x20, 0xf7,
0x08, 0x40, 0xd1, 0x9a, 0xd1, 0x1c, 0x98, 0xd6, 0x99, 0xb3, 0x4a, 0x00, 0x2e, 0xf7, 0xf7, 0x61,
0x2b, 0x74, 0x67, 0x3e, 0xd6, 0x01, 0x41, 0xe8, 0x3d, 0x45, 0x43, 0x27, 0xf1, 0x32, 0x19, 0x6c,
0x4a, 0xc4, 0x40, 0xc2, 0xb1, 0x9f, 0x8f, 0xc0, 0x90, 0xf6, 0x39, 0x99, 0x3a, 0x81, 0x3d, 0x76,
0x66, 0x01, 0x56, 0x15, 0x9c, 0x1d, 0xaa, 0xa2, 0xc5, 0x98, 0xbb, 0x88, 0xe8, 0x4a, 0xb8, 0xf1,
0x1e, 0x6c, 0x44, 0xee, 0x7c, 0x6c, 0x8f, 0xfc, 0xd9, 0x6c, 0x81, 0x35, 0xf6, 0x0b, 0xf6, 0xca,
0xa6, 0x68, 0x12, 0xb4, 0x93, 0x00, 0x49, 0x79, 0xea, 0x07, 0xa5, 0x8e, 0x9c, 0x00, 0x1d, 0x90,
0xf2, 0x66, 0x4d, 0x42, 0x3a, 0x0e, 0x2b, 0x2f, 0xa7, 0x8e, 0xb0, 0x0d, 0xc6, 0xca, 0xb9, 0x24,
0xe4, 0x06, 0xac, 0x60, 0x02, 0x6a, 0xf2, 0x80, 0xf1, 0x0b, 0x2b, 0x8a, 0xa6, 0x34, 0x08, 0x7b,
0x4a, 0xc6, 0x13, 0x61, 0x82, 0x58, 0x0a, 0x95, 0x9a, 0x69, 0x89, 0x46, 0x90, 0x35, 0x22, 0xf3,
0x6b, 0x68, 0xe8, 0x31, 0x86, 0xea, 0x71, 0xdc, 0xf4, 0x60, 0x4c, 0x97, 0x8b, 0x5e, 0x15, 0x49,
0x93, 0x4d, 0x4f, 0x51, 0xd9, 0x71, 0x3c, 0x4d, 0x4d, 0x4f, 0xc1, 0x86, 0xf1, 0xd4, 0xfc, 0xf3,
0x12, 0x6c, 0xe4, 0x43, 0x0e, 0x59, 0xe3, 0x52, 0x94, 0xb2, 0x47, 0x18, 0x5d, 0xb1, 0xf2, 0x91,
0xe2, 0x77, 0xf2, 0x21, 0xa9, 0xc3, 0x38, 0x0c, 0x8c, 0x7b, 0x67, 0xb9, 0x16, 0x11, 0xa6, 0x43,
0x4a, 0xbd, 0xb2, 0xe7, 0x37, 0x97, 0x39, 0x19, 0xdf, 0x1b, 0x9b, 0xff, 0xb9, 0x0a, 0xb5, 0x34,
0x80, 0xfd, 0x1f, 0xd8, 0x32, 0xee, 0x96, 0x67, 0x68, 0xa8, 0x58, 0xdf, 0x44, 0xea, 0x9c, 0x42,
0x8b, 0xf8, 0x87, 0x0a, 0x23, 0x52, 0x9a, 0x42, 0xdb, 0x5f, 0x7d, 0xa5, 0xed, 0xaf, 0x9d, 0x63,
0xfb, 0xeb, 0xe7, 0xda, 0x7e, 0x75, 0xc9, 0xf6, 0x31, 0x98, 0x7f, 0xbf, 0x70, 0x17, 0xa8, 0x6d,
0x6d, 0x39, 0x98, 0x3f, 0x60, 0xb8, 0x50, 0xf8, 0x62, 0x2f, 0x81, 0xd7, 0xf1, 0x92, 0xfa, 0x85,
0xbd, 0xa4, 0x51, 0xe4, 0x25, 0xb8, 0x78, 0x11, 0xce, 0x03, 0x2e, 0x80, 0xac, 0xd7, 0xd9, 0xe8,
0x9b, 0xa2, 0xa1, 0x80, 0x72, 0x85, 0xbf, 0xc0, 0x80, 0xb7, 0x08, 0x28, 0x96, 0xba, 0x63, 0xf2,
0x17, 0xe7, 0x31, 0xe6, 0xef, 0x98, 0x32, 0x3a, 0xf9, 0x41, 0x4d, 0x5c, 0x49, 0xb1, 0x1d, 0x0d,
0x49, 0x73, 0x44, 0xb9, 0x57, 0xca, 0xdd, 0x94, 0xd5, 0x1c, 0x02, 0xa4, 0x4c, 0xac, 0x20, 0x9c,
0xf1, 0xcc, 0x4b, 0xba, 0x6d, 0xc9, 0x8a, 0x8b, 0x41, 0x92, 0x60, 0x8f, 0x8e, 0x48, 0x46, 0xae,
0xf7, 0x14, 0x1d, 0x65, 0x4b, 0x4e, 0x70, 0xd2, 0x26, 0x9c, 0x33, 0x1a, 0xb9, 0x01, 0xf6, 0xb8,
0x6b, 0x48, 0x5c, 0xd2, 0xa6, 0x62, 0xd6, 0x19, 0x63, 0xee, 0x8a, 0xbd, 0x08, 0xb1, 0xdb, 0x8c,
0xd5, 0x20, 0xc6, 0x36, 0xac, 0xe2, 0x5c, 0xd9, 0xdf, 0xef, 0xee, 0xc8, 0x6d, 0x2f, 0x36, 0x1e,
0x50, 0xfd, 0x38, 0x99, 0xfa, 0x41, 0xb4, 0x7b, 0x85, 0x81, 0xb2, 0x61, 0xfe, 0x31, 0x54, 0x13,
0xeb, 0x32, 0x3e, 0xd6, 0xd4, 0x91, 0x89, 0x6f, 0xeb, 0x8c, 0x0d, 0x6a, 0x1a, 0xbe, 0x07, 0x95,
0x28, 0xdb, 0x7d, 0x14, 0x90, 0x32, 0xda, 0xfc, 0xa7, 0x12, 0xac, 0x2b, 0x88, 0x61, 0x42, 0xe3,
0xa8, 0x3f, 0xec, 0xdd, 0xed, 0x75, 0xda, 0xc3, 0x5e, 0xff, 0x88, 0x7b, 0xa9, 0x88, 0xc6, 0x5c,
0x83, 0x51, 0xd6, 0x7a, 0x38, 0xe8, 0xb6, 0x87, 0x16, 0x0b, 0xae, 0x88, 0xb5, 0x05, 0xb7, 0xa8,
0xec, 0xeb, 0x0f, 0xac, 0x23, 0x75, 0x06, 0x54, 0xf1, 0xf1, 0xdb, 0x78, 0x0b, 0x6a, 0x5f, 0x5b,
0xd6, 0xa0, 0x7d, 0xd0, 0x7b, 0x64, 0xa9, 0x53, 0x95, 0xda, 0x93, 0x04, 0x40, 0x61, 0x48, 0x58,
0x77, 0x85, 0x75, 0x7c, 0x9f, 0x5d, 0xa3, 0x22, 0xd6, 0x43, 0xd9, 0x24, 0xbe, 0x6e, 0xef, 0xb8,
0xd3, 0x16, 0x5d, 0xab, 0xcb, 0x4e, 0x81, 0x7c, 0xe3, 0x04, 0x40, 0x33, 0x35, 0xec, 0x0f, 0xdb,
0x07, 0xec, 0x12, 0x15, 0xb1, 0x1a, 0x53, 0xc3, 0xbc, 0x05, 0x6b, 0xd2, 0xb2, 0x09, 0xef, 0xcd,
0x83, 0x45, 0xac, 0xd2, 0xaa, 0x6c, 0x90, 0xde, 0x38, 0xcf, 0x04, 0x56, 0xe7, 0x57, 0xb2, 0x65,
0xba, 0xb0, 0x26, 0xcb, 0x1b, 0xf4, 0xf1, 0xb5, 0x11, 0xef, 0xb7, 0xd4, 0xec, 0x5e, 0x5d, 0x2e,
0x80, 0xe4, 0x6e, 0x4c, 0x28, 0x2a, 0xe3, 0xa7, 0x5c, 0xf1, 0xc7, 0xae, 0x9a, 0xe1, 0x2b, 0xcb,
0xe4, 0xb2, 0xb8, 0x92, 0x34, 0x34, 0xcd, 0x0d, 0x5d, 0x0a, 0x99, 0x3d, 0xca, 0x99, 0x63, 0x5c,
0xc3, 0x00, 0x18, 0x87, 0x2f, 0x92, 0xc9, 0x56, 0x40, 0x41, 0x30, 0xb2, 0x5f, 0xce, 0xec, 0x7c,
0x18, 0x22, 0xe7, 0xbb, 0x4a, 0x00, 0x92, 0x84, 0xf6, 0x60, 0x3c, 0x71, 0xdd, 0x00, 0x37, 0x49,
0xe8, 0xbc, 0x4b, 0x67, 0x70, 0x5b, 0x29, 0xa6, 0x97, 0x1c, 0xc6, 0x75, 0xe1, 0x6d, 0xb4, 0x6c,
0x6f, 0xb6, 0x98, 0xd9, 0xa9, 0x2d, 0x52, 0x91, 0x62, 0x2f, 0x9d, 0x7b, 0xbd, 0xa5, 0xa8, 0xda,
0x3a, 0x51, 0x22, 0xc5, 0xfc, 0xbb, 0x15, 0xa8, 0x6b, 0xc3, 0xfb, 0x7f, 0x3a, 0x0c, 0xde, 0x4f,
0xba, 0x27, 0x7e, 0xec, 0x39, 0x14, 0x50, 0x32, 0xe5, 0xa4, 0x21, 0x1a, 0x19, 0xee, 0x7e, 0xa2,
0x26, 0xda, 0xcf, 0x22, 0x60, 0x9a, 0x35, 0x65, 0xf7, 0xdc, 0xa2, 0x40, 0x40, 0x85, 0x16, 0x63,
0xa4, 0x41, 0xa6, 0x6d, 0xf3, 0x7f, 0x4a, 0x50, 0x4b, 0xcb, 0x61, 0x9a, 0x2a, 0x95, 0x5e, 0x54,
0x42, 0x50, 0x59, 0x4a, 0xe6, 0x18, 0x95, 0x0d, 0x30, 0xe8, 0x4b, 0x22, 0x2e, 0xae, 0xa5, 0xa9,
0xca, 0x32, 0x61, 0xa0, 0x64, 0xcc, 0xe2, 0x85, 0x3d, 0xf6, 0xa2, 0x11, 0x46, 0xe6, 0xf0, 0x85,
0xda, 0xb5, 0x35, 0x10, 0xd8, 0x4d, 0x60, 0x94, 0xc5, 0x29, 0x13, 0xd2, 0x7c, 0xce, 0xe8, 0xca,
0x42, 0xee, 0xc4, 0xeb, 0x0a, 0x76, 0x48, 0xf7, 0x0f, 0x18, 0x9b, 0x55, 0x69, 0x92, 0xcf, 0x4e,
0x4d, 0x09, 0x4d, 0xb4, 0xc1, 0x10, 0xa9, 0xc8, 0x58, 0x1d, 0x99, 0x9f, 0x54, 0x51, 0xc3, 0xfa,
0x60, 0xf2, 0x8a, 0x47, 0xb8, 0xb9, 0x41, 0x01, 0xb2, 0xfc, 0x5a, 0xc3, 0xe6, 0x61, 0x14, 0x99,
0xbf, 0x80, 0xba, 0x56, 0xd2, 0xa3, 0x6f, 0x6d, 0xeb, 0xf5, 0x7f, 0xbe, 0x3e, 0xd8, 0xd2, 0xea,
0x7d, 0x59, 0x1c, 0x98, 0x0b, 0x58, 0x93, 0xf5, 0x0c, 0xd9, 0x8e, 0x17, 0xd8, 0xb9, 0xad, 0x6e,
0xd5, 0x0b, 0x14, 0xf2, 0x7d, 0xd8, 0x9c, 0x39, 0xd1, 0x13, 0x7b, 0xea, 0xce, 0x4f, 0x30, 0xff,
0xe3, 0x92, 0xab, 0x29, 0x6b, 0x12, 0xf8, 0x80, 0xa1, 0x87, 0xde, 0xfc, 0x0c, 0x9d, 0xf3, 0x5c,
0x25, 0x78, 0x9d, 0xce, 0x79, 0x4e, 0x67, 0x41, 0x90, 0x9d, 0xbf, 0x61, 0x16, 0xd7, 0xb7, 0xbc,
0x57, 0xce, 0x9c, 0xd1, 0x51, 0xaa, 0x3d, 0x67, 0xd7, 0x8b, 0xb0, 0xa9, 0x17, 0xc5, 0x7c, 0x0f,
0x80, 0x30, 0xfa, 0xc6, 0x14, 0x5a, 0x4d, 0x0b, 0x7b, 0xb9, 0xdb, 0x6d, 0x2d, 0x97, 0x70, 0x22,
0xa5, 0x30, 0xef, 0x61, 0xf8, 0x77, 0xe2, 0xd1, 0x29, 0x29, 0xf3, 0x93, 0x9c, 0x32, 0xda, 0x86,
0x8b, 0x29, 0xce, 0x57, 0xc5, 0x7c, 0x04, 0x8d, 0x76, 0x44, 0x07, 0x00, 0x72, 0xac, 0xb8, 0x1e,
0xba, 0x30, 0x6d, 0x0b, 0xa3, 0x53, 0x69, 0x32, 0xd1, 0xfa, 0xe5, 0xdc, 0x25, 0xd1, 0x53, 0xb6,
0xcc, 0x5f, 0x97, 0x01, 0x30, 0xa0, 0x8d, 0x3d, 0xb9, 0x29, 0xff, 0x14, 0x4b, 0x16, 0x59, 0xa5,
0xd2, 0xd1, 0x66, 0xe9, 0x4c, 0xa1, 0xa4, 0xc6, 0x82, 0x65, 0x0c, 0x53, 0xd1, 0xb0, 0xbe, 0x80,
0x46, 0x5a, 0x29, 0x65, 0xe7, 0xa1, 0x45, 0x4c, 0xe9, 0xf9, 0x08, 0xb1, 0x7d, 0x05, 0x1b, 0x4e,
0x64, 0xd3, 0x61, 0x86, 0x5a, 0x54, 0xb5, 0x1b, 0xbb, 0x5a, 0x3c, 0x14, 0xac, 0x05, 0xf5, 0xe1,
0xdf, 0xc4, 0xd4, 0xaf, 0xb8, 0xa9, 0xcf, 0xca, 0xcb, 0x15, 0x95, 0x6c, 0xd4, 0xe3, 0x97, 0x14,
0xe9, 0x54, 0xd1, 0xc2, 0x5c, 0xab, 0x2f, 0xe5, 0x6a, 0xa4, 0x84, 0xc4, 0xf8, 0x4b, 0xd8, 0x72,
0x9f, 0xc7, 0x76, 0x9e, 0x79, 0xed, 0xa5, 0xcc, 0x9b, 0x48, 0xdc, 0xd1, 0xf9, 0xc9, 0x09, 0x83,
0x27, 0x1e, 0xc6, 0xd7, 0x08, 0xeb, 0x70, 0xf6, 0xb3, 0x55, 0x74, 0x42, 0x04, 0x09, 0x86, 0x98,
0x13, 0xd8, 0x4c, 0x19, 0xda, 0x23, 0x75, 0xd0, 0xab, 0xaf, 0xef, 0x0f, 0xb3, 0x6e, 0x96, 0x08,
0xb5, 0x25, 0xc6, 0xfa, 0x38, 0x51, 0x31, 0x39, 0x29, 0xc1, 0xfa, 0x58, 0x03, 0x99, 0x47, 0x50,
0x3b, 0x74, 0xc7, 0xaa, 0x87, 0x9f, 0xe6, 0x7a, 0x78, 0x53, 0x2f, 0x2f, 0xc6, 0x67, 0x64, 0x63,
0x4a, 0xc6, 0xa8, 0xbb, 0x90, 0x36, 0x59, 0x16, 0xb2, 0x61, 0xda, 0xb0, 0x89, 0x6b, 0x14, 0xba,
0x01, 0xd6, 0x83, 0x4a, 0xaa, 0xba, 0x3c, 0x28, 0x65, 0x97, 0x07, 0x68, 0x79, 0x44, 0xe1, 0xa4,
0x79, 0x5b, 0xb6, 0xb0, 0x56, 0x69, 0x2e, 0x22, 0x17, 0x17, 0x7f, 0x12, 0x63, 0x94, 0x8b, 0x62,
0x15, 0x09, 0xeb, 0x08, 0x3c, 0x40, 0xd8, 0x21, 0x82, 0xcc, 0x0f, 0xa1, 0x79, 0x84, 0xb3, 0x89,
0x3b, 0x17, 0x25, 0x5e, 0xbb, 0x89, 0x28, 0xe5, 0x6e, 0x22, 0xcc, 0x7f, 0x59, 0x81, 0x75, 0x49,
0x14, 0x65, 0x87, 0x15, 0xce, 0x48, 0x3b, 0x68, 0x5d, 0x3e, 0xac, 0x90, 0xd4, 0xea, 0xb0, 0x42,
0xc9, 0xff, 0x12, 0x6a, 0x59, 0xb5, 0x2b, 0x2d, 0xf9, 0xda, 0x4b, 0xe7, 0x5e, 0x64, 0xb4, 0x18,
0x8f, 0xcb, 0x33, 0x2c, 0xeb, 0xca, 0xcb, 0x87, 0x29, 0xe9, 0x64, 0x0a, 0xc2, 0xa3, 0x66, 0x40,
0x76, 0x2b, 0xa7, 0x4c, 0x99, 0xed, 0xb5, 0x9c, 0xc5, 0xeb, 0xb3, 0xc9, 0xd6, 0x2b, 0x01, 0x68,
0x84, 0xcd, 0x9c, 0x11, 0x2a, 0xeb, 0x3d, 0x47, 0xbb, 0x86, 0x6e, 0x87, 0x68, 0x50, 0xeb, 0x73,
0x39, 0x95, 0xca, 0x74, 0xb5, 0x15, 0xcf, 0xcd, 0xb1, 0x48, 0xe8, 0xcc, 0x5f, 0x63, 0xf6, 0x4b,
0xcf, 0xd9, 0xd3, 0xa8, 0x54, 0xd2, 0x02, 0xe4, 0xe7, 0x00, 0xa3, 0x34, 0x78, 0x9c, 0xbd, 0x09,
0xc9, 0x02, 0x8b, 0xd0, 0xe8, 0xd0, 0xf2, 0xd6, 0xe5, 0xc2, 0x44, 0x6a, 0xbe, 0xb4, 0xda, 0x56,
0x2d, 0xa1, 0x48, 0x28, 0xcc, 0x07, 0x98, 0x48, 0xe4, 0xf1, 0x4d, 0x91, 0x02, 0x9f, 0x01, 0x68,
0x77, 0x04, 0xf2, 0xc4, 0xb4, 0xf0, 0x42, 0x44, 0x23, 0x33, 0xff, 0xbd, 0x04, 0xad, 0xe5, 0x93,
0x1e, 0xdc, 0x70, 0xe9, 0xee, 0xb0, 0xb3, 0x7c, 0x26, 0xa4, 0xf9, 0xc2, 0xef, 0xe2, 0xca, 0x9c,
0xb2, 0x08, 0xc9, 0xf5, 0x0a, 0xb3, 0x88, 0x3c, 0xad, 0x4c, 0x29, 0x8c, 0x1b, 0xb0, 0x3e, 0x76,
0x27, 0x0e, 0x05, 0x8f, 0xd5, 0xf3, 0x4c, 0x39, 0xa1, 0x32, 0xdf, 0x01, 0x38, 0x0c, 0xe3, 0x64,
0x57, 0x80, 0x0a, 0x8c, 0x9d, 0xd8, 0x49, 0xae, 0x03, 0xe8, 0xdb, 0xb4, 0xa0, 0x2a, 0x06, 0x5f,
0xf7, 0xf8, 0x24, 0xe9, 0xa5, 0x4e, 0xb5, 0x5c, 0x3e, 0xc8, 0x84, 0xa4, 0x95, 0x0f, 0xe6, 0x6f,
0x2a, 0x50, 0x23, 0x39, 0xb2, 0x96, 0xcc, 0x4a, 0xac, 0x12, 0x87, 0x89, 0xa2, 0x12, 0x4b, 0x06,
0x90, 0xb4, 0x4d, 0xe7, 0x24, 0xb8, 0x39, 0x96, 0xbe, 0x8f, 0x5f, 0xb2, 0xcb, 0x11, 0xee, 0xf7,
0x6d, 0x2f, 0x78, 0xfa, 0xb9, 0xba, 0x58, 0x04, 0x09, 0xea, 0x21, 0x24, 0x4f, 0x70, 0x4b, 0x1d,
0x37, 0x65, 0x04, 0xb7, 0xf8, 0x60, 0x59, 0xe6, 0x30, 0x96, 0xa0, 0x6a, 0x1e, 0x09, 0x4a, 0x24,
0x64, 0x04, 0xb7, 0x54, 0xdd, 0x93, 0x11, 0xdc, 0xa2, 0x71, 0x60, 0x99, 0xe3, 0x61, 0x29, 0xaa,
0xae, 0x1e, 0x64, 0x8b, 0x8a, 0xb7, 0x64, 0x77, 0x26, 0x65, 0xd7, 0x78, 0x30, 0x8d, 0x04, 0xc8,
0xd2, 0x97, 0x88, 0x6e, 0xf1, 0x5e, 0x3c, 0x4f, 0x74, 0x4b, 0xee, 0x99, 0x49, 0xa6, 0x3d, 0xc7,
0x3a, 0x75, 0xf2, 0x82, 0xf7, 0xe0, 0x65, 0xda, 0x33, 0x13, 0xf0, 0x88, 0x61, 0xa4, 0xe7, 0xc8,
0x19, 0x9d, 0xd2, 0x01, 0x0b, 0x65, 0x9c, 0x06, 0x93, 0x00, 0x83, 0x04, 0x41, 0xa8, 0x08, 0x4c,
0x09, 0xf8, 0x9d, 0x04, 0x6f, 0xbd, 0xcb, 0xa2, 0x99, 0xd0, 0xc8, 0xc7, 0x13, 0x6f, 0x43, 0x9d,
0xb6, 0xf1, 0xfe, 0xc4, 0x66, 0x33, 0xd8, 0x60, 0x9a, 0x1a, 0x82, 0xfa, 0x93, 0x2e, 0x02, 0x28,
0xb8, 0xbb, 0xf4, 0xb0, 0x85, 0x37, 0xd8, 0x18, 0xdc, 0xb9, 0x41, 0x45, 0xa8, 0x52, 0xf1, 0xfb,
0x05, 0x15, 0xaa, 0x2d, 0x46, 0xd6, 0x25, 0xec, 0x01, 0x81, 0xe4, 0x52, 0xa0, 0x22, 0x8a, 0x62,
0x4b, 0x2a, 0xc8, 0x20, 0x26, 0x30, 0xbf, 0x83, 0x0a, 0x59, 0x47, 0x7a, 0xd6, 0x7e, 0xa6, 0xa0,
0x48, 0x6c, 0x50, 0x9d, 0xb5, 0x7f, 0x98, 0xdf, 0x91, 0x6d, 0xe7, 0x09, 0x73, 0xfb, 0xb1, 0xbf,
0x2c, 0x41, 0x59, 0xf4, 0xdb, 0x64, 0x3f, 0x4e, 0xa4, 0xf2, 0x0d, 0x7e, 0xd1, 0xd6, 0x53, 0xae,
0x24, 0x56, 0x15, 0x49, 0xf9, 0x9d, 0x02, 0x68, 0x65, 0xb1, 0x76, 0x24, 0x94, 0xba, 0xc7, 0x90,
0x2d, 0xed, 0x32, 0xa6, 0x92, 0xbb, 0x8c, 0x79, 0xe9, 0x25, 0x41, 0x5e, 0x71, 0xf3, 0xaf, 0xc9,
0x0f, 0xfa, 0x6d, 0x99, 0xcf, 0xb1, 0xb6, 0xc1, 0x24, 0xe7, 0x44, 0x69, 0xe6, 0x79, 0x57, 0xe3,
0x4b, 0x88, 0xae, 0x3f, 0x4a, 0x2f, 0xc7, 0x04, 0xd3, 0x0a, 0xc5, 0x73, 0xce, 0x33, 0x03, 0x1c,
0x1b, 0xf9, 0x0c, 0x4e, 0xc0, 0x2c, 0x50, 0x37, 0x76, 0x19, 0x80, 0x8f, 0x43, 0x22, 0x2e, 0x89,
0xe8, 0x66, 0x8f, 0x07, 0xd2, 0xa0, 0x8b, 0x49, 0x02, 0xb5, 0x11, 0x42, 0x95, 0xb8, 0x1f, 0x7a,
0x27, 0xde, 0x3c, 0x3b, 0xa6, 0xad, 0x4a, 0x40, 0x3b, 0x7a, 0xd9, 0xcd, 0xbc, 0xd1, 0x01, 0xa0,
0xcd, 0x95, 0x56, 0xbb, 0x5c, 0x60, 0x3c, 0x04, 0x10, 0x35, 0xe4, 0x53, 0x13, 0x82, 0x42, 0xe6,
0xee, 0xb3, 0x44, 0x48, 0xf5, 0x75, 0x84, 0x20, 0x9f, 0x12, 0xf2, 0x63, 0xa8, 0x84, 0xbe, 0x43,
0x07, 0x62, 0xe5, 0xfc, 0xf5, 0x3e, 0xb1, 0x33, 0xca, 0xfc, 0x1a, 0x5a, 0xcb, 0xd3, 0x6a, 0x40,
0x72, 0xde, 0xd1, 0x7a, 0xc3, 0x68, 0x40, 0xf5, 0x9b, 0xde, 0xf0, 0x7e, 0x57, 0xb4, 0xbf, 0x69,
0x95, 0x8c, 0x26, 0xd4, 0x06, 0x96, 0x25, 0xec, 0x6e, 0xff, 0x9b, 0xa3, 0xd6, 0x0a, 0x5a, 0x12,
0x08, 0xeb, 0x51, 0xfb, 0xa0, 0xc7, 0xc4, 0x65, 0xb3, 0x93, 0x17, 0xc6, 0x3a, 0x54, 0xa1, 0x72,
0xd4, 0x3f, 0x22, 0x51, 0xc8, 0x7c, 0xd4, 0x1f, 0xda, 0x77, 0xfb, 0x0f, 0x8f, 0xba, 0x28, 0xab,
0x06, 0xab, 0xcc, 0x8a, 0x72, 0xea, 0xb0, 0xde, 0x3b, 0x92, 0x8d, 0xb2, 0x39, 0x82, 0xf2, 0xa3,
0x70, 0x52, 0x98, 0xbb, 0xd0, 0x72, 0x43, 0x79, 0x4e, 0xda, 0x10, 0xf8, 0xc5, 0x1b, 0x25, 0x79,
0x3d, 0x11, 0xca, 0x2d, 0x47, 0x03, 0x37, 0x4a, 0x0c, 0x10, 0x31, 0x21, 0xd5, 0xe5, 0x07, 0xbf,
0xb6, 0x60, 0xa4, 0x04, 0x88, 0xd8, 0xfc, 0x8b, 0x15, 0x58, 0x93, 0x77, 0xc1, 0x67, 0xdc, 0x01,
0xf9, 0xb8, 0xbe, 0x49, 0xcf, 0x64, 0x71, 0xf7, 0x25, 0x01, 0xbd, 0x31, 0x59, 0x0c, 0xed, 0x69,
0xdc, 0xb9, 0x9d, 0xbe, 0x5e, 0xc1, 0xc2, 0x54, 0x82, 0x78, 0x77, 0xf8, 0x21, 0xb4, 0x14, 0x81,
0x32, 0x41, 0x95, 0xae, 0x6a, 0x62, 0x53, 0xc2, 0xdb, 0x09, 0x38, 0x77, 0x49, 0xb7, 0xba, 0x74,
0x49, 0xf7, 0x2e, 0x6c, 0xcc, 0x82, 0x69, 0x64, 0x4f, 0x9d, 0xc7, 0xee, 0x94, 0x37, 0x79, 0x32,
0x28, 0x37, 0x08, 0x7a, 0x40, 0x40, 0xda, 0xe3, 0x2d, 0x51, 0xe1, 0x16, 0x6f, 0x7d, 0x99, 0xca,
0x79, 0x4e, 0x3e, 0x30, 0xf2, 0xa7, 0xea, 0x2e, 0xad, 0xca, 0x69, 0x23, 0x03, 0xec, 0x77, 0x30,
0xad, 0x25, 0x79, 0x17, 0x17, 0xfe, 0xde, 0x41, 0xff, 0x4e, 0xfb, 0x00, 0x57, 0x0b, 0x97, 0xe7,
0xa0, 0xdf, 0xc1, 0xcf, 0x12, 0x81, 0xdb, 0xdd, 0x5f, 0xd9, 0xbd, 0x23, 0xb9, 0x54, 0xf4, 0xdd,
0x7f, 0x38, 0x6c, 0x95, 0xe9, 0x71, 0xcd, 0x23, 0x71, 0xb7, 0x55, 0xd9, 0xff, 0x13, 0xa8, 0xa5,
0x37, 0xf1, 0x04, 0x6d, 0x77, 0xbb, 0x28, 0x02, 0x3f, 0xba, 0x16, 0x09, 0x40, 0x26, 0xfc, 0xb0,
0xdb, 0x07, 0x07, 0x52, 0x82, 0xb0, 0x06, 0x07, 0xed, 0x0e, 0x5a, 0x0c, 0x89, 0xb6, 0x8e, 0xda,
0x77, 0x0e, 0xac, 0x56, 0x85, 0xa9, 0x7a, 0xc7, 0xdc, 0x58, 0xa5, 0xee, 0x85, 0x75, 0x6c, 0x0d,
0x5b, 0x6b, 0x64, 0x37, 0xc7, 0xfd, 0xbb, 0x43, 0xd9, 0x5c, 0x27, 0xa3, 0xeb, 0x1d, 0xf5, 0x86,
0x3d, 0x34, 0x97, 0x3f, 0xb2, 0x5a, 0xd5, 0x7d, 0x9b, 0x2e, 0x89, 0xd3, 0xbd, 0x29, 0x49, 0x1c,
0x08, 0xeb, 0x6e, 0xef, 0x5b, 0x69, 0xbc, 0x47, 0x56, 0xef, 0xde, 0xfd, 0x3b, 0x7d, 0x81, 0x5a,
0xa0, 0x3a, 0xc3, 0xf6, 0x3d, 0x35, 0x86, 0x63, 0x7b, 0xd0, 0x1e, 0xde, 0x47, 0x0d, 0x50, 0x7a,
0xa7, 0x7f, 0x78, 0xf8, 0x10, 0x45, 0x7e, 0x87, 0x4a, 0x6c, 0x41, 0xd3, 0xfa, 0x76, 0x68, 0x67,
0xa0, 0xd5, 0xfd, 0x0f, 0x71, 0x0f, 0x90, 0xec, 0x37, 0x79, 0x70, 0x47, 0xdf, 0xc9, 0xc1, 0xd1,
0x78, 0x78, 0x76, 0xd0, 0x78, 0x2d, 0x31, 0x6c, 0xad, 0xec, 0xef, 0x43, 0x6b, 0x79, 0x37, 0x69,
0xac, 0xc1, 0x8a, 0xf5, 0x00, 0x19, 0xf0, 0xf7, 0x9e, 0x85, 0xf4, 0xf8, 0x8b, 0x23, 0x5c, 0xd9,
0xbf, 0xa1, 0x8e, 0x0b, 0x54, 0x1d, 0x9d, 0xf9, 0x09, 0x4d, 0x77, 0xa7, 0x63, 0x0d, 0x86, 0x52,
0xb8, 0xb0, 0x7e, 0x65, 0x75, 0x48, 0xf8, 0x43, 0xd8, 0x2e, 0xd8, 0xca, 0x90, 0xc6, 0xa9, 0xb6,
0xb6, 0x9c, 0xf8, 0x1d, 0x68, 0x65, 0x20, 0x61, 0x1d, 0xf6, 0x1f, 0x51, 0xc7, 0x57, 0x60, 0x4b,
0x87, 0xca, 0x25, 0x58, 0xd9, 0xff, 0x18, 0x9a, 0xb9, 0xfd, 0x0b, 0x4d, 0xcf, 0xa1, 0xd5, 0xb5,
0x0f, 0xfb, 0x24, 0x6a, 0x13, 0xea, 0xd4, 0x48, 0xc8, 0x4b, 0xfb, 0x1f, 0x01, 0x64, 0xf5, 0x1d,
0x0d, 0x06, 0xcd, 0x82, 0x75, 0xee, 0x1d, 0x0e, 0xfa, 0x42, 0xe9, 0x6c, 0x7d, 0xcb, 0xdf, 0x2b,
0x37, 0xff, 0x6b, 0x0b, 0xaa, 0xf7, 0x28, 0xea, 0xb4, 0x03, 0xcf, 0xb8, 0x0d, 0x9b, 0xf7, 0xdc,
0x58, 0x7f, 0xe6, 0x61, 0x68, 0xf9, 0x2a, 0x7d, 0xf2, 0xb1, 0x77, 0xe6, 0xbd, 0x86, 0xf9, 0x86,
0x71, 0x9f, 0x9f, 0x3b, 0xe5, 0x78, 0xcd, 0xdc, 0x03, 0xb1, 0xc2, 0xd7, 0x23, 0x7b, 0x9b, 0x4b,
0x8f, 0x56, 0x51, 0xd2, 0x97, 0xd0, 0x40, 0x2d, 0x92, 0x57, 0x88, 0x51, 0xb1, 0x0a, 0x4b, 0x2f,
0x0a, 0xcd, 0x37, 0x3e, 0x29, 0x61, 0xe9, 0x5e, 0xd7, 0x18, 0x2f, 0xc8, 0x67, 0xfc, 0x21, 0x4e,
0x60, 0xf6, 0xe8, 0xd1, 0x78, 0x3b, 0xa7, 0xf4, 0x99, 0xb7, 0x90, 0x45, 0x0a, 0x7f, 0x84, 0x5e,
0x89, 0x9b, 0x64, 0xef, 0xb1, 0xa1, 0x21, 0xf9, 0x81, 0xc2, 0xde, 0x32, 0x00, 0xa9, 0x6f, 0xa0,
0xe3, 0x70, 0xa9, 0x53, 0xa8, 0x5f, 0x81, 0xf8, 0xcf, 0xd0, 0xbd, 0xfc, 0x49, 0xfc, 0x7a, 0x4c,
0x5f, 0x40, 0x3d, 0x65, 0xea, 0xcd, 0x2f, 0xcc, 0x76, 0x0b, 0x1a, 0x29, 0x5b, 0x7f, 0x71, 0xf1,
0xee, 0x6e, 0x42, 0xf5, 0x58, 0x5d, 0xef, 0x5e, 0x98, 0xe7, 0x13, 0x34, 0x43, 0xbe, 0xe3, 0xbb,
0x30, 0x07, 0x6e, 0xf8, 0xba, 0x5e, 0xf4, 0x5a, 0x2c, 0x77, 0xd0, 0x57, 0xe4, 0x8b, 0x5a, 0x63,
0x2f, 0xb7, 0xb2, 0xb9, 0x67, 0xc6, 0x7b, 0xd7, 0xce, 0xe0, 0x92, 0x52, 0x13, 0x65, 0x7c, 0x05,
0xd5, 0xe4, 0x55, 0xae, 0xf1, 0x83, 0x33, 0x84, 0xd1, 0x79, 0xfd, 0x7f, 0x50, 0xa2, 0xfd, 0xb1,
0x7a, 0xf4, 0x58, 0x68, 0x21, 0xc5, 0x0f, 0x4b, 0xd8, 0x9e, 0xbb, 0xf4, 0xca, 0x8d, 0x39, 0xef,
0x20, 0xa6, 0x73, 0xea, 0xcc, 0x4f, 0xe8, 0xa6, 0xa6, 0x68, 0xe4, 0xe7, 0x48, 0xf9, 0x79, 0xfa,
0xe8, 0x32, 0xbb, 0x9c, 0xbc, 0xb0, 0x4b, 0x75, 0xe9, 0x45, 0xb0, 0x54, 0xbe, 0xdf, 0xce, 0x4a,
0x87, 0x62, 0x01, 0xdb, 0x05, 0xe5, 0x0f, 0x4b, 0xb9, 0xcd, 0x0e, 0x82, 0xdb, 0x37, 0x43, 0x3b,
0x0a, 0xd3, 0x9f, 0xd5, 0xee, 0xed, 0xe4, 0xe0, 0x6a, 0x97, 0xc7, 0xbc, 0xb7, 0x60, 0x4d, 0xbe,
0xc1, 0x35, 0xf2, 0x6b, 0x94, 0x63, 0x2f, 0xb4, 0xe4, 0x35, 0xf9, 0x2a, 0x75, 0x89, 0x4f, 0x7f,
0xa7, 0x5a, 0x6c, 0xc9, 0xeb, 0xe4, 0xcc, 0x54, 0xe2, 0xbf, 0x6a, 0x96, 0x88, 0x88, 0x75, 0xfc,
0x19, 0x1b, 0x19, 0xf3, 0xe4, 0x8d, 0x2c, 0xf7, 0x70, 0xf5, 0x25, 0x3e, 0x40, 0xbd, 0x61, 0xd1,
0x5f, 0xd8, 0x59, 0xbe, 0x22, 0xe4, 0xbe, 0x3e, 0x65, 0xfd, 0xb0, 0x00, 0x8b, 0x5e, 0xc9, 0x82,
0x44, 0xda, 0x14, 0x52, 0xcd, 0x96, 0x9f, 0x0a, 0xfd, 0x6d, 0x6a, 0x91, 0x72, 0xbf, 0x80, 0x26,
0x76, 0xa5, 0x9d, 0x3d, 0x17, 0xbe, 0x08, 0xdd, 0x2b, 0x84, 0x72, 0x60, 0xdd, 0xc8, 0xb1, 0x47,
0xaf, 0xc7, 0xcf, 0xd6, 0xd7, 0xcc, 0xbd, 0x6d, 0x35, 0xde, 0xc9, 0xe9, 0x5f, 0xf0, 0xe8, 0xb5,
0x68, 0x18, 0xb7, 0x39, 0x9f, 0x64, 0xa7, 0x3e, 0x45, 0x87, 0x29, 0x7b, 0x45, 0xc0, 0x74, 0x0a,
0xb4, 0xa7, 0x9c, 0xaf, 0xc1, 0x8c, 0x03, 0xb8, 0x03, 0x0d, 0xfd, 0x9d, 0xac, 0xf1, 0xa3, 0x9c,
0xfe, 0x67, 0xdf, 0xcf, 0x16, 0x07, 0xbd, 0x1a, 0xaa, 0xa0, 0x0e, 0x8c, 0xce, 0x1c, 0xa9, 0xec,
0x9d, 0x81, 0xc8, 0xe0, 0x9f, 0xb0, 0x50, 0xad, 0x7a, 0x21, 0x26, 0xd4, 0xf6, 0x2b, 0xac, 0xa3,
0x92, 0x47, 0xa7, 0xc6, 0x5b, 0xf9, 0x40, 0x97, 0x7f, 0x6a, 0x5b, 0xa4, 0x67, 0x1f, 0xb6, 0x53,
0x3d, 0xb5, 0x43, 0xa8, 0x73, 0x9e, 0x22, 0xed, 0x9d, 0x83, 0x43, 0x81, 0x03, 0xd8, 0x2e, 0x78,
0x03, 0x6b, 0xbc, 0x5f, 0xa4, 0xd8, 0xd9, 0x27, 0xb2, 0x05, 0x2a, 0x3e, 0x5e, 0xe3, 0xff, 0xa4,
0xf9, 0xec, 0x7f, 0x03, 0x00, 0x00, 0xff, 0xff, 0x40, 0x18, 0xcf, 0x5b, 0x58, 0x33, 0x00, 0x00,
// 4284 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 0x02, 0xff, 0xd4, 0x7b, 0xcd, 0x73, 0x1b, 0x47,
0x76, 0xb8, 0x41, 0x7c, 0x10, 0x78, 0x00, 0x48, 0x70, 0x44, 0xc9, 0x14, 0xd7, 0xeb, 0xf5, 0x6f,
0x7e, 0x6b, 0xaf, 0xc5, 0xb5, 0x2d, 0x5b, 0xb6, 0xe9, 0x8d, 0xd6, 0xbb, 0x09, 0x04, 0x42, 0x12,
0xd6, 0x24, 0x01, 0x35, 0x21, 0xc5, 0xce, 0x65, 0x32, 0x04, 0x06, 0xe4, 0x94, 0x00, 0xcc, 0x78,
0x66, 0xa0, 0x8f, 0x54, 0x25, 0x87, 0xcd, 0x21, 0x87, 0x54, 0xfe, 0x80, 0x54, 0x6d, 0x6e, 0x39,
0xe5, 0x1f, 0x48, 0xe5, 0x9e, 0x54, 0xe5, 0x98, 0x6b, 0x2e, 0xc9, 0x21, 0x95, 0x3f, 0x21, 0x55,
0x39, 0xe6, 0xbd, 0xd7, 0x3d, 0x33, 0x3d, 0xc0, 0x88, 0xa2, 0x96, 0x5b, 0xa9, 0xca, 0x85, 0x98,
0x7e, 0x5f, 0xfd, 0xba, 0xfb, 0x7d, 0xf5, 0x07, 0xa1, 0x7e, 0xe6, 0x9d, 0x9e, 0xf9, 0x9f, 0xf8,
0x81, 0x17, 0x79, 0x46, 0x95, 0x1b, 0xb6, 0xef, 0x9a, 0x53, 0x28, 0x77, 0x83, 0xc0, 0x0b, 0x8c,
0x8f, 0xa1, 0x34, 0xf2, 0xc6, 0xce, 0x4e, 0xe1, 0xbd, 0xc2, 0x87, 0x1b, 0x77, 0x6e, 0x7e, 0x12,
0x53, 0x7c, 0xc2, 0x68, 0xf9, 0xb7, 0x83, 0x04, 0x82, 0xc9, 0x8c, 0x16, 0x14, 0x67, 0xe1, 0xd9,
0xce, 0x1a, 0x52, 0xd7, 0x04, 0x7d, 0x9a, 0x26, 0xd4, 0x12, 0x22, 0xa3, 0x0e, 0xeb, 0x27, 0x8f,
0x3b, 0x9d, 0xee, 0xc9, 0x49, 0xeb, 0x2d, 0xa3, 0x0a, 0xa5, 0xfb, 0xed, 0xde, 0x61, 0xab, 0x60,
0x9e, 0x41, 0xad, 0x1d, 0x9c, 0x2d, 0x66, 0xce, 0x3c, 0x0a, 0x8d, 0x4f, 0xa0, 0x1a, 0x38, 0xa1,
0xb7, 0x08, 0x46, 0x71, 0xaf, 0x46, 0xda, 0xab, 0x50, 0x18, 0x91, 0xd0, 0x18, 0x37, 0xa0, 0x32,
0xb1, 0x67, 0xee, 0xf4, 0x25, 0xf7, 0xda, 0x14, 0xaa, 0x65, 0x18, 0x50, 0x9a, 0xdb, 0x33, 0x67,
0xa7, 0xc8, 0xba, 0xf0, 0xb7, 0xf9, 0xaf, 0x05, 0x68, 0x1d, 0x79, 0xe3, 0x81, 0x1d, 0x9d, 0xa7,
0x1d, 0x7e, 0x06, 0x35, 0xcf, 0x77, 0x02, 0x3b, 0x72, 0xbd, 0xb9, 0xea, 0xf1, 0x5a, 0xda, 0x63,
0x3f, 0x46, 0x89, 0x94, 0x2a, 0xa3, 0xe3, 0xda, 0x25, 0x74, 0xcc, 0xd1, 0xc5, 0x30, 0xa1, 0xe4,
0xa3, 0x1e, 0x3b, 0x25, 0x84, 0xd5, 0xef, 0x6c, 0xa4, 0xfc, 0xa4, 0x9d, 0x60, 0x1c, 0xf1, 0x2d,
0x16, 0xee, 0x78, 0xa7, 0x8c, 0x34, 0x0d, 0xc1, 0xdf, 0xda, 0x78, 0x2b, 0xfa, 0x78, 0xcd, 0xf7,
0x61, 0x53, 0x0d, 0x0d, 0x15, 0xf0, 0xbd, 0x79, 0xe8, 0x24, 0xec, 0x85, 0x94, 0xdd, 0xfc, 0x53,
0xd8, 0x52, 0x64, 0xe1, 0x6f, 0x3f, 0xe7, 0xf1, 0x78, 0xd6, 0xb4, 0xf1, 0xfc, 0x18, 0xca, 0xa4,
0x73, 0x88, 0x83, 0x2c, 0xe6, 0x0c, 0x48, 0x22, 0xcd, 0x19, 0x6c, 0x63, 0xf7, 0xc7, 0x8e, 0x7b,
0x76, 0x7e, 0xea, 0x05, 0x57, 0x5a, 0x04, 0x9a, 0x40, 0xc7, 0x09, 0x58, 0x89, 0x6c, 0x7f, 0x08,
0x15, 0x8c, 0x33, 0xff, 0xa6, 0x00, 0x8d, 0xa3, 0x20, 0xfa, 0xdd, 0x5b, 0xd7, 0x2e, 0x54, 0xdd,
0x79, 0xe4, 0x04, 0xcf, 0xec, 0x29, 0xaf, 0x6a, 0x49, 0x24, 0x6d, 0xe3, 0x16, 0xb4, 0xe6, 0x6a,
0x80, 0x96, 0x3d, 0x1e, 0xa3, 0xac, 0x90, 0x57, 0xb9, 0x26, 0x36, 0x63, 0x78, 0x5b, 0x82, 0xcd,
0xbf, 0x2e, 0xf0, 0xaa, 0x65, 0x54, 0xfc, 0x2d, 0xa6, 0xe2, 0x07, 0x50, 0x1b, 0x2f, 0x66, 0xbe,
0x15, 0xbd, 0xf4, 0xe5, 0xa2, 0x94, 0x45, 0x95, 0x00, 0x43, 0x6c, 0x93, 0xaa, 0x13, 0x77, 0xea,
0x68, 0x06, 0x98, 0xb4, 0x33, 0xc3, 0x28, 0x65, 0x87, 0x61, 0xfe, 0x87, 0xd4, 0xed, 0xde, 0xcc,
0xbf, 0x92, 0x6e, 0x3b, 0xb0, 0x1e, 0x4f, 0x82, 0x34, 0x97, 0xb8, 0x49, 0x56, 0xe4, 0x7b, 0x41,
0xc4, 0x4a, 0x35, 0x05, 0x7f, 0x1b, 0xbf, 0x84, 0x12, 0x0f, 0xa2, 0xc4, 0xb2, 0xf7, 0x52, 0xd9,
0x4b, 0x9a, 0x60, 0x7b, 0xee, 0x46, 0x5e, 0xe0, 0xce, 0xcf, 0x06, 0xde, 0xd4, 0x1d, 0xbd, 0x14,
0xcc, 0x67, 0xde, 0x26, 0x07, 0xcf, 0x62, 0x8c, 0x75, 0x28, 0x0e, 0x44, 0x57, 0x46, 0x9c, 0x41,
0xff, 0x64, 0xd8, 0x2a, 0xd0, 0xd7, 0xbd, 0xfe, 0xf0, 0x61, 0x6b, 0xcd, 0xfc, 0x07, 0x19, 0x12,
0x84, 0xff, 0xd4, 0xbd, 0xd2, 0x30, 0x31, 0xf2, 0xd9, 0xe1, 0x5c, 0x59, 0x09, 0x7d, 0xea, 0x03,
0x2f, 0xe6, 0x0f, 0xbc, 0xa4, 0x0d, 0x1c, 0x57, 0x62, 0xea, 0x4e, 0x9c, 0xc8, 0xc5, 0x55, 0x22,
0x77, 0x2f, 0x8a, 0xa4, 0x4d, 0x46, 0xe8, 0x07, 0xce, 0xc4, 0x7d, 0xc1, 0x2e, 0x5f, 0x13, 0xaa,
0x65, 0x3a, 0xbc, 0x40, 0x4f, 0x82, 0xc9, 0x95, 0x34, 0xff, 0x11, 0x14, 0x9f, 0x05, 0x13, 0xe5,
0x46, 0xcd, 0x94, 0x18, 0xe5, 0x0a, 0xc2, 0x98, 0x21, 0xdc, 0xc0, 0x6e, 0x0e, 0xb0, 0xcb, 0xb9,
0x33, 0x3e, 0x71, 0xae, 0x66, 0xaa, 0x1f, 0x40, 0x31, 0x74, 0x22, 0xd5, 0xdb, 0x76, 0x4a, 0x9c,
0x8a, 0x17, 0x44, 0x80, 0x71, 0xea, 0x3a, 0x76, 0x7a, 0x12, 0xd9, 0x91, 0x43, 0x7d, 0x5d, 0xa9,
0x4f, 0x64, 0x09, 0x63, 0x41, 0xaa, 0x67, 0x8d, 0x25, 0xe9, 0x43, 0xa4, 0x54, 0xe6, 0xbf, 0x15,
0xc0, 0xa0, 0x38, 0xc9, 0x16, 0x74, 0xa5, 0xce, 0x3f, 0xc4, 0xc5, 0x63, 0x29, 0xaa, 0xe7, 0x96,
0x16, 0xa8, 0xa4, 0xe5, 0x2a, 0xbc, 0x71, 0x17, 0x6e, 0xe2, 0xba, 0x3a, 0x81, 0xe5, 0xbc, 0x70,
0xc3, 0x08, 0xed, 0xd7, 0x4a, 0xf4, 0x91, 0x26, 0x54, 0x15, 0x6f, 0x33, 0x41, 0x57, 0xe1, 0x13,
0xcd, 0x43, 0xe3, 0x36, 0x5c, 0x43, 0xa3, 0x08, 0xd1, 0x73, 0x1d, 0x9d, 0xab, 0xc4, 0x5c, 0x46,
0x8c, 0x4a, 0x19, 0xcc, 0xbf, 0x2a, 0xc0, 0x3b, 0xe9, 0x00, 0xc3, 0xd0, 0x3d, 0x9b, 0x5f, 0x79,
0x9e, 0xef, 0x02, 0xd8, 0x89, 0x24, 0x35, 0xdc, 0xdd, 0xe5, 0xe1, 0xa6, 0x7d, 0x09, 0x8d, 0xda,
0x7c, 0x0e, 0x3b, 0xa8, 0xce, 0x83, 0xa9, 0x77, 0x6a, 0x4f, 0x3b, 0xde, 0x7c, 0xe2, 0x9e, 0x5d,
0x75, 0xd6, 0xcf, 0x58, 0xd6, 0xea, 0xac, 0xcb, 0x3e, 0x84, 0xc2, 0x9b, 0xbf, 0x29, 0x62, 0x54,
0x50, 0xc9, 0x76, 0x3e, 0x0d, 0xdc, 0x38, 0x5b, 0xd2, 0x37, 0x7b, 0x9e, 0x1d, 0x45, 0x01, 0xc5,
0xae, 0x22, 0x42, 0x55, 0x8b, 0xbd, 0xfd, 0x4c, 0x86, 0xd3, 0xa2, 0xa0, 0x4f, 0xe2, 0x3e, 0x75,
0xc2, 0x48, 0xcd, 0x38, 0x7f, 0xa3, 0x67, 0xd5, 0xdd, 0xd0, 0x7a, 0xee, 0x46, 0xe7, 0xe3, 0xc0,
0x7e, 0xce, 0x6e, 0x5d, 0x15, 0xe0, 0x86, 0x7f, 0xa8, 0x20, 0xc6, 0xbb, 0x00, 0x18, 0x69, 0xdd,
0xb1, 0x1c, 0x59, 0x85, 0x03, 0xb7, 0x06, 0x31, 0x3e, 0x85, 0xed, 0xb9, 0x67, 0xb9, 0x33, 0x1f,
0x27, 0xce, 0x8d, 0x52, 0x49, 0xeb, 0x72, 0x59, 0xe7, 0x5e, 0x4f, 0xa1, 0x12, 0x89, 0x69, 0xbe,
0xaa, 0x66, 0xf2, 0xd5, 0x0f, 0x01, 0x64, 0x46, 0xb3, 0x28, 0x4a, 0xd5, 0x18, 0x57, 0x93, 0x90,
0x76, 0xc8, 0x09, 0x44, 0xa1, 0xb1, 0x5c, 0x00, 0x99, 0x24, 0x24, 0xa0, 0x37, 0x56, 0x09, 0x04,
0xb3, 0x82, 0x33, 0xde, 0xa9, 0x73, 0xcf, 0x49, 0xdb, 0xd8, 0x86, 0x32, 0x9a, 0xdb, 0xd4, 0xd9,
0x69, 0x30, 0x42, 0x36, 0x70, 0xf6, 0x5b, 0x38, 0xf0, 0x49, 0xe0, 0xcd, 0xd0, 0x96, 0x91, 0x70,
0x8e, 0xeb, 0xd0, 0x64, 0x82, 0x0d, 0x37, 0xbc, 0x8f, 0xe0, 0xae, 0x82, 0xd2, 0x14, 0x25, 0xb9,
0xd2, 0xf5, 0x77, 0x36, 0xb8, 0x6b, 0x88, 0x41, 0x3d, 0xdf, 0x8c, 0xa0, 0x7e, 0xe0, 0x90, 0xb5,
0xcb, 0x19, 0x49, 0x43, 0x61, 0x41, 0x0f, 0x85, 0x69, 0xf5, 0xb1, 0x76, 0x41, 0xf5, 0x61, 0xfc,
0x04, 0x36, 0xa7, 0xde, 0xfc, 0x0c, 0x5d, 0x4c, 0xb2, 0x39, 0xb1, 0x5f, 0x6d, 0x48, 0xf0, 0x40,
0x41, 0xcd, 0xbf, 0x2f, 0x40, 0x79, 0x68, 0x9f, 0xe2, 0x50, 0x3e, 0x50, 0x09, 0xe9, 0xd5, 0xc5,
0x02, 0xe3, 0x73, 0x4b, 0xa2, 0x74, 0x31, 0x8a, 0x99, 0xc5, 0xf8, 0x3d, 0x68, 0x8c, 0xd3, 0x31,
0x91, 0x97, 0x92, 0xce, 0xd7, 0xf5, 0x60, 0x98, 0x60, 0x45, 0x86, 0x94, 0xe6, 0xcb, 0xf7, 0xc2,
0xc8, 0x52, 0x21, 0x45, 0x99, 0x14, 0x81, 0xa4, 0x77, 0x99, 0xff, 0x48, 0xe6, 0x8c, 0xa5, 0x0f,
0xaf, 0x1a, 0x75, 0xe7, 0x3a, 0x72, 0x52, 0x9a, 0x22, 0x69, 0x1b, 0x3f, 0x83, 0x86, 0xed, 0xfb,
0xd3, 0x97, 0xb1, 0x98, 0x22, 0xfb, 0x88, 0xa6, 0x40, 0x9b, 0xb0, 0x2a, 0x3c, 0xd5, 0xed, 0xb4,
0x41, 0xd3, 0x31, 0x42, 0xef, 0xe4, 0x8e, 0xeb, 0xfa, 0x74, 0x50, 0x9f, 0xe4, 0xb7, 0x82, 0xf1,
0xc6, 0xcf, 0xa1, 0xe9, 0x20, 0xc6, 0x9a, 0x2d, 0xa6, 0x91, 0x7b, 0xee, 0xf9, 0x6c, 0xdc, 0xf5,
0x3b, 0x37, 0xb4, 0x0d, 0x04, 0xfe, 0x1e, 0x29, 0xac, 0x68, 0x38, 0x5a, 0xcb, 0x68, 0xc3, 0x66,
0xe0, 0x2d, 0x22, 0xc7, 0xc2, 0xe5, 0x98, 0x3a, 0x23, 0x4c, 0xe6, 0x6c, 0x93, 0xf5, 0x3b, 0x3b,
0xda, 0xf4, 0x13, 0x81, 0x88, 0xf1, 0x62, 0x23, 0xc8, 0xb4, 0x71, 0xa5, 0x4b, 0xee, 0x7c, 0xe2,
0xb1, 0xbd, 0x66, 0xa2, 0x3d, 0xe9, 0xc9, 0x61, 0x50, 0x30, 0x01, 0x05, 0x0a, 0xca, 0xb1, 0xe8,
0xe1, 0x8d, 0xe5, 0x40, 0x31, 0x64, 0xb8, 0x50, 0x78, 0x8a, 0x42, 0x51, 0x60, 0xcf, 0x43, 0x4e,
0xdd, 0xcd, 0x65, 0xb9, 0xc3, 0x18, 0x25, 0x52, 0x2a, 0x9a, 0x67, 0x39, 0x10, 0x8e, 0xbe, 0xc1,
0xce, 0xe6, 0xf2, 0x3c, 0xf3, 0x28, 0x4e, 0x18, 0x29, 0xea, 0x41, 0xda, 0x30, 0xff, 0xb9, 0x00,
0x75, 0x6d, 0x11, 0x8c, 0xaf, 0xa0, 0xe6, 0xce, 0xe3, 0xe5, 0x2a, 0xbc, 0x36, 0xb2, 0x62, 0x15,
0xa7, 0x18, 0x7f, 0x1f, 0x17, 0xe2, 0x05, 0x29, 0x63, 0x65, 0xb2, 0xd0, 0x45, 0xcc, 0x0d, 0xc9,
0x90, 0x0a, 0xc0, 0x00, 0xa4, 0x09, 0x28, 0xbe, 0x5e, 0x80, 0x64, 0x50, 0x16, 0xf9, 0x67, 0x50,
0x97, 0x7e, 0x75, 0xe8, 0xce, 0xdc, 0x48, 0x73, 0x8a, 0x42, 0xc6, 0x29, 0xfe, 0x1f, 0x34, 0x66,
0xf6, 0x8b, 0xd4, 0x31, 0x65, 0x25, 0x55, 0x47, 0x58, 0xec, 0x95, 0xc6, 0x17, 0x70, 0x23, 0x3c,
0x5f, 0x44, 0x63, 0xef, 0xf9, 0xdc, 0x8a, 0xce, 0x31, 0xa7, 0x9d, 0x7b, 0xd3, 0xb1, 0xe5, 0x8f,
0xe2, 0x12, 0x72, 0x3b, 0xc6, 0x0e, 0x63, 0xe4, 0x60, 0x14, 0x99, 0xff, 0x55, 0x84, 0x6a, 0x6c,
0x9d, 0xc6, 0xff, 0x87, 0xa6, 0xbd, 0x88, 0xce, 0x2d, 0x1f, 0x53, 0xcf, 0x73, 0x2f, 0x18, 0xab,
0x30, 0xd2, 0x20, 0xe0, 0x40, 0xc1, 0x8c, 0xf7, 0xa0, 0x8e, 0x4e, 0x37, 0x0a, 0x5c, 0x9f, 0xe3,
0xb2, 0x74, 0x69, 0x1d, 0x64, 0xdc, 0xc4, 0x6a, 0xcd, 0x1b, 0xd9, 0x53, 0x8c, 0xa6, 0xaa, 0xef,
0x75, 0x6e, 0xb7, 0xc3, 0x37, 0xa8, 0xfe, 0x8d, 0xb7, 0x61, 0x9d, 0x76, 0x29, 0x24, 0xa4, 0x2c,
0xe7, 0x82, 0x9a, 0x28, 0x03, 0xa3, 0x35, 0x23, 0xce, 0xd0, 0x24, 0x7c, 0x55, 0xf4, 0xd5, 0x08,
0xf2, 0x80, 0x00, 0x14, 0xad, 0x19, 0xcd, 0x81, 0x69, 0x9d, 0x39, 0xab, 0x04, 0xe0, 0x72, 0x7f,
0x0f, 0xb6, 0x02, 0x67, 0xe6, 0x61, 0x1d, 0xe0, 0x07, 0xee, 0x33, 0x34, 0x74, 0x12, 0x2f, 0x93,
0xc1, 0xa6, 0x44, 0x0c, 0x24, 0x1c, 0xfb, 0xf9, 0x08, 0x0c, 0x69, 0x9f, 0x93, 0xa9, 0xed, 0x5b,
0x63, 0x7b, 0xe6, 0x63, 0x55, 0xc1, 0xd9, 0xa1, 0x2a, 0x5a, 0x8c, 0xb9, 0x8f, 0x88, 0x03, 0x09,
0x37, 0xde, 0x87, 0x8d, 0xd0, 0x99, 0x8f, 0xad, 0x91, 0x37, 0x9b, 0x2d, 0xb0, 0xc6, 0x7e, 0xc9,
0x5e, 0xd9, 0x14, 0x4d, 0x82, 0x76, 0x62, 0x20, 0x29, 0x4f, 0xfd, 0xa0, 0xd4, 0x91, 0xed, 0xa3,
0x03, 0x52, 0xde, 0xac, 0x49, 0x48, 0xc7, 0x66, 0xe5, 0xe5, 0xd4, 0x11, 0xb6, 0xc1, 0x58, 0x39,
0x97, 0x84, 0xdc, 0x80, 0x35, 0x4c, 0x40, 0x4d, 0x1e, 0x30, 0x7e, 0x61, 0x45, 0xd1, 0x94, 0x06,
0x61, 0x4d, 0xc9, 0x78, 0x42, 0x4c, 0x10, 0x4b, 0xa1, 0x52, 0x33, 0x2d, 0xd1, 0xf0, 0xd3, 0x46,
0x68, 0x7e, 0x03, 0x0d, 0x3d, 0xc6, 0x50, 0x3d, 0x8e, 0x9b, 0x1e, 0x8c, 0xe9, 0x72, 0xd1, 0xab,
0x22, 0x6e, 0xb2, 0xe9, 0x29, 0x2a, 0x2b, 0x8a, 0xa6, 0x89, 0xe9, 0x29, 0xd8, 0x30, 0x9a, 0x9a,
0x7f, 0x5e, 0x80, 0x8d, 0x6c, 0xc8, 0x21, 0x6b, 0x5c, 0x8a, 0x52, 0xd6, 0x08, 0xa3, 0x2b, 0x56,
0x3e, 0x52, 0xfc, 0x76, 0x36, 0x24, 0x75, 0x18, 0x87, 0x81, 0x71, 0x77, 0x95, 0x6b, 0x11, 0x62,
0x3a, 0xa4, 0xd4, 0x2b, 0x7b, 0x7e, 0x7b, 0x99, 0x93, 0xf1, 0xbd, 0xb1, 0xf9, 0x9f, 0x65, 0xa8,
0x25, 0x01, 0xec, 0x7f, 0xc1, 0x96, 0x71, 0xb7, 0x3c, 0x43, 0x43, 0xc5, 0xfa, 0x26, 0x54, 0xe7,
0x14, 0x5a, 0xc4, 0x3f, 0x52, 0x18, 0x91, 0xd0, 0xe4, 0xda, 0x7e, 0xf9, 0xb5, 0xb6, 0x5f, 0xb9,
0xc0, 0xf6, 0xd7, 0x2f, 0xb4, 0xfd, 0xea, 0x92, 0xed, 0x63, 0x30, 0xff, 0x7e, 0xe1, 0x2c, 0x50,
0xdb, 0xda, 0x72, 0x30, 0x7f, 0xc4, 0x70, 0xa1, 0xf0, 0xf9, 0x5e, 0x02, 0x6f, 0xe2, 0x25, 0xf5,
0x4b, 0x7b, 0x49, 0x23, 0xcf, 0x4b, 0x70, 0xf1, 0x42, 0x9c, 0x07, 0x5c, 0x00, 0x59, 0xaf, 0xb3,
0xd1, 0x37, 0x45, 0x43, 0x01, 0xe5, 0x0a, 0x7f, 0x89, 0x01, 0x6f, 0xe1, 0x53, 0x2c, 0x75, 0xc6,
0xe4, 0x2f, 0xf6, 0x29, 0xe6, 0xef, 0x88, 0x32, 0x3a, 0xf9, 0x41, 0x4d, 0x5c, 0x4f, 0xb0, 0x1d,
0x0d, 0x49, 0x73, 0x44, 0xb9, 0x57, 0xca, 0xdd, 0x94, 0xd5, 0x1c, 0x02, 0xa4, 0x4c, 0xac, 0x20,
0xec, 0xf1, 0xcc, 0x8d, 0xbb, 0x6d, 0xc9, 0x8a, 0x8b, 0x41, 0x92, 0x60, 0x97, 0x8e, 0x48, 0x46,
0x8e, 0xfb, 0x0c, 0x1d, 0x65, 0x4b, 0x4e, 0x70, 0xdc, 0x26, 0x9c, 0x3d, 0x1a, 0x39, 0x3e, 0xf6,
0xb8, 0x63, 0x48, 0x5c, 0xdc, 0xa6, 0x62, 0xd6, 0x1e, 0x63, 0xee, 0x8a, 0xdc, 0x10, 0xb1, 0xd7,
0x18, 0xab, 0x41, 0x8c, 0x6b, 0x50, 0xc6, 0xb9, 0xb2, 0xbe, 0xdf, 0xd9, 0x96, 0xdb, 0x5e, 0x6c,
0x3c, 0xa2, 0xfa, 0x71, 0x32, 0xf5, 0xfc, 0x70, 0xe7, 0x3a, 0x03, 0x65, 0xc3, 0xfc, 0x63, 0xa8,
0xc6, 0xd6, 0x65, 0x7c, 0xac, 0xa9, 0x23, 0x13, 0xdf, 0xd6, 0x8a, 0x0d, 0x6a, 0x1a, 0xbe, 0x0f,
0xa5, 0x30, 0xdd, 0x7d, 0xe4, 0x90, 0x32, 0xda, 0xfc, 0xa7, 0x02, 0xac, 0x2b, 0x88, 0x61, 0x42,
0xe3, 0xb8, 0x3f, 0xec, 0xdd, 0xef, 0x75, 0xda, 0xc3, 0x5e, 0xff, 0x98, 0x7b, 0x29, 0x89, 0xc6,
0x5c, 0x83, 0x51, 0xd6, 0x7a, 0x3c, 0x38, 0x68, 0x0f, 0xbb, 0x2c, 0xb8, 0x24, 0x2a, 0x0b, 0x6e,
0x51, 0xd9, 0xd7, 0x1f, 0x74, 0x8f, 0xd5, 0x19, 0x50, 0xc9, 0xc3, 0x6f, 0xe3, 0x1d, 0xa8, 0x7d,
0xd3, 0xed, 0x0e, 0xda, 0x87, 0xbd, 0x27, 0x5d, 0x75, 0xaa, 0x52, 0x7b, 0x1a, 0x03, 0x28, 0x0c,
0x89, 0xee, 0x7d, 0xd1, 0x3d, 0x79, 0xc8, 0xae, 0x51, 0x12, 0xeb, 0x81, 0x6c, 0x12, 0xdf, 0x41,
0xef, 0xa4, 0xd3, 0x16, 0x07, 0xdd, 0x03, 0x76, 0x0a, 0xe4, 0x1b, 0xc7, 0x00, 0x9a, 0xa9, 0x61,
0x7f, 0xd8, 0x3e, 0x64, 0x97, 0x28, 0x89, 0x72, 0x44, 0x0d, 0x73, 0x1f, 0x2a, 0xd2, 0xb2, 0x09,
0xef, 0xce, 0xfd, 0x45, 0xa4, 0xd2, 0xaa, 0x6c, 0x90, 0xde, 0x38, 0xcf, 0x04, 0x56, 0xe7, 0x57,
0xb2, 0x65, 0x3a, 0x50, 0x91, 0xe5, 0x0d, 0xfa, 0x78, 0x65, 0xc4, 0xfb, 0x2d, 0x35, 0xbb, 0x37,
0x96, 0x0b, 0x20, 0xb9, 0x1b, 0x13, 0x8a, 0xca, 0xf8, 0x29, 0x57, 0xfc, 0x91, 0xa3, 0x66, 0xf8,
0xfa, 0x32, 0xb9, 0x2c, 0xae, 0x24, 0x0d, 0x4d, 0x73, 0x43, 0x97, 0x42, 0x66, 0x8f, 0x72, 0xe6,
0x18, 0xd7, 0x30, 0x00, 0x46, 0xc1, 0xcb, 0x78, 0xb2, 0x15, 0x50, 0x10, 0x8c, 0xec, 0x97, 0x33,
0x3b, 0x1f, 0x86, 0xc8, 0xf9, 0xae, 0x12, 0x80, 0x24, 0xa1, 0x3d, 0x18, 0x4f, 0x1d, 0xc7, 0xc7,
0x4d, 0x12, 0x3a, 0xef, 0xd2, 0x19, 0xdc, 0x56, 0x82, 0xe9, 0xc5, 0x87, 0x71, 0x07, 0xf0, 0x2e,
0x5a, 0xb6, 0x3b, 0x5b, 0xcc, 0xac, 0xc4, 0x16, 0xa9, 0x48, 0xb1, 0x96, 0xce, 0xbd, 0xde, 0x51,
0x54, 0x6d, 0x9d, 0x28, 0x96, 0x62, 0xfe, 0xdd, 0x1a, 0xd4, 0xb5, 0xe1, 0xfd, 0x1f, 0x1d, 0x06,
0xef, 0x27, 0x9d, 0x33, 0x2f, 0x72, 0x6d, 0x0a, 0x28, 0xa9, 0x72, 0xd2, 0x10, 0x8d, 0x14, 0xf7,
0x30, 0x56, 0x13, 0xed, 0x67, 0xe1, 0x33, 0x4d, 0x45, 0xd9, 0x3d, 0xb7, 0x28, 0x10, 0x50, 0xa1,
0xc5, 0x18, 0x69, 0x90, 0x49, 0xdb, 0xfc, 0xef, 0x02, 0xd4, 0x92, 0x72, 0x98, 0xa6, 0x4a, 0xa5,
0x17, 0x95, 0x10, 0x54, 0x96, 0x92, 0x39, 0x46, 0x65, 0x03, 0x0c, 0xfa, 0x92, 0x88, 0x8b, 0x6b,
0x69, 0xaa, 0xb2, 0x4c, 0x18, 0x28, 0x19, 0xb3, 0x68, 0x61, 0x8d, 0xdd, 0x70, 0x84, 0x91, 0x39,
0x78, 0xa9, 0x76, 0x6d, 0x0d, 0x04, 0x1e, 0xc4, 0x30, 0xca, 0xe2, 0x94, 0x09, 0x69, 0x3e, 0x67,
0x74, 0x65, 0x21, 0x77, 0xe2, 0x75, 0x05, 0x3b, 0xa2, 0xfb, 0x07, 0x8c, 0xcd, 0xaa, 0x34, 0xc9,
0x66, 0xa7, 0xa6, 0x84, 0xc6, 0xda, 0x60, 0x88, 0x54, 0x64, 0xac, 0x8e, 0xcc, 0x4f, 0xaa, 0xa8,
0x61, 0x7d, 0x30, 0x79, 0x45, 0x23, 0xdc, 0xdc, 0xa0, 0x00, 0x59, 0x7e, 0x55, 0xb0, 0x79, 0x14,
0x86, 0xe6, 0x2f, 0xa0, 0xae, 0x95, 0xf4, 0xe8, 0x5b, 0xd7, 0xf4, 0xfa, 0x3f, 0x5b, 0x1f, 0x6c,
0x69, 0xf5, 0xbe, 0x2c, 0x0e, 0xcc, 0x05, 0x54, 0x64, 0x3d, 0x43, 0xb6, 0xe3, 0xfa, 0x56, 0x66,
0xab, 0x5b, 0x75, 0x7d, 0x85, 0xfc, 0x00, 0x36, 0x67, 0x76, 0xf8, 0xd4, 0x9a, 0x3a, 0xf3, 0x33,
0xcc, 0xff, 0xb8, 0xe4, 0x6a, 0xca, 0x9a, 0x04, 0x3e, 0x64, 0xe8, 0x91, 0x3b, 0x5f, 0xa1, 0xb3,
0x5f, 0xa8, 0x04, 0xaf, 0xd3, 0xd9, 0x2f, 0xe8, 0x2c, 0x08, 0xd2, 0xf3, 0x37, 0xcc, 0xe2, 0xfa,
0x96, 0xf7, 0xfa, 0xca, 0x19, 0x1d, 0xa5, 0xda, 0x0b, 0x76, 0xbd, 0x08, 0x9b, 0xba, 0x61, 0xc4,
0xf7, 0x00, 0x08, 0xa3, 0x6f, 0x4c, 0xa1, 0xd5, 0xa4, 0xb0, 0x97, 0xbb, 0xdd, 0xd6, 0x72, 0x09,
0x27, 0x12, 0x0a, 0xf3, 0x01, 0x86, 0x7f, 0x3b, 0x1a, 0x9d, 0x93, 0x32, 0x3f, 0xc9, 0x28, 0xa3,
0x6d, 0xb8, 0x98, 0xe2, 0x62, 0x55, 0xcc, 0x27, 0xd0, 0x68, 0x87, 0x74, 0x00, 0x20, 0xc7, 0x8a,
0xeb, 0xa1, 0x0b, 0xd3, 0xb6, 0x30, 0x3a, 0x95, 0x26, 0x13, 0xad, 0x5f, 0xce, 0x5d, 0x1c, 0x3d,
0x65, 0xcb, 0xfc, 0x75, 0x11, 0x00, 0x03, 0xda, 0xd8, 0x95, 0x9b, 0xf2, 0xcf, 0xb0, 0x64, 0x91,
0x55, 0x2a, 0x1d, 0x6d, 0x16, 0x56, 0x0a, 0x25, 0x35, 0x16, 0x2c, 0x63, 0x98, 0x8a, 0x86, 0xf5,
0x25, 0x34, 0x92, 0x4a, 0x29, 0x3d, 0x0f, 0xcd, 0x63, 0x4a, 0xce, 0x47, 0x88, 0xed, 0x6b, 0xd8,
0xb0, 0x43, 0x8b, 0x0e, 0x33, 0xd4, 0xa2, 0xaa, 0xdd, 0xd8, 0x8d, 0xfc, 0xa1, 0x60, 0x2d, 0xa8,
0x0f, 0xff, 0x0e, 0xa6, 0x7e, 0xc5, 0x4d, 0x7d, 0x96, 0x5e, 0xad, 0xa8, 0x64, 0xa3, 0x1e, 0xbf,
0xa2, 0x48, 0xa7, 0x8a, 0x16, 0xe6, 0x2a, 0xbf, 0x92, 0xab, 0x91, 0x10, 0x12, 0xe3, 0x2f, 0x61,
0xcb, 0x79, 0x11, 0x59, 0x59, 0xe6, 0xca, 0x2b, 0x99, 0x37, 0x91, 0xb8, 0xa3, 0xf3, 0x93, 0x13,
0xfa, 0x4f, 0x5d, 0x8c, 0xaf, 0x21, 0xd6, 0xe1, 0xec, 0x67, 0x65, 0x74, 0x42, 0x04, 0x09, 0x86,
0x98, 0x13, 0xd8, 0x4c, 0x18, 0xda, 0x23, 0x75, 0xd0, 0xab, 0xaf, 0xef, 0x0f, 0xd3, 0x6e, 0x96,
0x08, 0xb5, 0x25, 0xc6, 0xfa, 0x38, 0x56, 0x31, 0x3e, 0x29, 0xc1, 0xfa, 0x58, 0x03, 0x99, 0xc7,
0x50, 0x3b, 0x72, 0xc6, 0xaa, 0x87, 0x9f, 0x66, 0x7a, 0x78, 0x5b, 0x2f, 0x2f, 0xc6, 0x2b, 0xb2,
0x31, 0x25, 0x63, 0xd4, 0x5d, 0x48, 0x9b, 0x2c, 0x0a, 0xd9, 0x30, 0x2d, 0xd8, 0xc4, 0x35, 0x0a,
0x1c, 0x1f, 0xeb, 0x41, 0x25, 0x55, 0x5d, 0x1e, 0x14, 0xd2, 0xcb, 0x03, 0xb4, 0x3c, 0xa2, 0xb0,
0x93, 0xbc, 0x2d, 0x5b, 0x58, 0xab, 0x34, 0x17, 0xa1, 0x83, 0x8b, 0x3f, 0x89, 0x30, 0xca, 0x85,
0x91, 0x8a, 0x84, 0x75, 0x04, 0x1e, 0x22, 0xec, 0x08, 0x41, 0xe6, 0x2d, 0x68, 0x1e, 0xe3, 0x6c,
0xe2, 0xce, 0x45, 0x89, 0xd7, 0x6e, 0x22, 0x0a, 0x99, 0x9b, 0x08, 0xf3, 0x5f, 0xd6, 0x60, 0x5d,
0x12, 0x85, 0xe9, 0x61, 0x85, 0x3d, 0xd2, 0x0e, 0x5a, 0x97, 0x0f, 0x2b, 0x24, 0xb5, 0x3a, 0xac,
0x50, 0xf2, 0xbf, 0x82, 0x5a, 0x5a, 0xed, 0x4a, 0x4b, 0xbe, 0xf9, 0xca, 0xb9, 0x17, 0x29, 0x2d,
0xc6, 0xe3, 0xe2, 0x0c, 0xcb, 0xba, 0xe2, 0xf2, 0x61, 0x4a, 0x32, 0x99, 0x82, 0xf0, 0xa8, 0x19,
0x90, 0xdd, 0xca, 0x29, 0x53, 0x66, 0x7b, 0x33, 0x63, 0xf1, 0xfa, 0x6c, 0xb2, 0xf5, 0x4a, 0x00,
0x1a, 0x61, 0x33, 0x63, 0x84, 0xca, 0x7a, 0x2f, 0xd0, 0xae, 0xa1, 0xdb, 0x21, 0x1a, 0xd4, 0xfa,
0x5c, 0x4e, 0xa5, 0x32, 0x5d, 0x6d, 0xc5, 0x33, 0x73, 0x2c, 0x62, 0x3a, 0xf3, 0xd7, 0x98, 0xfd,
0x92, 0x73, 0xf6, 0x24, 0x2a, 0x15, 0xb4, 0x00, 0xf9, 0x05, 0xc0, 0x28, 0x09, 0x1e, 0xab, 0x37,
0x21, 0x69, 0x60, 0x11, 0x1a, 0x1d, 0x5a, 0xde, 0xba, 0x5c, 0x98, 0x50, 0xcd, 0x97, 0x56, 0xdb,
0xaa, 0x25, 0x14, 0x31, 0x85, 0xf9, 0x08, 0x13, 0x89, 0x3c, 0xbe, 0xc9, 0x53, 0xe0, 0x73, 0x00,
0xed, 0x8e, 0x40, 0x9e, 0x98, 0xe6, 0x5e, 0x88, 0x68, 0x64, 0xe6, 0xbf, 0x17, 0xa0, 0xb5, 0x7c,
0xd2, 0x83, 0x1b, 0x2e, 0xdd, 0x1d, 0xb6, 0x97, 0xcf, 0x84, 0x34, 0x5f, 0xf8, 0x5d, 0x5c, 0x99,
0x53, 0x16, 0x21, 0xb9, 0x6e, 0x6e, 0x16, 0x91, 0xa7, 0x95, 0x09, 0x85, 0x71, 0x1b, 0xd6, 0xc7,
0xce, 0xc4, 0xa6, 0xe0, 0x51, 0xbe, 0xc8, 0x94, 0x63, 0x2a, 0xf3, 0x3d, 0x80, 0xa3, 0x20, 0x8a,
0x77, 0x05, 0xa8, 0xc0, 0xd8, 0x8e, 0xec, 0xf8, 0x3a, 0x80, 0xbe, 0xcd, 0x2e, 0x54, 0xc5, 0xe0,
0x9b, 0x1e, 0x9f, 0x24, 0xbd, 0xd2, 0xa9, 0x96, 0xcb, 0x07, 0x99, 0x90, 0xb4, 0xf2, 0xc1, 0xfc,
0x4d, 0x09, 0x6a, 0x24, 0x47, 0xd6, 0x92, 0x69, 0x89, 0x55, 0xe0, 0x30, 0x91, 0x57, 0x62, 0xc9,
0x00, 0x92, 0xb4, 0xe9, 0x9c, 0x04, 0x37, 0xc7, 0xd2, 0xf7, 0xf1, 0x4b, 0x76, 0x39, 0xc2, 0xfd,
0xbe, 0xe5, 0xfa, 0xcf, 0xbe, 0x50, 0x17, 0x8b, 0x20, 0x41, 0x3d, 0x84, 0x64, 0x09, 0xf6, 0xd5,
0x71, 0x53, 0x4a, 0xb0, 0xcf, 0x07, 0xcb, 0x32, 0x87, 0xb1, 0x04, 0x55, 0xf3, 0x48, 0x50, 0x2c,
0x21, 0x25, 0xd8, 0x57, 0x75, 0x4f, 0x4a, 0xb0, 0x4f, 0xe3, 0xc0, 0x32, 0xc7, 0xc5, 0x52, 0x54,
0x5d, 0x3d, 0xc8, 0x16, 0x15, 0x6f, 0xf1, 0xee, 0x4c, 0xca, 0xae, 0xf1, 0x60, 0x1a, 0x31, 0x90,
0xa5, 0x2f, 0x11, 0xed, 0xf3, 0x5e, 0x3c, 0x4b, 0xb4, 0x2f, 0xf7, 0xcc, 0x24, 0xd3, 0x9a, 0x63,
0x9d, 0x3a, 0x79, 0xc9, 0x7b, 0xf0, 0x22, 0xed, 0x99, 0x09, 0x78, 0xcc, 0x30, 0xd2, 0x73, 0x64,
0x8f, 0xce, 0xe9, 0x80, 0x85, 0x32, 0x4e, 0x83, 0x49, 0x80, 0x41, 0x82, 0x20, 0x54, 0x04, 0x26,
0x04, 0xfc, 0x4e, 0x82, 0xb7, 0xde, 0x45, 0xd1, 0x8c, 0x69, 0xe4, 0xe3, 0x89, 0x77, 0xa1, 0x4e,
0xdb, 0x78, 0x6f, 0x62, 0xb1, 0x19, 0x6c, 0x30, 0x4d, 0x0d, 0x41, 0xfd, 0xc9, 0x01, 0x02, 0x28,
0xb8, 0x3b, 0xf4, 0xb0, 0x85, 0x37, 0xd8, 0x18, 0xdc, 0xb9, 0x41, 0x45, 0xa8, 0x52, 0xf1, 0xfb,
0x05, 0x15, 0xaa, 0x2d, 0x46, 0xd6, 0x25, 0xec, 0x11, 0x81, 0xe4, 0x52, 0xa0, 0x22, 0x8a, 0x62,
0x4b, 0x2a, 0xc8, 0x20, 0x26, 0x30, 0xbf, 0x83, 0x12, 0x59, 0x47, 0x72, 0xd6, 0xbe, 0x52, 0x50,
0xc4, 0x36, 0xa8, 0xce, 0xda, 0x6f, 0x65, 0x77, 0x64, 0xd7, 0xb2, 0x84, 0x99, 0xfd, 0xd8, 0x5f,
0x16, 0xa0, 0x28, 0xfa, 0x6d, 0xb2, 0x1f, 0x3b, 0x54, 0xf9, 0x06, 0xbf, 0x68, 0xeb, 0x29, 0x57,
0x12, 0xab, 0x8a, 0xb8, 0xfc, 0x4e, 0x00, 0xb4, 0xb2, 0x58, 0x3b, 0x12, 0x4a, 0xdd, 0x63, 0xc8,
0x96, 0x76, 0x19, 0x53, 0xca, 0x5c, 0xc6, 0xbc, 0xf2, 0x92, 0x20, 0xab, 0xb8, 0x39, 0x82, 0xe2,
0x93, 0x60, 0x92, 0x1b, 0xa2, 0x50, 0xc1, 0x40, 0x1e, 0x87, 0x35, 0x04, 0x7e, 0x71, 0x3d, 0x2c,
0x4f, 0xa1, 0x03, 0x59, 0x59, 0x36, 0xb0, 0x1e, 0x66, 0x80, 0x88, 0x08, 0xa9, 0xce, 0xb8, 0xf9,
0x52, 0x9d, 0x91, 0x12, 0x20, 0x22, 0xf3, 0x2f, 0xd6, 0xa0, 0x22, 0xaf, 0xfc, 0x56, 0x46, 0x8d,
0x7c, 0x9c, 0xc6, 0x92, 0xa3, 0x37, 0x2c, 0xb2, 0x25, 0xa0, 0x37, 0xa6, 0x65, 0xa2, 0xd2, 0xd5,
0x99, 0x5b, 0xc9, 0x23, 0x05, 0xac, 0x3f, 0x24, 0x88, 0x37, 0x01, 0xb7, 0xa0, 0xa5, 0x08, 0x94,
0xe3, 0xab, 0xa8, 0x54, 0x13, 0x9b, 0x12, 0xde, 0x8e, 0xc1, 0x99, 0xbb, 0x98, 0xf2, 0xd2, 0x5d,
0xcc, 0x8f, 0x61, 0x63, 0xe6, 0x4f, 0x43, 0x6b, 0x6a, 0x9f, 0x3a, 0x53, 0xae, 0xe5, 0xa5, 0xef,
0x35, 0x08, 0x7a, 0x48, 0x40, 0x2a, 0xe5, 0x97, 0xa8, 0xb0, 0x92, 0x5f, 0x5f, 0xa6, 0xb2, 0x5f,
0xd0, 0x32, 0x8e, 0xbc, 0xa9, 0xba, 0x32, 0xa9, 0x72, 0x74, 0x48, 0x01, 0x7b, 0x1d, 0x8c, 0x5e,
0x71, 0x78, 0x05, 0x9c, 0x94, 0xc3, 0xfe, 0xbd, 0xf6, 0x61, 0xeb, 0x2d, 0xa3, 0x06, 0xe5, 0xc3,
0x7e, 0x07, 0x3f, 0x0b, 0x04, 0x6e, 0x1f, 0xfc, 0xca, 0xea, 0x1d, 0xb7, 0xd6, 0xe8, 0xb1, 0x16,
0x7d, 0xf7, 0x1f, 0x0f, 0x5b, 0x45, 0x7a, 0x43, 0xf1, 0x44, 0xdc, 0x6f, 0x95, 0xf6, 0xfe, 0x04,
0x6a, 0xc9, 0x85, 0x2b, 0x41, 0xdb, 0x07, 0x07, 0x28, 0x02, 0x3f, 0x0e, 0xba, 0x24, 0x00, 0x99,
0xf0, 0xc3, 0x6a, 0x1f, 0x1e, 0x4a, 0x09, 0xa2, 0x3b, 0x38, 0x6c, 0x77, 0xba, 0x28, 0x01, 0x45,
0x77, 0x8f, 0xdb, 0xf7, 0x0e, 0xbb, 0xad, 0x12, 0x53, 0xf5, 0x4e, 0xb8, 0x51, 0xa6, 0xee, 0x45,
0xf7, 0xa4, 0x3b, 0x6c, 0x55, 0x8c, 0x26, 0xa6, 0xce, 0xfe, 0xfd, 0xa1, 0x6c, 0xae, 0xe3, 0x7a,
0x41, 0xef, 0xb8, 0x37, 0xec, 0xb5, 0x0f, 0x7b, 0x7f, 0xd4, 0x6d, 0x55, 0xf7, 0x2c, 0xba, 0x0b,
0x4c, 0xb6, 0x20, 0x24, 0x71, 0x20, 0xba, 0xf7, 0x7b, 0xdf, 0xa2, 0x02, 0x0d, 0xa8, 0x1e, 0x77,
0x7b, 0x0f, 0x1e, 0xde, 0xeb, 0x0b, 0xd4, 0x02, 0xd5, 0x19, 0xb6, 0x1f, 0xa8, 0x31, 0x9c, 0x58,
0x83, 0xf6, 0xf0, 0x21, 0x6a, 0x80, 0xd2, 0x3b, 0xfd, 0xa3, 0xa3, 0xc7, 0x28, 0xf2, 0x3b, 0x54,
0x62, 0x0b, 0x9a, 0xdd, 0x6f, 0x87, 0x56, 0x0a, 0x2a, 0xef, 0xdd, 0xc2, 0x52, 0x2f, 0xde, 0x56,
0xf0, 0xe0, 0x8e, 0xbf, 0x93, 0x83, 0xa3, 0xf1, 0xf0, 0xec, 0xf4, 0x8e, 0x9f, 0x74, 0xc5, 0xb0,
0xb5, 0xb6, 0xb7, 0x07, 0xad, 0xe5, 0x4d, 0x83, 0x51, 0x81, 0xb5, 0xee, 0x23, 0x64, 0xc0, 0xdf,
0x07, 0x5d, 0xa4, 0xc7, 0x5f, 0x1c, 0xe1, 0xda, 0xde, 0x6d, 0xb5, 0x2b, 0x54, 0xe5, 0x52, 0x15,
0x4a, 0xc7, 0xfd, 0x63, 0x7a, 0x90, 0x42, 0xd3, 0xdd, 0xe9, 0x74, 0x07, 0x43, 0x29, 0x5c, 0x74,
0x7f, 0xd5, 0xed, 0x90, 0xf0, 0xc7, 0x70, 0x2d, 0xa7, 0x62, 0x25, 0x8d, 0x13, 0x6d, 0x2d, 0x39,
0xf1, 0xdb, 0xd0, 0x4a, 0x41, 0xa2, 0x7b, 0xd4, 0x7f, 0x42, 0x1d, 0x5f, 0x87, 0x2d, 0x1d, 0x2a,
0x97, 0x60, 0x6d, 0xef, 0x63, 0x68, 0x66, 0xca, 0x54, 0x9a, 0x9e, 0xa3, 0xee, 0x81, 0x75, 0xd4,
0x27, 0x51, 0x9b, 0x50, 0xa7, 0x46, 0x4c, 0x5e, 0xd8, 0xfb, 0x08, 0x20, 0x4d, 0xe3, 0x34, 0x18,
0x34, 0x0b, 0xd6, 0xb9, 0x77, 0x34, 0xe8, 0x0b, 0xa5, 0x73, 0xf7, 0x5b, 0xfe, 0x5e, 0xbb, 0xf3,
0xb7, 0x5b, 0x50, 0x7d, 0x40, 0x8e, 0xde, 0xf6, 0x5d, 0xe3, 0x2e, 0x6c, 0x3e, 0x70, 0x22, 0xfd,
0x36, 0xdf, 0xd0, 0xc2, 0x52, 0x72, 0xb3, 0xbf, 0xbb, 0x72, 0x2d, 0x6f, 0xbe, 0x65, 0x3c, 0xe4,
0x57, 0x2d, 0x19, 0x5e, 0x33, 0xf3, 0x0e, 0x28, 0xf7, 0x91, 0xc0, 0xee, 0xe6, 0xd2, 0xdb, 0x44,
0x94, 0xf4, 0x15, 0x34, 0x50, 0x8b, 0xf8, 0xb1, 0x59, 0x98, 0xaf, 0xc2, 0xd2, 0xc3, 0x31, 0xf3,
0xad, 0x4f, 0x0b, 0x58, 0xa1, 0xd5, 0x35, 0xc6, 0x4b, 0xf2, 0x19, 0x7f, 0x80, 0x13, 0x98, 0xbe,
0x6d, 0x33, 0xde, 0xcd, 0x28, 0xbd, 0xf2, 0xe4, 0x2d, 0x4f, 0xe1, 0x8f, 0xd0, 0x2b, 0x71, 0x2f,
0xe4, 0x9e, 0x1a, 0x1a, 0x92, 0xef, 0xa1, 0x77, 0x97, 0x01, 0x48, 0x7d, 0x1b, 0x1d, 0x87, 0x33,
0x5a, 0xae, 0x7e, 0x39, 0xe2, 0x3f, 0x47, 0xf7, 0xf2, 0x26, 0xd1, 0x9b, 0x31, 0x7d, 0x09, 0xf5,
0x84, 0xa9, 0x37, 0xbf, 0x34, 0xdb, 0x3e, 0x34, 0x12, 0xb6, 0xfe, 0xe2, 0xf2, 0xdd, 0xdd, 0x81,
0xea, 0x89, 0xba, 0xc5, 0xbb, 0x34, 0xcf, 0xa7, 0x68, 0x86, 0x7c, 0x95, 0x73, 0x69, 0x0e, 0xac,
0xeb, 0x0f, 0xdc, 0xf0, 0x8d, 0x58, 0xee, 0xa1, 0xaf, 0xc8, 0x87, 0x93, 0xc6, 0x6e, 0x66, 0x65,
0x33, 0xaf, 0x49, 0x77, 0x6f, 0xae, 0xe0, 0xe2, 0x8a, 0x02, 0x65, 0x7c, 0x0d, 0xd5, 0xf8, 0xf1,
0xa5, 0xf1, 0x83, 0x15, 0xc2, 0xf0, 0xa2, 0xfe, 0x3f, 0x2c, 0xd0, 0x36, 0x48, 0xbd, 0x6d, 0xcb,
0xb5, 0x90, 0xfc, 0xf7, 0x03, 0x6c, 0xcf, 0x07, 0xf4, 0x98, 0x89, 0x39, 0xef, 0x21, 0xa6, 0x73,
0x6e, 0xcf, 0xcf, 0xe8, 0x40, 0x3e, 0x6f, 0xe4, 0x17, 0x48, 0xf9, 0x79, 0xf2, 0xb6, 0x2e, 0xbd,
0x83, 0xba, 0xb4, 0x4b, 0xdd, 0x65, 0xd3, 0xc6, 0xfa, 0xda, 0xd0, 0xce, 0x2a, 0xf4, 0x77, 0x8f,
0xbb, 0xdb, 0x19, 0xb8, 0x2a, 0xc3, 0x99, 0x77, 0x1f, 0x2a, 0xf2, 0x91, 0xa4, 0x91, 0x9d, 0xdd,
0x0c, 0x7b, 0xae, 0x0d, 0x56, 0xe4, 0xb3, 0xc1, 0x25, 0x3e, 0xfd, 0x21, 0x61, 0xbe, 0x0d, 0xae,
0x93, 0x1b, 0x52, 0x0d, 0xf6, 0xba, 0xf1, 0x11, 0x11, 0xeb, 0xf8, 0x33, 0x36, 0x0f, 0xe6, 0xc9,
0x9a, 0x47, 0xe6, 0x65, 0xe1, 0x2b, 0xac, 0x97, 0x7a, 0xc3, 0xaa, 0x2c, 0xb7, 0x33, 0xed, 0x45,
0x1e, 0xd2, 0x70, 0x5f, 0x9f, 0xb1, 0x7e, 0x58, 0x3a, 0x85, 0xaf, 0x65, 0x41, 0x22, 0x6d, 0x0a,
0xa9, 0xda, 0xca, 0x4e, 0x85, 0xfe, 0x78, 0x30, 0x4f, 0xb9, 0x5f, 0x40, 0x13, 0xbb, 0xd2, 0x0e,
0x07, 0x73, 0x9f, 0xec, 0xed, 0xe6, 0x42, 0x39, 0x24, 0x6e, 0x64, 0xd8, 0xc3, 0x37, 0xe3, 0x67,
0xd3, 0x6d, 0x66, 0x1e, 0x1f, 0x1a, 0xef, 0x65, 0xf4, 0xcf, 0x79, 0x95, 0x98, 0x37, 0x8c, 0xbb,
0x9c, 0x09, 0xd2, 0x6d, 0x79, 0xde, 0x6e, 0x77, 0x37, 0x0f, 0x98, 0x4c, 0x81, 0xf6, 0xd6, 0xee,
0x0d, 0x98, 0x71, 0x00, 0xf7, 0xa0, 0xa1, 0x3f, 0x64, 0x34, 0x7e, 0x94, 0xd1, 0x7f, 0xf5, 0x81,
0x63, 0x7e, 0xb8, 0xaa, 0xa1, 0x0a, 0x6a, 0x47, 0xbf, 0xb2, 0xe7, 0xdd, 0x5d, 0x81, 0xc8, 0xb0,
0x1d, 0xb3, 0x50, 0x95, 0x79, 0x29, 0x26, 0xd4, 0xf6, 0x6b, 0xac, 0x80, 0xe2, 0x57, 0x81, 0xc6,
0x3b, 0xd9, 0x10, 0x95, 0x7d, 0x0b, 0x99, 0xa7, 0x67, 0x1f, 0xae, 0x25, 0x7a, 0x6a, 0xa7, 0x04,
0x17, 0xbc, 0x15, 0xd9, 0xbd, 0x00, 0x87, 0x02, 0x07, 0x70, 0x2d, 0xe7, 0x91, 0xa2, 0xf1, 0x41,
0x9e, 0x62, 0xab, 0x6f, 0x18, 0x73, 0x54, 0x3c, 0xad, 0xf0, 0xbf, 0x3a, 0x7c, 0xfe, 0x3f, 0x01,
0x00, 0x00, 0xff, 0xff, 0x68, 0x50, 0xca, 0x12, 0xf9, 0x30, 0x00, 0x00,
}
-25
View File
@@ -38,7 +38,6 @@ service GobgpApi {
rpc MonitorRib(Table) returns (stream Destination) {}
rpc MonitorBestChanged(Arguments) returns (stream Destination) {}
rpc MonitorPeerState(Arguments) returns (stream Peer) {}
rpc MonitorROAValidation(Arguments) returns (stream ROAResult) {}
rpc GetMrt(MrtArguments) returns (stream MrtMessage) {}
rpc ModMrt(ModMrtArguments) returns (Error) {}
rpc ModBmp(ModBmpArguments) returns (Error) {}
@@ -523,30 +522,6 @@ message ROA {
RPKIConf conf = 5;
}
message ROAResult {
enum ValidationReason {
UPDATE = 0;
WITHDRAW = 1;
PEER_DOWN = 2;
REVALIDATE = 3;
}
ValidationReason reason = 1;
string address = 2;
int64 timestamp = 3;
bytes aspath_attr = 4;
uint32 origin_as = 5;
string prefix = 6;
enum ValidationResult {
NONE = 0;
NOT_FOUND = 1;
VALID = 2;
INVALID = 3;
}
ValidationResult old_result = 7;
ValidationResult new_result = 8;
repeated ROA roas = 9;
}
message Vrf {
string name = 1;
bytes rd = 2;
-50
View File
@@ -24,7 +24,6 @@ import (
"golang.org/x/net/context"
"io"
"net"
"time"
)
func NewMonitorCmd() *cobra.Command {
@@ -106,54 +105,6 @@ func NewMonitorCmd() *cobra.Command {
},
}
rpkiCmd := &cobra.Command{
Use: CMD_RPKI,
Run: func(cmd *cobra.Command, args []string) {
stream, err := client.MonitorROAValidation(context.Background(), &gobgpapi.Arguments{})
if err != nil {
exitWithError(err)
}
for {
s, err := stream.Recv()
if err == io.EOF {
break
} else if err != nil {
exitWithError(err)
}
if globalOpts.Json {
j, _ := json.Marshal(s)
fmt.Println(string(j))
} else {
reason := "Update"
if s.Reason == gobgpapi.ROAResult_WITHDRAW {
reason = "Withdraw"
} else if s.Reason == gobgpapi.ROAResult_PEER_DOWN {
reason = "PeerDown"
} else if s.Reason == gobgpapi.ROAResult_REVALIDATE {
reason = "Revalidate"
} else {
reason = "Unknown"
}
aspath := &bgp.PathAttributeAsPath{}
aspath.DecodeFromBytes(s.AspathAttr)
fmt.Printf("[VALIDATION] Reason: %s, Peer: %s, Timestamp: %s, Prefix:%s, OriginAS:%d, ASPath:%s, Old:%s, New:%s", reason, s.Address, time.Unix(s.Timestamp, 0).String(), s.Prefix, s.OriginAs, aspath.String(), s.OldResult, s.NewResult)
if len(s.Roas) == 0 {
fmt.Printf("\n")
} else {
fmt.Printf(", ROAs:")
for i, roa := range s.Roas {
if i != 0 {
fmt.Printf(",")
}
fmt.Printf(" [Source: %s, AS: %v, Prefix: %s, Prefixlen: %v, Maxlen: %v]", net.JoinHostPort(roa.Conf.Address, roa.Conf.RemotePort), roa.As, roa.Prefix, roa.Prefixlen, roa.Maxlen)
}
fmt.Printf("\n")
}
}
}
},
}
adjInCmd := &cobra.Command{
Use: CMD_ADJ_IN,
Run: func(cmd *cobra.Command, args []string) {
@@ -208,7 +159,6 @@ func NewMonitorCmd() *cobra.Command {
}
monitorCmd.AddCommand(globalCmd)
monitorCmd.AddCommand(neighborCmd)
monitorCmd.AddCommand(rpkiCmd)
monitorCmd.AddCommand(adjInCmd)
return monitorCmd
-10
View File
@@ -50,7 +50,6 @@ const (
REQ_MONITOR_GLOBAL_BEST_CHANGED
REQ_MONITOR_INCOMING
REQ_MONITOR_NEIGHBOR_PEER_STATE
REQ_MONITOR_ROA_VALIDATION_RESULT
REQ_MRT_GLOBAL_RIB
REQ_MRT_LOCAL_RIB
REQ_MOD_MRT
@@ -204,15 +203,6 @@ func (s *Server) MonitorPeerState(arg *api.Arguments, stream api.GobgpApi_Monito
})
}
func (s *Server) MonitorROAValidation(arg *api.Arguments, stream api.GobgpApi_MonitorROAValidationServer) error {
req := NewGrpcRequest(REQ_MONITOR_ROA_VALIDATION_RESULT, "", bgp.RouteFamily(arg.Family), nil)
s.bgpServerCh <- req
return handleMultipleResponses(req, func(res *GrpcResponse) error {
return stream.Send(res.Data.(*api.ROAResult))
})
}
func (s *Server) neighbor(reqType int, arg *api.Arguments) (*api.Error, error) {
none := &api.Error{}
req := NewGrpcRequest(reqType, arg.Name, bgp.RouteFamily(arg.Family), nil)
+10 -41
View File
@@ -530,84 +530,53 @@ func (c *roaManager) handleGRPC(grpcReq *GrpcRequest) {
}
}
func validatePath(ownAs uint32, tree *radix.Tree, cidr string, asPath *bgp.PathAttributeAsPath) (config.RpkiValidationResultType, []*ROA) {
func validatePath(ownAs uint32, tree *radix.Tree, cidr string, asPath *bgp.PathAttributeAsPath) config.RpkiValidationResultType {
var as uint32
if asPath == nil || len(asPath.Value) == 0 {
return config.RPKI_VALIDATION_RESULT_TYPE_NOT_FOUND, []*ROA{}
return config.RPKI_VALIDATION_RESULT_TYPE_NOT_FOUND
}
asParam := asPath.Value[len(asPath.Value)-1].(*bgp.As4PathParam)
switch asParam.Type {
case bgp.BGP_ASPATH_ATTR_TYPE_SEQ:
if len(asParam.AS) == 0 {
return config.RPKI_VALIDATION_RESULT_TYPE_NOT_FOUND, []*ROA{}
return config.RPKI_VALIDATION_RESULT_TYPE_NOT_FOUND
}
as = asParam.AS[len(asParam.AS)-1]
case bgp.BGP_ASPATH_ATTR_TYPE_CONFED_SET, bgp.BGP_ASPATH_ATTR_TYPE_CONFED_SEQ:
as = ownAs
default:
return config.RPKI_VALIDATION_RESULT_TYPE_NOT_FOUND, []*ROA{}
return config.RPKI_VALIDATION_RESULT_TYPE_NOT_FOUND
}
_, n, _ := net.ParseCIDR(cidr)
ones, _ := n.Mask.Size()
prefixLen := uint8(ones)
_, b, _ := tree.LongestPrefix(table.IpToRadixkey(n.IP, prefixLen))
if b == nil {
return config.RPKI_VALIDATION_RESULT_TYPE_NOT_FOUND, []*ROA{}
return config.RPKI_VALIDATION_RESULT_TYPE_NOT_FOUND
}
roaList := make([]*ROA, 0)
result := config.RPKI_VALIDATION_RESULT_TYPE_INVALID
bucket, _ := b.(*roaBucket)
for _, r := range bucket.entries {
if prefixLen > r.MaxLen {
continue
}
if r.AS == as {
result = config.RPKI_VALIDATION_RESULT_TYPE_VALID
return config.RPKI_VALIDATION_RESULT_TYPE_VALID
}
roaList = append(roaList, r)
}
return result, roaList
return config.RPKI_VALIDATION_RESULT_TYPE_INVALID
}
func (c *roaManager) validate(pathList []*table.Path, isMonitor bool) []*api.ROAResult {
results := make([]*api.ROAResult, 0)
if len(c.clientMap) == 0 {
return results
}
func (c *roaManager) validate(pathList []*table.Path) {
for _, path := range pathList {
if path.IsWithdraw {
if path.IsWithdraw || path.IsEOR() {
continue
}
if tree, ok := c.Roas[path.GetRouteFamily()]; ok {
r, roaList := validatePath(c.AS, tree, path.GetNlri().String(), path.GetAsPath())
if isMonitor && path.Validation() != config.RpkiValidationResultType(r) {
apiRoaList := func() []*api.ROA {
apiRoaList := make([]*api.ROA, 0)
for _, r := range roaList {
apiRoaList = append(apiRoaList, r.toApiStruct())
}
return apiRoaList
}()
rr := &api.ROAResult{
Address: path.GetSource().Address.String(),
Timestamp: path.GetTimestamp().Unix(),
OriginAs: path.GetSourceAs(),
Prefix: path.GetNlri().String(),
OldResult: api.ROAResult_ValidationResult(path.Validation().ToInt()),
NewResult: api.ROAResult_ValidationResult(r.ToInt()),
Roas: apiRoaList,
}
if b := path.GetAsPath(); b != nil {
rr.AspathAttr, _ = b.Serialize()
}
results = append(results, rr)
}
r := validatePath(c.AS, tree, path.GetNlri().String(), path.GetAsPath())
path.SetValidation(config.RpkiValidationResultType(r))
}
}
return results
}
type roaClient struct {
+1 -2
View File
@@ -54,8 +54,7 @@ func strToASParam(str string) *bgp.PathAttributeAsPath {
}
func validateOne(tree *radix.Tree, cidr, aspathStr string) config.RpkiValidationResultType {
r, _ := validatePath(65500, tree, cidr, strToASParam(aspathStr))
return r
return validatePath(65500, tree, cidr, strToASParam(aspathStr))
}
func TestValidate0(t *testing.T) {
+7 -110
View File
@@ -499,8 +499,7 @@ func (server *BgpServer) dropPeerAllRoutes(peer *Peer, families []bgp.RouteFamil
ids = append(ids, table.GLOBAL_RIB_NAME)
}
for _, rf := range families {
best, withdrawn := server.globalRib.DeletePathsByPeer(ids, peer.fsm.peerInfo, rf)
server.validatePaths(nil, withdrawn, true)
best, _ := server.globalRib.DeletePathsByPeer(ids, peer.fsm.peerInfo, rf)
if !peer.isRouteServerClient() && !server.bgpConfig.Global.Collector.Enabled {
server.broadcastBests(best[table.GLOBAL_RIB_NAME])
@@ -518,33 +517,6 @@ func (server *BgpServer) dropPeerAllRoutes(peer *Peer, families []bgp.RouteFamil
return msgs
}
func (server *BgpServer) broadcastValidationResults(results []*api.ROAResult) {
for _, result := range results {
remainReqs := make([]*GrpcRequest, 0, len(server.broadcastReqs))
for _, req := range server.broadcastReqs {
select {
case <-req.EndCh:
continue
default:
}
if req.RequestType != REQ_MONITOR_ROA_VALIDATION_RESULT {
remainReqs = append(remainReqs, req)
continue
}
m := &broadcastGrpcMsg{
req: req,
result: &GrpcResponse{
Data: result,
},
}
server.broadcastMsgs = append(server.broadcastMsgs, m)
remainReqs = append(remainReqs, req)
}
server.broadcastReqs = remainReqs
}
}
func (server *BgpServer) broadcastBests(bests []*table.Path) {
for _, path := range bests {
if path == nil {
@@ -668,71 +640,9 @@ func (server *BgpServer) RSimportPaths(peer *Peer, pathList []*table.Path) []*ta
return moded
}
func (server *BgpServer) isRpkiMonitored() bool {
if len(server.broadcastReqs) > 0 {
for _, req := range server.broadcastReqs {
if req.RequestType == REQ_MONITOR_ROA_VALIDATION_RESULT {
return true
}
}
}
return false
}
func (server *BgpServer) validatePaths(newly, withdrawn []*table.Path, peerDown bool) {
isMonitor := server.isRpkiMonitored()
if isMonitor {
rrList := make([]*api.ROAResult, 0, len(withdrawn))
for _, path := range withdrawn {
if path.Validation() == config.RPKI_VALIDATION_RESULT_TYPE_INVALID {
reason := api.ROAResult_WITHDRAW
if peerDown {
reason = api.ROAResult_PEER_DOWN
}
rr := &api.ROAResult{
Reason: reason,
Address: path.GetSource().Address.String(),
Timestamp: path.GetTimestamp().Unix(),
OriginAs: path.GetSourceAs(),
Prefix: path.GetNlri().String(),
OldResult: api.ROAResult_ValidationResult(path.Validation().ToInt()),
NewResult: api.ROAResult_ValidationResult(path.Validation().ToInt()),
}
if b := path.GetAsPath(); b != nil {
rr.AspathAttr, _ = b.Serialize()
}
rrList = append(rrList, rr)
}
}
server.broadcastValidationResults(rrList)
}
if vResults := server.roaManager.validate(newly, isMonitor); isMonitor {
for i, path := range newly {
old := func() config.RpkiValidationResultType {
for _, withdrawn := range withdrawn {
if path.GetSource().Equal(withdrawn.GetSource()) {
return withdrawn.Validation()
}
}
return config.RPKI_VALIDATION_RESULT_TYPE_NONE
}()
vResults[i].OldResult = api.ROAResult_ValidationResult(old.ToInt())
}
rrList := make([]*api.ROAResult, 0, len(vResults))
for _, rr := range vResults {
invalid := api.ROAResult_ValidationResult(config.RPKI_VALIDATION_RESULT_TYPE_INVALID.ToInt())
if rr.NewResult == invalid || rr.OldResult == invalid {
rrList = append(rrList, rr)
}
}
server.broadcastValidationResults(rrList)
}
}
func (server *BgpServer) propagateUpdate(peer *Peer, pathList []*table.Path) ([]*SenderMsg, []*table.Path) {
rib := server.globalRib
var alteredPathList, newly, withdrawn []*table.Path
var alteredPathList, withdrawn []*table.Path
var best map[string][]*table.Path
msgs := make([]*SenderMsg, 0, len(server.neighborMap))
@@ -758,8 +668,7 @@ func (server *BgpServer) propagateUpdate(peer *Peer, pathList []*table.Path) ([]
ids = append(ids, targetPeer.TableID())
}
}
best, newly, withdrawn = rib.ProcessPaths(ids, append(pathList, moded...))
server.validatePaths(newly, withdrawn, false)
best, _, withdrawn = rib.ProcessPaths(ids, append(pathList, moded...))
} else {
for idx, path := range pathList {
path = server.policy.ApplyPolicy(table.GLOBAL_RIB_NAME, table.POLICY_DIRECTION_IMPORT, path, nil)
@@ -806,8 +715,7 @@ func (server *BgpServer) propagateUpdate(peer *Peer, pathList []*table.Path) ([]
}
}
alteredPathList = pathList
best, newly, withdrawn = rib.ProcessPaths([]string{table.GLOBAL_RIB_NAME}, pathList)
server.validatePaths(newly, withdrawn, false)
best, _, withdrawn = rib.ProcessPaths([]string{table.GLOBAL_RIB_NAME}, pathList)
if len(best[table.GLOBAL_RIB_NAME]) == 0 {
return nil, alteredPathList
}
@@ -948,6 +856,7 @@ func (server *BgpServer) handleFSMMessage(peer *Peer, e *FsmMsg) []*SenderMsg {
case *bgp.MessageError:
return []*SenderMsg{newSenderMsg(peer, nil, bgp.NewBGPNotificationMessage(m.TypeCode, m.SubTypeCode, m.Data), false)}
case *bgp.BGPMessage:
server.roaManager.validate(e.PathList)
pathList, eor, notification := peer.handleUpdate(e)
if notification != nil {
return []*SenderMsg{newSenderMsg(peer, nil, notification, true)}
@@ -2335,7 +2244,7 @@ func (server *BgpServer) handleGrpc(grpcReq *GrpcRequest) []*SenderMsg {
ResponseErr: err,
}
close(grpcReq.ResponseCh)
case REQ_MONITOR_GLOBAL_BEST_CHANGED, REQ_MONITOR_NEIGHBOR_PEER_STATE, REQ_MONITOR_ROA_VALIDATION_RESULT:
case REQ_MONITOR_GLOBAL_BEST_CHANGED, REQ_MONITOR_NEIGHBOR_PEER_STATE:
server.broadcastReqs = append(server.broadcastReqs, grpcReq)
case REQ_MONITOR_INCOMING:
if grpcReq.Name != "" {
@@ -2989,7 +2898,6 @@ func (server *BgpServer) handleModRpki(grpcReq *GrpcRequest) {
grpcDone(grpcReq, server.roaManager.operate(arg.Operation, arg.Address))
return
case api.Operation_REPLACE:
isMonitored := server.isRpkiMonitored()
for _, rf := range server.globalRib.GetRFlist() {
if t, ok := server.globalRib.Tables[rf]; ok {
dsts := t.GetDestinations()
@@ -3000,18 +2908,7 @@ func (server *BgpServer) handleModRpki(grpcReq *GrpcRequest) {
}
}
for _, dst := range dsts {
if rr := server.roaManager.validate(dst.GetAllKnownPathList(), isMonitored); isMonitored {
send := make([]*api.ROAResult, 0, len(rr))
for _, r := range rr {
invalid := api.ROAResult_ValidationResult(config.RPKI_VALIDATION_RESULT_TYPE_INVALID.ToInt())
if r.OldResult != r.NewResult && (r.OldResult == invalid || r.NewResult == invalid) {
r.Reason = api.ROAResult_REVALIDATE
send = append(send, r)
}
}
server.broadcastValidationResults(send)
}
server.roaManager.validate(dst.GetAllKnownPathList())
}
}
}