kata-containers/runtime/patches/0052-runtime-add-support-of-new-sandbox-StratoVirt.patch
holyfei c709612f2a kata-containers: modify kata-containers version
Fix #I4KI81
reason: modify kata-containers version and update
it to 1.11.1

Signed-off-by: holyfei <yangfeiyu20092010@163.com>
2021-11-30 20:08:25 +08:00

1721 lines
85 KiB
Diff

From 60b6a9c63a116db6d60a91b3dc875de3f33aa57c Mon Sep 17 00:00:00 2001
From: LiangZhang <zhangliang5@Huawei.com>
Date: Mon, 21 Sep 2020 15:33:17 +0800
Subject: [PATCH] runtime: add support of new sandbox StratoVirt
Signed-off-by: LiangZhang <zhangliang5@Huawei.com>
---
pkg/katautils/config.go | 5 +-
.../agent/protocols/grpc/agent.pb.go | 636 +++++++++++++--------
virtcontainers/agent.go | 3 +
virtcontainers/hypervisor.go | 12 +
virtcontainers/kata_agent.go | 73 ++-
virtcontainers/noop_agent.go | 5 +
virtcontainers/stratovirt.go | 617 ++++++++++++++++++++
7 files changed, 1090 insertions(+), 261 deletions(-)
create mode 100644 virtcontainers/stratovirt.go
diff --git a/pkg/katautils/config.go b/pkg/katautils/config.go
index 3365b3f..ed6f03c 100644
--- a/pkg/katautils/config.go
+++ b/pkg/katautils/config.go
@@ -52,7 +52,7 @@ const (
clhHypervisorTableType = "clh"
qemuHypervisorTableType = "qemu"
acrnHypervisorTableType = "acrn"
-
+ stratovirtHypervisorTableType = "stratovirt"
// supported proxy component types
kataProxyTableType = "kata"
@@ -921,6 +921,9 @@ func updateRuntimeConfigHypervisor(configPath string, tomlConf tomlConfig, confi
case clhHypervisorTableType:
config.HypervisorType = vc.ClhHypervisor
hConfig, err = newClhHypervisorConfig(hypervisor)
+ case stratovirtHypervisorTableType:
+ config.HypervisorType = vc.StratovirtHypervisor
+ hConfig, err = newQemuHypervisorConfig(hypervisor)
}
if err != nil {
diff --git a/vendor/github.com/kata-containers/agent/protocols/grpc/agent.pb.go b/vendor/github.com/kata-containers/agent/protocols/grpc/agent.pb.go
index c50ecb5..181fcb6 100644
--- a/vendor/github.com/kata-containers/agent/protocols/grpc/agent.pb.go
+++ b/vendor/github.com/kata-containers/agent/protocols/grpc/agent.pb.go
@@ -50,6 +50,7 @@
Interfaces
Routes
UpdateInterfaceRequest
+ UpdateInterfaceHwAddrByNameRequest
UpdateRoutesRequest
ListInterfacesRequest
ListRoutesRequest
@@ -1491,6 +1492,24 @@ func (m *UpdateInterfaceRequest) GetInterface() *types.Interface {
return nil
}
+type UpdateInterfaceHwAddrByNameRequest struct {
+ Interface *types.Interface `protobuf:"bytes,1,opt,name=interface" json:"interface,omitempty"`
+}
+
+func (m *UpdateInterfaceHwAddrByNameRequest) Reset() { *m = UpdateInterfaceHwAddrByNameRequest{} }
+func (m *UpdateInterfaceHwAddrByNameRequest) String() string { return proto.CompactTextString(m) }
+func (*UpdateInterfaceHwAddrByNameRequest) ProtoMessage() {}
+func (*UpdateInterfaceHwAddrByNameRequest) Descriptor() ([]byte, []int) {
+ return fileDescriptorAgent, []int{40}
+}
+
+func (m *UpdateInterfaceHwAddrByNameRequest) GetInterface() *types.Interface {
+ if m != nil {
+ return m.Interface
+ }
+ return nil
+}
+
type UpdateRoutesRequest struct {
Routes *Routes `protobuf:"bytes,1,opt,name=routes" json:"routes,omitempty"`
Increment bool `protobuf:"varint,2,opt,name=increment,proto3" json:"increment,omitempty"`
@@ -1499,7 +1518,7 @@ type UpdateRoutesRequest struct {
func (m *UpdateRoutesRequest) Reset() { *m = UpdateRoutesRequest{} }
func (m *UpdateRoutesRequest) String() string { return proto.CompactTextString(m) }
func (*UpdateRoutesRequest) ProtoMessage() {}
-func (*UpdateRoutesRequest) Descriptor() ([]byte, []int) { return fileDescriptorAgent, []int{40} }
+func (*UpdateRoutesRequest) Descriptor() ([]byte, []int) { return fileDescriptorAgent, []int{41} }
func (m *UpdateRoutesRequest) GetRoutes() *Routes {
if m != nil {
@@ -1521,7 +1540,7 @@ type ListInterfacesRequest struct {
func (m *ListInterfacesRequest) Reset() { *m = ListInterfacesRequest{} }
func (m *ListInterfacesRequest) String() string { return proto.CompactTextString(m) }
func (*ListInterfacesRequest) ProtoMessage() {}
-func (*ListInterfacesRequest) Descriptor() ([]byte, []int) { return fileDescriptorAgent, []int{41} }
+func (*ListInterfacesRequest) Descriptor() ([]byte, []int) { return fileDescriptorAgent, []int{42} }
type ListRoutesRequest struct {
}
@@ -1529,7 +1548,7 @@ type ListRoutesRequest struct {
func (m *ListRoutesRequest) Reset() { *m = ListRoutesRequest{} }
func (m *ListRoutesRequest) String() string { return proto.CompactTextString(m) }
func (*ListRoutesRequest) ProtoMessage() {}
-func (*ListRoutesRequest) Descriptor() ([]byte, []int) { return fileDescriptorAgent, []int{42} }
+func (*ListRoutesRequest) Descriptor() ([]byte, []int) { return fileDescriptorAgent, []int{43} }
type OnlineCPUMemRequest struct {
// Wait specifies if the caller waits for the agent to online all resources.
@@ -1545,7 +1564,7 @@ type OnlineCPUMemRequest struct {
func (m *OnlineCPUMemRequest) Reset() { *m = OnlineCPUMemRequest{} }
func (m *OnlineCPUMemRequest) String() string { return proto.CompactTextString(m) }
func (*OnlineCPUMemRequest) ProtoMessage() {}
-func (*OnlineCPUMemRequest) Descriptor() ([]byte, []int) { return fileDescriptorAgent, []int{43} }
+func (*OnlineCPUMemRequest) Descriptor() ([]byte, []int) { return fileDescriptorAgent, []int{44} }
func (m *OnlineCPUMemRequest) GetWait() bool {
if m != nil {
@@ -1576,7 +1595,7 @@ type ReseedRandomDevRequest struct {
func (m *ReseedRandomDevRequest) Reset() { *m = ReseedRandomDevRequest{} }
func (m *ReseedRandomDevRequest) String() string { return proto.CompactTextString(m) }
func (*ReseedRandomDevRequest) ProtoMessage() {}
-func (*ReseedRandomDevRequest) Descriptor() ([]byte, []int) { return fileDescriptorAgent, []int{44} }
+func (*ReseedRandomDevRequest) Descriptor() ([]byte, []int) { return fileDescriptorAgent, []int{45} }
func (m *ReseedRandomDevRequest) GetData() []byte {
if m != nil {
@@ -1603,7 +1622,7 @@ type AgentDetails struct {
func (m *AgentDetails) Reset() { *m = AgentDetails{} }
func (m *AgentDetails) String() string { return proto.CompactTextString(m) }
func (*AgentDetails) ProtoMessage() {}
-func (*AgentDetails) Descriptor() ([]byte, []int) { return fileDescriptorAgent, []int{45} }
+func (*AgentDetails) Descriptor() ([]byte, []int) { return fileDescriptorAgent, []int{46} }
func (m *AgentDetails) GetVersion() string {
if m != nil {
@@ -1654,7 +1673,7 @@ type GuestDetailsRequest struct {
func (m *GuestDetailsRequest) Reset() { *m = GuestDetailsRequest{} }
func (m *GuestDetailsRequest) String() string { return proto.CompactTextString(m) }
func (*GuestDetailsRequest) ProtoMessage() {}
-func (*GuestDetailsRequest) Descriptor() ([]byte, []int) { return fileDescriptorAgent, []int{46} }
+func (*GuestDetailsRequest) Descriptor() ([]byte, []int) { return fileDescriptorAgent, []int{47} }
func (m *GuestDetailsRequest) GetMemBlockSize() bool {
if m != nil {
@@ -1680,7 +1699,7 @@ type GuestDetailsResponse struct {
func (m *GuestDetailsResponse) Reset() { *m = GuestDetailsResponse{} }
func (m *GuestDetailsResponse) String() string { return proto.CompactTextString(m) }
func (*GuestDetailsResponse) ProtoMessage() {}
-func (*GuestDetailsResponse) Descriptor() ([]byte, []int) { return fileDescriptorAgent, []int{47} }
+func (*GuestDetailsResponse) Descriptor() ([]byte, []int) { return fileDescriptorAgent, []int{48} }
func (m *GuestDetailsResponse) GetMemBlockSizeBytes() uint64 {
if m != nil {
@@ -1712,7 +1731,7 @@ type MemHotplugByProbeRequest struct {
func (m *MemHotplugByProbeRequest) Reset() { *m = MemHotplugByProbeRequest{} }
func (m *MemHotplugByProbeRequest) String() string { return proto.CompactTextString(m) }
func (*MemHotplugByProbeRequest) ProtoMessage() {}
-func (*MemHotplugByProbeRequest) Descriptor() ([]byte, []int) { return fileDescriptorAgent, []int{48} }
+func (*MemHotplugByProbeRequest) Descriptor() ([]byte, []int) { return fileDescriptorAgent, []int{49} }
func (m *MemHotplugByProbeRequest) GetMemHotplugProbeAddr() []uint64 {
if m != nil {
@@ -1731,7 +1750,7 @@ type SetGuestDateTimeRequest struct {
func (m *SetGuestDateTimeRequest) Reset() { *m = SetGuestDateTimeRequest{} }
func (m *SetGuestDateTimeRequest) String() string { return proto.CompactTextString(m) }
func (*SetGuestDateTimeRequest) ProtoMessage() {}
-func (*SetGuestDateTimeRequest) Descriptor() ([]byte, []int) { return fileDescriptorAgent, []int{49} }
+func (*SetGuestDateTimeRequest) Descriptor() ([]byte, []int) { return fileDescriptorAgent, []int{50} }
func (m *SetGuestDateTimeRequest) GetSec() int64 {
if m != nil {
@@ -1780,7 +1799,7 @@ type Storage struct {
func (m *Storage) Reset() { *m = Storage{} }
func (m *Storage) String() string { return proto.CompactTextString(m) }
func (*Storage) ProtoMessage() {}
-func (*Storage) Descriptor() ([]byte, []int) { return fileDescriptorAgent, []int{50} }
+func (*Storage) Descriptor() ([]byte, []int) { return fileDescriptorAgent, []int{51} }
func (m *Storage) GetDriver() string {
if m != nil {
@@ -1863,7 +1882,7 @@ type Device struct {
func (m *Device) Reset() { *m = Device{} }
func (m *Device) String() string { return proto.CompactTextString(m) }
func (*Device) ProtoMessage() {}
-func (*Device) Descriptor() ([]byte, []int) { return fileDescriptorAgent, []int{51} }
+func (*Device) Descriptor() ([]byte, []int) { return fileDescriptorAgent, []int{52} }
func (m *Device) GetId() string {
if m != nil {
@@ -1909,7 +1928,7 @@ type StringUser struct {
func (m *StringUser) Reset() { *m = StringUser{} }
func (m *StringUser) String() string { return proto.CompactTextString(m) }
func (*StringUser) ProtoMessage() {}
-func (*StringUser) Descriptor() ([]byte, []int) { return fileDescriptorAgent, []int{52} }
+func (*StringUser) Descriptor() ([]byte, []int) { return fileDescriptorAgent, []int{53} }
func (m *StringUser) GetUid() string {
if m != nil {
@@ -1957,7 +1976,7 @@ type CopyFileRequest struct {
func (m *CopyFileRequest) Reset() { *m = CopyFileRequest{} }
func (m *CopyFileRequest) String() string { return proto.CompactTextString(m) }
func (*CopyFileRequest) ProtoMessage() {}
-func (*CopyFileRequest) Descriptor() ([]byte, []int) { return fileDescriptorAgent, []int{53} }
+func (*CopyFileRequest) Descriptor() ([]byte, []int) { return fileDescriptorAgent, []int{54} }
func (m *CopyFileRequest) GetPath() string {
if m != nil {
@@ -2021,7 +2040,7 @@ type StartTracingRequest struct {
func (m *StartTracingRequest) Reset() { *m = StartTracingRequest{} }
func (m *StartTracingRequest) String() string { return proto.CompactTextString(m) }
func (*StartTracingRequest) ProtoMessage() {}
-func (*StartTracingRequest) Descriptor() ([]byte, []int) { return fileDescriptorAgent, []int{54} }
+func (*StartTracingRequest) Descriptor() ([]byte, []int) { return fileDescriptorAgent, []int{55} }
type StopTracingRequest struct {
}
@@ -2029,7 +2048,7 @@ type StopTracingRequest struct {
func (m *StopTracingRequest) Reset() { *m = StopTracingRequest{} }
func (m *StopTracingRequest) String() string { return proto.CompactTextString(m) }
func (*StopTracingRequest) ProtoMessage() {}
-func (*StopTracingRequest) Descriptor() ([]byte, []int) { return fileDescriptorAgent, []int{55} }
+func (*StopTracingRequest) Descriptor() ([]byte, []int) { return fileDescriptorAgent, []int{56} }
type UpdateIPVSRequest struct {
// IPVS_req is the IPVS rule message needed to update
@@ -2039,7 +2058,7 @@ type UpdateIPVSRequest struct {
func (m *UpdateIPVSRequest) Reset() { *m = UpdateIPVSRequest{} }
func (m *UpdateIPVSRequest) String() string { return proto.CompactTextString(m) }
func (*UpdateIPVSRequest) ProtoMessage() {}
-func (*UpdateIPVSRequest) Descriptor() ([]byte, []int) { return fileDescriptorAgent, []int{56} }
+func (*UpdateIPVSRequest) Descriptor() ([]byte, []int) { return fileDescriptorAgent, []int{57} }
func (m *UpdateIPVSRequest) GetIPVSReq() string {
if m != nil {
@@ -2056,7 +2075,7 @@ type IPVSResponse struct {
func (m *IPVSResponse) Reset() { *m = IPVSResponse{} }
func (m *IPVSResponse) String() string { return proto.CompactTextString(m) }
func (*IPVSResponse) ProtoMessage() {}
-func (*IPVSResponse) Descriptor() ([]byte, []int) { return fileDescriptorAgent, []int{57} }
+func (*IPVSResponse) Descriptor() ([]byte, []int) { return fileDescriptorAgent, []int{58} }
func (m *IPVSResponse) GetIPVSRes() string {
if m != nil {
@@ -2106,6 +2125,7 @@ func init() {
proto.RegisterType((*Interfaces)(nil), "grpc.Interfaces")
proto.RegisterType((*Routes)(nil), "grpc.Routes")
proto.RegisterType((*UpdateInterfaceRequest)(nil), "grpc.UpdateInterfaceRequest")
+ proto.RegisterType((*UpdateInterfaceHwAddrByNameRequest)(nil), "grpc.UpdateInterfaceHwAddrByNameRequest")
proto.RegisterType((*UpdateRoutesRequest)(nil), "grpc.UpdateRoutesRequest")
proto.RegisterType((*ListInterfacesRequest)(nil), "grpc.ListInterfacesRequest")
proto.RegisterType((*ListRoutesRequest)(nil), "grpc.ListRoutesRequest")
@@ -2163,6 +2183,7 @@ type AgentServiceClient interface {
TtyWinResize(ctx context.Context, in *TtyWinResizeRequest, opts ...grpc1.CallOption) (*google_protobuf2.Empty, error)
// networking
UpdateInterface(ctx context.Context, in *UpdateInterfaceRequest, opts ...grpc1.CallOption) (*types.Interface, error)
+ UpdateInterfaceHwAddrByName(ctx context.Context, in *UpdateInterfaceHwAddrByNameRequest, opts ...grpc1.CallOption) (*types.Interface, error)
UpdateRoutes(ctx context.Context, in *UpdateRoutesRequest, opts ...grpc1.CallOption) (*Routes, error)
ListInterfaces(ctx context.Context, in *ListInterfacesRequest, opts ...grpc1.CallOption) (*Interfaces, error)
ListRoutes(ctx context.Context, in *ListRoutesRequest, opts ...grpc1.CallOption) (*Routes, error)
@@ -2342,6 +2363,15 @@ func (c *agentServiceClient) UpdateInterface(ctx context.Context, in *UpdateInte
return out, nil
}
+func (c *agentServiceClient) UpdateInterfaceHwAddrByName(ctx context.Context, in *UpdateInterfaceHwAddrByNameRequest, opts ...grpc1.CallOption) (*types.Interface, error) {
+ out := new(types.Interface)
+ err := grpc1.Invoke(ctx, "/grpc.AgentService/UpdateInterfaceHwAddrByName", in, out, c.cc, opts...)
+ if err != nil {
+ return nil, err
+ }
+ return out, nil
+}
+
func (c *agentServiceClient) UpdateRoutes(ctx context.Context, in *UpdateRoutesRequest, opts ...grpc1.CallOption) (*Routes, error) {
out := new(Routes)
err := grpc1.Invoke(ctx, "/grpc.AgentService/UpdateRoutes", in, out, c.cc, opts...)
@@ -2497,6 +2527,7 @@ type AgentServiceServer interface {
TtyWinResize(context.Context, *TtyWinResizeRequest) (*google_protobuf2.Empty, error)
// networking
UpdateInterface(context.Context, *UpdateInterfaceRequest) (*types.Interface, error)
+ UpdateInterfaceHwAddrByName(context.Context, *UpdateInterfaceHwAddrByNameRequest) (*types.Interface, error)
UpdateRoutes(context.Context, *UpdateRoutesRequest) (*Routes, error)
ListInterfaces(context.Context, *ListInterfacesRequest) (*Interfaces, error)
ListRoutes(context.Context, *ListRoutesRequest) (*Routes, error)
@@ -2825,6 +2856,24 @@ func _AgentService_UpdateInterface_Handler(srv interface{}, ctx context.Context,
return interceptor(ctx, in, info, handler)
}
+func _AgentService_UpdateInterfaceHwAddrByName_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc1.UnaryServerInterceptor) (interface{}, error) {
+ in := new(UpdateInterfaceHwAddrByNameRequest)
+ if err := dec(in); err != nil {
+ return nil, err
+ }
+ if interceptor == nil {
+ return srv.(AgentServiceServer).UpdateInterfaceHwAddrByName(ctx, in)
+ }
+ info := &grpc1.UnaryServerInfo{
+ Server: srv,
+ FullMethod: "/grpc.AgentService/UpdateInterfaceHwAddrByName",
+ }
+ handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+ return srv.(AgentServiceServer).UpdateInterfaceHwAddrByName(ctx, req.(*UpdateInterfaceHwAddrByNameRequest))
+ }
+ return interceptor(ctx, in, info, handler)
+}
+
func _AgentService_UpdateRoutes_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc1.UnaryServerInterceptor) (interface{}, error) {
in := new(UpdateRoutesRequest)
if err := dec(in); err != nil {
@@ -3150,6 +3199,10 @@ var _AgentService_serviceDesc = grpc1.ServiceDesc{
Handler: _AgentService_UpdateInterface_Handler,
},
{
+ MethodName: "UpdateInterfaceHwAddrByName",
+ Handler: _AgentService_UpdateInterfaceHwAddrByName_Handler,
+ },
+ {
MethodName: "UpdateRoutes",
Handler: _AgentService_UpdateRoutes_Handler,
},
@@ -4899,6 +4952,34 @@ func (m *UpdateInterfaceRequest) MarshalTo(dAtA []byte) (int, error) {
return i, nil
}
+func (m *UpdateInterfaceHwAddrByNameRequest) Marshal() (dAtA []byte, err error) {
+ size := m.Size()
+ dAtA = make([]byte, size)
+ n, err := m.MarshalTo(dAtA)
+ if err != nil {
+ return nil, err
+ }
+ return dAtA[:n], nil
+}
+
+func (m *UpdateInterfaceHwAddrByNameRequest) MarshalTo(dAtA []byte) (int, error) {
+ var i int
+ _ = i
+ var l int
+ _ = l
+ if m.Interface != nil {
+ dAtA[i] = 0xa
+ i++
+ i = encodeVarintAgent(dAtA, i, uint64(m.Interface.Size()))
+ n25, err := m.Interface.MarshalTo(dAtA[i:])
+ if err != nil {
+ return 0, err
+ }
+ i += n25
+ }
+ return i, nil
+}
+
func (m *UpdateRoutesRequest) Marshal() (dAtA []byte, err error) {
size := m.Size()
dAtA = make([]byte, size)
@@ -4918,11 +4999,11 @@ func (m *UpdateRoutesRequest) MarshalTo(dAtA []byte) (int, error) {
dAtA[i] = 0xa
i++
i = encodeVarintAgent(dAtA, i, uint64(m.Routes.Size()))
- n25, err := m.Routes.MarshalTo(dAtA[i:])
+ n26, err := m.Routes.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n25
+ i += n26
}
if m.Increment {
dAtA[i] = 0x10
@@ -5176,11 +5257,11 @@ func (m *GuestDetailsResponse) MarshalTo(dAtA []byte) (int, error) {
dAtA[i] = 0x12
i++
i = encodeVarintAgent(dAtA, i, uint64(m.AgentDetails.Size()))
- n26, err := m.AgentDetails.MarshalTo(dAtA[i:])
+ n27, err := m.AgentDetails.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n26
+ i += n27
}
if m.SupportMemHotplugProbe {
dAtA[i] = 0x18
@@ -5211,21 +5292,21 @@ func (m *MemHotplugByProbeRequest) MarshalTo(dAtA []byte) (int, error) {
var l int
_ = l
if len(m.MemHotplugProbeAddr) > 0 {
- dAtA28 := make([]byte, len(m.MemHotplugProbeAddr)*10)
- var j27 int
+ dAtA29 := make([]byte, len(m.MemHotplugProbeAddr)*10)
+ var j28 int
for _, num := range m.MemHotplugProbeAddr {
for num >= 1<<7 {
- dAtA28[j27] = uint8(uint64(num)&0x7f | 0x80)
+ dAtA29[j28] = uint8(uint64(num)&0x7f | 0x80)
num >>= 7
- j27++
+ j28++
}
- dAtA28[j27] = uint8(num)
- j27++
+ dAtA29[j28] = uint8(num)
+ j28++
}
dAtA[i] = 0xa
i++
- i = encodeVarintAgent(dAtA, i, uint64(j27))
- i += copy(dAtA[i:], dAtA28[:j27])
+ i = encodeVarintAgent(dAtA, i, uint64(j28))
+ i += copy(dAtA[i:], dAtA29[:j28])
}
return i, nil
}
@@ -6333,6 +6414,16 @@ func (m *UpdateInterfaceRequest) Size() (n int) {
return n
}
+func (m *UpdateInterfaceHwAddrByNameRequest) Size() (n int) {
+ var l int
+ _ = l
+ if m.Interface != nil {
+ l = m.Interface.Size()
+ n += 1 + l + sovAgent(uint64(l))
+ }
+ return n
+}
+
func (m *UpdateRoutesRequest) Size() (n int) {
var l int
_ = l
@@ -12114,6 +12205,89 @@ func (m *UpdateInterfaceRequest) Unmarshal(dAtA []byte) error {
}
return nil
}
+func (m *UpdateInterfaceHwAddrByNameRequest) Unmarshal(dAtA []byte) error {
+ l := len(dAtA)
+ iNdEx := 0
+ for iNdEx < l {
+ preIndex := iNdEx
+ var wire uint64
+ for shift := uint(0); ; shift += 7 {
+ if shift >= 64 {
+ return ErrIntOverflowAgent
+ }
+ if iNdEx >= l {
+ return io.ErrUnexpectedEOF
+ }
+ b := dAtA[iNdEx]
+ iNdEx++
+ wire |= (uint64(b) & 0x7F) << shift
+ if b < 0x80 {
+ break
+ }
+ }
+ fieldNum := int32(wire >> 3)
+ wireType := int(wire & 0x7)
+ if wireType == 4 {
+ return fmt.Errorf("proto: UpdateInterfaceHwAddrByNameRequest: wiretype end group for non-group")
+ }
+ if fieldNum <= 0 {
+ return fmt.Errorf("proto: UpdateInterfaceHwAddrByNameRequest: illegal tag %d (wire type %d)", fieldNum, wire)
+ }
+ switch fieldNum {
+ case 1:
+ if wireType != 2 {
+ return fmt.Errorf("proto: wrong wireType = %d for field Interface", wireType)
+ }
+ var msglen int
+ for shift := uint(0); ; shift += 7 {
+ if shift >= 64 {
+ return ErrIntOverflowAgent
+ }
+ if iNdEx >= l {
+ return io.ErrUnexpectedEOF
+ }
+ b := dAtA[iNdEx]
+ iNdEx++
+ msglen |= (int(b) & 0x7F) << shift
+ if b < 0x80 {
+ break
+ }
+ }
+ if msglen < 0 {
+ return ErrInvalidLengthAgent
+ }
+ postIndex := iNdEx + msglen
+ if postIndex > l {
+ return io.ErrUnexpectedEOF
+ }
+ if m.Interface == nil {
+ m.Interface = &types.Interface{}
+ }
+ if err := m.Interface.Unmarshal(dAtA[iNdEx:postIndex]); err != nil {
+ return err
+ }
+ iNdEx = postIndex
+ default:
+ iNdEx = preIndex
+ skippy, err := skipAgent(dAtA[iNdEx:])
+ if err != nil {
+ return err
+ }
+ if skippy < 0 {
+ return ErrInvalidLengthAgent
+ }
+ if (iNdEx + skippy) > l {
+ return io.ErrUnexpectedEOF
+ }
+ iNdEx += skippy
+ }
+ }
+
+ if iNdEx > l {
+ return io.ErrUnexpectedEOF
+ }
+ return nil
+}
func (m *UpdateRoutesRequest) Unmarshal(dAtA []byte) error {
l := len(dAtA)
iNdEx := 0
@@ -14242,204 +14416,206 @@ var (
func init() { proto.RegisterFile("agent.proto", fileDescriptorAgent) }
var fileDescriptorAgent = []byte{
- // 3183 bytes of a gzipped FileDescriptorProto
- 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xc4, 0x39, 0x4b, 0x6f, 0x1c, 0xc7,
- 0x99, 0x98, 0x07, 0x39, 0x33, 0xdf, 0xbc, 0xc8, 0x22, 0x45, 0x8d, 0x46, 0xb2, 0x2c, 0xb7, 0x6d,
- 0x99, 0x5e, 0xaf, 0x49, 0x8b, 0x36, 0xfc, 0x84, 0x57, 0x10, 0x29, 0xad, 0xc8, 0xb5, 0xb4, 0xe2,
- 0xf6, 0x88, 0xeb, 0x5d, 0x2c, 0x16, 0x8d, 0x66, 0x77, 0x71, 0x58, 0xe6, 0x74, 0x57, 0xbb, 0xaa,
- 0x9a, 0xe2, 0x78, 0x81, 0x3d, 0x26, 0xd7, 0x9c, 0x72, 0xcb, 0x1f, 0x08, 0x72, 0xcb, 0x2d, 0xb9,
- 0xe6, 0x60, 0x04, 0x39, 0x04, 0xf9, 0x01, 0x41, 0xe0, 0x9f, 0x90, 0x5f, 0x10, 0xd4, 0xab, 0x1f,
- 0x33, 0x43, 0x1a, 0x11, 0x04, 0xe4, 0xd2, 0xe8, 0xef, 0x51, 0xdf, 0xab, 0xaa, 0xbe, 0xfa, 0xbe,
- 0x2a, 0x68, 0xfb, 0x63, 0x1c, 0x8b, 0xad, 0x84, 0x51, 0x41, 0x51, 0x7d, 0xcc, 0x92, 0x60, 0xd8,
- 0xa2, 0x01, 0xd1, 0x88, 0xe1, 0xc7, 0x63, 0x22, 0x4e, 0xd3, 0xe3, 0xad, 0x80, 0x46, 0xdb, 0x67,
- 0xbe, 0xf0, 0xdf, 0x0f, 0x68, 0x2c, 0x7c, 0x12, 0x63, 0xc6, 0xb7, 0xd5, 0xc0, 0xed, 0xe4, 0x6c,
- 0xbc, 0x2d, 0xa6, 0x09, 0xe6, 0xfa, 0x6b, 0xc6, 0xdd, 0x1c, 0x53, 0x3a, 0x9e, 0xe0, 0x6d, 0x05,
- 0x1d, 0xa7, 0x27, 0xdb, 0x38, 0x4a, 0xc4, 0x54, 0x13, 0x9d, 0x5f, 0x54, 0x61, 0x63, 0x8f, 0x61,
- 0x5f, 0xe0, 0x3d, 0x2b, 0xcd, 0xc5, 0xdf, 0xa6, 0x98, 0x0b, 0xf4, 0x06, 0x74, 0x32, 0x0d, 0x1e,
- 0x09, 0x07, 0x95, 0x3b, 0x95, 0xcd, 0x96, 0xdb, 0xce, 0x70, 0x07, 0x21, 0xba, 0x0e, 0x0d, 0x7c,
- 0x81, 0x03, 0x49, 0xad, 0x2a, 0xea, 0xb2, 0x04, 0x0f, 0x42, 0x74, 0x0f, 0xda, 0x5c, 0x30, 0x12,
- 0x8f, 0xbd, 0x94, 0x63, 0x36, 0xa8, 0xdd, 0xa9, 0x6c, 0xb6, 0x77, 0x56, 0xb6, 0xa4, 0x4b, 0x5b,
- 0x23, 0x45, 0x38, 0xe2, 0x98, 0xb9, 0xc0, 0xb3, 0x7f, 0x74, 0x17, 0x1a, 0x21, 0x3e, 0x27, 0x01,
- 0xe6, 0x83, 0xfa, 0x9d, 0xda, 0x66, 0x7b, 0xa7, 0xa3, 0xd9, 0x1f, 0x2a, 0xa4, 0x6b, 0x89, 0xe8,
- 0x5d, 0x68, 0x72, 0x41, 0x99, 0x3f, 0xc6, 0x7c, 0xb0, 0xa4, 0x18, 0xbb, 0x56, 0xae, 0xc2, 0xba,
- 0x19, 0x19, 0xdd, 0x82, 0xda, 0xb3, 0xbd, 0x83, 0xc1, 0xb2, 0xd2, 0x0e, 0x86, 0x2b, 0xc1, 0x81,
- 0x2b, 0xd1, 0xe8, 0x4d, 0xe8, 0x72, 0x3f, 0x0e, 0x8f, 0xe9, 0x85, 0x97, 0x90, 0x30, 0xe6, 0x83,
- 0xc6, 0x9d, 0xca, 0x66, 0xd3, 0xed, 0x18, 0xe4, 0xa1, 0xc4, 0x39, 0x9f, 0xc3, 0xb5, 0x91, 0xf0,
- 0x99, 0x78, 0x89, 0xe8, 0x38, 0x47, 0xb0, 0xe1, 0xe2, 0x88, 0x9e, 0xbf, 0x54, 0x68, 0x07, 0xd0,
- 0x10, 0x24, 0xc2, 0x34, 0x15, 0x2a, 0xb4, 0x5d, 0xd7, 0x82, 0xce, 0xaf, 0x2a, 0x80, 0x1e, 0x5d,
- 0xe0, 0xe0, 0x90, 0xd1, 0x00, 0x73, 0xfe, 0x0f, 0x9a, 0xae, 0x77, 0xa0, 0x91, 0x68, 0x03, 0x06,
- 0x75, 0xc5, 0x6e, 0x66, 0xc1, 0x5a, 0x65, 0xa9, 0xce, 0x37, 0xb0, 0x3e, 0x22, 0xe3, 0xd8, 0x9f,
- 0xbc, 0x42, 0x7b, 0x37, 0x60, 0x99, 0x2b, 0x99, 0xca, 0xd4, 0xae, 0x6b, 0x20, 0xe7, 0x10, 0xd0,
- 0xd7, 0x3e, 0x11, 0xaf, 0x4e, 0x93, 0xf3, 0x3e, 0xac, 0x95, 0x24, 0xf2, 0x84, 0xc6, 0x1c, 0x2b,
- 0x03, 0x84, 0x2f, 0x52, 0xae, 0x84, 0x2d, 0xb9, 0x06, 0x72, 0x30, 0xac, 0x3f, 0x21, 0xdc, 0xb2,
- 0xe3, 0xbf, 0xc7, 0x84, 0x0d, 0x58, 0x3e, 0xa1, 0x2c, 0xf2, 0x85, 0xb5, 0x40, 0x43, 0x08, 0x41,
- 0xdd, 0x67, 0x63, 0x3e, 0xa8, 0xdd, 0xa9, 0x6d, 0xb6, 0x5c, 0xf5, 0x2f, 0x57, 0xe5, 0x8c, 0x1a,
- 0x63, 0xd7, 0x1b, 0xd0, 0x31, 0x71, 0xf7, 0x26, 0x84, 0x0b, 0xa5, 0xa7, 0xe3, 0xb6, 0x0d, 0x4e,
- 0x8e, 0x71, 0x28, 0x6c, 0x1c, 0x25, 0xe1, 0x4b, 0x6e, 0xf8, 0x1d, 0x68, 0x31, 0xcc, 0x69, 0xca,
- 0xe4, 0x36, 0xad, 0xaa, 0x79, 0x5f, 0xd7, 0xf3, 0xfe, 0x84, 0xc4, 0xe9, 0x85, 0x6b, 0x69, 0x6e,
- 0xce, 0x66, 0xb6, 0x90, 0xe0, 0x2f, 0xb3, 0x85, 0x3e, 0x87, 0x6b, 0x87, 0x7e, 0xca, 0x5f, 0xc6,
- 0x56, 0xe7, 0x0b, 0xb9, 0xfd, 0x78, 0x1a, 0xbd, 0xd4, 0xe0, 0x5f, 0x56, 0xa0, 0xb9, 0x97, 0xa4,
- 0x47, 0xdc, 0x1f, 0x63, 0xf4, 0x3a, 0xb4, 0x05, 0x15, 0xfe, 0xc4, 0x4b, 0x25, 0xa8, 0xd8, 0xeb,
- 0x2e, 0x28, 0x94, 0x66, 0x90, 0x61, 0xc7, 0x2c, 0x48, 0x52, 0xc3, 0x51, 0xbd, 0x53, 0xdb, 0xac,
- 0xbb, 0x6d, 0x8d, 0xd3, 0x2c, 0x5b, 0xb0, 0xa6, 0x68, 0x1e, 0x89, 0xbd, 0x33, 0xcc, 0x62, 0x3c,
- 0x89, 0x68, 0x88, 0xd5, 0xfa, 0xad, 0xbb, 0xab, 0x8a, 0x74, 0x10, 0x7f, 0x95, 0x11, 0xd0, 0x3f,
- 0xc1, 0x6a, 0xc6, 0x2f, 0x37, 0xa5, 0xe2, 0xae, 0x2b, 0xee, 0xbe, 0xe1, 0x3e, 0x32, 0x68, 0xe7,
- 0xff, 0xa1, 0xf7, 0xfc, 0x94, 0x51, 0x21, 0x26, 0x24, 0x1e, 0x3f, 0xf4, 0x85, 0x2f, 0xb3, 0x47,
- 0x82, 0x19, 0xa1, 0x21, 0x37, 0xd6, 0x5a, 0x10, 0xbd, 0x07, 0xab, 0x42, 0xf3, 0xe2, 0xd0, 0xb3,
- 0x3c, 0x55, 0xc5, 0xb3, 0x92, 0x11, 0x0e, 0x0d, 0xf3, 0xdb, 0xd0, 0xcb, 0x99, 0x65, 0xfe, 0x31,
- 0xf6, 0x76, 0x33, 0xec, 0x73, 0x12, 0x61, 0xe7, 0x5c, 0xc5, 0x4a, 0x4d, 0x32, 0x7a, 0x0f, 0x5a,
- 0x79, 0x1c, 0x2a, 0x6a, 0x85, 0xf4, 0xf4, 0x0a, 0xb1, 0xe1, 0x74, 0x9b, 0x59, 0x50, 0xbe, 0x84,
- 0xbe, 0xc8, 0x0c, 0xf7, 0x42, 0x5f, 0xf8, 0xe5, 0x45, 0x55, 0xf6, 0xca, 0xed, 0x89, 0x12, 0xec,
- 0x7c, 0x01, 0xad, 0x43, 0x12, 0x72, 0xad, 0x78, 0x00, 0x8d, 0x20, 0x65, 0x0c, 0xc7, 0xc2, 0xba,
- 0x6c, 0x40, 0xb4, 0x0e, 0x4b, 0x13, 0x12, 0x11, 0x61, 0xdc, 0xd4, 0x80, 0x43, 0x01, 0x9e, 0xe2,
- 0x88, 0xb2, 0xa9, 0x0a, 0xd8, 0x3a, 0x2c, 0x15, 0x27, 0x57, 0x03, 0xe8, 0x26, 0xb4, 0x22, 0xff,
- 0x22, 0x9b, 0x54, 0x49, 0x69, 0x46, 0xfe, 0x85, 0x36, 0x7e, 0x00, 0x8d, 0x13, 0x9f, 0x4c, 0x82,
- 0x58, 0x98, 0xa8, 0x58, 0x30, 0x57, 0x58, 0x2f, 0x2a, 0xfc, 0x5d, 0x15, 0xda, 0x5a, 0xa3, 0x36,
- 0x78, 0x1d, 0x96, 0x02, 0x3f, 0x38, 0xcd, 0x54, 0x2a, 0x00, 0xdd, 0xb5, 0x86, 0x54, 0x8b, 0x49,
- 0x38, 0xb7, 0xd4, 0x9a, 0xb6, 0x0d, 0xc0, 0x5f, 0xf8, 0x89, 0xb1, 0xad, 0x76, 0x09, 0x73, 0x4b,
- 0xf2, 0x68, 0x73, 0x3f, 0x84, 0x8e, 0x5e, 0x77, 0x66, 0x48, 0xfd, 0x92, 0x21, 0x6d, 0xcd, 0xa5,
- 0x07, 0xbd, 0x09, 0xdd, 0x94, 0x63, 0xef, 0x94, 0x60, 0xe6, 0xb3, 0xe0, 0x74, 0x3a, 0x58, 0xd2,
- 0x67, 0x64, 0xca, 0xf1, 0xbe, 0xc5, 0xa1, 0x1d, 0x58, 0x92, 0xe9, 0x8f, 0x0f, 0x96, 0xd5, 0x71,
- 0x7c, 0xab, 0x28, 0x52, 0xb9, 0xba, 0xa5, 0xbe, 0x8f, 0x62, 0xc1, 0xa6, 0xae, 0x66, 0x1d, 0x7e,
- 0x0a, 0x90, 0x23, 0xd1, 0x0a, 0xd4, 0xce, 0xf0, 0xd4, 0xec, 0x43, 0xf9, 0x2b, 0x83, 0x73, 0xee,
- 0x4f, 0x52, 0x1b, 0x75, 0x0d, 0x7c, 0x5e, 0xfd, 0xb4, 0xe2, 0x04, 0xd0, 0xdf, 0x9d, 0x9c, 0x11,
- 0x5a, 0x18, 0xbe, 0x0e, 0x4b, 0x91, 0xff, 0x0d, 0x65, 0x36, 0x92, 0x0a, 0x50, 0x58, 0x12, 0x53,
- 0x66, 0x45, 0x28, 0x00, 0xf5, 0xa0, 0x4a, 0x13, 0x15, 0xaf, 0x96, 0x5b, 0xa5, 0x49, 0xae, 0xa8,
- 0x5e, 0x50, 0xe4, 0xfc, 0xb9, 0x0e, 0x90, 0x6b, 0x41, 0x2e, 0x0c, 0x09, 0xf5, 0x38, 0x66, 0xb2,
- 0x04, 0xf1, 0x8e, 0xa7, 0x02, 0x73, 0x8f, 0xe1, 0x20, 0x65, 0x9c, 0x9c, 0xcb, 0xf9, 0x93, 0x6e,
- 0x5f, 0xd3, 0x6e, 0xcf, 0xd8, 0xe6, 0x5e, 0x27, 0x74, 0xa4, 0xc7, 0xed, 0xca, 0x61, 0xae, 0x1d,
- 0x85, 0x0e, 0xe0, 0x5a, 0x2e, 0x33, 0x2c, 0x88, 0xab, 0x5e, 0x25, 0x6e, 0x2d, 0x13, 0x17, 0xe6,
- 0xa2, 0x1e, 0xc1, 0x1a, 0xa1, 0xde, 0xb7, 0x29, 0x4e, 0x4b, 0x82, 0x6a, 0x57, 0x09, 0x5a, 0x25,
- 0xf4, 0x3f, 0xd4, 0x80, 0x5c, 0xcc, 0x21, 0xdc, 0x28, 0x78, 0x29, 0xb7, 0x7b, 0x41, 0x58, 0xfd,
- 0x2a, 0x61, 0x1b, 0x99, 0x55, 0x32, 0x1f, 0xe4, 0x12, 0xff, 0x0d, 0x36, 0x08, 0xf5, 0x5e, 0xf8,
- 0x44, 0xcc, 0x8a, 0x5b, 0xfa, 0x11, 0x27, 0xe5, 0xa1, 0x5b, 0x96, 0xa5, 0x9d, 0x8c, 0x30, 0x1b,
- 0x97, 0x9c, 0x5c, 0xfe, 0x11, 0x27, 0x9f, 0xaa, 0x01, 0xb9, 0x98, 0x07, 0xb0, 0x4a, 0xe8, 0xac,
- 0x35, 0x8d, 0xab, 0x84, 0xf4, 0x09, 0x2d, 0x5b, 0xb2, 0x0b, 0xab, 0x1c, 0x07, 0x82, 0xb2, 0xe2,
- 0x22, 0x68, 0x5e, 0x25, 0x62, 0xc5, 0xf0, 0x67, 0x32, 0x9c, 0xff, 0x81, 0xce, 0x7e, 0x3a, 0xc6,
- 0x62, 0x72, 0x9c, 0x25, 0x83, 0x57, 0x96, 0x7f, 0x9c, 0xbf, 0x56, 0xa1, 0xbd, 0x37, 0x66, 0x34,
- 0x4d, 0x4a, 0x39, 0x59, 0x6f, 0xd2, 0xd9, 0x9c, 0xac, 0x58, 0x54, 0x4e, 0xd6, 0xcc, 0x1f, 0x41,
- 0x27, 0x52, 0x5b, 0xd7, 0xf0, 0xeb, 0x3c, 0xb4, 0x3a, 0xb7, 0xa9, 0xdd, 0x76, 0x54, 0x48, 0x66,
- 0x5b, 0x00, 0x09, 0x09, 0xb9, 0x19, 0xa3, 0xd3, 0x51, 0xdf, 0x54, 0x84, 0x36, 0x45, 0xbb, 0xad,
- 0x24, 0xcb, 0xd6, 0xf7, 0xa0, 0x7d, 0x2c, 0x83, 0x64, 0x06, 0x94, 0x92, 0x51, 0x1e, 0x3d, 0x17,
- 0x8e, 0xf3, 0x4d, 0xb8, 0x0f, 0xdd, 0x53, 0x1d, 0x32, 0x33, 0x48, 0xaf, 0xa1, 0x37, 0x8d, 0x27,
- 0xb9, 0xbf, 0x5b, 0xc5, 0xc8, 0xea, 0x09, 0xe8, 0x9c, 0x16, 0x50, 0xc3, 0x11, 0xac, 0xce, 0xb1,
- 0x2c, 0xc8, 0x41, 0x9b, 0xc5, 0x1c, 0xd4, 0xde, 0x41, 0x5a, 0x51, 0x71, 0x64, 0x31, 0x2f, 0xfd,
- 0xac, 0x0a, 0xbd, 0x83, 0x58, 0x60, 0x76, 0xe2, 0x07, 0x58, 0x5b, 0x8c, 0xa0, 0x1e, 0xfb, 0x11,
- 0x36, 0x32, 0xd5, 0x3f, 0xba, 0x01, 0x4d, 0x76, 0xa1, 0x53, 0x88, 0x99, 0xd1, 0x06, 0xbb, 0x50,
- 0xa9, 0x01, 0xbd, 0x06, 0xc0, 0x2e, 0xbc, 0xc4, 0x0f, 0xce, 0xb0, 0x89, 0x61, 0xdd, 0x6d, 0xb1,
- 0x8b, 0x43, 0x8d, 0x90, 0x8b, 0x81, 0x5d, 0x78, 0x98, 0x31, 0xca, 0xb8, 0xc9, 0x56, 0x4d, 0x76,
- 0xf1, 0x48, 0xc1, 0x66, 0x6c, 0xc8, 0x68, 0x92, 0xe0, 0x50, 0x65, 0x69, 0x35, 0xf6, 0xa1, 0x46,
- 0x48, 0xad, 0xc2, 0x6a, 0x5d, 0xd6, 0x5a, 0x45, 0xae, 0x55, 0xe4, 0x5a, 0x1b, 0x7a, 0xa4, 0x28,
- 0x6a, 0x15, 0x99, 0xd6, 0xa6, 0xd6, 0x2a, 0x0a, 0x5a, 0x45, 0xae, 0xb5, 0x65, 0xc7, 0x1a, 0xad,
- 0xce, 0x6f, 0xaa, 0xd0, 0x78, 0x1e, 0xa8, 0x49, 0x41, 0x77, 0xa0, 0x8d, 0xb9, 0xf0, 0x8f, 0x27,
- 0x84, 0x9f, 0xe2, 0xd0, 0x2c, 0xf3, 0x22, 0x4a, 0xda, 0xc8, 0xa7, 0xb1, 0xc7, 0xe5, 0x09, 0x6e,
- 0x22, 0xc3, 0xa7, 0xf1, 0x48, 0x9e, 0xe0, 0x86, 0xc4, 0x70, 0x70, 0x6e, 0xd7, 0x3a, 0x9f, 0xc6,
- 0x2e, 0x0e, 0xce, 0xa5, 0x7d, 0x27, 0x24, 0x56, 0x39, 0xe6, 0x9e, 0x8d, 0xca, 0x09, 0x89, 0x65,
- 0xfe, 0xb8, 0x57, 0x24, 0xee, 0x98, 0xa0, 0x58, 0xe2, 0x8e, 0xf2, 0x4c, 0xa6, 0x01, 0x49, 0x35,
- 0x41, 0x69, 0x4a, 0x84, 0xa4, 0xaa, 0xc3, 0x79, 0x42, 0x39, 0x36, 0x01, 0xd1, 0x80, 0xf4, 0x57,
- 0xfd, 0xe8, 0x31, 0x3a, 0x1a, 0x2d, 0x85, 0x51, 0x83, 0x6e, 0x40, 0x73, 0xe2, 0x73, 0xe1, 0xf9,
- 0xc1, 0x99, 0x09, 0x46, 0x43, 0xc2, 0x0f, 0x82, 0x33, 0x59, 0xdd, 0xcb, 0x82, 0x1c, 0xc7, 0x03,
- 0x50, 0x04, 0x03, 0xa9, 0xaa, 0x65, 0x42, 0x39, 0x89, 0xc7, 0x83, 0xb6, 0xa9, 0x5a, 0x34, 0xe8,
- 0xa4, 0xd0, 0x38, 0x0a, 0x75, 0xec, 0xf2, 0xc1, 0x95, 0xd9, 0xc1, 0x36, 0xf6, 0x26, 0x60, 0x06,
- 0x34, 0x6b, 0x45, 0x9f, 0x08, 0x26, 0x62, 0x4d, 0x76, 0xa1, 0x13, 0xbe, 0x99, 0x52, 0x43, 0xac,
- 0xdb, 0x29, 0xd5, 0x44, 0xe7, 0x0f, 0x15, 0xe8, 0xfc, 0x3b, 0x16, 0x2f, 0x28, 0x3b, 0xb3, 0xf9,
- 0x00, 0x88, 0x5d, 0xd6, 0xdc, 0x9c, 0x75, 0xa6, 0x3c, 0x2b, 0x2f, 0x77, 0xb7, 0xc0, 0x87, 0x5e,
- 0x87, 0x9a, 0x08, 0x12, 0xb3, 0x73, 0x4c, 0x6b, 0x68, 0x96, 0x82, 0x2b, 0x29, 0xe8, 0x0d, 0xa8,
- 0x8b, 0x20, 0xf9, 0xd8, 0xa4, 0x8a, 0x19, 0x0e, 0x45, 0x92, 0x32, 0xd2, 0x30, 0x29, 0xb7, 0x97,
- 0x26, 0x24, 0xae, 0xa4, 0x48, 0x19, 0x69, 0x98, 0x7c, 0xac, 0x66, 0x76, 0x8e, 0x43, 0x91, 0x9c,
- 0x9f, 0x56, 0x60, 0x63, 0xb6, 0xfb, 0x30, 0xbd, 0xd2, 0x47, 0xd0, 0x09, 0x54, 0xd2, 0x28, 0x25,
- 0xc6, 0xd5, 0xb9, 0x74, 0xe2, 0xb6, 0x83, 0x42, 0x2e, 0xfd, 0x04, 0xba, 0xb1, 0x0e, 0x4f, 0x29,
- 0x3f, 0x9a, 0xe4, 0x50, 0x8c, 0x9c, 0xdb, 0x89, 0x0b, 0x90, 0x13, 0x02, 0xfa, 0x9a, 0x11, 0x81,
- 0x47, 0x82, 0x61, 0x3f, 0x7a, 0x15, 0x5d, 0x30, 0x82, 0xba, 0x2a, 0x99, 0x6b, 0xaa, 0xc9, 0x53,
- 0xff, 0xce, 0x3b, 0xb0, 0x56, 0xd2, 0x62, 0x7c, 0x5d, 0x81, 0xda, 0xc4, 0x2c, 0x9f, 0xae, 0x2b,
- 0x7f, 0x1d, 0x1f, 0x56, 0x5d, 0xec, 0x87, 0xaf, 0xce, 0x1a, 0xa3, 0xa2, 0x96, 0xab, 0xd8, 0x04,
- 0x54, 0x54, 0x61, 0x4c, 0xb1, 0x56, 0x57, 0x0a, 0x56, 0x3f, 0x83, 0xd5, 0x3d, 0xb9, 0x8b, 0x46,
- 0x22, 0x24, 0xf1, 0xab, 0x68, 0xdb, 0xff, 0x0f, 0xd6, 0x9e, 0x8b, 0xe9, 0xd7, 0x52, 0x18, 0x27,
- 0xdf, 0xe1, 0x57, 0xe4, 0x1f, 0xa3, 0x2f, 0xac, 0x7f, 0x8c, 0xbe, 0x90, 0xdb, 0x32, 0xa0, 0x93,
- 0x34, 0x8a, 0xd5, 0x12, 0xed, 0xba, 0x06, 0x72, 0x76, 0xa1, 0xa3, 0x1b, 0xb9, 0xa7, 0x34, 0x4c,
- 0x27, 0x78, 0xe1, 0x31, 0x70, 0x1b, 0x20, 0xf1, 0x99, 0x1f, 0x61, 0x81, 0x19, 0x57, 0x25, 0x5f,
- 0xcb, 0x2d, 0x60, 0x9c, 0x9f, 0x57, 0x61, 0x5d, 0xdf, 0xcb, 0x8d, 0xf4, 0x75, 0x94, 0x75, 0x61,
- 0x08, 0xcd, 0x53, 0xca, 0x45, 0x41, 0x60, 0x06, 0x4b, 0x13, 0xc3, 0xd8, 0x4a, 0x93, 0xbf, 0xa5,
- 0xcb, 0xb2, 0xda, 0xd5, 0x97, 0x65, 0x73, 0xd7, 0x61, 0xf5, 0xf9, 0xeb, 0x30, 0x99, 0x00, 0x2d,
- 0x13, 0xd1, 0xc7, 0x4c, 0xcb, 0x6d, 0x19, 0xcc, 0x41, 0x88, 0xee, 0x42, 0x7f, 0x2c, 0xad, 0xf4,
- 0x4e, 0x29, 0x3d, 0xf3, 0x12, 0x5f, 0x9c, 0xaa, 0xc4, 0xda, 0x72, 0xbb, 0x0a, 0xbd, 0x4f, 0xe9,
- 0xd9, 0xa1, 0x2f, 0x4e, 0xd1, 0x67, 0xd0, 0x33, 0xbd, 0x48, 0xa4, 0x42, 0xc4, 0x4d, 0x05, 0x66,
- 0x76, 0x51, 0x31, 0x7a, 0x6e, 0xf7, 0xac, 0x00, 0x71, 0xe7, 0x3a, 0x5c, 0x7b, 0x88, 0xb9, 0x60,
- 0x74, 0x5a, 0x0e, 0x8c, 0xf3, 0x2f, 0x00, 0x07, 0x79, 0xfe, 0xf9, 0xa0, 0x08, 0x99, 0xac, 0xb5,
- 0xb2, 0xa5, 0xaf, 0x45, 0x33, 0x82, 0x5b, 0xe0, 0x71, 0xb6, 0x60, 0xd9, 0xa5, 0xa9, 0x3c, 0x11,
- 0xdf, 0xb2, 0x7f, 0x66, 0x5c, 0xc7, 0x8c, 0x53, 0x48, 0xd7, 0xd0, 0x9c, 0x7d, 0x7b, 0x8f, 0x92,
- 0x8b, 0x33, 0x53, 0xb4, 0x05, 0xad, 0x2c, 0x13, 0x9a, 0xac, 0x32, 0xaf, 0x3a, 0x67, 0x71, 0xfe,
- 0x1b, 0xd6, 0xb4, 0x24, 0x2d, 0xd9, 0x8a, 0x79, 0x0b, 0x96, 0x99, 0x35, 0xa3, 0x92, 0xdf, 0x87,
- 0x1a, 0x26, 0x43, 0x43, 0xb7, 0xa4, 0xb2, 0x80, 0xe1, 0xc8, 0x1e, 0x9b, 0x4d, 0x37, 0x47, 0xc8,
- 0x68, 0x3d, 0x21, 0x5c, 0xe4, 0x6e, 0xda, 0x68, 0xad, 0xc1, 0xaa, 0x24, 0x94, 0x34, 0x3a, 0xff,
- 0x0b, 0x6b, 0xcf, 0xe2, 0x09, 0x89, 0xf1, 0xde, 0xe1, 0xd1, 0x53, 0x9c, 0x65, 0x05, 0x04, 0x75,
- 0x75, 0xde, 0x55, 0x94, 0x74, 0xf5, 0x2f, 0xb7, 0x49, 0x7c, 0xec, 0x05, 0x49, 0xca, 0xcd, 0xf5,
- 0xe4, 0x72, 0x7c, 0xbc, 0x97, 0xa4, 0x5c, 0x9e, 0x81, 0xb2, 0xd6, 0xa4, 0xf1, 0x64, 0xaa, 0xf6,
- 0x4a, 0xd3, 0x6d, 0x04, 0x49, 0xfa, 0x2c, 0x9e, 0x4c, 0x9d, 0x7f, 0x56, 0x17, 0x32, 0x18, 0x87,
- 0xae, 0x1f, 0x87, 0x34, 0x7a, 0x88, 0xcf, 0x0b, 0x1a, 0xb2, 0xe6, 0xdf, 0xe6, 0x84, 0xef, 0x2b,
- 0xd0, 0x79, 0x30, 0xc6, 0xb1, 0x78, 0x88, 0x85, 0x4f, 0x26, 0xaa, 0xc1, 0x3f, 0xc7, 0x8c, 0x13,
- 0x1a, 0x9b, 0x85, 0x6f, 0x41, 0xf4, 0x3a, 0xb4, 0x49, 0x4c, 0x84, 0x17, 0xfa, 0x38, 0xa2, 0xb1,
- 0x89, 0x02, 0x48, 0xd4, 0x43, 0x85, 0x41, 0xef, 0x40, 0x5f, 0x5f, 0x1f, 0x7b, 0xa7, 0x7e, 0x1c,
- 0x4e, 0xe4, 0x96, 0xd3, 0xd7, 0x69, 0x3d, 0x8d, 0xde, 0x37, 0x58, 0xf4, 0x2e, 0xac, 0x98, 0x0d,
- 0x91, 0x73, 0xd6, 0x15, 0x67, 0xdf, 0xe0, 0x4b, 0xac, 0x69, 0x92, 0x50, 0x26, 0xb8, 0xc7, 0x71,
- 0x10, 0xd0, 0x28, 0x31, 0xdd, 0x71, 0xdf, 0xe2, 0x47, 0x1a, 0xed, 0x8c, 0x61, 0xed, 0xb1, 0xf4,
- 0xd3, 0x78, 0x92, 0x4f, 0x70, 0x2f, 0xc2, 0x91, 0x77, 0x3c, 0xa1, 0xc1, 0x99, 0x27, 0xd3, 0x94,
- 0x89, 0xb0, 0xac, 0xbf, 0x77, 0x25, 0x72, 0x44, 0xbe, 0x53, 0x17, 0x41, 0x92, 0xeb, 0x94, 0x8a,
- 0x64, 0x92, 0x8e, 0xbd, 0x84, 0xd1, 0x63, 0x6c, 0x5c, 0xec, 0x47, 0x38, 0xda, 0xd7, 0xf8, 0x43,
- 0x89, 0x76, 0x7e, 0x5b, 0x81, 0xf5, 0xb2, 0x26, 0x93, 0x74, 0xb7, 0x61, 0xbd, 0xac, 0xca, 0xd4,
- 0x82, 0xba, 0x9e, 0x58, 0x2d, 0x2a, 0xd4, 0x55, 0xe1, 0x27, 0xd0, 0x55, 0x6f, 0x0a, 0x5e, 0xa8,
- 0x25, 0x95, 0x8f, 0xb9, 0xe2, 0xbc, 0xb8, 0x1d, 0xbf, 0x38, 0x4b, 0x9f, 0xc1, 0x0d, 0xe3, 0xbe,
- 0x37, 0x6f, 0xb6, 0x5e, 0x10, 0x1b, 0x86, 0xe1, 0xe9, 0x8c, 0xf5, 0x4f, 0x60, 0x90, 0xa3, 0x76,
- 0xa7, 0x0a, 0x69, 0x63, 0xf5, 0x01, 0xac, 0xcd, 0x38, 0xfb, 0x20, 0x0c, 0x99, 0xda, 0xa0, 0x75,
- 0x77, 0x11, 0xc9, 0xb9, 0x0f, 0xd7, 0x47, 0x58, 0xe8, 0x68, 0xf8, 0xc2, 0x34, 0xa6, 0x5a, 0xd8,
- 0x0a, 0xd4, 0x46, 0x38, 0x50, 0xce, 0xd7, 0x5c, 0xf9, 0x2b, 0x17, 0xe0, 0x11, 0xc7, 0x81, 0xf2,
- 0xb2, 0xe6, 0xaa, 0x7f, 0xe7, 0xd7, 0x15, 0x68, 0x98, 0x34, 0x29, 0x53, 0x7d, 0xc8, 0xc8, 0x39,
- 0x66, 0x66, 0xe9, 0x19, 0x08, 0xbd, 0x0d, 0x3d, 0xfd, 0xe7, 0xd1, 0x44, 0x10, 0x9a, 0x25, 0xdf,
- 0xae, 0xc6, 0x3e, 0xd3, 0x48, 0x75, 0x5d, 0xac, 0x6e, 0x43, 0xcd, 0xc5, 0x83, 0x81, 0xd4, 0x9d,
- 0x2f, 0x97, 0x99, 0x41, 0x25, 0xdb, 0x96, 0x6b, 0x20, 0xb9, 0xd4, 0xad, 0xbc, 0x25, 0x25, 0xcf,
- 0x82, 0x72, 0xa9, 0x47, 0x34, 0x8d, 0x85, 0x97, 0x50, 0x12, 0x0b, 0x93, 0x5d, 0x41, 0xa1, 0x0e,
- 0x25, 0xc6, 0xf9, 0x49, 0x05, 0x96, 0xf5, 0x93, 0x09, 0xea, 0x41, 0x35, 0x3b, 0xe3, 0xaa, 0x44,
- 0xd5, 0x0b, 0x4a, 0x97, 0x3e, 0xd7, 0xd4, 0xbf, 0xdc, 0xc7, 0xe7, 0x91, 0xce, 0xd4, 0xc6, 0xb4,
- 0xf3, 0x48, 0xa5, 0xe8, 0xb7, 0xa1, 0x97, 0x1f, 0x95, 0x8a, 0xae, 0x4d, 0xec, 0x66, 0x58, 0xc5,
- 0x76, 0xa9, 0xa5, 0xce, 0x7f, 0x01, 0xe4, 0x4f, 0x07, 0x32, 0xe4, 0x69, 0x66, 0x8c, 0xfc, 0x95,
- 0x98, 0x71, 0x76, 0xc8, 0xca, 0x5f, 0x74, 0x17, 0x7a, 0x7e, 0x18, 0x12, 0x39, 0xdc, 0x9f, 0x3c,
- 0x26, 0x61, 0xb6, 0x49, 0xcb, 0x58, 0xe7, 0xf7, 0x15, 0xe8, 0xef, 0xd1, 0x64, 0xfa, 0xaf, 0x64,
- 0x82, 0x0b, 0x19, 0x44, 0x19, 0x69, 0xce, 0x58, 0xf9, 0xaf, 0xab, 0xff, 0x09, 0xd6, 0x5b, 0x4b,
- 0xcf, 0x6c, 0x53, 0x22, 0xd4, 0xb6, 0xb2, 0xc4, 0xec, 0x16, 0xb6, 0xab, 0x89, 0x4f, 0x69, 0xa8,
- 0x9a, 0xb4, 0x90, 0x30, 0x2f, 0xbb, 0x73, 0xed, 0xba, 0x8d, 0x90, 0x30, 0x45, 0x32, 0x8e, 0x2c,
- 0xa9, 0x6b, 0xff, 0xa2, 0x23, 0xcb, 0x1a, 0x23, 0x1d, 0xd9, 0x80, 0x65, 0x7a, 0x72, 0xc2, 0xb1,
- 0x50, 0xdd, 0x43, 0xcd, 0x35, 0x50, 0x96, 0xe6, 0x9a, 0x85, 0x34, 0x77, 0x0d, 0xd6, 0xd4, 0x03,
- 0xd3, 0x73, 0xe6, 0x07, 0x24, 0x1e, 0xdb, 0x54, 0xbc, 0x0e, 0x68, 0x24, 0x68, 0x32, 0x83, 0xdd,
- 0x82, 0x55, 0x73, 0xe6, 0x1c, 0xfe, 0xe7, 0xc8, 0xba, 0x7e, 0x03, 0x9a, 0x12, 0xf4, 0x18, 0xfe,
- 0xd6, 0x26, 0x46, 0x43, 0x76, 0xde, 0x85, 0x8e, 0xfe, 0x35, 0x69, 0x20, 0x67, 0xe5, 0x65, 0x56,
- 0xbe, 0xf3, 0xa7, 0x15, 0x93, 0x6e, 0xcd, 0x45, 0x0e, 0x7a, 0x0c, 0xfd, 0x99, 0x87, 0x41, 0x64,
- 0x6e, 0xf6, 0x16, 0xbf, 0x17, 0x0e, 0x37, 0xb6, 0xf4, 0x43, 0xe3, 0x96, 0x7d, 0x68, 0xdc, 0x7a,
- 0x14, 0x25, 0x62, 0x8a, 0x1e, 0x41, 0xaf, 0xfc, 0x84, 0x86, 0x6e, 0xda, 0x1a, 0x64, 0xc1, 0xc3,
- 0xda, 0xa5, 0x62, 0x1e, 0x43, 0x7f, 0xe6, 0x35, 0xcd, 0xda, 0xb3, 0xf8, 0x91, 0xed, 0x52, 0x41,
- 0xf7, 0xa1, 0x5d, 0x78, 0x3e, 0x43, 0x03, 0x2d, 0x64, 0xfe, 0x45, 0xed, 0x52, 0x01, 0x7b, 0xd0,
- 0x2d, 0xbd, 0x68, 0xa1, 0xa1, 0xf1, 0x67, 0xc1, 0x33, 0xd7, 0xa5, 0x42, 0x76, 0xa1, 0x5d, 0x78,
- 0x58, 0xb2, 0x56, 0xcc, 0xbf, 0x5e, 0x0d, 0x6f, 0x2c, 0xa0, 0x98, 0xe9, 0xdc, 0x87, 0x6e, 0xe9,
- 0x19, 0xc8, 0x1a, 0xb2, 0xe8, 0x09, 0x6a, 0x78, 0x73, 0x21, 0xcd, 0x48, 0x7a, 0x0c, 0xfd, 0x99,
- 0x47, 0x21, 0x1b, 0xdc, 0xc5, 0x6f, 0x45, 0x97, 0xba, 0xf5, 0x95, 0x9a, 0xec, 0x42, 0xbb, 0x55,
- 0x98, 0xec, 0xf9, 0x27, 0xa0, 0xe1, 0xad, 0xc5, 0x44, 0x63, 0xd5, 0x23, 0xe8, 0x95, 0x5f, 0x7f,
- 0xac, 0xb0, 0x85, 0x6f, 0x42, 0x57, 0xaf, 0x9c, 0xd2, 0x43, 0x50, 0xbe, 0x72, 0x16, 0xbd, 0x0f,
- 0x5d, 0x2a, 0xe8, 0x01, 0x80, 0x69, 0xae, 0x42, 0x12, 0x67, 0x53, 0x36, 0xd7, 0xd4, 0x65, 0x53,
- 0xb6, 0xa0, 0x11, 0xbb, 0x0f, 0xa0, 0x7b, 0xa2, 0x90, 0xa6, 0x02, 0x5d, 0xb7, 0x66, 0xcc, 0x34,
- 0x62, 0xc3, 0xc1, 0x3c, 0x61, 0x4e, 0x00, 0x66, 0xec, 0x65, 0x04, 0x7c, 0x09, 0x90, 0xf7, 0x5a,
- 0x56, 0xc0, 0x5c, 0xf7, 0x75, 0x45, 0x0c, 0x3a, 0xc5, 0xce, 0x0a, 0x19, 0x5f, 0x17, 0x74, 0x5b,
- 0x57, 0x88, 0xe8, 0xcf, 0x54, 0xce, 0xe5, 0xc5, 0x36, 0x5b, 0x50, 0x0f, 0xe7, 0xaa, 0x67, 0xf4,
- 0x09, 0x74, 0x8a, 0x25, 0xb3, 0xb5, 0x62, 0x41, 0x19, 0x3d, 0x2c, 0x95, 0xcd, 0xe8, 0x3e, 0xf4,
- 0xca, 0x05, 0x31, 0x2a, 0xec, 0x8b, 0xb9, 0x32, 0x79, 0xb8, 0x32, 0x73, 0xd1, 0xc1, 0xd1, 0x87,
- 0x00, 0x79, 0xe1, 0x6c, 0xc3, 0x37, 0x57, 0x4a, 0xcf, 0x68, 0xfd, 0x12, 0x7a, 0x85, 0xbc, 0x2d,
- 0x7b, 0xc2, 0xeb, 0x25, 0x87, 0xf3, 0x6c, 0x3e, 0x34, 0x15, 0x56, 0x29, 0x6d, 0x3f, 0x80, 0x4e,
- 0xf1, 0x8c, 0xb0, 0xde, 0x2e, 0x38, 0x37, 0xae, 0x4a, 0x7a, 0x85, 0xf3, 0xc4, 0xae, 0xdd, 0xf9,
- 0x23, 0xe6, 0xaa, 0xa4, 0x57, 0xea, 0x47, 0x6d, 0xae, 0x59, 0xd4, 0xa4, 0x5e, 0x75, 0x14, 0x94,
- 0x9b, 0x37, 0x1b, 0xfd, 0x85, 0x2d, 0xdd, 0x55, 0x6b, 0xb0, 0xd8, 0xa7, 0xd8, 0x78, 0x2c, 0xe8,
- 0x5d, 0x7e, 0x24, 0x27, 0x14, 0x7b, 0x91, 0x42, 0x4e, 0x58, 0xd0, 0xa2, 0x5c, 0x2a, 0x68, 0x1f,
- 0xfa, 0x8f, 0x6d, 0x99, 0x69, 0x4a, 0x60, 0x63, 0xce, 0x82, 0x92, 0x7f, 0x38, 0x5c, 0x44, 0x32,
- 0xb3, 0xfc, 0x15, 0xac, 0xce, 0x95, 0xbf, 0xe8, 0x76, 0x76, 0xef, 0xbe, 0xb0, 0x2e, 0xbe, 0xd4,
- 0xac, 0x03, 0x58, 0x99, 0xad, 0x7e, 0xd1, 0x6b, 0x66, 0xd2, 0x17, 0x57, 0xc5, 0x97, 0x8a, 0xfa,
- 0x0c, 0x9a, 0xb6, 0xda, 0x42, 0xe6, 0x7d, 0x63, 0xa6, 0xfa, 0xba, 0x6c, 0xe8, 0x6e, 0xe7, 0xfb,
- 0x1f, 0x6e, 0x57, 0xfe, 0xf8, 0xc3, 0xed, 0xca, 0x5f, 0x7e, 0xb8, 0x5d, 0x39, 0x5e, 0x56, 0xd4,
- 0x0f, 0xff, 0x16, 0x00, 0x00, 0xff, 0xff, 0x9a, 0x16, 0x45, 0x76, 0xe7, 0x24, 0x00, 0x00,
+ // 3214 bytes of a gzipped FileDescriptorProto
+ 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xc4, 0x39, 0xcb, 0x6e, 0x1c, 0xc7,
+ 0x76, 0x98, 0x07, 0x39, 0x33, 0x67, 0x5e, 0x9c, 0x22, 0x45, 0x8d, 0x46, 0xb2, 0x2c, 0xb7, 0x6d,
+ 0x99, 0x8e, 0x63, 0xd2, 0xa2, 0x0d, 0x3f, 0xe1, 0x08, 0x22, 0xa5, 0x88, 0x8c, 0x25, 0x8b, 0x69,
+ 0x8a, 0x71, 0x8c, 0x20, 0x68, 0x34, 0xbb, 0x8b, 0xc3, 0x32, 0xa7, 0xbb, 0xda, 0x55, 0xd5, 0x14,
+ 0xc7, 0x01, 0xb2, 0x4c, 0xb6, 0x59, 0x65, 0x97, 0x1f, 0x08, 0x92, 0x55, 0x76, 0xc9, 0x36, 0x0b,
+ 0x23, 0xc8, 0xe2, 0x7e, 0xc1, 0xc5, 0x85, 0x3f, 0xe1, 0x7e, 0xc1, 0x45, 0xbd, 0xfa, 0x31, 0x33,
+ 0xa4, 0x71, 0x09, 0x01, 0x77, 0xd3, 0xe8, 0xf3, 0xa8, 0xf3, 0xaa, 0xaa, 0x53, 0xe7, 0x54, 0x41,
+ 0xdb, 0x1f, 0xe3, 0x58, 0x6c, 0x26, 0x8c, 0x0a, 0x8a, 0xea, 0x63, 0x96, 0x04, 0xa3, 0x16, 0x0d,
+ 0x88, 0x46, 0x8c, 0x3e, 0x1d, 0x13, 0x71, 0x9a, 0x1e, 0x6f, 0x06, 0x34, 0xda, 0x3a, 0xf3, 0x85,
+ 0xff, 0x61, 0x40, 0x63, 0xe1, 0x93, 0x18, 0x33, 0xbe, 0xa5, 0x06, 0x6e, 0x25, 0x67, 0xe3, 0x2d,
+ 0x31, 0x4d, 0x30, 0xd7, 0x5f, 0x33, 0xee, 0xf6, 0x98, 0xd2, 0xf1, 0x04, 0x6f, 0x29, 0xe8, 0x38,
+ 0x3d, 0xd9, 0xc2, 0x51, 0x22, 0xa6, 0x9a, 0xe8, 0xfc, 0x5b, 0x15, 0xd6, 0x77, 0x19, 0xf6, 0x05,
+ 0xde, 0xb5, 0xd2, 0x5c, 0xfc, 0x63, 0x8a, 0xb9, 0x40, 0x6f, 0x41, 0x27, 0xd3, 0xe0, 0x91, 0x70,
+ 0x58, 0xb9, 0x57, 0xd9, 0x68, 0xb9, 0xed, 0x0c, 0xb7, 0x1f, 0xa2, 0x9b, 0xd0, 0xc0, 0x17, 0x38,
+ 0x90, 0xd4, 0xaa, 0xa2, 0x2e, 0x4b, 0x70, 0x3f, 0x44, 0x0f, 0xa0, 0xcd, 0x05, 0x23, 0xf1, 0xd8,
+ 0x4b, 0x39, 0x66, 0xc3, 0xda, 0xbd, 0xca, 0x46, 0x7b, 0x7b, 0x65, 0x53, 0xba, 0xb4, 0x79, 0xa8,
+ 0x08, 0x47, 0x1c, 0x33, 0x17, 0x78, 0xf6, 0x8f, 0xee, 0x43, 0x23, 0xc4, 0xe7, 0x24, 0xc0, 0x7c,
+ 0x58, 0xbf, 0x57, 0xdb, 0x68, 0x6f, 0x77, 0x34, 0xfb, 0x63, 0x85, 0x74, 0x2d, 0x11, 0xbd, 0x0f,
+ 0x4d, 0x2e, 0x28, 0xf3, 0xc7, 0x98, 0x0f, 0x97, 0x14, 0x63, 0xd7, 0xca, 0x55, 0x58, 0x37, 0x23,
+ 0xa3, 0x3b, 0x50, 0x7b, 0xb1, 0xbb, 0x3f, 0x5c, 0x56, 0xda, 0xc1, 0x70, 0x25, 0x38, 0x70, 0x25,
+ 0x1a, 0xbd, 0x0d, 0x5d, 0xee, 0xc7, 0xe1, 0x31, 0xbd, 0xf0, 0x12, 0x12, 0xc6, 0x7c, 0xd8, 0xb8,
+ 0x57, 0xd9, 0x68, 0xba, 0x1d, 0x83, 0x3c, 0x90, 0x38, 0xe7, 0x4b, 0xb8, 0x71, 0x28, 0x7c, 0x26,
+ 0xae, 0x11, 0x1d, 0xe7, 0x08, 0xd6, 0x5d, 0x1c, 0xd1, 0xf3, 0x6b, 0x85, 0x76, 0x08, 0x0d, 0x41,
+ 0x22, 0x4c, 0x53, 0xa1, 0x42, 0xdb, 0x75, 0x2d, 0xe8, 0xfc, 0x47, 0x05, 0xd0, 0x93, 0x0b, 0x1c,
+ 0x1c, 0x30, 0x1a, 0x60, 0xce, 0xff, 0x44, 0xd3, 0xf5, 0x1e, 0x34, 0x12, 0x6d, 0xc0, 0xb0, 0xae,
+ 0xd8, 0xcd, 0x2c, 0x58, 0xab, 0x2c, 0xd5, 0xf9, 0x01, 0xd6, 0x0e, 0xc9, 0x38, 0xf6, 0x27, 0xaf,
+ 0xd1, 0xde, 0x75, 0x58, 0xe6, 0x4a, 0xa6, 0x32, 0xb5, 0xeb, 0x1a, 0xc8, 0x39, 0x00, 0xf4, 0x9d,
+ 0x4f, 0xc4, 0xeb, 0xd3, 0xe4, 0x7c, 0x08, 0xab, 0x25, 0x89, 0x3c, 0xa1, 0x31, 0xc7, 0xca, 0x00,
+ 0xe1, 0x8b, 0x94, 0x2b, 0x61, 0x4b, 0xae, 0x81, 0x1c, 0x0c, 0x6b, 0xcf, 0x08, 0xb7, 0xec, 0xf8,
+ 0x8f, 0x31, 0x61, 0x1d, 0x96, 0x4f, 0x28, 0x8b, 0x7c, 0x61, 0x2d, 0xd0, 0x10, 0x42, 0x50, 0xf7,
+ 0xd9, 0x98, 0x0f, 0x6b, 0xf7, 0x6a, 0x1b, 0x2d, 0x57, 0xfd, 0xcb, 0x55, 0x39, 0xa3, 0xc6, 0xd8,
+ 0xf5, 0x16, 0x74, 0x4c, 0xdc, 0xbd, 0x09, 0xe1, 0x42, 0xe9, 0xe9, 0xb8, 0x6d, 0x83, 0x93, 0x63,
+ 0x1c, 0x0a, 0xeb, 0x47, 0x49, 0x78, 0xcd, 0x0d, 0xbf, 0x0d, 0x2d, 0x86, 0x39, 0x4d, 0x99, 0xdc,
+ 0xa6, 0x55, 0x35, 0xef, 0x6b, 0x7a, 0xde, 0x9f, 0x91, 0x38, 0xbd, 0x70, 0x2d, 0xcd, 0xcd, 0xd9,
+ 0xcc, 0x16, 0x12, 0xfc, 0x3a, 0x5b, 0xe8, 0x4b, 0xb8, 0x71, 0xe0, 0xa7, 0xfc, 0x3a, 0xb6, 0x3a,
+ 0x5f, 0xc9, 0xed, 0xc7, 0xd3, 0xe8, 0x5a, 0x83, 0xff, 0xbd, 0x02, 0xcd, 0xdd, 0x24, 0x3d, 0xe2,
+ 0xfe, 0x18, 0xa3, 0x37, 0xa1, 0x2d, 0xa8, 0xf0, 0x27, 0x5e, 0x2a, 0x41, 0xc5, 0x5e, 0x77, 0x41,
+ 0xa1, 0x34, 0x83, 0x0c, 0x3b, 0x66, 0x41, 0x92, 0x1a, 0x8e, 0xea, 0xbd, 0xda, 0x46, 0xdd, 0x6d,
+ 0x6b, 0x9c, 0x66, 0xd9, 0x84, 0x55, 0x45, 0xf3, 0x48, 0xec, 0x9d, 0x61, 0x16, 0xe3, 0x49, 0x44,
+ 0x43, 0xac, 0xd6, 0x6f, 0xdd, 0x1d, 0x28, 0xd2, 0x7e, 0xfc, 0x4d, 0x46, 0x40, 0x7f, 0x06, 0x83,
+ 0x8c, 0x5f, 0x6e, 0x4a, 0xc5, 0x5d, 0x57, 0xdc, 0x7d, 0xc3, 0x7d, 0x64, 0xd0, 0xce, 0x3f, 0x42,
+ 0xef, 0xe5, 0x29, 0xa3, 0x42, 0x4c, 0x48, 0x3c, 0x7e, 0xec, 0x0b, 0x5f, 0x66, 0x8f, 0x04, 0x33,
+ 0x42, 0x43, 0x6e, 0xac, 0xb5, 0x20, 0xfa, 0x00, 0x06, 0x42, 0xf3, 0xe2, 0xd0, 0xb3, 0x3c, 0x55,
+ 0xc5, 0xb3, 0x92, 0x11, 0x0e, 0x0c, 0xf3, 0xbb, 0xd0, 0xcb, 0x99, 0x65, 0xfe, 0x31, 0xf6, 0x76,
+ 0x33, 0xec, 0x4b, 0x12, 0x61, 0xe7, 0x5c, 0xc5, 0x4a, 0x4d, 0x32, 0xfa, 0x00, 0x5a, 0x79, 0x1c,
+ 0x2a, 0x6a, 0x85, 0xf4, 0xf4, 0x0a, 0xb1, 0xe1, 0x74, 0x9b, 0x59, 0x50, 0xbe, 0x86, 0xbe, 0xc8,
+ 0x0c, 0xf7, 0x42, 0x5f, 0xf8, 0xe5, 0x45, 0x55, 0xf6, 0xca, 0xed, 0x89, 0x12, 0xec, 0x7c, 0x05,
+ 0xad, 0x03, 0x12, 0x72, 0xad, 0x78, 0x08, 0x8d, 0x20, 0x65, 0x0c, 0xc7, 0xc2, 0xba, 0x6c, 0x40,
+ 0xb4, 0x06, 0x4b, 0x13, 0x12, 0x11, 0x61, 0xdc, 0xd4, 0x80, 0x43, 0x01, 0x9e, 0xe3, 0x88, 0xb2,
+ 0xa9, 0x0a, 0xd8, 0x1a, 0x2c, 0x15, 0x27, 0x57, 0x03, 0xe8, 0x36, 0xb4, 0x22, 0xff, 0x22, 0x9b,
+ 0x54, 0x49, 0x69, 0x46, 0xfe, 0x85, 0x36, 0x7e, 0x08, 0x8d, 0x13, 0x9f, 0x4c, 0x82, 0x58, 0x98,
+ 0xa8, 0x58, 0x30, 0x57, 0x58, 0x2f, 0x2a, 0xfc, 0xdf, 0x2a, 0xb4, 0xb5, 0x46, 0x6d, 0xf0, 0x1a,
+ 0x2c, 0x05, 0x7e, 0x70, 0x9a, 0xa9, 0x54, 0x00, 0xba, 0x6f, 0x0d, 0xa9, 0x16, 0x93, 0x70, 0x6e,
+ 0xa9, 0x35, 0x6d, 0x0b, 0x80, 0xbf, 0xf2, 0x13, 0x63, 0x5b, 0xed, 0x12, 0xe6, 0x96, 0xe4, 0xd1,
+ 0xe6, 0x7e, 0x0c, 0x1d, 0xbd, 0xee, 0xcc, 0x90, 0xfa, 0x25, 0x43, 0xda, 0x9a, 0x4b, 0x0f, 0x7a,
+ 0x1b, 0xba, 0x29, 0xc7, 0xde, 0x29, 0xc1, 0xcc, 0x67, 0xc1, 0xe9, 0x74, 0xb8, 0xa4, 0xcf, 0xc8,
+ 0x94, 0xe3, 0x3d, 0x8b, 0x43, 0xdb, 0xb0, 0x24, 0xd3, 0x1f, 0x1f, 0x2e, 0xab, 0xe3, 0xf8, 0x4e,
+ 0x51, 0xa4, 0x72, 0x75, 0x53, 0x7d, 0x9f, 0xc4, 0x82, 0x4d, 0x5d, 0xcd, 0x3a, 0xfa, 0x1c, 0x20,
+ 0x47, 0xa2, 0x15, 0xa8, 0x9d, 0xe1, 0xa9, 0xd9, 0x87, 0xf2, 0x57, 0x06, 0xe7, 0xdc, 0x9f, 0xa4,
+ 0x36, 0xea, 0x1a, 0xf8, 0xb2, 0xfa, 0x79, 0xc5, 0x09, 0xa0, 0xbf, 0x33, 0x39, 0x23, 0xb4, 0x30,
+ 0x7c, 0x0d, 0x96, 0x22, 0xff, 0x07, 0xca, 0x6c, 0x24, 0x15, 0xa0, 0xb0, 0x24, 0xa6, 0xcc, 0x8a,
+ 0x50, 0x00, 0xea, 0x41, 0x95, 0x26, 0x2a, 0x5e, 0x2d, 0xb7, 0x4a, 0x93, 0x5c, 0x51, 0xbd, 0xa0,
+ 0xc8, 0xf9, 0x6d, 0x1d, 0x20, 0xd7, 0x82, 0x5c, 0x18, 0x11, 0xea, 0x71, 0xcc, 0x64, 0x09, 0xe2,
+ 0x1d, 0x4f, 0x05, 0xe6, 0x1e, 0xc3, 0x41, 0xca, 0x38, 0x39, 0x97, 0xf3, 0x27, 0xdd, 0xbe, 0xa1,
+ 0xdd, 0x9e, 0xb1, 0xcd, 0xbd, 0x49, 0xe8, 0xa1, 0x1e, 0xb7, 0x23, 0x87, 0xb9, 0x76, 0x14, 0xda,
+ 0x87, 0x1b, 0xb9, 0xcc, 0xb0, 0x20, 0xae, 0x7a, 0x95, 0xb8, 0xd5, 0x4c, 0x5c, 0x98, 0x8b, 0x7a,
+ 0x02, 0xab, 0x84, 0x7a, 0x3f, 0xa6, 0x38, 0x2d, 0x09, 0xaa, 0x5d, 0x25, 0x68, 0x40, 0xe8, 0x5f,
+ 0xab, 0x01, 0xb9, 0x98, 0x03, 0xb8, 0x55, 0xf0, 0x52, 0x6e, 0xf7, 0x82, 0xb0, 0xfa, 0x55, 0xc2,
+ 0xd6, 0x33, 0xab, 0x64, 0x3e, 0xc8, 0x25, 0xfe, 0x15, 0xac, 0x13, 0xea, 0xbd, 0xf2, 0x89, 0x98,
+ 0x15, 0xb7, 0xf4, 0x2b, 0x4e, 0xca, 0x43, 0xb7, 0x2c, 0x4b, 0x3b, 0x19, 0x61, 0x36, 0x2e, 0x39,
+ 0xb9, 0xfc, 0x2b, 0x4e, 0x3e, 0x57, 0x03, 0x72, 0x31, 0x8f, 0x60, 0x40, 0xe8, 0xac, 0x35, 0x8d,
+ 0xab, 0x84, 0xf4, 0x09, 0x2d, 0x5b, 0xb2, 0x03, 0x03, 0x8e, 0x03, 0x41, 0x59, 0x71, 0x11, 0x34,
+ 0xaf, 0x12, 0xb1, 0x62, 0xf8, 0x33, 0x19, 0xce, 0xdf, 0x41, 0x67, 0x2f, 0x1d, 0x63, 0x31, 0x39,
+ 0xce, 0x92, 0xc1, 0x6b, 0xcb, 0x3f, 0xce, 0xef, 0xab, 0xd0, 0xde, 0x1d, 0x33, 0x9a, 0x26, 0xa5,
+ 0x9c, 0xac, 0x37, 0xe9, 0x6c, 0x4e, 0x56, 0x2c, 0x2a, 0x27, 0x6b, 0xe6, 0x4f, 0xa0, 0x13, 0xa9,
+ 0xad, 0x6b, 0xf8, 0x75, 0x1e, 0x1a, 0xcc, 0x6d, 0x6a, 0xb7, 0x1d, 0x15, 0x92, 0xd9, 0x26, 0x40,
+ 0x42, 0x42, 0x6e, 0xc6, 0xe8, 0x74, 0xd4, 0x37, 0x15, 0xa1, 0x4d, 0xd1, 0x6e, 0x2b, 0xc9, 0xb2,
+ 0xf5, 0x03, 0x68, 0x1f, 0xcb, 0x20, 0x99, 0x01, 0xa5, 0x64, 0x94, 0x47, 0xcf, 0x85, 0xe3, 0x7c,
+ 0x13, 0xee, 0x41, 0xf7, 0x54, 0x87, 0xcc, 0x0c, 0xd2, 0x6b, 0xe8, 0x6d, 0xe3, 0x49, 0xee, 0xef,
+ 0x66, 0x31, 0xb2, 0x7a, 0x02, 0x3a, 0xa7, 0x05, 0xd4, 0xe8, 0x10, 0x06, 0x73, 0x2c, 0x0b, 0x72,
+ 0xd0, 0x46, 0x31, 0x07, 0xb5, 0xb7, 0x91, 0x56, 0x54, 0x1c, 0x59, 0xcc, 0x4b, 0xff, 0x52, 0x85,
+ 0xde, 0x7e, 0x2c, 0x30, 0x3b, 0xf1, 0x03, 0xac, 0x2d, 0x46, 0x50, 0x8f, 0xfd, 0x08, 0x1b, 0x99,
+ 0xea, 0x1f, 0xdd, 0x82, 0x26, 0xbb, 0xd0, 0x29, 0xc4, 0xcc, 0x68, 0x83, 0x5d, 0xa8, 0xd4, 0x80,
+ 0xde, 0x00, 0x60, 0x17, 0x5e, 0xe2, 0x07, 0x67, 0xd8, 0xc4, 0xb0, 0xee, 0xb6, 0xd8, 0xc5, 0x81,
+ 0x46, 0xc8, 0xc5, 0xc0, 0x2e, 0x3c, 0xcc, 0x18, 0x65, 0xdc, 0x64, 0xab, 0x26, 0xbb, 0x78, 0xa2,
+ 0x60, 0x33, 0x36, 0x64, 0x34, 0x49, 0x70, 0xa8, 0xb2, 0xb4, 0x1a, 0xfb, 0x58, 0x23, 0xa4, 0x56,
+ 0x61, 0xb5, 0x2e, 0x6b, 0xad, 0x22, 0xd7, 0x2a, 0x72, 0xad, 0x0d, 0x3d, 0x52, 0x14, 0xb5, 0x8a,
+ 0x4c, 0x6b, 0x53, 0x6b, 0x15, 0x05, 0xad, 0x22, 0xd7, 0xda, 0xb2, 0x63, 0x8d, 0x56, 0xe7, 0xbf,
+ 0xab, 0xd0, 0x78, 0x19, 0xa8, 0x49, 0x41, 0xf7, 0xa0, 0x8d, 0xb9, 0xf0, 0x8f, 0x27, 0x84, 0x9f,
+ 0xe2, 0xd0, 0x2c, 0xf3, 0x22, 0x4a, 0xda, 0xc8, 0xa7, 0xb1, 0xc7, 0xe5, 0x09, 0x6e, 0x22, 0xc3,
+ 0xa7, 0xf1, 0xa1, 0x3c, 0xc1, 0x0d, 0x89, 0xe1, 0xe0, 0xdc, 0xae, 0x75, 0x3e, 0x8d, 0x5d, 0x1c,
+ 0x9c, 0x4b, 0xfb, 0x4e, 0x48, 0xac, 0x72, 0xcc, 0x03, 0x1b, 0x95, 0x13, 0x12, 0xcb, 0xfc, 0xf1,
+ 0xa0, 0x48, 0xdc, 0x36, 0x41, 0xb1, 0xc4, 0x6d, 0xe5, 0x99, 0x4c, 0x03, 0x92, 0x6a, 0x82, 0xd2,
+ 0x94, 0x08, 0x49, 0x55, 0x87, 0xf3, 0x84, 0x72, 0x6c, 0x02, 0xa2, 0x01, 0xe9, 0xaf, 0xfa, 0xd1,
+ 0x63, 0x74, 0x34, 0x5a, 0x0a, 0xa3, 0x06, 0xdd, 0x82, 0xe6, 0xc4, 0xe7, 0xc2, 0xf3, 0x83, 0x33,
+ 0x13, 0x8c, 0x86, 0x84, 0x1f, 0x05, 0x67, 0xb2, 0xba, 0x97, 0x05, 0x39, 0x8e, 0x87, 0xa0, 0x08,
+ 0x06, 0x52, 0x55, 0xcb, 0x84, 0x72, 0x12, 0x8f, 0x87, 0x6d, 0x53, 0xb5, 0x68, 0xd0, 0x49, 0xa1,
+ 0x71, 0x14, 0xea, 0xd8, 0xe5, 0x83, 0x2b, 0xb3, 0x83, 0x6d, 0xec, 0x4d, 0xc0, 0x0c, 0x68, 0xd6,
+ 0x8a, 0x3e, 0x11, 0x4c, 0xc4, 0x9a, 0xec, 0x42, 0x27, 0x7c, 0x33, 0xa5, 0x86, 0x58, 0xb7, 0x53,
+ 0xaa, 0x89, 0xce, 0xff, 0x57, 0xa0, 0xf3, 0x2d, 0x16, 0xaf, 0x28, 0x3b, 0xb3, 0xf9, 0x00, 0x88,
+ 0x5d, 0xd6, 0xdc, 0x9c, 0x75, 0xa6, 0x3c, 0x2b, 0x2f, 0x77, 0xb7, 0xc0, 0x87, 0xde, 0x84, 0x9a,
+ 0x08, 0x12, 0xb3, 0x73, 0x4c, 0x6b, 0x68, 0x96, 0x82, 0x2b, 0x29, 0xe8, 0x2d, 0xa8, 0x8b, 0x20,
+ 0xf9, 0xd4, 0xa4, 0x8a, 0x19, 0x0e, 0x45, 0x92, 0x32, 0xd2, 0x30, 0x29, 0xb7, 0x97, 0x26, 0x24,
+ 0xae, 0xa4, 0x48, 0x19, 0x69, 0x98, 0x7c, 0xaa, 0x66, 0x76, 0x8e, 0x43, 0x91, 0x9c, 0x7f, 0xae,
+ 0xc0, 0xfa, 0x6c, 0xf7, 0x61, 0x7a, 0xa5, 0x4f, 0xa0, 0x13, 0xa8, 0xa4, 0x51, 0x4a, 0x8c, 0x83,
+ 0xb9, 0x74, 0xe2, 0xb6, 0x83, 0x42, 0x2e, 0xfd, 0x0c, 0xba, 0xb1, 0x0e, 0x4f, 0x29, 0x3f, 0x9a,
+ 0xe4, 0x50, 0x8c, 0x9c, 0xdb, 0x89, 0x0b, 0x90, 0x13, 0x02, 0xfa, 0x8e, 0x11, 0x81, 0x0f, 0x05,
+ 0xc3, 0x7e, 0xf4, 0x3a, 0xba, 0x60, 0x04, 0x75, 0x55, 0x32, 0xd7, 0x54, 0x93, 0xa7, 0xfe, 0x9d,
+ 0xf7, 0x60, 0xb5, 0xa4, 0xc5, 0xf8, 0xba, 0x02, 0xb5, 0x89, 0x59, 0x3e, 0x5d, 0x57, 0xfe, 0x3a,
+ 0x3e, 0x0c, 0x5c, 0xec, 0x87, 0xaf, 0xcf, 0x1a, 0xa3, 0xa2, 0x96, 0xab, 0xd8, 0x00, 0x54, 0x54,
+ 0x61, 0x4c, 0xb1, 0x56, 0x57, 0x0a, 0x56, 0xbf, 0x80, 0xc1, 0xae, 0xdc, 0x45, 0x87, 0x22, 0x24,
+ 0xf1, 0xeb, 0x68, 0xdb, 0xff, 0x01, 0x56, 0x5f, 0x8a, 0xe9, 0x77, 0x52, 0x18, 0x27, 0x3f, 0xe1,
+ 0xd7, 0xe4, 0x1f, 0xa3, 0xaf, 0xac, 0x7f, 0x8c, 0xbe, 0x92, 0xdb, 0x32, 0xa0, 0x93, 0x34, 0x8a,
+ 0xd5, 0x12, 0xed, 0xba, 0x06, 0x72, 0x76, 0xa0, 0xa3, 0x1b, 0xb9, 0xe7, 0x34, 0x4c, 0x27, 0x78,
+ 0xe1, 0x31, 0x70, 0x17, 0x20, 0xf1, 0x99, 0x1f, 0x61, 0x81, 0x19, 0x57, 0x25, 0x5f, 0xcb, 0x2d,
+ 0x60, 0x9c, 0x7f, 0xad, 0xc2, 0x9a, 0xbe, 0x97, 0x3b, 0xd4, 0xd7, 0x51, 0xd6, 0x85, 0x11, 0x34,
+ 0x4f, 0x29, 0x17, 0x05, 0x81, 0x19, 0x2c, 0x4d, 0x0c, 0x63, 0x2b, 0x4d, 0xfe, 0x96, 0x2e, 0xcb,
+ 0x6a, 0x57, 0x5f, 0x96, 0xcd, 0x5d, 0x87, 0xd5, 0xe7, 0xaf, 0xc3, 0x64, 0x02, 0xb4, 0x4c, 0x44,
+ 0x1f, 0x33, 0x2d, 0xb7, 0x65, 0x30, 0xfb, 0x21, 0xba, 0x0f, 0xfd, 0xb1, 0xb4, 0xd2, 0x3b, 0xa5,
+ 0xf4, 0xcc, 0x4b, 0x7c, 0x71, 0xaa, 0x12, 0x6b, 0xcb, 0xed, 0x2a, 0xf4, 0x1e, 0xa5, 0x67, 0x07,
+ 0xbe, 0x38, 0x45, 0x5f, 0x40, 0xcf, 0xf4, 0x22, 0x91, 0x0a, 0x11, 0x37, 0x15, 0x98, 0xd9, 0x45,
+ 0xc5, 0xe8, 0xb9, 0xdd, 0xb3, 0x02, 0xc4, 0x9d, 0x9b, 0x70, 0xe3, 0x31, 0xe6, 0x82, 0xd1, 0x69,
+ 0x39, 0x30, 0xce, 0x5f, 0x00, 0xec, 0xe7, 0xf9, 0xe7, 0xa3, 0x22, 0x64, 0xb2, 0xd6, 0xca, 0xa6,
+ 0xbe, 0x16, 0xcd, 0x08, 0x6e, 0x81, 0xc7, 0xd9, 0x84, 0x65, 0x97, 0xa6, 0xf2, 0x44, 0x7c, 0xc7,
+ 0xfe, 0x99, 0x71, 0x1d, 0x33, 0x4e, 0x21, 0x5d, 0x43, 0x73, 0xf6, 0xec, 0x3d, 0x4a, 0x2e, 0xce,
+ 0x4c, 0xd1, 0x26, 0xb4, 0xb2, 0x4c, 0x68, 0xb2, 0xca, 0xbc, 0xea, 0x9c, 0xc5, 0x79, 0x09, 0xce,
+ 0x8c, 0xa4, 0xbd, 0x57, 0x8f, 0xc2, 0x90, 0xed, 0x4c, 0xbf, 0xf5, 0xa3, 0x6b, 0x4b, 0xfd, 0x1e,
+ 0x56, 0xb5, 0x54, 0x6d, 0xaf, 0x15, 0xf3, 0x0e, 0x2c, 0x33, 0xeb, 0x5c, 0x25, 0xbf, 0x65, 0x35,
+ 0x4c, 0x86, 0x86, 0xee, 0x48, 0x65, 0x01, 0xc3, 0x91, 0x3d, 0x8c, 0x9b, 0x6e, 0x8e, 0x90, 0x73,
+ 0xf0, 0x8c, 0x70, 0x91, 0x07, 0xcf, 0xce, 0xc1, 0x2a, 0x0c, 0x24, 0xa1, 0xa4, 0xd1, 0xf9, 0x7b,
+ 0x58, 0x7d, 0x11, 0x4f, 0x48, 0x8c, 0x77, 0x0f, 0x8e, 0x9e, 0xe3, 0x2c, 0xd7, 0x20, 0xa8, 0xab,
+ 0x53, 0xb4, 0xa2, 0xa4, 0xab, 0x7f, 0xb9, 0xf9, 0xe2, 0x63, 0x2f, 0x48, 0x52, 0x6e, 0x2e, 0x3d,
+ 0x97, 0xe3, 0xe3, 0xdd, 0x24, 0xe5, 0xf2, 0x64, 0x95, 0x15, 0x2c, 0x8d, 0x27, 0x53, 0xb5, 0x03,
+ 0x9b, 0x6e, 0x23, 0x48, 0xd2, 0x17, 0xf1, 0x64, 0xea, 0xfc, 0xb9, 0xba, 0xe6, 0xc1, 0x38, 0x74,
+ 0xfd, 0x38, 0xa4, 0xd1, 0x63, 0x7c, 0x5e, 0xd0, 0x90, 0x5d, 0x29, 0xd8, 0x4c, 0xf3, 0x73, 0x05,
+ 0x3a, 0x8f, 0xc6, 0x38, 0x16, 0x8f, 0xb1, 0xf0, 0xc9, 0x44, 0x5d, 0x1b, 0x9c, 0x63, 0xc6, 0x09,
+ 0x8d, 0xcd, 0x76, 0xb2, 0x20, 0x7a, 0x13, 0xda, 0x24, 0x26, 0xc2, 0x0b, 0x7d, 0x1c, 0xd1, 0xd8,
+ 0x44, 0x01, 0x24, 0xea, 0xb1, 0xc2, 0xa0, 0xf7, 0xa0, 0xaf, 0x2f, 0xa5, 0xbd, 0x53, 0x3f, 0x0e,
+ 0x27, 0x72, 0x23, 0xeb, 0x4b, 0xba, 0x9e, 0x46, 0xef, 0x19, 0x2c, 0x7a, 0x1f, 0x56, 0xcc, 0x36,
+ 0xcb, 0x39, 0xeb, 0x8a, 0xb3, 0x6f, 0xf0, 0x25, 0xd6, 0x34, 0x49, 0x28, 0x13, 0xdc, 0xe3, 0x38,
+ 0x08, 0x68, 0x94, 0x98, 0x9e, 0xbb, 0x6f, 0xf1, 0x87, 0x1a, 0xed, 0x8c, 0x61, 0xf5, 0xa9, 0xf4,
+ 0xd3, 0x78, 0x92, 0x4f, 0x70, 0x2f, 0xc2, 0x91, 0x77, 0x3c, 0xa1, 0xc1, 0x99, 0x27, 0x93, 0x9f,
+ 0x89, 0xb0, 0xac, 0xea, 0x77, 0x24, 0xf2, 0x90, 0xfc, 0xa4, 0xae, 0x97, 0x24, 0xd7, 0x29, 0x15,
+ 0xc9, 0x24, 0x1d, 0x7b, 0x09, 0xa3, 0xc7, 0xd8, 0xb8, 0xd8, 0x8f, 0x70, 0xb4, 0xa7, 0xf1, 0x07,
+ 0x12, 0xed, 0xfc, 0x4f, 0x05, 0xd6, 0xca, 0x9a, 0x4c, 0x2a, 0xdf, 0x82, 0xb5, 0xb2, 0x2a, 0x53,
+ 0x61, 0xea, 0x2a, 0x65, 0x50, 0x54, 0xa8, 0x6b, 0xcd, 0xcf, 0xa0, 0xab, 0x5e, 0x2a, 0xbc, 0x50,
+ 0x4b, 0x2a, 0x1f, 0x9e, 0xc5, 0x79, 0x71, 0x3b, 0x7e, 0x71, 0x96, 0xbe, 0x80, 0x5b, 0xc6, 0x7d,
+ 0x6f, 0xde, 0x6c, 0xbd, 0x20, 0xd6, 0x0d, 0xc3, 0xf3, 0x19, 0xeb, 0x9f, 0xc1, 0x30, 0x47, 0xed,
+ 0x4c, 0x15, 0xd2, 0xc6, 0xea, 0x23, 0x58, 0x9d, 0x71, 0x56, 0xee, 0x3b, 0xb5, 0xed, 0xeb, 0xee,
+ 0x22, 0x92, 0xf3, 0x10, 0x6e, 0x1e, 0x62, 0xa1, 0xa3, 0xe1, 0x0b, 0xd3, 0xee, 0x6a, 0x61, 0x2b,
+ 0x50, 0x3b, 0xc4, 0x81, 0x72, 0xbe, 0xe6, 0xca, 0x5f, 0xb9, 0x00, 0x8f, 0x38, 0x0e, 0x94, 0x97,
+ 0x35, 0x57, 0xfd, 0x3b, 0xff, 0x55, 0x81, 0x86, 0x49, 0xbe, 0xf2, 0x00, 0x09, 0x19, 0x39, 0xc7,
+ 0xcc, 0x2c, 0x3d, 0x03, 0xa1, 0x77, 0xa1, 0xa7, 0xff, 0x3c, 0x9a, 0x08, 0x42, 0xb3, 0x94, 0xde,
+ 0xd5, 0xd8, 0x17, 0x1a, 0xa9, 0x2e, 0xa1, 0xd5, 0x1d, 0xab, 0xb9, 0xce, 0x30, 0x90, 0xba, 0x49,
+ 0xe6, 0x32, 0x33, 0xa8, 0x14, 0xde, 0x72, 0x0d, 0x24, 0x97, 0xba, 0x95, 0xb7, 0xa4, 0xe4, 0x59,
+ 0x50, 0x2e, 0xf5, 0x88, 0xa6, 0xb1, 0xf0, 0x12, 0x4a, 0x62, 0x61, 0x72, 0x36, 0x28, 0xd4, 0x81,
+ 0xc4, 0x38, 0xff, 0x54, 0x81, 0x65, 0xfd, 0x10, 0x83, 0x7a, 0x50, 0xcd, 0x4e, 0xce, 0x2a, 0x51,
+ 0x55, 0x88, 0xd2, 0xa5, 0x4f, 0x4b, 0xf5, 0x2f, 0xf7, 0xf1, 0x79, 0xa4, 0xf3, 0xbf, 0x31, 0xed,
+ 0x3c, 0x52, 0x89, 0xff, 0x5d, 0xe8, 0xe5, 0x07, 0xb0, 0xa2, 0x6b, 0x13, 0xbb, 0x19, 0x56, 0xb1,
+ 0x5d, 0x6a, 0xa9, 0xf3, 0xb7, 0x00, 0xf9, 0x83, 0x84, 0x0c, 0x79, 0x9a, 0x19, 0x23, 0x7f, 0x25,
+ 0x66, 0x9c, 0x1d, 0xdd, 0xf2, 0x17, 0xdd, 0x87, 0x9e, 0x1f, 0x86, 0x44, 0x0e, 0xf7, 0x27, 0x4f,
+ 0x49, 0x98, 0x6d, 0xd2, 0x32, 0xd6, 0xf9, 0xbf, 0x0a, 0xf4, 0x77, 0x69, 0x32, 0xfd, 0x4b, 0x32,
+ 0xc1, 0x85, 0x0c, 0xa2, 0x8c, 0x34, 0x27, 0xb7, 0xfc, 0xd7, 0x3d, 0xc5, 0x04, 0xeb, 0xad, 0xa5,
+ 0x67, 0xb6, 0x29, 0x11, 0x6a, 0x5b, 0x59, 0x62, 0x76, 0xb7, 0xdb, 0xd5, 0xc4, 0xe7, 0x34, 0x54,
+ 0xad, 0x5f, 0x48, 0x98, 0x97, 0xdd, 0xe4, 0x76, 0xdd, 0x46, 0x48, 0x98, 0x22, 0x19, 0x47, 0x96,
+ 0xd4, 0x63, 0x42, 0xd1, 0x91, 0x65, 0x8d, 0x91, 0x8e, 0xac, 0xc3, 0x32, 0x3d, 0x39, 0xe1, 0x58,
+ 0xa8, 0x9e, 0xa4, 0xe6, 0x1a, 0x28, 0x4b, 0x73, 0xcd, 0x42, 0x9a, 0xbb, 0x01, 0xab, 0xea, 0xd9,
+ 0xea, 0x25, 0xf3, 0x03, 0x12, 0x8f, 0x6d, 0x2a, 0x5e, 0x03, 0x74, 0x28, 0x68, 0x32, 0x83, 0xdd,
+ 0x84, 0x81, 0x39, 0x7f, 0x0e, 0xfe, 0xe6, 0xd0, 0xba, 0x7e, 0x0b, 0x9a, 0x12, 0xf4, 0x18, 0xfe,
+ 0xd1, 0x26, 0x46, 0x43, 0x76, 0xde, 0x87, 0x8e, 0xfe, 0x35, 0x69, 0x20, 0x67, 0xe5, 0x65, 0x56,
+ 0xbe, 0xfd, 0x9f, 0x03, 0x93, 0x6e, 0xcd, 0xf5, 0x10, 0x7a, 0x0a, 0xfd, 0x99, 0xe7, 0x46, 0x64,
+ 0xee, 0x0b, 0x17, 0xbf, 0x42, 0x8e, 0xd6, 0x37, 0xf5, 0xf3, 0xe5, 0xa6, 0x7d, 0xbe, 0xdc, 0x7c,
+ 0x12, 0x25, 0x62, 0x8a, 0x9e, 0x40, 0xaf, 0xfc, 0x30, 0x87, 0x6e, 0xdb, 0xca, 0x66, 0xc1, 0x73,
+ 0xdd, 0xa5, 0x62, 0x9e, 0x42, 0x7f, 0xe6, 0x8d, 0xce, 0xda, 0xb3, 0xf8, 0xe9, 0xee, 0x52, 0x41,
+ 0x0f, 0xa1, 0x5d, 0x78, 0x94, 0x43, 0x43, 0x2d, 0x64, 0xfe, 0x9d, 0xee, 0x52, 0x01, 0xbb, 0xd0,
+ 0x2d, 0xbd, 0x93, 0xa1, 0x91, 0xf1, 0x67, 0xc1, 0xe3, 0xd9, 0xa5, 0x42, 0x76, 0xa0, 0x5d, 0x78,
+ 0xae, 0xb2, 0x56, 0xcc, 0xbf, 0x89, 0x8d, 0x6e, 0x2d, 0xa0, 0x98, 0xe9, 0xdc, 0x83, 0x6e, 0xe9,
+ 0x71, 0xc9, 0x1a, 0xb2, 0xe8, 0x61, 0x6b, 0x74, 0x7b, 0x21, 0xcd, 0x48, 0x7a, 0x0a, 0xfd, 0x99,
+ 0xa7, 0x26, 0x1b, 0xdc, 0xc5, 0x2f, 0x50, 0x97, 0xba, 0xf5, 0x8d, 0x9a, 0xec, 0x42, 0x13, 0x57,
+ 0x98, 0xec, 0xf9, 0x87, 0xa5, 0xd1, 0x9d, 0xc5, 0x44, 0x63, 0xd5, 0x13, 0xe8, 0x95, 0xdf, 0x94,
+ 0xac, 0xb0, 0x85, 0x2f, 0x4d, 0x57, 0xaf, 0x9c, 0xd2, 0xf3, 0x52, 0xbe, 0x72, 0x16, 0xbd, 0x3a,
+ 0x5d, 0x2a, 0xe8, 0x11, 0x80, 0x69, 0xd9, 0x42, 0x12, 0x67, 0x53, 0x36, 0xd7, 0x2a, 0x66, 0x53,
+ 0xb6, 0xa0, 0xbd, 0x7b, 0x08, 0xa0, 0x3b, 0xad, 0x90, 0xa6, 0x02, 0xdd, 0xb4, 0x66, 0xcc, 0xb4,
+ 0x77, 0xa3, 0xe1, 0x3c, 0x61, 0x4e, 0x00, 0x66, 0xec, 0x3a, 0x02, 0xbe, 0x06, 0xc8, 0x3b, 0x38,
+ 0x2b, 0x60, 0xae, 0xa7, 0xbb, 0x22, 0x06, 0x9d, 0x62, 0xbf, 0x86, 0x8c, 0xaf, 0x0b, 0x7a, 0xb8,
+ 0x2b, 0x44, 0xf4, 0x67, 0xaa, 0xe8, 0xf2, 0x62, 0x9b, 0x2d, 0xd3, 0x47, 0x73, 0xd5, 0x33, 0xfa,
+ 0x1e, 0x6e, 0x5f, 0x51, 0x88, 0xa3, 0x8d, 0x85, 0xe2, 0x16, 0xd4, 0xea, 0x0b, 0x44, 0x7f, 0x06,
+ 0x9d, 0x62, 0x35, 0x6e, 0x1d, 0x5c, 0x50, 0xa1, 0x8f, 0x4a, 0x15, 0x39, 0x7a, 0x08, 0xbd, 0x72,
+ 0xad, 0x8d, 0x0a, 0x5b, 0x6e, 0xae, 0x02, 0x1f, 0xad, 0xcc, 0xdc, 0xcc, 0x70, 0xf4, 0x31, 0x40,
+ 0x5e, 0x93, 0xdb, 0x99, 0x99, 0xab, 0xd2, 0x67, 0xb4, 0x7e, 0x0d, 0xbd, 0xc2, 0x91, 0x20, 0x9b,
+ 0xd8, 0x9b, 0x25, 0xe7, 0xf3, 0x83, 0x62, 0x64, 0x8a, 0xb7, 0xd2, 0x89, 0xf0, 0x08, 0x3a, 0xc5,
+ 0xe3, 0xc7, 0x7a, 0xbb, 0xe0, 0x48, 0xba, 0x2a, 0x9f, 0x16, 0x8e, 0x2a, 0xbb, 0x2d, 0xe6, 0x4f,
+ 0xaf, 0xab, 0xf2, 0x69, 0xa9, 0x81, 0xb6, 0x69, 0x6c, 0x51, 0x57, 0x7d, 0xd5, 0x29, 0x53, 0xee,
+ 0x36, 0x6d, 0xf4, 0x17, 0xf6, 0xa0, 0x57, 0x2d, 0xef, 0x62, 0x0b, 0x64, 0xe3, 0xb1, 0xa0, 0x2d,
+ 0xfa, 0x95, 0x74, 0x53, 0x6c, 0x73, 0x0a, 0xe9, 0x66, 0x41, 0xf7, 0x73, 0xa9, 0xa0, 0x3d, 0xe8,
+ 0x3f, 0xb5, 0x15, 0xac, 0xa9, 0xae, 0x8d, 0x39, 0x0b, 0xba, 0x89, 0xd1, 0x68, 0x11, 0xc9, 0xcc,
+ 0xf2, 0x37, 0x30, 0x98, 0xab, 0xac, 0xd1, 0xdd, 0xec, 0xa1, 0x60, 0x61, 0xc9, 0x7d, 0xa9, 0x59,
+ 0xfb, 0xb0, 0x32, 0x5b, 0x58, 0xa3, 0x37, 0xcc, 0xa4, 0x2f, 0x2e, 0xb8, 0x2f, 0x15, 0xf5, 0x05,
+ 0x34, 0x6d, 0x21, 0x87, 0xcc, 0x83, 0xcc, 0x4c, 0x61, 0x77, 0xd9, 0xd0, 0x9d, 0xce, 0xcf, 0xbf,
+ 0xdc, 0xad, 0xfc, 0xe6, 0x97, 0xbb, 0x95, 0xdf, 0xfd, 0x72, 0xb7, 0x72, 0xbc, 0xac, 0xa8, 0x1f,
+ 0xff, 0x21, 0x00, 0x00, 0xff, 0xff, 0x1b, 0x62, 0x55, 0x85, 0x98, 0x25, 0x00, 0x00,
}
diff --git a/virtcontainers/agent.go b/virtcontainers/agent.go
index 3f22d9f..5e3ace9 100644
--- a/virtcontainers/agent.go
+++ b/virtcontainers/agent.go
@@ -231,6 +231,9 @@ type agent interface {
// updateInterface will tell the agent to update a nic for an existed Sandbox.
updateInterface(inf *vcTypes.Interface) (*vcTypes.Interface, error)
+ // updateInterfaceHwAddrByName will tell the agent to update a nic for an existed Sandbox by nic name.
+ updateInterfaceHwAddrByName(inf *vcTypes.Interface) (*vcTypes.Interface, error)
+
// listInterfaces will tell the agent to list interfaces of an existed Sandbox
listInterfaces() ([]*vcTypes.Interface, error)
diff --git a/virtcontainers/hypervisor.go b/virtcontainers/hypervisor.go
index 60f1d19..3ca874e 100644
--- a/virtcontainers/hypervisor.go
+++ b/virtcontainers/hypervisor.go
@@ -47,6 +47,9 @@ const (
// MockHypervisor is a mock hypervisor for testing purposes
MockHypervisor HypervisorType = "mock"
+
+ // StratovirtHypervisor is stratovirt hypervisor
+ StratovirtHypervisor HypervisorType = "stratovirt"
)
const (
@@ -171,6 +174,9 @@ func (hType *HypervisorType) Set(value string) error {
case "mock":
*hType = MockHypervisor
return nil
+ case "stratovirt":
+ *hType = StratovirtHypervisor
+ return nil
default:
return fmt.Errorf("Unknown hypervisor type %s", value)
}
@@ -189,6 +195,8 @@ func (hType *HypervisorType) String() string {
return string(ClhHypervisor)
case MockHypervisor:
return string(MockHypervisor)
+ case StratovirtHypervisor:
+ return string(StratovirtHypervisor)
default:
return ""
}
@@ -218,6 +226,10 @@ func newHypervisor(hType HypervisorType) (hypervisor, error) {
}, nil
case MockHypervisor:
return &mockHypervisor{}, nil
+ case StratovirtHypervisor:
+ return &stratovirt{
+ store: store,
+ }, nil
default:
return nil, fmt.Errorf("Unknown hypervisor type %s", hType)
}
diff --git a/virtcontainers/kata_agent.go b/virtcontainers/kata_agent.go
index 0f03c9d..f8cad39 100644
--- a/virtcontainers/kata_agent.go
+++ b/virtcontainers/kata_agent.go
@@ -102,36 +102,37 @@ const (
)
const (
- grpcCheckRequest = "grpc.CheckRequest"
- grpcExecProcessRequest = "grpc.ExecProcessRequest"
- grpcCreateSandboxRequest = "grpc.CreateSandboxRequest"
- grpcDestroySandboxRequest = "grpc.DestroySandboxRequest"
- grpcCreateContainerRequest = "grpc.CreateContainerRequest"
- grpcStartContainerRequest = "grpc.StartContainerRequest"
- grpcRemoveContainerRequest = "grpc.RemoveContainerRequest"
- grpcSignalProcessRequest = "grpc.SignalProcessRequest"
- grpcUpdateRoutesRequest = "grpc.UpdateRoutesRequest"
- grpcUpdateInterfaceRequest = "grpc.UpdateInterfaceRequest"
- grpcListInterfacesRequest = "grpc.ListInterfacesRequest"
- grpcListRoutesRequest = "grpc.ListRoutesRequest"
- grpcOnlineCPUMemRequest = "grpc.OnlineCPUMemRequest"
- grpcListProcessesRequest = "grpc.ListProcessesRequest"
- grpcUpdateContainerRequest = "grpc.UpdateContainerRequest"
- grpcWaitProcessRequest = "grpc.WaitProcessRequest"
- grpcTtyWinResizeRequest = "grpc.TtyWinResizeRequest"
- grpcWriteStreamRequest = "grpc.WriteStreamRequest"
- grpcCloseStdinRequest = "grpc.CloseStdinRequest"
- grpcStatsContainerRequest = "grpc.StatsContainerRequest"
- grpcPauseContainerRequest = "grpc.PauseContainerRequest"
- grpcResumeContainerRequest = "grpc.ResumeContainerRequest"
- grpcReseedRandomDevRequest = "grpc.ReseedRandomDevRequest"
- grpcGuestDetailsRequest = "grpc.GuestDetailsRequest"
- grpcMemHotplugByProbeRequest = "grpc.MemHotplugByProbeRequest"
- grpcCopyFileRequest = "grpc.CopyFileRequest"
- grpcSetGuestDateTimeRequest = "grpc.SetGuestDateTimeRequest"
- grpcStartTracingRequest = "grpc.StartTracingRequest"
- grpcStopTracingRequest = "grpc.StopTracingRequest"
- grpcUpdateIPVSRequest = "grpc.UpdateIPVSRequest"
+ grpcCheckRequest = "grpc.CheckRequest"
+ grpcExecProcessRequest = "grpc.ExecProcessRequest"
+ grpcCreateSandboxRequest = "grpc.CreateSandboxRequest"
+ grpcDestroySandboxRequest = "grpc.DestroySandboxRequest"
+ grpcCreateContainerRequest = "grpc.CreateContainerRequest"
+ grpcStartContainerRequest = "grpc.StartContainerRequest"
+ grpcRemoveContainerRequest = "grpc.RemoveContainerRequest"
+ grpcSignalProcessRequest = "grpc.SignalProcessRequest"
+ grpcUpdateRoutesRequest = "grpc.UpdateRoutesRequest"
+ grpcUpdateInterfaceRequest = "grpc.UpdateInterfaceRequest"
+ grpcUpdateInterfaceHwAddrByNameRequest = "grpc.UpdateInterfaceHwAddrByNameRequest"
+ grpcListInterfacesRequest = "grpc.ListInterfacesRequest"
+ grpcListRoutesRequest = "grpc.ListRoutesRequest"
+ grpcOnlineCPUMemRequest = "grpc.OnlineCPUMemRequest"
+ grpcListProcessesRequest = "grpc.ListProcessesRequest"
+ grpcUpdateContainerRequest = "grpc.UpdateContainerRequest"
+ grpcWaitProcessRequest = "grpc.WaitProcessRequest"
+ grpcTtyWinResizeRequest = "grpc.TtyWinResizeRequest"
+ grpcWriteStreamRequest = "grpc.WriteStreamRequest"
+ grpcCloseStdinRequest = "grpc.CloseStdinRequest"
+ grpcStatsContainerRequest = "grpc.StatsContainerRequest"
+ grpcPauseContainerRequest = "grpc.PauseContainerRequest"
+ grpcResumeContainerRequest = "grpc.ResumeContainerRequest"
+ grpcReseedRandomDevRequest = "grpc.ReseedRandomDevRequest"
+ grpcGuestDetailsRequest = "grpc.GuestDetailsRequest"
+ grpcMemHotplugByProbeRequest = "grpc.MemHotplugByProbeRequest"
+ grpcCopyFileRequest = "grpc.CopyFileRequest"
+ grpcSetGuestDateTimeRequest = "grpc.SetGuestDateTimeRequest"
+ grpcStartTracingRequest = "grpc.StartTracingRequest"
+ grpcStopTracingRequest = "grpc.StopTracingRequest"
+ grpcUpdateIPVSRequest = "grpc.UpdateIPVSRequest"
)
// The function is declared this way for mocking in unit tests
@@ -628,6 +629,15 @@ func (k *kataAgent) updateInterface(ifc *vcTypes.Interface) (*vcTypes.Interface,
return nil, err
}
+func (k *kataAgent) updateInterfaceHwAddrByName(ifc *vcTypes.Interface) (*vcTypes.Interface, error) {
+ ifcReq := &grpc.UpdateInterfaceHwAddrByNameRequest{
+ Interface: k.convertToKataAgentInterface(ifc),
+ }
+ _, err := k.sendReq(ifcReq)
+
+ return nil, err
+}
+
func (k *kataAgent) updateInterfaces(interfaces []*vcTypes.Interface) error {
for _, ifc := range interfaces {
if _, err := k.updateInterface(ifc); err != nil {
@@ -2074,6 +2084,9 @@ func (k *kataAgent) installReqFunc(c *kataclient.AgentClient) {
k.reqHandlers[grpcUpdateInterfaceRequest] = func(ctx context.Context, req interface{}, opts ...golangGrpc.CallOption) (interface{}, error) {
return k.client.UpdateInterface(ctx, req.(*grpc.UpdateInterfaceRequest), opts...)
}
+ k.reqHandlers[grpcUpdateInterfaceHwAddrByNameRequest] = func(ctx context.Context, req interface{}, opts ...golangGrpc.CallOption) (interface{}, error) {
+ return k.client.UpdateInterfaceHwAddrByName(ctx, req.(*grpc.UpdateInterfaceHwAddrByNameRequest), opts...)
+ }
k.reqHandlers[grpcListInterfacesRequest] = func(ctx context.Context, req interface{}, opts ...golangGrpc.CallOption) (interface{}, error) {
return k.client.ListInterfaces(ctx, req.(*grpc.ListInterfacesRequest), opts...)
}
diff --git a/virtcontainers/noop_agent.go b/virtcontainers/noop_agent.go
index d174623..bac34be 100644
--- a/virtcontainers/noop_agent.go
+++ b/virtcontainers/noop_agent.go
@@ -111,6 +111,11 @@ func (n *noopAgent) updateInterface(inf *vcTypes.Interface) (*vcTypes.Interface,
return nil, nil
}
+// updateInterfaceHwAddrByName is the Noop agent Interface update implementation. It does nothing.
+func (n *noopAgent) updateInterfaceHwAddrByName(inf *vcTypes.Interface) (*vcTypes.Interface, error) {
+ return nil, nil
+}
+
// listInterfaces is the Noop agent Interfaces list implementation. It does nothing.
func (n *noopAgent) listInterfaces() ([]*vcTypes.Interface, error) {
return nil, nil
diff --git a/virtcontainers/stratovirt.go b/virtcontainers/stratovirt.go
new file mode 100644
index 0000000..7c156d5
--- /dev/null
+++ b/virtcontainers/stratovirt.go
@@ -0,0 +1,617 @@
+package virtcontainers
+
+import (
+ "context"
+ "fmt"
+ "os"
+ "os/exec"
+ "path/filepath"
+ "strconv"
+ "strings"
+ "syscall"
+ "time"
+
+ govmmQemu "github.com/intel/govmm/qemu"
+ "github.com/opentracing/opentracing-go"
+ "github.com/pkg/errors"
+ "github.com/sirupsen/logrus"
+
+ "github.com/kata-containers/runtime/virtcontainers/device/config"
+ persistapi "github.com/kata-containers/runtime/virtcontainers/persist/api"
+ vcTypes "github.com/kata-containers/runtime/virtcontainers/pkg/types"
+ "github.com/kata-containers/runtime/virtcontainers/store"
+ "github.com/kata-containers/runtime/virtcontainers/types"
+)
+
+const defaultDummyMac = "22:33:44:aa:bb:"
+const mmioBlkCount = 6
+const mmioNetCount = 2
+
+type stratovirtDev struct {
+ dev interface{}
+ devType deviceType
+}
+
+type stratovirt struct {
+ id string
+ ctx context.Context
+ sandbox *Sandbox
+ store persistapi.PersistDriver
+ config HypervisorConfig
+ pid int
+ socketPath string
+ consolePath string
+ qmpMonitorCh qmpChannel
+ devices []stratovirtDev
+ HotpluggedVCPUs []CPUDevice
+ mmioBlkSlots [mmioBlkCount]bool
+ mmioNetSlots [mmioNetCount]bool
+}
+
+func (s *stratovirt) Logger() *logrus.Entry {
+ return virtLog.WithField("subsystem", "stratovirt")
+}
+
+func (s *stratovirt) trace(name string) (opentracing.Span, context.Context) {
+ span, ctx := opentracing.StartSpanFromContext(s.ctx, name)
+
+ span.SetTag("subsystem", "hypervisor")
+ span.SetTag("type", "stratovirt")
+
+ return span, ctx
+}
+
+func (s *stratovirt) getKernelCmdLine() string {
+ var params []string
+
+ params = append(params, "pci=off")
+ params = append(params, "reboot=k")
+ params = append(params, "panic=1")
+ params = append(params, "iommu=off")
+ params = append(params, "acpi=off")
+ params = append(params, "quiet")
+ params = append(params, "agent.use_vsock="+strconv.FormatBool(s.config.UseVSock))
+ params = append(params, SerializeParams(s.config.KernelParams, "=")...)
+
+ return strings.Join(params, " ")
+}
+
+func (s *stratovirt) hypervisorConfig() HypervisorConfig {
+ return s.config
+}
+
+func (s *stratovirt) createSandbox(ctx context.Context, id string, networkNS NetworkNamespace, hypervisorConfig *HypervisorConfig, stateful bool) error {
+ s.ctx = ctx
+
+ span, _ := s.trace("createSandbox")
+ defer span.Finish()
+
+ sandbox, err := globalSandboxList.lookupSandbox(id)
+ if err != nil {
+ s.Logger().Error("Get sandbox failed")
+ return err
+ }
+
+ s.id = id
+ s.sandbox = sandbox
+ s.config = *hypervisorConfig
+ s.socketPath = filepath.Join(s.store.RunVMStoragePath(), id, "qmp.sock")
+ s.consolePath = filepath.Join(s.store.RunVMStoragePath(), id, "console.sock")
+ s.qmpMonitorCh = qmpChannel{
+ ctx: s.ctx,
+ path: s.socketPath,
+ }
+
+ return err
+}
+
+func (s *stratovirt) waitSandBoxStarted(timeout int) error {
+ timeStart := time.Now()
+ for {
+ err := s.qmpSetup()
+ if err == nil {
+ break
+ }
+
+ if int(time.Since(timeStart).Seconds()) > timeout {
+ return fmt.Errorf("Failed to connect to StratoVirt instance (timeout %ds): %v", timeout, err)
+ }
+
+ time.Sleep(time.Duration(50) * time.Millisecond)
+ }
+
+ if err := s.qmpMonitorCh.qmp.ExecuteQMPCapabilities(s.qmpMonitorCh.ctx); err != nil {
+ s.Logger().WithError(err).Error(qmpCapErrMsg)
+ return err
+ }
+
+ return nil
+}
+
+func (s *stratovirt) startSandbox(timeout int) error {
+ span, _ := s.trace("startSandbox")
+ defer span.Finish()
+
+ var params []string
+ params = append(params, "-name "+fmt.Sprintf("sandbox-%s", s.id))
+ params = append(params, "-api-channel unix:"+s.socketPath)
+
+ if kernelPath, err := s.config.KernelAssetPath(); err == nil {
+ params = append(params, "-kernel "+kernelPath)
+ }
+
+ if initrdPath, err := s.config.InitrdAssetPath(); err == nil {
+ params = append(params, "-initrd "+initrdPath)
+ }
+
+ params = append(params, "-append "+s.getKernelCmdLine())
+ params = append(params, fmt.Sprintf("-smp %d", s.config.NumVCPUs))
+ params = append(params, fmt.Sprintf("-m %d", s.config.MemorySize*1024*1024))
+ params = append(params, fmt.Sprintf("-chardev id=charconsole0,path=%s", s.consolePath))
+
+ // add devices to cmdline
+ for _, d := range s.devices {
+ switch v := d.dev.(type) {
+ case Endpoint:
+ name := v.Name()
+ mac := v.HardwareAddr()
+ tapName := v.NetworkPair().TapInterface.TAPIface.Name
+ params = append(params, fmt.Sprintf("-net id=%s,mac=%s,host_dev_name=%s", name, mac, tapName))
+ case config.BlockDrive:
+ id := v.ID
+ path := v.File
+ params = append(params, fmt.Sprintf("-drive id=%s,file=%s", id, path))
+ case types.VSock:
+ v.VhostFd.Close()
+ params = append(params, fmt.Sprintf("-device vsock,id=vsock-id,guest-cid=%d", v.ContextID))
+ default:
+ s.Logger().Error("Adding device type is unsupported")
+ }
+ }
+
+ // daemonize
+ params = append(params, "-daemonize")
+
+ // append logfile only on debug
+ if s.config.Debug {
+ dir := filepath.Join(store.RunVMStoragePath(), s.id)
+ params = append(params, fmt.Sprintf("-D %s/stratovirt.log", dir))
+ }
+
+ s.Logger().Info("StratoVirt start with params: ", strings.Join(params, " "))
+
+ dir := filepath.Join(store.RunVMStoragePath(), s.id)
+ err := os.MkdirAll(dir, store.DirMode)
+ if err != nil {
+ return err
+ }
+ defer func() {
+ if err != nil {
+ if err := os.RemoveAll(dir); err != nil {
+ s.Logger().WithError(err).Error("Fail to clean up vm dir %s", dir)
+ }
+ }
+ }()
+
+ binPath, err := s.config.HypervisorAssetPath()
+ if err != nil {
+ s.Logger().WithField("Fail to get hypervisor bin path", err).Error()
+ return err
+ }
+
+ cmd := exec.CommandContext(s.ctx, binPath, params...)
+ if err := cmd.Run(); err != nil {
+ s.Logger().WithField("Error starting hypervisor, please check the params", err).Error()
+ return err
+ }
+
+ if err = s.waitSandBoxStarted(timeout); err != nil {
+ return err
+ }
+
+ return nil
+}
+
+func (s *stratovirt) stopSandbox(force bool) error {
+ span, _ := s.trace("stopSandbox")
+ defer span.Finish()
+
+ defer func() {
+ dir := filepath.Join(store.RunVMStoragePath(), s.id)
+ link, _ := filepath.EvalSymlinks(dir)
+
+ if err := os.RemoveAll(dir); err != nil {
+ s.Logger().WithError(err).Warnf("Failed to clean up vm dir %s", dir)
+ }
+
+ if link != dir && link != "" {
+ if err := os.RemoveAll(link); err != nil {
+ s.Logger().WithError(err).WithField("link", link).Warn("Failed to remove vm path link %s", link)
+ }
+ }
+ }()
+
+ if !force {
+ err := s.qmpSetup()
+ if err != nil {
+ return err
+ }
+
+ err = s.qmpMonitorCh.qmp.ExecuteQuit(s.qmpMonitorCh.ctx)
+ if err != nil {
+ s.Logger().WithError(err).Error("Fail to execute qmp: QUIT")
+ return err
+ }
+ } else {
+ if s.pid > 0 {
+ syscall.Kill(s.pid, syscall.SIGKILL)
+ }
+ }
+ return nil
+}
+
+func (s *stratovirt) pauseSandbox() error {
+ return nil
+}
+
+func (s *stratovirt) saveSandbox() error {
+ return nil
+}
+
+func (s *stratovirt) resumeSandbox() error {
+ return nil
+}
+
+func (s *stratovirt) addDevice(devInfo interface{}, devType deviceType) error {
+ dev := stratovirtDev{
+ dev: devInfo,
+ devType: devType,
+ }
+ s.devices = append(s.devices, dev)
+
+ return nil
+}
+
+func (s *stratovirt) updateVMInterfaceHwAddr(Name string, HwAddr string) error {
+ inf := &vcTypes.Interface{
+ Name: Name,
+ HwAddr: HwAddr,
+ IPAddresses: []*vcTypes.IPAddress{},
+ PciAddr: "",
+ }
+
+ if _, err := s.sandbox.agent.updateInterfaceHwAddrByName(inf); err != nil {
+ s.Logger().WithError(err).Error("Agent updateInterfaceHwAddrByName failed")
+ return err
+ }
+
+ return nil
+}
+
+func (s *stratovirt) getDevSlot(Name string, isPut bool) (slot int, err error) {
+ Name = filepath.Base(strings.ToLower(Name))
+
+ if strings.HasPrefix(Name, "eth") {
+ idxStr := strings.TrimPrefix(Name, "eth")
+ if idxStr == Name {
+ return 0, fmt.Errorf("Could not parse idx from Name %q", Name)
+ }
+
+ idx, err := strconv.Atoi(idxStr)
+ if err != nil {
+ return 0, fmt.Errorf("Could not convert to int from Str %q", idxStr)
+ }
+
+ if !isPut && s.mmioNetSlots[idx] {
+ return 0, fmt.Errorf("GetDevSlot failed, slot is being used %q", idxStr)
+ }
+ s.mmioNetSlots[idx] = !isPut
+
+ return idx, nil
+ } else if strings.HasPrefix(Name, "vd") {
+ charStr := strings.TrimPrefix(Name, "vd")
+ if charStr == Name {
+ return 0, fmt.Errorf("Could not parse idx from Name %q", Name)
+ }
+
+ char := []rune(charStr)
+ idx := int(char[0] - 'a')
+
+ if !isPut && s.mmioBlkSlots[idx] {
+ return 0, fmt.Errorf("GetDevSlot failed, slot is being used %q", charStr)
+ }
+ s.mmioBlkSlots[idx] = !isPut
+
+ return idx, nil
+ }
+
+ return 0, fmt.Errorf("GetDevSlot failed, Name is invalid %q", Name)
+}
+
+func (s *stratovirt) hotplugNet(endpoint Endpoint, op operation) (err error) {
+ err = s.qmpSetup()
+ if err != nil {
+ return err
+ }
+ var tap TapInterface
+
+ switch endpoint.Type() {
+ case VethEndpointType:
+ drive := endpoint.(*VethEndpoint)
+ tap = drive.NetPair.TapInterface
+ case TapEndpointType:
+ drive := endpoint.(*TapEndpoint)
+ tap = drive.TapInterface
+ default:
+ return fmt.Errorf("Endpoint is not supported")
+ }
+
+ switch op {
+ case addDevice:
+ var (
+ VMFdNames []string
+ VhostFdNames []string
+ )
+ for i, VMFd := range tap.VMFds {
+ fdName := fmt.Sprintf("fd%d", i)
+ if err := s.qmpMonitorCh.qmp.ExecuteGetFD(s.qmpMonitorCh.ctx, fdName, VMFd); err != nil {
+ return err
+ }
+ VMFdNames = append(VMFdNames, fdName)
+ }
+ for i, VhostFd := range tap.VhostFds {
+ fdName := fmt.Sprintf("vhostfd%d", i)
+ if err := s.qmpMonitorCh.qmp.ExecuteGetFD(s.qmpMonitorCh.ctx, fdName, VhostFd); err != nil {
+ return err
+ }
+ VhostFd.Close()
+ VhostFdNames = append(VhostFdNames, fdName)
+ }
+
+ slot, err := s.getDevSlot(endpoint.Name(), false)
+ if err != nil {
+ return fmt.Errorf("Could not get unused slot for %q", endpoint.Name())
+ }
+
+ if len(VMFdNames) != 0 || len(VhostFdNames) != 0 {
+ if err := s.qmpMonitorCh.qmp.ExecuteNetdevAddByFds(s.qmpMonitorCh.ctx, "tap", tap.ID, VMFdNames, VhostFdNames); err != nil {
+ s.getDevSlot(endpoint.Name(), true)
+ return err
+ }
+ } else {
+ if err := s.qmpMonitorCh.qmp.ExecuteNetdevAdd(s.qmpMonitorCh.ctx, "tap", tap.ID, tap.TAPIface.Name, "no", "no", 0); err != nil {
+ s.getDevSlot(endpoint.Name(), true)
+ return err
+ }
+ }
+ if err := s.qmpMonitorCh.qmp.ExecuteNetPCIDeviceAdd(s.qmpMonitorCh.ctx, tap.Name, tap.ID, endpoint.HardwareAddr(), fmt.Sprintf("%d", slot), "", "", 0, false); err != nil {
+ s.getDevSlot(endpoint.Name(), true)
+ return err
+ }
+
+ // update vm interface
+ if err := s.updateVMInterfaceHwAddr(endpoint.Name(), endpoint.HardwareAddr()); err != nil {
+ s.getDevSlot(endpoint.Name(), true)
+ return err
+ }
+ case removeDevice:
+ if err := s.qmpMonitorCh.qmp.ExecuteDeviceDel(s.qmpMonitorCh.ctx, tap.ID); err != nil {
+ return err
+ }
+ if err := s.qmpMonitorCh.qmp.ExecuteNetdevDel(s.qmpMonitorCh.ctx, tap.ID); err != nil {
+ return err
+ }
+
+ slot, err := s.getDevSlot(endpoint.Name(), true)
+ if err != nil {
+ slot = 0
+ }
+
+ // clear vm interface
+ if err := s.updateVMInterfaceHwAddr(endpoint.Name(), defaultDummyMac+fmt.Sprintf("%02x", slot)); err != nil {
+ s.getDevSlot(endpoint.Name(), false)
+ return err
+ }
+ default:
+ return fmt.Errorf("Operation is not supported")
+ }
+
+ return nil
+}
+
+func (s *stratovirt) hotplugBlk(drive *config.BlockDrive, op operation) (err error) {
+ err = s.qmpSetup()
+ if err != nil {
+ return err
+ }
+
+ switch op {
+ case addDevice:
+ driver := "virtio-blk-pci"
+ slot, err := s.getDevSlot(drive.VirtPath, false)
+ if err != nil {
+ return fmt.Errorf("Could not get unused slot for %q", drive.VirtPath)
+ }
+
+ if err := s.qmpMonitorCh.qmp.ExecuteBlockdevAdd(s.qmpMonitorCh.ctx, drive.File, drive.ID); err != nil {
+ s.getDevSlot(drive.VirtPath, true)
+ return err
+ }
+
+ if err := s.qmpMonitorCh.qmp.ExecutePCIDeviceAdd(s.qmpMonitorCh.ctx, drive.ID, drive.ID, driver, fmt.Sprintf("%d", slot), "", "", 0, true, false); err != nil {
+ s.getDevSlot(drive.VirtPath, true)
+ return err
+ }
+ case removeDevice:
+ if err := s.qmpMonitorCh.qmp.ExecuteDeviceDel(s.qmpMonitorCh.ctx, drive.ID); err != nil {
+ return err
+ }
+ if err := s.qmpMonitorCh.qmp.ExecuteBlockdevDel(s.qmpMonitorCh.ctx, drive.ID); err != nil {
+ return err
+ }
+
+ s.getDevSlot(drive.VirtPath, true)
+ default:
+ return fmt.Errorf("Operation is not supported")
+ }
+
+ return nil
+}
+
+func (s *stratovirt) hotplugAddDevice(devInfo interface{}, devType deviceType) (interface{}, error) {
+ span, _ := s.trace("hotplugAddDevice")
+ defer span.Finish()
+
+ switch devType {
+ case netDev:
+ return nil, s.hotplugNet(devInfo.(Endpoint), addDevice)
+ case blockDev:
+ return nil, s.hotplugBlk(devInfo.(*config.BlockDrive), addDevice)
+ default:
+ return nil, fmt.Errorf("Hotplug add device failed: unsupported device type '%v'", devType)
+ }
+}
+
+func (s *stratovirt) hotplugRemoveDevice(devInfo interface{}, devType deviceType) (interface{}, error) {
+ span, _ := s.trace("hotplugRemoveDevice")
+ defer span.Finish()
+
+ switch devType {
+ case netDev:
+ return nil, s.hotplugNet(devInfo.(Endpoint), removeDevice)
+ case blockDev:
+ return nil, s.hotplugBlk(devInfo.(*config.BlockDrive), removeDevice)
+ default:
+ return nil, fmt.Errorf("Hotplug remove device: unsupported device type '%v'", devType)
+ }
+}
+
+func (s *stratovirt) resizeMemory(reqMemMB uint32, memoryBlockSizeMB uint32, probe bool) (uint32, memoryDevice, error) {
+ return 0, memoryDevice{}, nil
+}
+
+func (s *stratovirt) resizeVCPUs(reqVCPUs uint32) (currentVCPUs uint32, newVCPUs uint32, err error) {
+ return 0, 0, nil
+}
+
+func (s *stratovirt) getSandboxConsole(id string) (string, error) {
+ return s.consolePath, nil
+}
+
+func (s *stratovirt) getMemorySize() uint32 {
+ return 0
+}
+
+func (s *stratovirt) disconnect() {
+ span, _ := s.trace("disconnect")
+ defer span.Finish()
+
+ s.qmpTeardown()
+}
+
+func (s *stratovirt) capabilities() types.Capabilities {
+ span, _ := s.trace("capabilities")
+ defer span.Finish()
+
+ var caps types.Capabilities
+ caps.SetBlockDeviceHotplugSupport()
+
+ return caps
+}
+
+func (s *stratovirt) qmpTeardown() {
+ if s.qmpMonitorCh.qmp != nil {
+ s.qmpMonitorCh.qmp.Shutdown()
+ <-s.qmpMonitorCh.disconn
+ s.qmpMonitorCh.qmp = nil
+ s.qmpMonitorCh.disconn = nil
+ }
+}
+
+func (s *stratovirt) qmpSetup() error {
+ s.qmpTeardown()
+
+ cfg := govmmQemu.QMPConfig{Logger: newQMPLogger()}
+
+ // Auto-closed by QMPStart().
+ disconnectCh := make(chan struct{})
+
+ qmp, _, err := govmmQemu.QMPStart(s.qmpMonitorCh.ctx, s.qmpMonitorCh.path, cfg, disconnectCh)
+ if err != nil {
+ s.Logger().WithError(err).Error("Failed to connect to StratoVirt instance")
+ return err
+ }
+
+ s.qmpMonitorCh.qmp = qmp
+ s.qmpMonitorCh.disconn = disconnectCh
+
+ return nil
+}
+
+func (s *stratovirt) getThreadIDs() (vcpuThreadIDs, error) {
+ span, _ := s.trace("getThreadIDs")
+ defer span.Finish()
+
+ tid := vcpuThreadIDs{}
+ if err := s.qmpSetup(); err != nil {
+ return tid, err
+ }
+
+ cpuInfos, err := s.qmpMonitorCh.qmp.ExecQueryCpus(s.qmpMonitorCh.ctx)
+ if err != nil {
+ s.Logger().WithError(err).Error("Failed to query cpu infos")
+ return tid, err
+ }
+
+ tid.vcpus = make(map[int]int, len(cpuInfos))
+ for _, i := range cpuInfos {
+ if i.ThreadID > 0 {
+ tid.vcpus[i.CPU] = i.ThreadID
+ }
+ }
+ return tid, nil
+}
+
+func (s *stratovirt) cleanup() error {
+ span, _ := s.trace("cleanup")
+ defer span.Finish()
+
+ s.qmpTeardown()
+
+ return nil
+}
+
+func (s *stratovirt) getPids() []int {
+ return []int{s.pid}
+}
+
+func (s *stratovirt) fromGrpc(ctx context.Context, hypervisorConfig *HypervisorConfig, j []byte) error {
+ return nil
+}
+
+func (s *stratovirt) toGrpc() ([]byte, error) {
+ return nil, nil
+}
+
+func (s *stratovirt) check() error {
+ if err := syscall.Kill(s.pid, syscall.Signal(0)); err != nil {
+ return errors.Wrapf(err, "Failed to ping StratoVirt process")
+ }
+
+ return nil
+}
+
+func (s *stratovirt) generateSocket(id string, useVsock bool) (interface{}, error) {
+ return generateVMSocket(id, useVsock, s.store.RunVMStoragePath())
+}
+
+func (s *stratovirt) save() (p persistapi.HypervisorState) {
+ p.Pid = s.pid
+ p.Type = string(StratovirtHypervisor)
+ return
+}
+
+func (s *stratovirt) load(p persistapi.HypervisorState) {
+ s.pid = p.Pid
+ return
+}
--
1.8.3.1