From bb180b8661908d979490ad99d3f9732b5eff4383 Mon Sep 17 00:00:00 2001 From: Jim Kalafut Date: Fri, 3 Aug 2018 09:32:17 -0700 Subject: [PATCH] Add PluginEnv to SystemView (#5028) --- logical/plugin.pb.go | 77 +++++ logical/plugin.proto | 10 + logical/plugin/grpc_system.go | 21 ++ logical/plugin/grpc_system_test.go | 29 ++ logical/plugin/pb/backend.pb.go | 450 +++++++++++++++++------------ logical/plugin/pb/backend.proto | 9 + logical/plugin/system.go | 34 +++ logical/plugin/system_test.go | 30 ++ logical/system_view.go | 9 + vault/dynamic_system_view.go | 7 + 10 files changed, 494 insertions(+), 182 deletions(-) create mode 100644 logical/plugin.pb.go create mode 100644 logical/plugin.proto diff --git a/logical/plugin.pb.go b/logical/plugin.pb.go new file mode 100644 index 0000000000..b568595ca0 --- /dev/null +++ b/logical/plugin.pb.go @@ -0,0 +1,77 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// source: logical/plugin.proto + +package logical // import "github.com/hashicorp/vault/logical" + +import proto "github.com/golang/protobuf/proto" +import fmt "fmt" +import math "math" + +// 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 PluginEnvironment struct { + // vault_version is the version of the Vault server + VaultVersion string `protobuf:"bytes,1,opt,name=vault_version,json=vaultVersion,proto3" json:"vault_version,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *PluginEnvironment) Reset() { *m = PluginEnvironment{} } +func (m *PluginEnvironment) String() string { return proto.CompactTextString(m) } +func (*PluginEnvironment) ProtoMessage() {} +func (*PluginEnvironment) Descriptor() ([]byte, []int) { + return fileDescriptor_plugin_d09b48a313e4c766, []int{0} +} +func (m *PluginEnvironment) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_PluginEnvironment.Unmarshal(m, b) +} +func (m *PluginEnvironment) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_PluginEnvironment.Marshal(b, m, deterministic) +} +func (dst *PluginEnvironment) XXX_Merge(src proto.Message) { + xxx_messageInfo_PluginEnvironment.Merge(dst, src) +} +func (m *PluginEnvironment) XXX_Size() int { + return xxx_messageInfo_PluginEnvironment.Size(m) +} +func (m *PluginEnvironment) XXX_DiscardUnknown() { + xxx_messageInfo_PluginEnvironment.DiscardUnknown(m) +} + +var xxx_messageInfo_PluginEnvironment proto.InternalMessageInfo + +func (m *PluginEnvironment) GetVaultVersion() string { + if m != nil { + return m.VaultVersion + } + return "" +} + +func init() { + proto.RegisterType((*PluginEnvironment)(nil), "logical.PluginEnvironment") +} + +func init() { proto.RegisterFile("logical/plugin.proto", fileDescriptor_plugin_d09b48a313e4c766) } + +var fileDescriptor_plugin_d09b48a313e4c766 = []byte{ + // 133 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x12, 0xc9, 0xc9, 0x4f, 0xcf, + 0x4c, 0x4e, 0xcc, 0xd1, 0x2f, 0xc8, 0x29, 0x4d, 0xcf, 0xcc, 0xd3, 0x2b, 0x28, 0xca, 0x2f, 0xc9, + 0x17, 0x62, 0x87, 0x8a, 0x2a, 0x59, 0x70, 0x09, 0x06, 0x80, 0x25, 0x5c, 0xf3, 0xca, 0x32, 0x8b, + 0xf2, 0xf3, 0x72, 0x53, 0xf3, 0x4a, 0x84, 0x94, 0xb9, 0x78, 0xcb, 0x12, 0x4b, 0x73, 0x4a, 0xe2, + 0xcb, 0x52, 0x8b, 0x8a, 0x33, 0xf3, 0xf3, 0x24, 0x18, 0x15, 0x18, 0x35, 0x38, 0x83, 0x78, 0xc0, + 0x82, 0x61, 0x10, 0x31, 0x27, 0x95, 0x28, 0xa5, 0xf4, 0xcc, 0x92, 0x8c, 0xd2, 0x24, 0xbd, 0xe4, + 0xfc, 0x5c, 0xfd, 0x8c, 0xc4, 0xe2, 0x8c, 0xcc, 0xe4, 0xfc, 0xa2, 0x02, 0x7d, 0xb0, 0x22, 0x7d, + 0xa8, 0xf9, 0x49, 0x6c, 0x60, 0xfb, 0x8c, 0x01, 0x01, 0x00, 0x00, 0xff, 0xff, 0xa3, 0xff, 0x48, + 0xa9, 0x87, 0x00, 0x00, 0x00, +} diff --git a/logical/plugin.proto b/logical/plugin.proto new file mode 100644 index 0000000000..ec84934725 --- /dev/null +++ b/logical/plugin.proto @@ -0,0 +1,10 @@ +syntax = "proto3"; + +option go_package = "github.com/hashicorp/vault/logical"; + +package logical; + +message PluginEnvironment { + // VaultVersion is the version of the Vault server + string vault_version = 1; +} diff --git a/logical/plugin/grpc_system.go b/logical/plugin/grpc_system.go index df8fa6728f..a0670801dd 100644 --- a/logical/plugin/grpc_system.go +++ b/logical/plugin/grpc_system.go @@ -146,6 +146,15 @@ func (s *gRPCSystemViewClient) EntityInfo(entityID string) (*logical.Entity, err return reply.Entity, nil } +func (s *gRPCSystemViewClient) PluginEnv(ctx context.Context) (*logical.PluginEnvironment, error) { + reply, err := s.client.PluginEnv(ctx, &pb.Empty{}) + if err != nil { + return nil, err + } + + return reply.PluginEnvironment, nil +} + type gRPCSystemViewServer struct { impl logical.SystemView } @@ -242,3 +251,15 @@ func (s *gRPCSystemViewServer) EntityInfo(ctx context.Context, args *pb.EntityIn Entity: entity, }, nil } + +func (s *gRPCSystemViewServer) PluginEnv(ctx context.Context, _ *pb.Empty) (*pb.PluginEnvReply, error) { + pluginEnv, err := s.impl.PluginEnv(ctx) + if err != nil { + return &pb.PluginEnvReply{ + Err: pb.ErrToString(err), + }, nil + } + return &pb.PluginEnvReply{ + PluginEnvironment: pluginEnv, + }, nil +} diff --git a/logical/plugin/grpc_system_test.go b/logical/plugin/grpc_system_test.go index ce4922ae7a..42d087beb9 100644 --- a/logical/plugin/grpc_system_test.go +++ b/logical/plugin/grpc_system_test.go @@ -201,3 +201,32 @@ func TestSystem_GRPC_entityInfo(t *testing.T) { t.Fatalf("expected: %v, got: %v", sys.EntityVal, actual) } } + +func TestSystem_GRPC_pluginEnv(t *testing.T) { + sys := logical.TestSystemView() + sys.PluginEnvironment = &logical.PluginEnvironment{ + VaultVersion: "0.10.42", + } + client, _ := plugin.TestGRPCConn(t, func(s *grpc.Server) { + pb.RegisterSystemViewServer(s, &gRPCSystemViewServer{ + impl: sys, + }) + }) + defer client.Close() + + testSystemView := newGRPCSystemView(client) + + expected, err := sys.PluginEnv(context.Background()) + if err != nil { + t.Fatal(err) + } + + actual, err := testSystemView.PluginEnv(context.Background()) + if err != nil { + t.Fatal(err) + } + + if !proto.Equal(expected, actual) { + t.Fatalf("expected: %v, got: %v", expected, actual) + } +} diff --git a/logical/plugin/pb/backend.pb.go b/logical/plugin/pb/backend.pb.go index 713b24464e..6738b2577f 100644 --- a/logical/plugin/pb/backend.pb.go +++ b/logical/plugin/pb/backend.pb.go @@ -35,7 +35,7 @@ func (m *Empty) Reset() { *m = Empty{} } func (m *Empty) String() string { return proto.CompactTextString(m) } func (*Empty) ProtoMessage() {} func (*Empty) Descriptor() ([]byte, []int) { - return fileDescriptor_backend_47c8b1854cae270c, []int{0} + return fileDescriptor_backend_6306a5aa9d5ea026, []int{0} } func (m *Empty) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_Empty.Unmarshal(m, b) @@ -66,7 +66,7 @@ func (m *Header) Reset() { *m = Header{} } func (m *Header) String() string { return proto.CompactTextString(m) } func (*Header) ProtoMessage() {} func (*Header) Descriptor() ([]byte, []int) { - return fileDescriptor_backend_47c8b1854cae270c, []int{1} + return fileDescriptor_backend_6306a5aa9d5ea026, []int{1} } func (m *Header) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_Header.Unmarshal(m, b) @@ -117,7 +117,7 @@ func (m *ProtoError) Reset() { *m = ProtoError{} } func (m *ProtoError) String() string { return proto.CompactTextString(m) } func (*ProtoError) ProtoMessage() {} func (*ProtoError) Descriptor() ([]byte, []int) { - return fileDescriptor_backend_47c8b1854cae270c, []int{2} + return fileDescriptor_backend_6306a5aa9d5ea026, []int{2} } func (m *ProtoError) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_ProtoError.Unmarshal(m, b) @@ -180,7 +180,7 @@ func (m *Paths) Reset() { *m = Paths{} } func (m *Paths) String() string { return proto.CompactTextString(m) } func (*Paths) ProtoMessage() {} func (*Paths) Descriptor() ([]byte, []int) { - return fileDescriptor_backend_47c8b1854cae270c, []int{3} + return fileDescriptor_backend_6306a5aa9d5ea026, []int{3} } func (m *Paths) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_Paths.Unmarshal(m, b) @@ -304,7 +304,7 @@ func (m *Request) Reset() { *m = Request{} } func (m *Request) String() string { return proto.CompactTextString(m) } func (*Request) ProtoMessage() {} func (*Request) Descriptor() ([]byte, []int) { - return fileDescriptor_backend_47c8b1854cae270c, []int{4} + return fileDescriptor_backend_6306a5aa9d5ea026, []int{4} } func (m *Request) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_Request.Unmarshal(m, b) @@ -523,7 +523,7 @@ func (m *Auth) Reset() { *m = Auth{} } func (m *Auth) String() string { return proto.CompactTextString(m) } func (*Auth) ProtoMessage() {} func (*Auth) Descriptor() ([]byte, []int) { - return fileDescriptor_backend_47c8b1854cae270c, []int{5} + return fileDescriptor_backend_6306a5aa9d5ea026, []int{5} } func (m *Auth) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_Auth.Unmarshal(m, b) @@ -649,7 +649,7 @@ func (m *LeaseOptions) Reset() { *m = LeaseOptions{} } func (m *LeaseOptions) String() string { return proto.CompactTextString(m) } func (*LeaseOptions) ProtoMessage() {} func (*LeaseOptions) Descriptor() ([]byte, []int) { - return fileDescriptor_backend_47c8b1854cae270c, []int{6} + return fileDescriptor_backend_6306a5aa9d5ea026, []int{6} } func (m *LeaseOptions) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_LeaseOptions.Unmarshal(m, b) @@ -723,7 +723,7 @@ func (m *Secret) Reset() { *m = Secret{} } func (m *Secret) String() string { return proto.CompactTextString(m) } func (*Secret) ProtoMessage() {} func (*Secret) Descriptor() ([]byte, []int) { - return fileDescriptor_backend_47c8b1854cae270c, []int{7} + return fileDescriptor_backend_6306a5aa9d5ea026, []int{7} } func (m *Secret) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_Secret.Unmarshal(m, b) @@ -794,7 +794,7 @@ func (m *Response) Reset() { *m = Response{} } func (m *Response) String() string { return proto.CompactTextString(m) } func (*Response) ProtoMessage() {} func (*Response) Descriptor() ([]byte, []int) { - return fileDescriptor_backend_47c8b1854cae270c, []int{8} + return fileDescriptor_backend_6306a5aa9d5ea026, []int{8} } func (m *Response) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_Response.Unmarshal(m, b) @@ -889,7 +889,7 @@ func (m *ResponseWrapInfo) Reset() { *m = ResponseWrapInfo{} } func (m *ResponseWrapInfo) String() string { return proto.CompactTextString(m) } func (*ResponseWrapInfo) ProtoMessage() {} func (*ResponseWrapInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_backend_47c8b1854cae270c, []int{9} + return fileDescriptor_backend_6306a5aa9d5ea026, []int{9} } func (m *ResponseWrapInfo) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_ResponseWrapInfo.Unmarshal(m, b) @@ -991,7 +991,7 @@ func (m *RequestWrapInfo) Reset() { *m = RequestWrapInfo{} } func (m *RequestWrapInfo) String() string { return proto.CompactTextString(m) } func (*RequestWrapInfo) ProtoMessage() {} func (*RequestWrapInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_backend_47c8b1854cae270c, []int{10} + return fileDescriptor_backend_6306a5aa9d5ea026, []int{10} } func (m *RequestWrapInfo) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_RequestWrapInfo.Unmarshal(m, b) @@ -1045,7 +1045,7 @@ func (m *HandleRequestArgs) Reset() { *m = HandleRequestArgs{} } func (m *HandleRequestArgs) String() string { return proto.CompactTextString(m) } func (*HandleRequestArgs) ProtoMessage() {} func (*HandleRequestArgs) Descriptor() ([]byte, []int) { - return fileDescriptor_backend_47c8b1854cae270c, []int{11} + return fileDescriptor_backend_6306a5aa9d5ea026, []int{11} } func (m *HandleRequestArgs) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_HandleRequestArgs.Unmarshal(m, b) @@ -1092,7 +1092,7 @@ func (m *HandleRequestReply) Reset() { *m = HandleRequestReply{} } func (m *HandleRequestReply) String() string { return proto.CompactTextString(m) } func (*HandleRequestReply) ProtoMessage() {} func (*HandleRequestReply) Descriptor() ([]byte, []int) { - return fileDescriptor_backend_47c8b1854cae270c, []int{12} + return fileDescriptor_backend_6306a5aa9d5ea026, []int{12} } func (m *HandleRequestReply) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_HandleRequestReply.Unmarshal(m, b) @@ -1138,7 +1138,7 @@ func (m *SpecialPathsReply) Reset() { *m = SpecialPathsReply{} } func (m *SpecialPathsReply) String() string { return proto.CompactTextString(m) } func (*SpecialPathsReply) ProtoMessage() {} func (*SpecialPathsReply) Descriptor() ([]byte, []int) { - return fileDescriptor_backend_47c8b1854cae270c, []int{13} + return fileDescriptor_backend_6306a5aa9d5ea026, []int{13} } func (m *SpecialPathsReply) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_SpecialPathsReply.Unmarshal(m, b) @@ -1178,7 +1178,7 @@ func (m *HandleExistenceCheckArgs) Reset() { *m = HandleExistenceCheckAr func (m *HandleExistenceCheckArgs) String() string { return proto.CompactTextString(m) } func (*HandleExistenceCheckArgs) ProtoMessage() {} func (*HandleExistenceCheckArgs) Descriptor() ([]byte, []int) { - return fileDescriptor_backend_47c8b1854cae270c, []int{14} + return fileDescriptor_backend_6306a5aa9d5ea026, []int{14} } func (m *HandleExistenceCheckArgs) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_HandleExistenceCheckArgs.Unmarshal(m, b) @@ -1226,7 +1226,7 @@ func (m *HandleExistenceCheckReply) Reset() { *m = HandleExistenceCheckR func (m *HandleExistenceCheckReply) String() string { return proto.CompactTextString(m) } func (*HandleExistenceCheckReply) ProtoMessage() {} func (*HandleExistenceCheckReply) Descriptor() ([]byte, []int) { - return fileDescriptor_backend_47c8b1854cae270c, []int{15} + return fileDescriptor_backend_6306a5aa9d5ea026, []int{15} } func (m *HandleExistenceCheckReply) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_HandleExistenceCheckReply.Unmarshal(m, b) @@ -1281,7 +1281,7 @@ func (m *SetupArgs) Reset() { *m = SetupArgs{} } func (m *SetupArgs) String() string { return proto.CompactTextString(m) } func (*SetupArgs) ProtoMessage() {} func (*SetupArgs) Descriptor() ([]byte, []int) { - return fileDescriptor_backend_47c8b1854cae270c, []int{16} + return fileDescriptor_backend_6306a5aa9d5ea026, []int{16} } func (m *SetupArgs) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_SetupArgs.Unmarshal(m, b) @@ -1334,7 +1334,7 @@ func (m *SetupReply) Reset() { *m = SetupReply{} } func (m *SetupReply) String() string { return proto.CompactTextString(m) } func (*SetupReply) ProtoMessage() {} func (*SetupReply) Descriptor() ([]byte, []int) { - return fileDescriptor_backend_47c8b1854cae270c, []int{17} + return fileDescriptor_backend_6306a5aa9d5ea026, []int{17} } func (m *SetupReply) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_SetupReply.Unmarshal(m, b) @@ -1373,7 +1373,7 @@ func (m *TypeReply) Reset() { *m = TypeReply{} } func (m *TypeReply) String() string { return proto.CompactTextString(m) } func (*TypeReply) ProtoMessage() {} func (*TypeReply) Descriptor() ([]byte, []int) { - return fileDescriptor_backend_47c8b1854cae270c, []int{18} + return fileDescriptor_backend_6306a5aa9d5ea026, []int{18} } func (m *TypeReply) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_TypeReply.Unmarshal(m, b) @@ -1411,7 +1411,7 @@ func (m *InvalidateKeyArgs) Reset() { *m = InvalidateKeyArgs{} } func (m *InvalidateKeyArgs) String() string { return proto.CompactTextString(m) } func (*InvalidateKeyArgs) ProtoMessage() {} func (*InvalidateKeyArgs) Descriptor() ([]byte, []int) { - return fileDescriptor_backend_47c8b1854cae270c, []int{19} + return fileDescriptor_backend_6306a5aa9d5ea026, []int{19} } func (m *InvalidateKeyArgs) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_InvalidateKeyArgs.Unmarshal(m, b) @@ -1451,7 +1451,7 @@ func (m *StorageEntry) Reset() { *m = StorageEntry{} } func (m *StorageEntry) String() string { return proto.CompactTextString(m) } func (*StorageEntry) ProtoMessage() {} func (*StorageEntry) Descriptor() ([]byte, []int) { - return fileDescriptor_backend_47c8b1854cae270c, []int{20} + return fileDescriptor_backend_6306a5aa9d5ea026, []int{20} } func (m *StorageEntry) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_StorageEntry.Unmarshal(m, b) @@ -1503,7 +1503,7 @@ func (m *StorageListArgs) Reset() { *m = StorageListArgs{} } func (m *StorageListArgs) String() string { return proto.CompactTextString(m) } func (*StorageListArgs) ProtoMessage() {} func (*StorageListArgs) Descriptor() ([]byte, []int) { - return fileDescriptor_backend_47c8b1854cae270c, []int{21} + return fileDescriptor_backend_6306a5aa9d5ea026, []int{21} } func (m *StorageListArgs) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_StorageListArgs.Unmarshal(m, b) @@ -1542,7 +1542,7 @@ func (m *StorageListReply) Reset() { *m = StorageListReply{} } func (m *StorageListReply) String() string { return proto.CompactTextString(m) } func (*StorageListReply) ProtoMessage() {} func (*StorageListReply) Descriptor() ([]byte, []int) { - return fileDescriptor_backend_47c8b1854cae270c, []int{22} + return fileDescriptor_backend_6306a5aa9d5ea026, []int{22} } func (m *StorageListReply) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_StorageListReply.Unmarshal(m, b) @@ -1587,7 +1587,7 @@ func (m *StorageGetArgs) Reset() { *m = StorageGetArgs{} } func (m *StorageGetArgs) String() string { return proto.CompactTextString(m) } func (*StorageGetArgs) ProtoMessage() {} func (*StorageGetArgs) Descriptor() ([]byte, []int) { - return fileDescriptor_backend_47c8b1854cae270c, []int{23} + return fileDescriptor_backend_6306a5aa9d5ea026, []int{23} } func (m *StorageGetArgs) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_StorageGetArgs.Unmarshal(m, b) @@ -1626,7 +1626,7 @@ func (m *StorageGetReply) Reset() { *m = StorageGetReply{} } func (m *StorageGetReply) String() string { return proto.CompactTextString(m) } func (*StorageGetReply) ProtoMessage() {} func (*StorageGetReply) Descriptor() ([]byte, []int) { - return fileDescriptor_backend_47c8b1854cae270c, []int{24} + return fileDescriptor_backend_6306a5aa9d5ea026, []int{24} } func (m *StorageGetReply) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_StorageGetReply.Unmarshal(m, b) @@ -1671,7 +1671,7 @@ func (m *StoragePutArgs) Reset() { *m = StoragePutArgs{} } func (m *StoragePutArgs) String() string { return proto.CompactTextString(m) } func (*StoragePutArgs) ProtoMessage() {} func (*StoragePutArgs) Descriptor() ([]byte, []int) { - return fileDescriptor_backend_47c8b1854cae270c, []int{25} + return fileDescriptor_backend_6306a5aa9d5ea026, []int{25} } func (m *StoragePutArgs) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_StoragePutArgs.Unmarshal(m, b) @@ -1709,7 +1709,7 @@ func (m *StoragePutReply) Reset() { *m = StoragePutReply{} } func (m *StoragePutReply) String() string { return proto.CompactTextString(m) } func (*StoragePutReply) ProtoMessage() {} func (*StoragePutReply) Descriptor() ([]byte, []int) { - return fileDescriptor_backend_47c8b1854cae270c, []int{26} + return fileDescriptor_backend_6306a5aa9d5ea026, []int{26} } func (m *StoragePutReply) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_StoragePutReply.Unmarshal(m, b) @@ -1747,7 +1747,7 @@ func (m *StorageDeleteArgs) Reset() { *m = StorageDeleteArgs{} } func (m *StorageDeleteArgs) String() string { return proto.CompactTextString(m) } func (*StorageDeleteArgs) ProtoMessage() {} func (*StorageDeleteArgs) Descriptor() ([]byte, []int) { - return fileDescriptor_backend_47c8b1854cae270c, []int{27} + return fileDescriptor_backend_6306a5aa9d5ea026, []int{27} } func (m *StorageDeleteArgs) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_StorageDeleteArgs.Unmarshal(m, b) @@ -1785,7 +1785,7 @@ func (m *StorageDeleteReply) Reset() { *m = StorageDeleteReply{} } func (m *StorageDeleteReply) String() string { return proto.CompactTextString(m) } func (*StorageDeleteReply) ProtoMessage() {} func (*StorageDeleteReply) Descriptor() ([]byte, []int) { - return fileDescriptor_backend_47c8b1854cae270c, []int{28} + return fileDescriptor_backend_6306a5aa9d5ea026, []int{28} } func (m *StorageDeleteReply) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_StorageDeleteReply.Unmarshal(m, b) @@ -1823,7 +1823,7 @@ func (m *TTLReply) Reset() { *m = TTLReply{} } func (m *TTLReply) String() string { return proto.CompactTextString(m) } func (*TTLReply) ProtoMessage() {} func (*TTLReply) Descriptor() ([]byte, []int) { - return fileDescriptor_backend_47c8b1854cae270c, []int{29} + return fileDescriptor_backend_6306a5aa9d5ea026, []int{29} } func (m *TTLReply) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_TTLReply.Unmarshal(m, b) @@ -1862,7 +1862,7 @@ func (m *SudoPrivilegeArgs) Reset() { *m = SudoPrivilegeArgs{} } func (m *SudoPrivilegeArgs) String() string { return proto.CompactTextString(m) } func (*SudoPrivilegeArgs) ProtoMessage() {} func (*SudoPrivilegeArgs) Descriptor() ([]byte, []int) { - return fileDescriptor_backend_47c8b1854cae270c, []int{30} + return fileDescriptor_backend_6306a5aa9d5ea026, []int{30} } func (m *SudoPrivilegeArgs) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_SudoPrivilegeArgs.Unmarshal(m, b) @@ -1907,7 +1907,7 @@ func (m *SudoPrivilegeReply) Reset() { *m = SudoPrivilegeReply{} } func (m *SudoPrivilegeReply) String() string { return proto.CompactTextString(m) } func (*SudoPrivilegeReply) ProtoMessage() {} func (*SudoPrivilegeReply) Descriptor() ([]byte, []int) { - return fileDescriptor_backend_47c8b1854cae270c, []int{31} + return fileDescriptor_backend_6306a5aa9d5ea026, []int{31} } func (m *SudoPrivilegeReply) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_SudoPrivilegeReply.Unmarshal(m, b) @@ -1945,7 +1945,7 @@ func (m *TaintedReply) Reset() { *m = TaintedReply{} } func (m *TaintedReply) String() string { return proto.CompactTextString(m) } func (*TaintedReply) ProtoMessage() {} func (*TaintedReply) Descriptor() ([]byte, []int) { - return fileDescriptor_backend_47c8b1854cae270c, []int{32} + return fileDescriptor_backend_6306a5aa9d5ea026, []int{32} } func (m *TaintedReply) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_TaintedReply.Unmarshal(m, b) @@ -1983,7 +1983,7 @@ func (m *CachingDisabledReply) Reset() { *m = CachingDisabledReply{} } func (m *CachingDisabledReply) String() string { return proto.CompactTextString(m) } func (*CachingDisabledReply) ProtoMessage() {} func (*CachingDisabledReply) Descriptor() ([]byte, []int) { - return fileDescriptor_backend_47c8b1854cae270c, []int{33} + return fileDescriptor_backend_6306a5aa9d5ea026, []int{33} } func (m *CachingDisabledReply) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_CachingDisabledReply.Unmarshal(m, b) @@ -2021,7 +2021,7 @@ func (m *ReplicationStateReply) Reset() { *m = ReplicationStateReply{} } func (m *ReplicationStateReply) String() string { return proto.CompactTextString(m) } func (*ReplicationStateReply) ProtoMessage() {} func (*ReplicationStateReply) Descriptor() ([]byte, []int) { - return fileDescriptor_backend_47c8b1854cae270c, []int{34} + return fileDescriptor_backend_6306a5aa9d5ea026, []int{34} } func (m *ReplicationStateReply) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_ReplicationStateReply.Unmarshal(m, b) @@ -2061,7 +2061,7 @@ func (m *ResponseWrapDataArgs) Reset() { *m = ResponseWrapDataArgs{} } func (m *ResponseWrapDataArgs) String() string { return proto.CompactTextString(m) } func (*ResponseWrapDataArgs) ProtoMessage() {} func (*ResponseWrapDataArgs) Descriptor() ([]byte, []int) { - return fileDescriptor_backend_47c8b1854cae270c, []int{35} + return fileDescriptor_backend_6306a5aa9d5ea026, []int{35} } func (m *ResponseWrapDataArgs) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_ResponseWrapDataArgs.Unmarshal(m, b) @@ -2114,7 +2114,7 @@ func (m *ResponseWrapDataReply) Reset() { *m = ResponseWrapDataReply{} } func (m *ResponseWrapDataReply) String() string { return proto.CompactTextString(m) } func (*ResponseWrapDataReply) ProtoMessage() {} func (*ResponseWrapDataReply) Descriptor() ([]byte, []int) { - return fileDescriptor_backend_47c8b1854cae270c, []int{36} + return fileDescriptor_backend_6306a5aa9d5ea026, []int{36} } func (m *ResponseWrapDataReply) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_ResponseWrapDataReply.Unmarshal(m, b) @@ -2159,7 +2159,7 @@ func (m *MlockEnabledReply) Reset() { *m = MlockEnabledReply{} } func (m *MlockEnabledReply) String() string { return proto.CompactTextString(m) } func (*MlockEnabledReply) ProtoMessage() {} func (*MlockEnabledReply) Descriptor() ([]byte, []int) { - return fileDescriptor_backend_47c8b1854cae270c, []int{37} + return fileDescriptor_backend_6306a5aa9d5ea026, []int{37} } func (m *MlockEnabledReply) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_MlockEnabledReply.Unmarshal(m, b) @@ -2197,7 +2197,7 @@ func (m *LocalMountReply) Reset() { *m = LocalMountReply{} } func (m *LocalMountReply) String() string { return proto.CompactTextString(m) } func (*LocalMountReply) ProtoMessage() {} func (*LocalMountReply) Descriptor() ([]byte, []int) { - return fileDescriptor_backend_47c8b1854cae270c, []int{38} + return fileDescriptor_backend_6306a5aa9d5ea026, []int{38} } func (m *LocalMountReply) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_LocalMountReply.Unmarshal(m, b) @@ -2235,7 +2235,7 @@ func (m *EntityInfoArgs) Reset() { *m = EntityInfoArgs{} } func (m *EntityInfoArgs) String() string { return proto.CompactTextString(m) } func (*EntityInfoArgs) ProtoMessage() {} func (*EntityInfoArgs) Descriptor() ([]byte, []int) { - return fileDescriptor_backend_47c8b1854cae270c, []int{39} + return fileDescriptor_backend_6306a5aa9d5ea026, []int{39} } func (m *EntityInfoArgs) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_EntityInfoArgs.Unmarshal(m, b) @@ -2274,7 +2274,7 @@ func (m *EntityInfoReply) Reset() { *m = EntityInfoReply{} } func (m *EntityInfoReply) String() string { return proto.CompactTextString(m) } func (*EntityInfoReply) ProtoMessage() {} func (*EntityInfoReply) Descriptor() ([]byte, []int) { - return fileDescriptor_backend_47c8b1854cae270c, []int{40} + return fileDescriptor_backend_6306a5aa9d5ea026, []int{40} } func (m *EntityInfoReply) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_EntityInfoReply.Unmarshal(m, b) @@ -2308,6 +2308,52 @@ func (m *EntityInfoReply) GetErr() string { return "" } +type PluginEnvReply struct { + PluginEnvironment *logical.PluginEnvironment `sentinel:"" protobuf:"bytes,1,opt,name=plugin_environment,json=pluginEnvironment,proto3" json:"plugin_environment,omitempty"` + Err string `sentinel:"" protobuf:"bytes,2,opt,name=err,proto3" json:"err,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *PluginEnvReply) Reset() { *m = PluginEnvReply{} } +func (m *PluginEnvReply) String() string { return proto.CompactTextString(m) } +func (*PluginEnvReply) ProtoMessage() {} +func (*PluginEnvReply) Descriptor() ([]byte, []int) { + return fileDescriptor_backend_6306a5aa9d5ea026, []int{41} +} +func (m *PluginEnvReply) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_PluginEnvReply.Unmarshal(m, b) +} +func (m *PluginEnvReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_PluginEnvReply.Marshal(b, m, deterministic) +} +func (dst *PluginEnvReply) XXX_Merge(src proto.Message) { + xxx_messageInfo_PluginEnvReply.Merge(dst, src) +} +func (m *PluginEnvReply) XXX_Size() int { + return xxx_messageInfo_PluginEnvReply.Size(m) +} +func (m *PluginEnvReply) XXX_DiscardUnknown() { + xxx_messageInfo_PluginEnvReply.DiscardUnknown(m) +} + +var xxx_messageInfo_PluginEnvReply proto.InternalMessageInfo + +func (m *PluginEnvReply) GetPluginEnvironment() *logical.PluginEnvironment { + if m != nil { + return m.PluginEnvironment + } + return nil +} + +func (m *PluginEnvReply) GetErr() string { + if m != nil { + return m.Err + } + return "" +} + type Connection struct { // RemoteAddr is the network address that sent the request. RemoteAddr string `sentinel:"" protobuf:"bytes,1,opt,name=remote_addr,json=remoteAddr,proto3" json:"remote_addr,omitempty"` @@ -2320,7 +2366,7 @@ func (m *Connection) Reset() { *m = Connection{} } func (m *Connection) String() string { return proto.CompactTextString(m) } func (*Connection) ProtoMessage() {} func (*Connection) Descriptor() ([]byte, []int) { - return fileDescriptor_backend_47c8b1854cae270c, []int{41} + return fileDescriptor_backend_6306a5aa9d5ea026, []int{42} } func (m *Connection) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_Connection.Unmarshal(m, b) @@ -2392,6 +2438,7 @@ func init() { proto.RegisterType((*LocalMountReply)(nil), "pb.LocalMountReply") proto.RegisterType((*EntityInfoArgs)(nil), "pb.EntityInfoArgs") proto.RegisterType((*EntityInfoReply)(nil), "pb.EntityInfoReply") + proto.RegisterType((*PluginEnvReply)(nil), "pb.PluginEnvReply") proto.RegisterType((*Connection)(nil), "pb.Connection") } @@ -2916,6 +2963,8 @@ type SystemViewClient interface { LocalMount(ctx context.Context, in *Empty, opts ...grpc.CallOption) (*LocalMountReply, error) // EntityInfo returns the basic entity information for the given entity id EntityInfo(ctx context.Context, in *EntityInfoArgs, opts ...grpc.CallOption) (*EntityInfoReply, error) + // PluginEnv returns Vault environment information used by plugins + PluginEnv(ctx context.Context, in *Empty, opts ...grpc.CallOption) (*PluginEnvReply, error) } type systemViewClient struct { @@ -3016,6 +3065,15 @@ func (c *systemViewClient) EntityInfo(ctx context.Context, in *EntityInfoArgs, o return out, nil } +func (c *systemViewClient) PluginEnv(ctx context.Context, in *Empty, opts ...grpc.CallOption) (*PluginEnvReply, error) { + out := new(PluginEnvReply) + err := c.cc.Invoke(ctx, "/pb.SystemView/PluginEnv", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + // SystemViewServer is the server API for SystemView service. type SystemViewServer interface { // DefaultLeaseTTL returns the default lease TTL set in Vault configuration @@ -3052,6 +3110,8 @@ type SystemViewServer interface { LocalMount(context.Context, *Empty) (*LocalMountReply, error) // EntityInfo returns the basic entity information for the given entity id EntityInfo(context.Context, *EntityInfoArgs) (*EntityInfoReply, error) + // PluginEnv returns Vault environment information used by plugins + PluginEnv(context.Context, *Empty) (*PluginEnvReply, error) } func RegisterSystemViewServer(s *grpc.Server, srv SystemViewServer) { @@ -3238,6 +3298,24 @@ func _SystemView_EntityInfo_Handler(srv interface{}, ctx context.Context, dec fu return interceptor(ctx, in, info, handler) } +func _SystemView_PluginEnv_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(Empty) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(SystemViewServer).PluginEnv(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/pb.SystemView/PluginEnv", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(SystemViewServer).PluginEnv(ctx, req.(*Empty)) + } + return interceptor(ctx, in, info, handler) +} + var _SystemView_serviceDesc = grpc.ServiceDesc{ ServiceName: "pb.SystemView", HandlerType: (*SystemViewServer)(nil), @@ -3282,153 +3360,161 @@ var _SystemView_serviceDesc = grpc.ServiceDesc{ MethodName: "EntityInfo", Handler: _SystemView_EntityInfo_Handler, }, + { + MethodName: "PluginEnv", + Handler: _SystemView_PluginEnv_Handler, + }, }, Streams: []grpc.StreamDesc{}, Metadata: "logical/plugin/pb/backend.proto", } func init() { - proto.RegisterFile("logical/plugin/pb/backend.proto", fileDescriptor_backend_47c8b1854cae270c) + proto.RegisterFile("logical/plugin/pb/backend.proto", fileDescriptor_backend_6306a5aa9d5ea026) } -var fileDescriptor_backend_47c8b1854cae270c = []byte{ - // 2201 bytes of a gzipped FileDescriptorProto +var fileDescriptor_backend_6306a5aa9d5ea026 = []byte{ + // 2258 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xb4, 0x58, 0x5f, 0x73, 0xdb, 0xc6, - 0x11, 0x1f, 0xfe, 0x07, 0x97, 0xa4, 0x28, 0x9d, 0x15, 0x17, 0xa6, 0x9d, 0x9a, 0x45, 0x6a, 0x9b, - 0xf1, 0xc4, 0x94, 0xcd, 0x34, 0xad, 0xd3, 0x4e, 0xd2, 0x51, 0x24, 0xc5, 0x51, 0x23, 0x25, 0x1a, - 0x48, 0x6e, 0xfa, 0x6f, 0x86, 0x39, 0x02, 0x2b, 0x12, 0x23, 0x10, 0x40, 0x0f, 0x07, 0xc9, 0x7c, - 0xea, 0xb7, 0xe8, 0x43, 0x67, 0xfa, 0x19, 0xfa, 0xda, 0xb7, 0xbe, 0x76, 0xa6, 0xcf, 0xfd, 0x1a, - 0xfd, 0x0c, 0x9d, 0xfb, 0x03, 0x10, 0x20, 0xa9, 0xc6, 0x9d, 0x69, 0xdf, 0x6e, 0xff, 0xdd, 0xde, - 0x2e, 0x76, 0x7f, 0x7b, 0x07, 0x78, 0xe8, 0x87, 0x53, 0xcf, 0xa1, 0xfe, 0x5e, 0xe4, 0x27, 0x53, - 0x2f, 0xd8, 0x8b, 0x26, 0x7b, 0x13, 0xea, 0x5c, 0x61, 0xe0, 0x0e, 0x23, 0x16, 0xf2, 0x90, 0x94, - 0xa3, 0x49, 0xef, 0xe1, 0x34, 0x0c, 0xa7, 0x3e, 0xee, 0x49, 0xce, 0x24, 0xb9, 0xdc, 0xe3, 0xde, - 0x1c, 0x63, 0x4e, 0xe7, 0x91, 0x52, 0xea, 0xdd, 0x4d, 0x77, 0xf1, 0x5c, 0x0c, 0xb8, 0xc7, 0x17, - 0x8a, 0x6f, 0x35, 0xa0, 0x76, 0x34, 0x8f, 0xf8, 0xc2, 0xea, 0x43, 0xfd, 0x0b, 0xa4, 0x2e, 0x32, - 0x72, 0x17, 0xea, 0x33, 0xb9, 0x32, 0x4b, 0xfd, 0xca, 0xa0, 0x69, 0x6b, 0xca, 0xfa, 0x2d, 0xc0, - 0x99, 0xb0, 0x39, 0x62, 0x2c, 0x64, 0xe4, 0x1e, 0x18, 0xc8, 0xd8, 0x98, 0x2f, 0x22, 0x34, 0x4b, - 0xfd, 0xd2, 0xa0, 0x63, 0x37, 0x90, 0xb1, 0x8b, 0x45, 0x84, 0xe4, 0x7b, 0x20, 0x96, 0xe3, 0x79, - 0x3c, 0x35, 0xcb, 0xfd, 0x92, 0xd8, 0x01, 0x19, 0x3b, 0x8d, 0xa7, 0xa9, 0x8d, 0x13, 0xba, 0x68, - 0x56, 0xfa, 0xa5, 0x41, 0x45, 0xda, 0x1c, 0x84, 0x2e, 0x5a, 0x7f, 0x2c, 0x41, 0xed, 0x8c, 0xf2, - 0x59, 0x4c, 0x08, 0x54, 0x59, 0x18, 0x72, 0xed, 0x5c, 0xae, 0xc9, 0x00, 0xba, 0x49, 0x40, 0x13, - 0x3e, 0x13, 0x67, 0x77, 0x28, 0x47, 0xd7, 0x2c, 0x4b, 0xf1, 0x2a, 0x9b, 0xbc, 0x07, 0x1d, 0x3f, - 0x74, 0xa8, 0x3f, 0x8e, 0x79, 0xc8, 0xe8, 0x54, 0xf8, 0x11, 0x7a, 0x6d, 0xc9, 0x3c, 0x57, 0x3c, - 0xf2, 0x14, 0x76, 0x62, 0xa4, 0xfe, 0xf8, 0x86, 0xd1, 0x28, 0x53, 0xac, 0xaa, 0x0d, 0x85, 0xe0, - 0x1b, 0x46, 0x23, 0xad, 0x6b, 0xfd, 0xad, 0x0e, 0x0d, 0x1b, 0x7f, 0x9f, 0x60, 0xcc, 0xc9, 0x16, - 0x94, 0x3d, 0x57, 0x46, 0xdb, 0xb4, 0xcb, 0x9e, 0x4b, 0x86, 0x40, 0x6c, 0x8c, 0x7c, 0xe1, 0xda, - 0x0b, 0x83, 0x03, 0x3f, 0x89, 0x39, 0x32, 0x1d, 0xf3, 0x06, 0x09, 0x79, 0x00, 0xcd, 0x30, 0x42, - 0x26, 0x79, 0x32, 0x01, 0x4d, 0x7b, 0xc9, 0x10, 0x81, 0x47, 0x94, 0xcf, 0xcc, 0xaa, 0x14, 0xc8, - 0xb5, 0xe0, 0xb9, 0x94, 0x53, 0xb3, 0xa6, 0x78, 0x62, 0x4d, 0x2c, 0xa8, 0xc7, 0xe8, 0x30, 0xe4, - 0x66, 0xbd, 0x5f, 0x1a, 0xb4, 0x46, 0x30, 0x8c, 0x26, 0xc3, 0x73, 0xc9, 0xb1, 0xb5, 0x84, 0x3c, - 0x80, 0xaa, 0xc8, 0x8b, 0xd9, 0x90, 0x1a, 0x86, 0xd0, 0xd8, 0x4f, 0xf8, 0xcc, 0x96, 0x5c, 0x32, - 0x82, 0x86, 0xfa, 0xa6, 0xb1, 0x69, 0xf4, 0x2b, 0x83, 0xd6, 0xc8, 0x14, 0x0a, 0x3a, 0xca, 0xa1, - 0x2a, 0x83, 0xf8, 0x28, 0xe0, 0x6c, 0x61, 0xa7, 0x8a, 0xe4, 0x07, 0xd0, 0x76, 0x7c, 0x0f, 0x03, - 0x3e, 0xe6, 0xe1, 0x15, 0x06, 0x66, 0x53, 0x9e, 0xa8, 0xa5, 0x78, 0x17, 0x82, 0x45, 0x46, 0xf0, - 0x4e, 0x5e, 0x65, 0x4c, 0x1d, 0x07, 0xe3, 0x38, 0x64, 0x26, 0x48, 0xdd, 0x3b, 0x39, 0xdd, 0x7d, - 0x2d, 0x12, 0xdb, 0xba, 0x5e, 0x1c, 0xf9, 0x74, 0x31, 0x0e, 0xe8, 0x1c, 0xcd, 0x96, 0xda, 0x56, - 0xf3, 0xbe, 0xa2, 0x73, 0x24, 0x0f, 0xa1, 0x35, 0x0f, 0x93, 0x80, 0x8f, 0xa3, 0xd0, 0x0b, 0xb8, - 0xd9, 0x96, 0x1a, 0x20, 0x59, 0x67, 0x82, 0x43, 0xde, 0x05, 0x45, 0xa9, 0x62, 0xec, 0xa8, 0xbc, - 0x4a, 0x8e, 0x2c, 0xc7, 0x47, 0xb0, 0xa5, 0xc4, 0xd9, 0x79, 0xb6, 0xa4, 0x4a, 0x47, 0x72, 0xb3, - 0x93, 0x3c, 0x87, 0xa6, 0xac, 0x07, 0x2f, 0xb8, 0x0c, 0xcd, 0xae, 0xcc, 0xdb, 0x9d, 0x5c, 0x5a, - 0x44, 0x4d, 0x1c, 0x07, 0x97, 0xa1, 0x6d, 0xdc, 0xe8, 0x15, 0xf9, 0x04, 0xee, 0x17, 0xe2, 0x65, - 0x38, 0xa7, 0x5e, 0xe0, 0x05, 0xd3, 0x71, 0x12, 0x63, 0x6c, 0x6e, 0xcb, 0x0a, 0x37, 0x73, 0x51, - 0xdb, 0xa9, 0xc2, 0xeb, 0x18, 0x63, 0x72, 0x1f, 0x9a, 0xaa, 0x15, 0xc7, 0x9e, 0x6b, 0xee, 0xc8, - 0x23, 0x19, 0x8a, 0x71, 0xec, 0x92, 0x27, 0xd0, 0x8d, 0x42, 0xdf, 0x73, 0x16, 0xe3, 0xf0, 0x1a, - 0x19, 0xf3, 0x5c, 0x34, 0x49, 0xbf, 0x34, 0x30, 0xec, 0x2d, 0xc5, 0xfe, 0x5a, 0x73, 0x37, 0xb5, - 0xc6, 0x1d, 0xa9, 0xb8, 0xd6, 0x1a, 0x43, 0x00, 0x27, 0x0c, 0x02, 0x74, 0x64, 0xf9, 0xed, 0xca, - 0x08, 0xb7, 0x44, 0x84, 0x07, 0x19, 0xd7, 0xce, 0x69, 0xf4, 0x3e, 0x87, 0x76, 0xbe, 0x14, 0xc8, - 0x36, 0x54, 0xae, 0x70, 0xa1, 0xcb, 0x5f, 0x2c, 0x49, 0x1f, 0x6a, 0xd7, 0xd4, 0x4f, 0x50, 0x96, - 0xbc, 0x2e, 0x44, 0x65, 0x62, 0x2b, 0xc1, 0x4f, 0xcb, 0x2f, 0x4b, 0xd6, 0x9f, 0xab, 0x50, 0x15, - 0xc5, 0x47, 0x3e, 0x82, 0x8e, 0x8f, 0x34, 0xc6, 0x71, 0x18, 0x09, 0x07, 0xb1, 0xdc, 0xaa, 0x35, - 0xda, 0x16, 0x66, 0x27, 0x42, 0xf0, 0xb5, 0xe2, 0xdb, 0x6d, 0x3f, 0x47, 0x89, 0x96, 0xf6, 0x02, - 0x8e, 0x2c, 0xa0, 0xfe, 0x58, 0x36, 0x83, 0x6a, 0xb0, 0x76, 0xca, 0x3c, 0x14, 0x4d, 0xb1, 0x5a, - 0x47, 0x95, 0xf5, 0x3a, 0xea, 0x81, 0x21, 0x73, 0xe7, 0x61, 0xac, 0x9b, 0x3d, 0xa3, 0xc9, 0x08, - 0x8c, 0x39, 0x72, 0xaa, 0x7b, 0x4d, 0xb4, 0xc4, 0xdd, 0xb4, 0x67, 0x86, 0xa7, 0x5a, 0xa0, 0x1a, - 0x22, 0xd3, 0x5b, 0xeb, 0x88, 0xfa, 0x7a, 0x47, 0xf4, 0xc0, 0xc8, 0x8a, 0xae, 0xa1, 0xbe, 0x70, - 0x4a, 0x0b, 0x98, 0x8d, 0x90, 0x79, 0xa1, 0x6b, 0x1a, 0xb2, 0x50, 0x34, 0x25, 0x40, 0x32, 0x48, - 0xe6, 0xaa, 0x84, 0x9a, 0x0a, 0x24, 0x83, 0x64, 0xbe, 0x5e, 0x31, 0xb0, 0x52, 0x31, 0x3f, 0x84, - 0x1a, 0xf5, 0x3d, 0x1a, 0xcb, 0x16, 0x12, 0x5f, 0x56, 0x23, 0xfe, 0x70, 0x5f, 0x70, 0x6d, 0x25, - 0x24, 0x1f, 0x42, 0x67, 0xca, 0xc2, 0x24, 0x1a, 0x4b, 0x12, 0x63, 0xb3, 0x2d, 0xa3, 0x5d, 0xd5, - 0x6e, 0x4b, 0xa5, 0x7d, 0xa5, 0x23, 0x3a, 0x70, 0x12, 0x26, 0x81, 0x3b, 0x76, 0x3c, 0x97, 0xc5, - 0x66, 0x47, 0x26, 0x0f, 0x24, 0xeb, 0x40, 0x70, 0x7a, 0x3f, 0x83, 0x4e, 0x21, 0x4b, 0x1b, 0x6a, - 0x65, 0x37, 0x5f, 0x2b, 0xcd, 0x7c, 0x7d, 0xfc, 0xa5, 0x04, 0xed, 0xfc, 0xe7, 0x17, 0xc6, 0x17, - 0x17, 0x27, 0xd2, 0xb8, 0x62, 0x8b, 0xa5, 0x00, 0x4e, 0x86, 0x01, 0xde, 0xd0, 0x89, 0xaf, 0x36, - 0x30, 0xec, 0x25, 0x43, 0x48, 0xbd, 0xc0, 0x61, 0x38, 0xc7, 0x80, 0xeb, 0xb9, 0xb2, 0x64, 0x90, - 0x8f, 0x01, 0xbc, 0x38, 0x4e, 0x70, 0x2c, 0x46, 0xa2, 0x04, 0xd7, 0xd6, 0xa8, 0x37, 0x54, 0xf3, - 0x72, 0x98, 0xce, 0xcb, 0xe1, 0x45, 0x3a, 0x2f, 0xed, 0xa6, 0xd4, 0x16, 0xb4, 0xf8, 0x44, 0xa7, - 0xf4, 0x8d, 0x38, 0x4b, 0x4d, 0x7d, 0x22, 0x45, 0x59, 0x7f, 0x80, 0xba, 0xc2, 0xdb, 0xff, 0x6b, - 0x49, 0xdf, 0x03, 0x43, 0xed, 0xed, 0xb9, 0xba, 0x9c, 0x1b, 0x92, 0x3e, 0x76, 0xad, 0x7f, 0x94, - 0xc0, 0xb0, 0x31, 0x8e, 0xc2, 0x20, 0xc6, 0xdc, 0x3c, 0x28, 0x7d, 0xe7, 0x3c, 0x28, 0x6f, 0x9c, - 0x07, 0xe9, 0x94, 0xa9, 0xe4, 0xa6, 0x4c, 0x0f, 0x0c, 0x86, 0xae, 0xc7, 0xd0, 0xe1, 0x7a, 0x22, - 0x65, 0xb4, 0x90, 0xdd, 0x50, 0x26, 0x80, 0x2c, 0x96, 0xdd, 0xd2, 0xb4, 0x33, 0x9a, 0xbc, 0xc8, - 0xc3, 0xa8, 0x1a, 0x50, 0xbb, 0x0a, 0x46, 0xd5, 0x71, 0xd7, 0x71, 0xd4, 0xfa, 0x7b, 0x19, 0xb6, - 0x57, 0xc5, 0x1b, 0x8a, 0x60, 0x17, 0x6a, 0xaa, 0xd1, 0x74, 0x05, 0xf1, 0xb5, 0x16, 0xab, 0xac, - 0xb4, 0xd8, 0xcf, 0xa1, 0xe3, 0x30, 0x94, 0xd3, 0xf5, 0x6d, 0xbf, 0x7e, 0x3b, 0x35, 0x90, 0x05, - 0xf0, 0x3e, 0x6c, 0x8b, 0x53, 0x46, 0xe8, 0x2e, 0x87, 0x87, 0x1a, 0xc5, 0x5d, 0xcd, 0xcf, 0xc6, - 0xc7, 0x53, 0xd8, 0x49, 0x55, 0x97, 0x3d, 0x5a, 0x2f, 0xe8, 0x1e, 0xa5, 0xad, 0x7a, 0x17, 0xea, - 0x97, 0x21, 0x9b, 0x53, 0xae, 0x41, 0x41, 0x53, 0xa2, 0x2c, 0xb2, 0xf3, 0xca, 0xab, 0x80, 0xa1, - 0xca, 0x22, 0x65, 0x8a, 0x0b, 0x92, 0x00, 0x81, 0xec, 0xf2, 0x22, 0x01, 0xc2, 0xb0, 0x8d, 0xf4, - 0xd2, 0x62, 0xfd, 0x0a, 0xba, 0x2b, 0xf3, 0x6a, 0x43, 0x22, 0x97, 0xee, 0xcb, 0x05, 0xf7, 0x85, - 0x9d, 0x2b, 0x2b, 0x3b, 0xff, 0x1a, 0x76, 0xbe, 0xa0, 0x81, 0xeb, 0xa3, 0xde, 0x7f, 0x9f, 0x4d, - 0x63, 0x31, 0x79, 0xf5, 0xf5, 0x69, 0xac, 0x2f, 0x46, 0x1d, 0xbb, 0xa9, 0x39, 0xc7, 0x2e, 0x79, - 0x04, 0x0d, 0xa6, 0xb4, 0x75, 0xe1, 0xb5, 0x72, 0x03, 0xd5, 0x4e, 0x65, 0xd6, 0xb7, 0x40, 0x0a, - 0x5b, 0x8b, 0x9b, 0xd3, 0x82, 0x0c, 0x44, 0x01, 0xaa, 0xa2, 0xd0, 0x85, 0xdd, 0xce, 0xd7, 0x91, - 0x9d, 0x49, 0x49, 0x1f, 0x2a, 0xc8, 0x98, 0x76, 0x21, 0x27, 0xda, 0xf2, 0x9e, 0x6a, 0x0b, 0x91, - 0xf5, 0x23, 0xd8, 0x39, 0x8f, 0xd0, 0xf1, 0xa8, 0x2f, 0xef, 0x98, 0xca, 0xc1, 0x43, 0xa8, 0x89, - 0x24, 0xa7, 0x3d, 0xdb, 0x94, 0x86, 0x52, 0xac, 0xf8, 0xd6, 0xb7, 0x60, 0xaa, 0x73, 0x1d, 0xbd, - 0xf1, 0x62, 0x8e, 0x81, 0x83, 0x07, 0x33, 0x74, 0xae, 0xfe, 0x87, 0x91, 0x5f, 0xc3, 0xbd, 0x4d, - 0x1e, 0xd2, 0xf3, 0xb5, 0x1c, 0x41, 0x8d, 0x2f, 0x05, 0xd0, 0x4a, 0x1f, 0x86, 0x0d, 0x92, 0xf5, - 0xb9, 0xe0, 0x88, 0xef, 0x88, 0xc2, 0x2e, 0xd6, 0x90, 0xa8, 0xa9, 0x34, 0x1f, 0x95, 0xdb, 0xf3, - 0xf1, 0xd7, 0x12, 0x34, 0xcf, 0x91, 0x27, 0x91, 0x8c, 0xe5, 0x3e, 0x34, 0x27, 0x2c, 0xbc, 0x42, - 0xb6, 0x0c, 0xc5, 0x50, 0x8c, 0x63, 0x97, 0xbc, 0x80, 0xfa, 0x41, 0x18, 0x5c, 0x7a, 0x53, 0x79, - 0xe3, 0x6e, 0x8d, 0xee, 0x29, 0x74, 0xd1, 0xb6, 0x43, 0x25, 0x53, 0xa3, 0x51, 0x2b, 0x92, 0x3e, - 0xb4, 0xf4, 0x0b, 0xe5, 0xf5, 0xeb, 0xe3, 0xc3, 0x74, 0x14, 0xe7, 0x58, 0xbd, 0x8f, 0xa1, 0x95, - 0x33, 0xfc, 0xaf, 0xa6, 0xc5, 0xf7, 0x01, 0xa4, 0x77, 0x95, 0xa3, 0x6d, 0x15, 0xaa, 0xb6, 0x14, - 0xa1, 0x3d, 0x84, 0xa6, 0xb8, 0xf5, 0x29, 0x31, 0x81, 0x6a, 0xee, 0x81, 0x22, 0xd7, 0xd6, 0x23, - 0xd8, 0x39, 0x0e, 0xae, 0xa9, 0xef, 0xb9, 0x94, 0xe3, 0x97, 0xb8, 0x90, 0x29, 0x58, 0x3b, 0x81, - 0x75, 0x0e, 0x6d, 0xfd, 0x04, 0x78, 0xab, 0x33, 0xb6, 0xf5, 0x19, 0xff, 0x73, 0x13, 0xbd, 0x0f, - 0x5d, 0xbd, 0xe9, 0x89, 0xa7, 0x5b, 0x48, 0x5c, 0x03, 0x18, 0x5e, 0x7a, 0x6f, 0xf4, 0xd6, 0x9a, - 0xb2, 0x5e, 0xc2, 0x76, 0x4e, 0x35, 0x0b, 0xe7, 0x0a, 0x17, 0x71, 0xfa, 0x34, 0x12, 0xeb, 0x34, - 0x03, 0xe5, 0x65, 0x06, 0x2c, 0xd8, 0xd2, 0x96, 0xaf, 0x90, 0xdf, 0x12, 0xdd, 0x97, 0xd9, 0x41, - 0x5e, 0xa1, 0xde, 0xfc, 0x31, 0xd4, 0x50, 0x44, 0x9a, 0x1f, 0x61, 0xf9, 0x0c, 0xd8, 0x4a, 0xbc, - 0xc1, 0xe1, 0xcb, 0xcc, 0xe1, 0x59, 0xa2, 0x1c, 0xbe, 0xe5, 0x5e, 0xd6, 0x7b, 0xd9, 0x31, 0xce, - 0x12, 0x7e, 0xdb, 0x17, 0x7d, 0x04, 0x3b, 0x5a, 0xe9, 0x10, 0x7d, 0xe4, 0x78, 0x4b, 0x48, 0x8f, - 0x81, 0x14, 0xd4, 0x6e, 0xdb, 0xee, 0x01, 0x18, 0x17, 0x17, 0x27, 0x99, 0xb4, 0x88, 0x8d, 0xd6, - 0x27, 0xb0, 0x73, 0x9e, 0xb8, 0xe1, 0x19, 0xf3, 0xae, 0x3d, 0x1f, 0xa7, 0xca, 0x59, 0xfa, 0x32, - 0x2b, 0xe5, 0x5e, 0x66, 0x1b, 0xa7, 0x91, 0x35, 0x00, 0x52, 0x30, 0xcf, 0xbe, 0x5b, 0x9c, 0xb8, - 0xa1, 0x6e, 0x61, 0xb9, 0xb6, 0x06, 0xd0, 0xbe, 0xa0, 0x62, 0xde, 0xbb, 0x4a, 0xc7, 0x84, 0x06, - 0x57, 0xb4, 0x56, 0x4b, 0x49, 0x6b, 0x04, 0xbb, 0x07, 0xd4, 0x99, 0x79, 0xc1, 0xf4, 0xd0, 0x8b, - 0xc5, 0x85, 0x47, 0x5b, 0xf4, 0xc0, 0x70, 0x35, 0x43, 0x9b, 0x64, 0xb4, 0xf5, 0x0c, 0xde, 0xc9, - 0xbd, 0x3f, 0xcf, 0x39, 0x4d, 0xf3, 0xb1, 0x0b, 0xb5, 0x58, 0x50, 0xd2, 0xa2, 0x66, 0x2b, 0xc2, - 0xfa, 0x0a, 0x76, 0xf3, 0x03, 0x58, 0x5c, 0x3f, 0xd2, 0xc0, 0xe5, 0xc5, 0xa0, 0x94, 0xbb, 0x18, - 0xe8, 0x9c, 0x95, 0x97, 0xf3, 0x64, 0x1b, 0x2a, 0xbf, 0xf8, 0xe6, 0x42, 0x17, 0xbb, 0x58, 0x5a, - 0xbf, 0x13, 0xee, 0x8b, 0xfb, 0x29, 0xf7, 0x85, 0xdb, 0x41, 0xe9, 0x6d, 0x6e, 0x07, 0x1b, 0xea, - 0xed, 0x19, 0xec, 0x9c, 0xfa, 0xa1, 0x73, 0x75, 0x14, 0xe4, 0xb2, 0x61, 0x42, 0x03, 0x83, 0x7c, - 0x32, 0x52, 0xd2, 0x7a, 0x02, 0xdd, 0x13, 0xf1, 0xfa, 0x3f, 0x15, 0xcf, 0xbd, 0x2c, 0x0b, 0xf2, - 0x87, 0x80, 0x56, 0x55, 0x84, 0xf5, 0x0c, 0xb6, 0xf4, 0x88, 0x0e, 0x2e, 0xc3, 0x14, 0x19, 0x97, - 0xc3, 0xbc, 0x54, 0xbc, 0x70, 0x5b, 0x27, 0xd0, 0x5d, 0xaa, 0xab, 0x7d, 0x9f, 0x40, 0x5d, 0x89, - 0x75, 0x6c, 0xdd, 0xec, 0x5a, 0xad, 0x34, 0x6d, 0x2d, 0xde, 0x18, 0x14, 0x2c, 0xdf, 0x61, 0x02, - 0xfb, 0x19, 0xce, 0x43, 0x8e, 0x63, 0xea, 0xba, 0x69, 0xf9, 0x82, 0x62, 0xed, 0xbb, 0x2e, 0x1b, - 0xfd, 0xab, 0x0c, 0x8d, 0xcf, 0x14, 0xa2, 0x92, 0x4f, 0xa1, 0x53, 0x98, 0x9f, 0xe4, 0x1d, 0xf9, - 0x10, 0x5b, 0x9d, 0xd6, 0xbd, 0xbb, 0x6b, 0x6c, 0x75, 0xea, 0xe7, 0xd0, 0xce, 0x4f, 0x47, 0x22, - 0x27, 0xa1, 0xfc, 0x2b, 0xd4, 0x93, 0x3b, 0xad, 0x8f, 0xce, 0x73, 0xd8, 0xdd, 0x34, 0xb7, 0xc8, - 0x83, 0xa5, 0x87, 0xf5, 0x99, 0xd9, 0x7b, 0xf7, 0x36, 0x69, 0x3a, 0xef, 0x1a, 0x07, 0x3e, 0xd2, - 0x20, 0x89, 0xf2, 0x27, 0x58, 0x2e, 0xc9, 0x0b, 0xe8, 0x14, 0x90, 0x5b, 0xc5, 0xb9, 0x06, 0xe6, - 0x79, 0x93, 0xc7, 0x50, 0x93, 0xd3, 0x82, 0x74, 0x0a, 0x63, 0xab, 0xb7, 0x95, 0x91, 0xca, 0x77, - 0x1f, 0xaa, 0xf2, 0x5f, 0x41, 0xce, 0xb1, 0xb4, 0xc8, 0x46, 0xc9, 0xe8, 0x9f, 0x25, 0x68, 0xa4, - 0xff, 0x8f, 0x5e, 0x40, 0x55, 0x80, 0x32, 0xb9, 0x93, 0xc3, 0xb5, 0x14, 0xd0, 0x7b, 0xbb, 0x2b, - 0x4c, 0xe5, 0x60, 0x08, 0x95, 0x57, 0xc8, 0x09, 0xc9, 0x09, 0x35, 0x3a, 0xf7, 0xee, 0x14, 0x79, - 0x99, 0xfe, 0x59, 0x52, 0xd4, 0xd7, 0xe0, 0x5a, 0xd0, 0xcf, 0x60, 0xf3, 0x27, 0x50, 0x57, 0xb0, - 0xa7, 0x92, 0xb2, 0x06, 0x98, 0xea, 0xe3, 0xaf, 0x03, 0xe4, 0xe8, 0x4f, 0x55, 0x80, 0xf3, 0x45, - 0xcc, 0x71, 0xfe, 0x4b, 0x0f, 0x6f, 0xc8, 0x53, 0xe8, 0x1e, 0xe2, 0x25, 0x4d, 0x7c, 0x2e, 0x9f, - 0x2f, 0xa2, 0xbd, 0x73, 0x39, 0x91, 0x37, 0xb0, 0x0c, 0x3d, 0x1f, 0x43, 0xeb, 0x94, 0xbe, 0xf9, - 0x6e, 0xbd, 0x4f, 0xa1, 0x53, 0x00, 0x45, 0x7d, 0xc4, 0x55, 0x98, 0xd5, 0x47, 0x5c, 0x87, 0xcf, - 0xc7, 0xd0, 0xd0, 0x50, 0x99, 0xf7, 0x21, 0x87, 0x4a, 0x01, 0x42, 0x7f, 0x0c, 0xdd, 0x15, 0xa0, - 0xcc, 0xeb, 0xcb, 0x7f, 0x5c, 0x1b, 0x81, 0xf4, 0xa5, 0x78, 0x7e, 0x14, 0xc1, 0x32, 0x6f, 0x78, - 0x4f, 0x01, 0xd4, 0x26, 0x34, 0x7d, 0x55, 0x7c, 0xb8, 0xc8, 0x67, 0x9b, 0xb9, 0x8a, 0x67, 0x29, - 0x9a, 0xa6, 0x1b, 0x6d, 0xc2, 0xc5, 0xe7, 0xd0, 0xce, 0x43, 0xda, 0x5a, 0x0b, 0xae, 0xe3, 0xdd, - 0x07, 0x00, 0x4b, 0x54, 0xcb, 0xeb, 0xcb, 0xf2, 0x58, 0x05, 0xbc, 0x8f, 0x00, 0x96, 0x58, 0xa5, - 0xaa, 0xaa, 0x08, 0x75, 0xca, 0x6c, 0x05, 0xcf, 0x3e, 0x1b, 0xfe, 0xe6, 0x83, 0xa9, 0xc7, 0x67, - 0xc9, 0x64, 0xe8, 0x84, 0xf3, 0xbd, 0x19, 0x8d, 0x67, 0x9e, 0x13, 0xb2, 0x68, 0xef, 0x5a, 0x14, - 0xc8, 0xde, 0xda, 0x8f, 0xe9, 0x49, 0x5d, 0xbe, 0xa8, 0x3e, 0xfc, 0x77, 0x00, 0x00, 0x00, 0xff, - 0xff, 0x6e, 0x84, 0x57, 0xb3, 0xb4, 0x16, 0x00, 0x00, + 0x11, 0x1f, 0x92, 0x22, 0x09, 0x2e, 0x49, 0x51, 0x3a, 0x2b, 0x2e, 0x4c, 0x3b, 0x35, 0x8b, 0xd4, + 0xb6, 0xe2, 0x89, 0x29, 0x9b, 0x69, 0x5a, 0xa7, 0x9d, 0xa4, 0xa3, 0xc8, 0x8a, 0xa3, 0x46, 0x4a, + 0x34, 0x90, 0xdc, 0xf4, 0xdf, 0x0c, 0x73, 0x02, 0x56, 0x24, 0x46, 0x20, 0x80, 0x1e, 0x0e, 0xb2, + 0xf9, 0xd4, 0x6f, 0xd1, 0xb7, 0x7e, 0x86, 0xbe, 0xf6, 0xad, 0x6f, 0x9d, 0xce, 0xf4, 0xb9, 0x5f, + 0xa3, 0x9f, 0xa1, 0x73, 0x7f, 0x00, 0x1e, 0x48, 0xaa, 0x71, 0x67, 0xda, 0xb7, 0xdb, 0x3f, 0xb7, + 0x77, 0xbb, 0xd8, 0xfd, 0xed, 0x1e, 0xe0, 0x7e, 0x18, 0x4f, 0x02, 0x8f, 0x86, 0x7b, 0x49, 0x98, + 0x4d, 0x82, 0x68, 0x2f, 0xb9, 0xd8, 0xbb, 0xa0, 0xde, 0x15, 0x46, 0xfe, 0x30, 0x61, 0x31, 0x8f, + 0x49, 0x35, 0xb9, 0xe8, 0xdf, 0x9f, 0xc4, 0xf1, 0x24, 0xc4, 0x3d, 0xc9, 0xb9, 0xc8, 0x2e, 0xf7, + 0x78, 0x30, 0xc3, 0x94, 0xd3, 0x59, 0xa2, 0x94, 0xfa, 0xb7, 0x73, 0x2b, 0x81, 0x8f, 0x11, 0x0f, + 0xf8, 0x5c, 0xf3, 0x77, 0xca, 0xd6, 0x15, 0xd7, 0x69, 0x42, 0xfd, 0x70, 0x96, 0xf0, 0xb9, 0x33, + 0x80, 0xc6, 0x17, 0x48, 0x7d, 0x64, 0xe4, 0x36, 0x34, 0xa6, 0x72, 0x65, 0x57, 0x06, 0xb5, 0xdd, + 0x96, 0xab, 0x29, 0xe7, 0xb7, 0x00, 0xa7, 0x62, 0xcf, 0x21, 0x63, 0x31, 0x23, 0x77, 0xc0, 0x42, + 0xc6, 0xc6, 0x7c, 0x9e, 0xa0, 0x5d, 0x19, 0x54, 0x76, 0xbb, 0x6e, 0x13, 0x19, 0x3b, 0x9f, 0x27, + 0x48, 0xbe, 0x07, 0x62, 0x39, 0x9e, 0xa5, 0x13, 0xbb, 0x3a, 0xa8, 0x08, 0x0b, 0xc8, 0xd8, 0x49, + 0x3a, 0xc9, 0xf7, 0x78, 0xb1, 0x8f, 0x76, 0x6d, 0x50, 0xd9, 0xad, 0xc9, 0x3d, 0x07, 0xb1, 0x8f, + 0xce, 0x1f, 0x2b, 0x50, 0x3f, 0xa5, 0x7c, 0x9a, 0x12, 0x02, 0x1b, 0x2c, 0x8e, 0xb9, 0x3e, 0x5c, + 0xae, 0xc9, 0x2e, 0xf4, 0xb2, 0x88, 0x66, 0x7c, 0x2a, 0x3c, 0xf2, 0x28, 0x47, 0xdf, 0xae, 0x4a, + 0xf1, 0x32, 0x9b, 0xbc, 0x07, 0xdd, 0x30, 0xf6, 0x68, 0x38, 0x4e, 0x79, 0xcc, 0xe8, 0x44, 0x9c, + 0x23, 0xf4, 0x3a, 0x92, 0x79, 0xa6, 0x78, 0xe4, 0x31, 0x6c, 0xa7, 0x48, 0xc3, 0xf1, 0x6b, 0x46, + 0x93, 0x42, 0x71, 0x43, 0x19, 0x14, 0x82, 0x6f, 0x18, 0x4d, 0xb4, 0xae, 0xf3, 0xd7, 0x06, 0x34, + 0x5d, 0xfc, 0x7d, 0x86, 0x29, 0x27, 0x9b, 0x50, 0x0d, 0x7c, 0xe9, 0x6d, 0xcb, 0xad, 0x06, 0x3e, + 0x19, 0x02, 0x71, 0x31, 0x09, 0xc5, 0xd1, 0x41, 0x1c, 0x1d, 0x84, 0x59, 0xca, 0x91, 0x69, 0x9f, + 0xd7, 0x48, 0xc8, 0x3d, 0x68, 0xc5, 0x09, 0x32, 0xc9, 0x93, 0x01, 0x68, 0xb9, 0x0b, 0x86, 0x70, + 0x3c, 0xa1, 0x7c, 0x6a, 0x6f, 0x48, 0x81, 0x5c, 0x0b, 0x9e, 0x4f, 0x39, 0xb5, 0xeb, 0x8a, 0x27, + 0xd6, 0xc4, 0x81, 0x46, 0x8a, 0x1e, 0x43, 0x6e, 0x37, 0x06, 0x95, 0xdd, 0xf6, 0x08, 0x86, 0xc9, + 0xc5, 0xf0, 0x4c, 0x72, 0x5c, 0x2d, 0x21, 0xf7, 0x60, 0x43, 0xc4, 0xc5, 0x6e, 0x4a, 0x0d, 0x4b, + 0x68, 0xec, 0x67, 0x7c, 0xea, 0x4a, 0x2e, 0x19, 0x41, 0x53, 0x7d, 0xd3, 0xd4, 0xb6, 0x06, 0xb5, + 0xdd, 0xf6, 0xc8, 0x16, 0x0a, 0xda, 0xcb, 0xa1, 0x4a, 0x83, 0xf4, 0x30, 0xe2, 0x6c, 0xee, 0xe6, + 0x8a, 0xe4, 0x07, 0xd0, 0xf1, 0xc2, 0x00, 0x23, 0x3e, 0xe6, 0xf1, 0x15, 0x46, 0x76, 0x4b, 0xde, + 0xa8, 0xad, 0x78, 0xe7, 0x82, 0x45, 0x46, 0xf0, 0x8e, 0xa9, 0x32, 0xa6, 0x9e, 0x87, 0x69, 0x1a, + 0x33, 0x1b, 0xa4, 0xee, 0x2d, 0x43, 0x77, 0x5f, 0x8b, 0x84, 0x59, 0x3f, 0x48, 0x93, 0x90, 0xce, + 0xc7, 0x11, 0x9d, 0xa1, 0xdd, 0x56, 0x66, 0x35, 0xef, 0x2b, 0x3a, 0x43, 0x72, 0x1f, 0xda, 0xb3, + 0x38, 0x8b, 0xf8, 0x38, 0x89, 0x83, 0x88, 0xdb, 0x1d, 0xa9, 0x01, 0x92, 0x75, 0x2a, 0x38, 0xe4, + 0x5d, 0x50, 0x94, 0x4a, 0xc6, 0xae, 0x8a, 0xab, 0xe4, 0xc8, 0x74, 0x7c, 0x00, 0x9b, 0x4a, 0x5c, + 0xdc, 0x67, 0x53, 0xaa, 0x74, 0x25, 0xb7, 0xb8, 0xc9, 0x53, 0x68, 0xc9, 0x7c, 0x08, 0xa2, 0xcb, + 0xd8, 0xee, 0xc9, 0xb8, 0xdd, 0x32, 0xc2, 0x22, 0x72, 0xe2, 0x28, 0xba, 0x8c, 0x5d, 0xeb, 0xb5, + 0x5e, 0x91, 0x4f, 0xe0, 0x6e, 0xc9, 0x5f, 0x86, 0x33, 0x1a, 0x44, 0x41, 0x34, 0x19, 0x67, 0x29, + 0xa6, 0xf6, 0x96, 0xcc, 0x70, 0xdb, 0xf0, 0xda, 0xcd, 0x15, 0x5e, 0xa5, 0x98, 0x92, 0xbb, 0xd0, + 0x52, 0x05, 0x3a, 0x0e, 0x7c, 0x7b, 0x5b, 0x5e, 0xc9, 0x52, 0x8c, 0x23, 0x9f, 0x3c, 0x82, 0x5e, + 0x12, 0x87, 0x81, 0x37, 0x1f, 0xc7, 0xd7, 0xc8, 0x58, 0xe0, 0xa3, 0x4d, 0x06, 0x95, 0x5d, 0xcb, + 0xdd, 0x54, 0xec, 0xaf, 0x35, 0x77, 0x5d, 0x69, 0xdc, 0x92, 0x8a, 0x2b, 0xa5, 0x31, 0x04, 0xf0, + 0xe2, 0x28, 0x42, 0x4f, 0xa6, 0xdf, 0x8e, 0xf4, 0x70, 0x53, 0x78, 0x78, 0x50, 0x70, 0x5d, 0x43, + 0xa3, 0xff, 0x39, 0x74, 0xcc, 0x54, 0x20, 0x5b, 0x50, 0xbb, 0xc2, 0xb9, 0x4e, 0x7f, 0xb1, 0x24, + 0x03, 0xa8, 0x5f, 0xd3, 0x30, 0x43, 0x99, 0xf2, 0x3a, 0x11, 0xd5, 0x16, 0x57, 0x09, 0x7e, 0x5a, + 0x7d, 0x5e, 0x71, 0xfe, 0xb4, 0x01, 0x1b, 0x22, 0xf9, 0xc8, 0x47, 0xd0, 0x0d, 0x91, 0xa6, 0x38, + 0x8e, 0x13, 0x71, 0x40, 0x2a, 0x4d, 0xb5, 0x47, 0x5b, 0x62, 0xdb, 0xb1, 0x10, 0x7c, 0xad, 0xf8, + 0x6e, 0x27, 0x34, 0x28, 0x51, 0xd2, 0x41, 0xc4, 0x91, 0x45, 0x34, 0x1c, 0xcb, 0x62, 0x50, 0x05, + 0xd6, 0xc9, 0x99, 0x2f, 0x44, 0x51, 0x2c, 0xe7, 0x51, 0x6d, 0x35, 0x8f, 0xfa, 0x60, 0xc9, 0xd8, + 0x05, 0x98, 0xea, 0x62, 0x2f, 0x68, 0x32, 0x02, 0x6b, 0x86, 0x9c, 0xea, 0x5a, 0x13, 0x25, 0x71, + 0x3b, 0xaf, 0x99, 0xe1, 0x89, 0x16, 0xa8, 0x82, 0x28, 0xf4, 0x56, 0x2a, 0xa2, 0xb1, 0x5a, 0x11, + 0x7d, 0xb0, 0x8a, 0xa4, 0x6b, 0xaa, 0x2f, 0x9c, 0xd3, 0x02, 0x66, 0x13, 0x64, 0x41, 0xec, 0xdb, + 0x96, 0x4c, 0x14, 0x4d, 0x09, 0x90, 0x8c, 0xb2, 0x99, 0x4a, 0xa1, 0x96, 0x02, 0xc9, 0x28, 0x9b, + 0xad, 0x66, 0x0c, 0x2c, 0x65, 0xcc, 0x0f, 0xa1, 0x4e, 0xc3, 0x80, 0xa6, 0xb2, 0x84, 0xc4, 0x97, + 0xd5, 0x78, 0x3f, 0xdc, 0x17, 0x5c, 0x57, 0x09, 0xc9, 0x87, 0xd0, 0x9d, 0xb0, 0x38, 0x4b, 0xc6, + 0x92, 0xc4, 0xd4, 0xee, 0x48, 0x6f, 0x97, 0xb5, 0x3b, 0x52, 0x69, 0x5f, 0xe9, 0x88, 0x0a, 0xbc, + 0x88, 0xb3, 0xc8, 0x1f, 0x7b, 0x81, 0xcf, 0x52, 0xbb, 0x2b, 0x83, 0x07, 0x92, 0x75, 0x20, 0x38, + 0xfd, 0x9f, 0x41, 0xb7, 0x14, 0xa5, 0x35, 0xb9, 0xb2, 0x63, 0xe6, 0x4a, 0xcb, 0xcc, 0x8f, 0x3f, + 0x57, 0xa0, 0x63, 0x7e, 0x7e, 0xb1, 0xf9, 0xfc, 0xfc, 0x58, 0x6e, 0xae, 0xb9, 0x62, 0x29, 0x80, + 0x93, 0x61, 0x84, 0xaf, 0xe9, 0x45, 0xa8, 0x0c, 0x58, 0xee, 0x82, 0x21, 0xa4, 0x41, 0xe4, 0x31, + 0x9c, 0x61, 0xc4, 0x75, 0x5f, 0x59, 0x30, 0xc8, 0xc7, 0x00, 0x41, 0x9a, 0x66, 0x38, 0x16, 0x8d, + 0x52, 0x82, 0x6b, 0x7b, 0xd4, 0x1f, 0xaa, 0x2e, 0x3a, 0xcc, 0xbb, 0xe8, 0xf0, 0x3c, 0xef, 0xa2, + 0x6e, 0x4b, 0x6a, 0x0b, 0x5a, 0x7c, 0xa2, 0x13, 0xfa, 0x46, 0xdc, 0xa5, 0xae, 0x3e, 0x91, 0xa2, + 0x9c, 0x3f, 0x40, 0x43, 0xe1, 0xed, 0xff, 0x35, 0xa5, 0xef, 0x80, 0xa5, 0x6c, 0x07, 0xbe, 0x4e, + 0xe7, 0xa6, 0xa4, 0x8f, 0x7c, 0xe7, 0x1f, 0x15, 0xb0, 0x5c, 0x4c, 0x93, 0x38, 0x4a, 0xd1, 0xe8, + 0x07, 0x95, 0xef, 0xec, 0x07, 0xd5, 0xb5, 0xfd, 0x20, 0xef, 0x32, 0x35, 0xa3, 0xcb, 0xf4, 0xc1, + 0x62, 0xe8, 0x07, 0x0c, 0x3d, 0xae, 0x3b, 0x52, 0x41, 0x0b, 0xd9, 0x6b, 0xca, 0x04, 0x90, 0xa5, + 0xb2, 0x5a, 0x5a, 0x6e, 0x41, 0x93, 0x67, 0x26, 0x8c, 0xaa, 0x06, 0xb5, 0xa3, 0x60, 0x54, 0x5d, + 0x77, 0x15, 0x47, 0x9d, 0xbf, 0x57, 0x61, 0x6b, 0x59, 0xbc, 0x26, 0x09, 0x76, 0xa0, 0xae, 0x0a, + 0x4d, 0x67, 0x10, 0x5f, 0x29, 0xb1, 0xda, 0x52, 0x89, 0xfd, 0x1c, 0xba, 0x1e, 0x43, 0xd9, 0x5d, + 0xdf, 0xf6, 0xeb, 0x77, 0xf2, 0x0d, 0x32, 0x01, 0xde, 0x87, 0x2d, 0x71, 0xcb, 0x04, 0xfd, 0x45, + 0xf3, 0x50, 0xad, 0xb8, 0xa7, 0xf9, 0x45, 0xfb, 0x78, 0x0c, 0xdb, 0xb9, 0xea, 0xa2, 0x46, 0x1b, + 0x25, 0xdd, 0xc3, 0xbc, 0x54, 0x6f, 0x43, 0xe3, 0x32, 0x66, 0x33, 0xca, 0x35, 0x28, 0x68, 0x4a, + 0xa4, 0x45, 0x71, 0x5f, 0x39, 0x0a, 0x58, 0x2a, 0x2d, 0x72, 0xa6, 0x18, 0x90, 0x04, 0x08, 0x14, + 0xc3, 0x8b, 0x04, 0x08, 0xcb, 0xb5, 0xf2, 0xa1, 0xc5, 0xf9, 0x15, 0xf4, 0x96, 0xfa, 0xd5, 0x9a, + 0x40, 0x2e, 0x8e, 0xaf, 0x96, 0x8e, 0x2f, 0x59, 0xae, 0x2d, 0x59, 0xfe, 0x35, 0x6c, 0x7f, 0x41, + 0x23, 0x3f, 0x44, 0x6d, 0x7f, 0x9f, 0x4d, 0x52, 0xd1, 0x79, 0xf5, 0xf8, 0x34, 0xd6, 0x83, 0x51, + 0xd7, 0x6d, 0x69, 0xce, 0x91, 0x4f, 0x1e, 0x40, 0x93, 0x29, 0x6d, 0x9d, 0x78, 0x6d, 0xa3, 0xa1, + 0xba, 0xb9, 0xcc, 0xf9, 0x16, 0x48, 0xc9, 0xb4, 0x98, 0x9c, 0xe6, 0x64, 0x57, 0x24, 0xa0, 0x4a, + 0x0a, 0x9d, 0xd8, 0x1d, 0x33, 0x8f, 0xdc, 0x42, 0x4a, 0x06, 0x50, 0x43, 0xc6, 0xf4, 0x11, 0xb2, + 0xa3, 0x2d, 0xe6, 0x54, 0x57, 0x88, 0x9c, 0x1f, 0xc1, 0xf6, 0x59, 0x82, 0x5e, 0x40, 0x43, 0x39, + 0x63, 0xaa, 0x03, 0xee, 0x43, 0x5d, 0x04, 0x39, 0xaf, 0xd9, 0x96, 0xdc, 0x28, 0xc5, 0x8a, 0xef, + 0x7c, 0x0b, 0xb6, 0xba, 0xd7, 0xe1, 0x9b, 0x20, 0xe5, 0x18, 0x79, 0x78, 0x30, 0x45, 0xef, 0xea, + 0x7f, 0xe8, 0xf9, 0x35, 0xdc, 0x59, 0x77, 0x42, 0x7e, 0xbf, 0xb6, 0x27, 0xa8, 0xf1, 0xa5, 0x00, + 0x5a, 0x79, 0x86, 0xe5, 0x82, 0x64, 0x7d, 0x2e, 0x38, 0xe2, 0x3b, 0xa2, 0xd8, 0x97, 0x6a, 0x48, + 0xd4, 0x54, 0x1e, 0x8f, 0xda, 0xcd, 0xf1, 0xf8, 0x4b, 0x05, 0x5a, 0x67, 0xc8, 0xb3, 0x44, 0xfa, + 0x72, 0x17, 0x5a, 0x17, 0x2c, 0xbe, 0x42, 0xb6, 0x70, 0xc5, 0x52, 0x8c, 0x23, 0x9f, 0x3c, 0x83, + 0xc6, 0x41, 0x1c, 0x5d, 0x06, 0x13, 0x39, 0x71, 0xb7, 0x47, 0x77, 0x14, 0xba, 0xe8, 0xbd, 0x43, + 0x25, 0x53, 0xad, 0x51, 0x2b, 0x92, 0x01, 0xb4, 0xf5, 0xbb, 0xe5, 0xd5, 0xab, 0xa3, 0x17, 0x79, + 0x2b, 0x36, 0x58, 0xfd, 0x8f, 0xa1, 0x6d, 0x6c, 0xfc, 0xaf, 0xba, 0xc5, 0xf7, 0x01, 0xe4, 0xe9, + 0x2a, 0x46, 0x5b, 0xca, 0x55, 0xbd, 0x53, 0xb8, 0x76, 0x1f, 0x5a, 0x62, 0xea, 0x53, 0x62, 0x02, + 0x1b, 0xc6, 0x03, 0x45, 0xae, 0x9d, 0x07, 0xb0, 0x7d, 0x14, 0x5d, 0xd3, 0x30, 0xf0, 0x29, 0xc7, + 0x2f, 0x71, 0x2e, 0x43, 0xb0, 0x72, 0x03, 0xe7, 0x0c, 0x3a, 0xfa, 0x09, 0xf0, 0x56, 0x77, 0xec, + 0xe8, 0x3b, 0xfe, 0xe7, 0x22, 0x7a, 0x1f, 0x7a, 0xda, 0xe8, 0x71, 0xa0, 0x4b, 0x48, 0x8c, 0x01, + 0x0c, 0x2f, 0x83, 0x37, 0xda, 0xb4, 0xa6, 0x9c, 0xe7, 0xb0, 0x65, 0xa8, 0x16, 0xee, 0x5c, 0xe1, + 0x3c, 0xcd, 0x9f, 0x46, 0x62, 0x9d, 0x47, 0xa0, 0xba, 0x88, 0x80, 0x03, 0x9b, 0x7a, 0xe7, 0x4b, + 0xe4, 0x37, 0x78, 0xf7, 0x65, 0x71, 0x91, 0x97, 0xa8, 0x8d, 0x3f, 0x84, 0x3a, 0x0a, 0x4f, 0xcd, + 0x16, 0x66, 0x46, 0xc0, 0x55, 0xe2, 0x35, 0x07, 0x3e, 0x2f, 0x0e, 0x3c, 0xcd, 0xd4, 0x81, 0x6f, + 0x69, 0xcb, 0x79, 0xaf, 0xb8, 0xc6, 0x69, 0xc6, 0x6f, 0xfa, 0xa2, 0x0f, 0x60, 0x5b, 0x2b, 0xbd, + 0xc0, 0x10, 0x39, 0xde, 0xe0, 0xd2, 0x43, 0x20, 0x25, 0xb5, 0x9b, 0xcc, 0xdd, 0x03, 0xeb, 0xfc, + 0xfc, 0xb8, 0x90, 0x96, 0xb1, 0xd1, 0xf9, 0x04, 0xb6, 0xcf, 0x32, 0x3f, 0x3e, 0x65, 0xc1, 0x75, + 0x10, 0xe2, 0x44, 0x1d, 0x96, 0xbf, 0xcc, 0x2a, 0xc6, 0xcb, 0x6c, 0x6d, 0x37, 0x72, 0x76, 0x81, + 0x94, 0xb6, 0x17, 0xdf, 0x2d, 0xcd, 0xfc, 0x58, 0x97, 0xb0, 0x5c, 0x3b, 0xbb, 0xd0, 0x39, 0xa7, + 0xa2, 0xdf, 0xfb, 0x4a, 0xc7, 0x86, 0x26, 0x57, 0xb4, 0x56, 0xcb, 0x49, 0x67, 0x04, 0x3b, 0x07, + 0xd4, 0x9b, 0x06, 0xd1, 0xe4, 0x45, 0x90, 0x8a, 0x81, 0x47, 0xef, 0xe8, 0x83, 0xe5, 0x6b, 0x86, + 0xde, 0x52, 0xd0, 0xce, 0x13, 0x78, 0xc7, 0x78, 0x7f, 0x9e, 0x71, 0x9a, 0xc7, 0x63, 0x07, 0xea, + 0xa9, 0xa0, 0xe4, 0x8e, 0xba, 0xab, 0x08, 0xe7, 0x2b, 0xd8, 0x31, 0x1b, 0xb0, 0x18, 0x3f, 0x72, + 0xc7, 0xe5, 0x60, 0x50, 0x31, 0x06, 0x03, 0x1d, 0xb3, 0xea, 0xa2, 0x9f, 0x6c, 0x41, 0xed, 0x17, + 0xdf, 0x9c, 0xeb, 0x64, 0x17, 0x4b, 0xe7, 0x77, 0xe2, 0xf8, 0xb2, 0x3d, 0x75, 0x7c, 0x69, 0x3a, + 0xa8, 0xbc, 0xcd, 0x74, 0xb0, 0x26, 0xdf, 0x9e, 0xc0, 0xf6, 0x49, 0x18, 0x7b, 0x57, 0x87, 0x91, + 0x11, 0x0d, 0x1b, 0x9a, 0x18, 0x99, 0xc1, 0xc8, 0x49, 0xe7, 0x11, 0xf4, 0x8e, 0xc5, 0xeb, 0xff, + 0x44, 0x3c, 0xf7, 0x8a, 0x28, 0xc8, 0x1f, 0x02, 0x5a, 0x55, 0x11, 0xce, 0x13, 0xd8, 0xd4, 0x2d, + 0x3a, 0xba, 0x8c, 0x73, 0x64, 0x5c, 0x34, 0xf3, 0x4a, 0x79, 0xe0, 0x76, 0x8e, 0xa1, 0xb7, 0x50, + 0x57, 0x76, 0x1f, 0x41, 0x43, 0x89, 0xb5, 0x6f, 0xbd, 0x62, 0xac, 0x56, 0x9a, 0xae, 0x16, 0xaf, + 0x71, 0x6a, 0x06, 0x9b, 0xa7, 0xf2, 0xc7, 0xcc, 0x61, 0x74, 0xad, 0x8c, 0x1d, 0x01, 0x51, 0xbf, + 0x6a, 0xc6, 0x18, 0x5d, 0x07, 0x2c, 0x8e, 0xe4, 0x7c, 0x5b, 0xd1, 0x23, 0x4c, 0x6e, 0xb8, 0xd8, + 0x94, 0x6b, 0xb8, 0xdb, 0xc9, 0x32, 0x6b, 0x6d, 0x0c, 0x61, 0xf1, 0xec, 0x13, 0xad, 0x86, 0xe1, + 0x2c, 0xe6, 0x38, 0xa6, 0xbe, 0x9f, 0x57, 0x0b, 0x28, 0xd6, 0xbe, 0xef, 0xb3, 0xd1, 0xbf, 0xaa, + 0xd0, 0xfc, 0x4c, 0x01, 0x38, 0xf9, 0x14, 0xba, 0xa5, 0x76, 0x4d, 0xde, 0x91, 0xef, 0xbe, 0xe5, + 0xe1, 0xa0, 0x7f, 0x7b, 0x85, 0xad, 0xfc, 0x7a, 0x0a, 0x1d, 0xb3, 0x19, 0x13, 0xd9, 0x78, 0xe5, + 0x4f, 0xa8, 0xbe, 0xb4, 0xb4, 0xda, 0xa9, 0xcf, 0x60, 0x67, 0x5d, 0x9b, 0x24, 0xf7, 0x16, 0x27, + 0xac, 0xb6, 0xe8, 0xfe, 0xbb, 0x37, 0x49, 0xf3, 0xf6, 0xda, 0x3c, 0x08, 0x91, 0x46, 0x59, 0x62, + 0xde, 0x60, 0xb1, 0x24, 0xcf, 0xa0, 0x5b, 0x6a, 0x14, 0xca, 0xcf, 0x95, 0xde, 0x61, 0x6e, 0x79, + 0x08, 0x75, 0xd9, 0x9c, 0x48, 0xb7, 0xd4, 0x25, 0xfb, 0x9b, 0x05, 0xa9, 0xce, 0x1e, 0xc0, 0x86, + 0xfc, 0x35, 0x61, 0x1c, 0x2c, 0x77, 0x14, 0x9d, 0x6b, 0xf4, 0xcf, 0x0a, 0x34, 0xf3, 0xdf, 0x55, + 0xcf, 0x60, 0x43, 0xf4, 0x00, 0x72, 0xcb, 0x80, 0xd1, 0xbc, 0x7f, 0xf4, 0x77, 0x96, 0x98, 0xea, + 0x80, 0x21, 0xd4, 0x5e, 0x22, 0x27, 0xc4, 0x10, 0xea, 0x66, 0xd0, 0xbf, 0x55, 0xe6, 0x15, 0xfa, + 0xa7, 0x59, 0x59, 0x5f, 0x63, 0x79, 0x49, 0xbf, 0x40, 0xe9, 0x9f, 0x40, 0x43, 0xa1, 0xac, 0x0a, + 0xca, 0x0a, 0x3e, 0xab, 0x8f, 0xbf, 0x8a, 0xc7, 0xa3, 0xbf, 0x6d, 0x00, 0x9c, 0xcd, 0x53, 0x8e, + 0xb3, 0x5f, 0x06, 0xf8, 0x9a, 0x3c, 0x86, 0xde, 0x0b, 0xbc, 0xa4, 0x59, 0xc8, 0xe5, 0x6b, 0x49, + 0xa0, 0x89, 0x11, 0x13, 0x39, 0xf0, 0x15, 0x60, 0xfd, 0x10, 0xda, 0x27, 0xf4, 0xcd, 0x77, 0xeb, + 0x7d, 0x0a, 0xdd, 0x12, 0x06, 0xeb, 0x2b, 0x2e, 0xa3, 0xba, 0xbe, 0xe2, 0x2a, 0x5a, 0x3f, 0x84, + 0xa6, 0x46, 0x66, 0xf3, 0x0c, 0xd9, 0xc3, 0x4a, 0x88, 0xfd, 0x63, 0xe8, 0x2d, 0xe1, 0xb2, 0xa9, + 0x2f, 0x7f, 0xa9, 0xad, 0xc5, 0xed, 0xe7, 0xe2, 0xb5, 0x53, 0xc6, 0x66, 0x73, 0xe3, 0x1d, 0x85, + 0x87, 0xeb, 0xc0, 0xfb, 0x65, 0xf9, 0x9d, 0x24, 0x5f, 0x89, 0xf6, 0x32, 0x7c, 0xe6, 0xe0, 0x9d, + 0x1b, 0x5a, 0x07, 0xc3, 0x4f, 0xa1, 0x63, 0x22, 0xe8, 0x4a, 0x09, 0xae, 0xc2, 0xeb, 0x07, 0x00, + 0x0b, 0x10, 0x35, 0xf5, 0x65, 0x7a, 0x2c, 0xe3, 0xeb, 0x47, 0x00, 0x0b, 0x68, 0x54, 0x59, 0x55, + 0x46, 0x56, 0xb5, 0x6d, 0x19, 0x3e, 0x1f, 0x43, 0xab, 0x80, 0x33, 0xf3, 0x0c, 0x69, 0xa0, 0x8c, + 0x8e, 0x9f, 0x0d, 0x7f, 0xf3, 0xc1, 0x24, 0xe0, 0xd3, 0xec, 0x62, 0xe8, 0xc5, 0xb3, 0xbd, 0x29, + 0x4d, 0xa7, 0x81, 0x17, 0xb3, 0x64, 0xef, 0x5a, 0x24, 0xd3, 0xde, 0xca, 0x9f, 0xf4, 0x8b, 0x86, + 0x7c, 0xec, 0x7d, 0xf8, 0xef, 0x00, 0x00, 0x00, 0xff, 0xff, 0xc6, 0x0c, 0x9b, 0x12, 0x65, 0x17, + 0x00, 0x00, } diff --git a/logical/plugin/pb/backend.proto b/logical/plugin/pb/backend.proto index db0815f243..8911499008 100644 --- a/logical/plugin/pb/backend.proto +++ b/logical/plugin/pb/backend.proto @@ -5,6 +5,7 @@ option go_package = "github.com/hashicorp/vault/logical/plugin/pb"; import "google/protobuf/timestamp.proto"; import "logical/identity.proto"; +import "logical/plugin.proto"; message Empty {} @@ -498,6 +499,11 @@ message EntityInfoReply { string err = 2; } +message PluginEnvReply { + logical.PluginEnvironment plugin_environment = 1; + string err = 2; +} + // SystemView exposes system configuration information in a safe way for plugins // to consume. Plugins should implement the client for this service. service SystemView { @@ -544,6 +550,9 @@ service SystemView { // EntityInfo returns the basic entity information for the given entity id rpc EntityInfo(EntityInfoArgs) returns (EntityInfoReply); + + // PluginEnv returns Vault environment information used by plugins + rpc PluginEnv(Empty) returns (PluginEnvReply); } message Connection { diff --git a/logical/plugin/system.go b/logical/plugin/system.go index 08402de3f7..21abb3c252 100644 --- a/logical/plugin/system.go +++ b/logical/plugin/system.go @@ -146,6 +146,20 @@ func (s *SystemViewClient) EntityInfo(entityID string) (*logical.Entity, error) return reply.Entity, nil } +func (s *SystemViewClient) PluginEnv(_ context.Context) (*logical.PluginEnvironment, error) { + var reply PluginEnvReply + + err := s.client.Call("Plugin.PluginEnv", new(interface{}), &reply) + if err != nil { + return nil, err + } + if reply.Error != nil { + return nil, reply.Error + } + + return reply.PluginEnvironment, nil +} + type SystemViewServer struct { impl logical.SystemView } @@ -253,6 +267,21 @@ func (s *SystemViewServer) EntityInfo(args *EntityInfoArgs, reply *EntityInfoRep return nil } +func (s *SystemViewServer) PluginEnv(_ interface{}, reply *PluginEnvReply) error { + pluginEnv, err := s.impl.PluginEnv(context.Background()) + if err != nil { + *reply = PluginEnvReply{ + Error: wrapError(err), + } + return nil + } + *reply = PluginEnvReply{ + PluginEnvironment: pluginEnv, + } + + return nil +} + type DefaultLeaseTTLReply struct { DefaultLeaseTTL time.Duration } @@ -309,3 +338,8 @@ type EntityInfoReply struct { Entity *logical.Entity Error error } + +type PluginEnvReply struct { + PluginEnvironment *logical.PluginEnvironment + Error error +} diff --git a/logical/plugin/system_test.go b/logical/plugin/system_test.go index 2e152fcdec..32e13b4d43 100644 --- a/logical/plugin/system_test.go +++ b/logical/plugin/system_test.go @@ -199,3 +199,33 @@ func TestSystem_entityInfo(t *testing.T) { t.Fatalf("expected: %v, got: %v", sys.EntityVal, actual) } } + +func TestSystem_pluginEnv(t *testing.T) { + client, server := plugin.TestRPCConn(t) + defer client.Close() + + sys := logical.TestSystemView() + sys.PluginEnvironment = &logical.PluginEnvironment{ + VaultVersion: "0.10.42", + } + + server.RegisterName("Plugin", &SystemViewServer{ + impl: sys, + }) + + testSystemView := &SystemViewClient{client: client} + + expected, err := sys.PluginEnv(context.Background()) + if err != nil { + t.Fatal(err) + } + + actual, err := testSystemView.PluginEnv(context.Background()) + if err != nil { + t.Fatal(err) + } + + if !reflect.DeepEqual(expected, actual) { + t.Fatalf("expected: %v, got: %v", expected, actual) + } +} diff --git a/logical/system_view.go b/logical/system_view.go index 3fbcb6719f..8eb72cb6e2 100644 --- a/logical/system_view.go +++ b/logical/system_view.go @@ -61,6 +61,9 @@ type SystemView interface { // EntityInfo returns a subset of information related to the identity entity // for the given entity id EntityInfo(entityID string) (*Entity, error) + + // PluginEnv returns Vault environment information used by plugins + PluginEnv(context.Context) (*PluginEnvironment, error) } type StaticSystemView struct { @@ -74,6 +77,8 @@ type StaticSystemView struct { LocalMountVal bool ReplicationStateVal consts.ReplicationState EntityVal *Entity + VaultVersion string + PluginEnvironment *PluginEnvironment } func (d StaticSystemView) DefaultLeaseTTL() time.Duration { @@ -119,3 +124,7 @@ func (d StaticSystemView) MlockEnabled() bool { func (d StaticSystemView) EntityInfo(entityID string) (*Entity, error) { return d.EntityVal, nil } + +func (d StaticSystemView) PluginEnv(_ context.Context) (*PluginEnvironment, error) { + return d.PluginEnvironment, nil +} diff --git a/vault/dynamic_system_view.go b/vault/dynamic_system_view.go index 4904c58d52..6e37190e67 100644 --- a/vault/dynamic_system_view.go +++ b/vault/dynamic_system_view.go @@ -10,6 +10,7 @@ import ( "github.com/hashicorp/vault/helper/pluginutil" "github.com/hashicorp/vault/helper/wrapping" "github.com/hashicorp/vault/logical" + "github.com/hashicorp/vault/version" ) type dynamicSystemView struct { @@ -206,3 +207,9 @@ func (d dynamicSystemView) EntityInfo(entityID string) (*logical.Entity, error) return ret, nil } + +func (d dynamicSystemView) PluginEnv(_ context.Context) (*logical.PluginEnvironment, error) { + return &logical.PluginEnvironment{ + VaultVersion: version.GetVersion().Version, + }, nil +}