Add support for specifying a checkpoint directory. (#245)
Signed-off-by: Ross Boucher <rboucher@gmail.com>
This commit is contained in:
parent
76dd6710dc
commit
e756ae42d1
10 changed files with 291 additions and 228 deletions
|
@ -56,6 +56,7 @@ func (s *apiServer) CreateContainer(ctx context.Context, c *types.CreateContaine
|
||||||
e.RuntimeArgs = c.RuntimeArgs
|
e.RuntimeArgs = c.RuntimeArgs
|
||||||
e.StartResponse = make(chan supervisor.StartResponse, 1)
|
e.StartResponse = make(chan supervisor.StartResponse, 1)
|
||||||
if c.Checkpoint != "" {
|
if c.Checkpoint != "" {
|
||||||
|
e.CheckpointDir = c.CheckpointDir
|
||||||
e.Checkpoint = &runtime.Checkpoint{
|
e.Checkpoint = &runtime.Checkpoint{
|
||||||
Name: c.Checkpoint,
|
Name: c.Checkpoint,
|
||||||
}
|
}
|
||||||
|
@ -77,6 +78,7 @@ func (s *apiServer) CreateContainer(ctx context.Context, c *types.CreateContaine
|
||||||
func (s *apiServer) CreateCheckpoint(ctx context.Context, r *types.CreateCheckpointRequest) (*types.CreateCheckpointResponse, error) {
|
func (s *apiServer) CreateCheckpoint(ctx context.Context, r *types.CreateCheckpointRequest) (*types.CreateCheckpointResponse, error) {
|
||||||
e := &supervisor.CreateCheckpointTask{}
|
e := &supervisor.CreateCheckpointTask{}
|
||||||
e.ID = r.Id
|
e.ID = r.Id
|
||||||
|
e.CheckpointDir = r.CheckpointDir
|
||||||
e.Checkpoint = &runtime.Checkpoint{
|
e.Checkpoint = &runtime.Checkpoint{
|
||||||
Name: r.Checkpoint.Name,
|
Name: r.Checkpoint.Name,
|
||||||
Exit: r.Checkpoint.Exit,
|
Exit: r.Checkpoint.Exit,
|
||||||
|
@ -84,6 +86,7 @@ func (s *apiServer) CreateCheckpoint(ctx context.Context, r *types.CreateCheckpo
|
||||||
UnixSockets: r.Checkpoint.UnixSockets,
|
UnixSockets: r.Checkpoint.UnixSockets,
|
||||||
Shell: r.Checkpoint.Shell,
|
Shell: r.Checkpoint.Shell,
|
||||||
}
|
}
|
||||||
|
|
||||||
s.sv.SendTask(e)
|
s.sv.SendTask(e)
|
||||||
if err := <-e.ErrorCh(); err != nil {
|
if err := <-e.ErrorCh(); err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
|
@ -97,6 +100,7 @@ func (s *apiServer) DeleteCheckpoint(ctx context.Context, r *types.DeleteCheckpo
|
||||||
}
|
}
|
||||||
e := &supervisor.DeleteCheckpointTask{}
|
e := &supervisor.DeleteCheckpointTask{}
|
||||||
e.ID = r.Id
|
e.ID = r.Id
|
||||||
|
e.CheckpointDir = r.CheckpointDir
|
||||||
e.Checkpoint = &runtime.Checkpoint{
|
e.Checkpoint = &runtime.Checkpoint{
|
||||||
Name: r.Name,
|
Name: r.Name,
|
||||||
}
|
}
|
||||||
|
@ -124,7 +128,7 @@ func (s *apiServer) ListCheckpoint(ctx context.Context, r *types.ListCheckpointR
|
||||||
return nil, grpc.Errorf(codes.NotFound, "no such containers")
|
return nil, grpc.Errorf(codes.NotFound, "no such containers")
|
||||||
}
|
}
|
||||||
var out []*types.Checkpoint
|
var out []*types.Checkpoint
|
||||||
checkpoints, err := container.Checkpoints()
|
checkpoints, err := container.Checkpoints(r.CheckpointDir)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
|
@ -71,7 +71,10 @@ var _ = math.Inf
|
||||||
|
|
||||||
// This is a compile-time assertion to ensure that this generated file
|
// This is a compile-time assertion to ensure that this generated file
|
||||||
// is compatible with the proto package it is being compiled against.
|
// is compatible with the proto package it is being compiled against.
|
||||||
const _ = proto.ProtoPackageIsVersion1
|
// A compilation error at this line likely means your copy of the
|
||||||
|
// proto package needs to be updated.
|
||||||
|
// FIXME: I can't seeem to get this to work.
|
||||||
|
const _ = proto.ProtoPackageIsVersion1 // please upgrade the proto package
|
||||||
|
|
||||||
type GetServerVersionRequest struct {
|
type GetServerVersionRequest struct {
|
||||||
}
|
}
|
||||||
|
@ -115,16 +118,17 @@ func (*UpdateProcessResponse) ProtoMessage() {}
|
||||||
func (*UpdateProcessResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{3} }
|
func (*UpdateProcessResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{3} }
|
||||||
|
|
||||||
type CreateContainerRequest struct {
|
type CreateContainerRequest struct {
|
||||||
Id string `protobuf:"bytes,1,opt,name=id" json:"id,omitempty"`
|
Id string `protobuf:"bytes,1,opt,name=id" json:"id,omitempty"`
|
||||||
BundlePath string `protobuf:"bytes,2,opt,name=bundlePath" json:"bundlePath,omitempty"`
|
BundlePath string `protobuf:"bytes,2,opt,name=bundlePath" json:"bundlePath,omitempty"`
|
||||||
Checkpoint string `protobuf:"bytes,3,opt,name=checkpoint" json:"checkpoint,omitempty"`
|
Checkpoint string `protobuf:"bytes,3,opt,name=checkpoint" json:"checkpoint,omitempty"`
|
||||||
Stdin string `protobuf:"bytes,4,opt,name=stdin" json:"stdin,omitempty"`
|
Stdin string `protobuf:"bytes,4,opt,name=stdin" json:"stdin,omitempty"`
|
||||||
Stdout string `protobuf:"bytes,5,opt,name=stdout" json:"stdout,omitempty"`
|
Stdout string `protobuf:"bytes,5,opt,name=stdout" json:"stdout,omitempty"`
|
||||||
Stderr string `protobuf:"bytes,6,opt,name=stderr" json:"stderr,omitempty"`
|
Stderr string `protobuf:"bytes,6,opt,name=stderr" json:"stderr,omitempty"`
|
||||||
Labels []string `protobuf:"bytes,7,rep,name=labels" json:"labels,omitempty"`
|
Labels []string `protobuf:"bytes,7,rep,name=labels" json:"labels,omitempty"`
|
||||||
NoPivotRoot bool `protobuf:"varint,8,opt,name=noPivotRoot" json:"noPivotRoot,omitempty"`
|
NoPivotRoot bool `protobuf:"varint,8,opt,name=noPivotRoot" json:"noPivotRoot,omitempty"`
|
||||||
Runtime string `protobuf:"bytes,9,opt,name=runtime" json:"runtime,omitempty"`
|
Runtime string `protobuf:"bytes,9,opt,name=runtime" json:"runtime,omitempty"`
|
||||||
RuntimeArgs []string `protobuf:"bytes,10,rep,name=runtimeArgs" json:"runtimeArgs,omitempty"`
|
RuntimeArgs []string `protobuf:"bytes,10,rep,name=runtimeArgs" json:"runtimeArgs,omitempty"`
|
||||||
|
CheckpointDir string `protobuf:"bytes,11,opt,name=checkpointDir" json:"checkpointDir,omitempty"`
|
||||||
}
|
}
|
||||||
|
|
||||||
func (m *CreateContainerRequest) Reset() { *m = CreateContainerRequest{} }
|
func (m *CreateContainerRequest) Reset() { *m = CreateContainerRequest{} }
|
||||||
|
@ -235,8 +239,9 @@ func (*AddProcessResponse) ProtoMessage() {}
|
||||||
func (*AddProcessResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{11} }
|
func (*AddProcessResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{11} }
|
||||||
|
|
||||||
type CreateCheckpointRequest struct {
|
type CreateCheckpointRequest struct {
|
||||||
Id string `protobuf:"bytes,1,opt,name=id" json:"id,omitempty"`
|
Id string `protobuf:"bytes,1,opt,name=id" json:"id,omitempty"`
|
||||||
Checkpoint *Checkpoint `protobuf:"bytes,2,opt,name=checkpoint" json:"checkpoint,omitempty"`
|
Checkpoint *Checkpoint `protobuf:"bytes,2,opt,name=checkpoint" json:"checkpoint,omitempty"`
|
||||||
|
CheckpointDir string `protobuf:"bytes,3,opt,name=checkpointDir" json:"checkpointDir,omitempty"`
|
||||||
}
|
}
|
||||||
|
|
||||||
func (m *CreateCheckpointRequest) Reset() { *m = CreateCheckpointRequest{} }
|
func (m *CreateCheckpointRequest) Reset() { *m = CreateCheckpointRequest{} }
|
||||||
|
@ -260,8 +265,9 @@ func (*CreateCheckpointResponse) ProtoMessage() {}
|
||||||
func (*CreateCheckpointResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{13} }
|
func (*CreateCheckpointResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{13} }
|
||||||
|
|
||||||
type DeleteCheckpointRequest struct {
|
type DeleteCheckpointRequest struct {
|
||||||
Id string `protobuf:"bytes,1,opt,name=id" json:"id,omitempty"`
|
Id string `protobuf:"bytes,1,opt,name=id" json:"id,omitempty"`
|
||||||
Name string `protobuf:"bytes,2,opt,name=name" json:"name,omitempty"`
|
Name string `protobuf:"bytes,2,opt,name=name" json:"name,omitempty"`
|
||||||
|
CheckpointDir string `protobuf:"bytes,3,opt,name=checkpointDir" json:"checkpointDir,omitempty"`
|
||||||
}
|
}
|
||||||
|
|
||||||
func (m *DeleteCheckpointRequest) Reset() { *m = DeleteCheckpointRequest{} }
|
func (m *DeleteCheckpointRequest) Reset() { *m = DeleteCheckpointRequest{} }
|
||||||
|
@ -278,7 +284,8 @@ func (*DeleteCheckpointResponse) ProtoMessage() {}
|
||||||
func (*DeleteCheckpointResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{15} }
|
func (*DeleteCheckpointResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{15} }
|
||||||
|
|
||||||
type ListCheckpointRequest struct {
|
type ListCheckpointRequest struct {
|
||||||
Id string `protobuf:"bytes,1,opt,name=id" json:"id,omitempty"`
|
Id string `protobuf:"bytes,1,opt,name=id" json:"id,omitempty"`
|
||||||
|
CheckpointDir string `protobuf:"bytes,2,opt,name=checkpointDir" json:"checkpointDir,omitempty"`
|
||||||
}
|
}
|
||||||
|
|
||||||
func (m *ListCheckpointRequest) Reset() { *m = ListCheckpointRequest{} }
|
func (m *ListCheckpointRequest) Reset() { *m = ListCheckpointRequest{} }
|
||||||
|
@ -1310,150 +1317,152 @@ var _API_serviceDesc = grpc.ServiceDesc{
|
||||||
}
|
}
|
||||||
|
|
||||||
var fileDescriptor0 = []byte{
|
var fileDescriptor0 = []byte{
|
||||||
// 2307 bytes of a gzipped FileDescriptorProto
|
// 2337 bytes of a gzipped FileDescriptorProto
|
||||||
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 0x02, 0xff, 0xec, 0x59, 0xcd, 0x73, 0x1b, 0x49,
|
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 0x02, 0xff, 0xec, 0x59, 0xcd, 0x72, 0x23, 0x49,
|
||||||
0x15, 0x8f, 0xa4, 0x91, 0x6c, 0x3d, 0x7d, 0xd8, 0x9e, 0xf8, 0x43, 0xd1, 0x6e, 0xb2, 0x61, 0x0a,
|
0x11, 0x1e, 0x49, 0x2d, 0xd9, 0x4a, 0xfd, 0xd8, 0xee, 0xf5, 0x8f, 0x46, 0xbb, 0x33, 0x3b, 0x74,
|
||||||
0xd8, 0x00, 0x8b, 0x09, 0xce, 0x6e, 0x91, 0x82, 0x82, 0xaa, 0xc4, 0x09, 0x4b, 0xd8, 0x78, 0x71,
|
0x2c, 0x30, 0xc0, 0x62, 0x06, 0xcf, 0x6e, 0x30, 0x01, 0x11, 0x44, 0xcc, 0xd8, 0xc3, 0x32, 0xec,
|
||||||
0xc6, 0x36, 0x7b, 0xa1, 0x4a, 0x35, 0x9e, 0xe9, 0x48, 0x83, 0xa5, 0x99, 0xd9, 0x99, 0x96, 0x2d,
|
0x78, 0xf1, 0xb4, 0x6d, 0xf6, 0xa8, 0x68, 0x77, 0xd7, 0x48, 0x8d, 0xa5, 0xee, 0xde, 0xee, 0x92,
|
||||||
0x5f, 0x38, 0xc2, 0x8d, 0x7f, 0x80, 0x2a, 0x2e, 0x70, 0xe2, 0xce, 0x81, 0xbf, 0x80, 0xff, 0x84,
|
0x2d, 0x5f, 0x38, 0x70, 0x80, 0x1b, 0x2f, 0x40, 0x04, 0x17, 0x6e, 0xdc, 0x39, 0xf0, 0x04, 0x44,
|
||||||
0xe2, 0xc2, 0x9d, 0x23, 0xaf, 0xbb, 0xdf, 0xf4, 0xf4, 0xe8, 0xc3, 0x0e, 0x07, 0x8a, 0xcb, 0x5e,
|
0xf0, 0x20, 0x04, 0x17, 0xee, 0x1c, 0xc9, 0xaa, 0xca, 0xae, 0xae, 0xd6, 0x8f, 0x3d, 0x1c, 0x08,
|
||||||
0x54, 0xfd, 0x7e, 0xfd, 0xfa, 0xbd, 0xd7, 0xef, 0xab, 0x7b, 0x5a, 0xd0, 0xf4, 0x92, 0x70, 0x3f,
|
0x2e, 0x5c, 0x14, 0x95, 0x5f, 0x65, 0x65, 0x66, 0x65, 0x66, 0x65, 0x65, 0x97, 0xa0, 0xe9, 0x25,
|
||||||
0x49, 0x63, 0x1e, 0xdb, 0x75, 0x7e, 0x9d, 0xb0, 0xcc, 0xb9, 0x07, 0x7b, 0x9f, 0x32, 0x7e, 0xc2,
|
0xe1, 0x7e, 0x92, 0xc6, 0x3c, 0xb6, 0xeb, 0xfc, 0x26, 0x61, 0x99, 0x73, 0x1f, 0xf6, 0x3e, 0x63,
|
||||||
0xd2, 0x4b, 0x96, 0xfe, 0x92, 0xa5, 0x59, 0x18, 0x47, 0x2e, 0xfb, 0x72, 0xca, 0x32, 0xee, 0xcc,
|
0xfc, 0x94, 0xa5, 0x57, 0x2c, 0xfd, 0x05, 0x4b, 0xb3, 0x30, 0x8e, 0x5c, 0xf6, 0xd5, 0x94, 0x65,
|
||||||
0xa0, 0xb7, 0x38, 0x95, 0x25, 0x71, 0x94, 0x31, 0x7b, 0x1b, 0xea, 0x13, 0xef, 0xd7, 0x71, 0xda,
|
0xdc, 0x99, 0x41, 0x6f, 0x71, 0x2a, 0x4b, 0xe2, 0x28, 0x63, 0xf6, 0x36, 0xd4, 0x27, 0xde, 0x2f,
|
||||||
0xab, 0x3c, 0xac, 0x3c, 0xea, 0xb8, 0x8a, 0x90, 0x68, 0x18, 0x21, 0x5a, 0x25, 0x54, 0x10, 0x02,
|
0xe3, 0xb4, 0x57, 0x79, 0x54, 0x79, 0xdc, 0x71, 0x15, 0x21, 0xd1, 0x30, 0x42, 0xb4, 0x4a, 0xa8,
|
||||||
0x4d, 0x3c, 0xee, 0x8f, 0x7a, 0x35, 0x85, 0x4a, 0xc2, 0xee, 0xc3, 0x7a, 0xca, 0x2e, 0x43, 0x21,
|
0x20, 0x04, 0x9a, 0x78, 0xdc, 0x1f, 0xf5, 0x6a, 0x0a, 0x95, 0x84, 0xdd, 0x87, 0xf5, 0x94, 0x5d,
|
||||||
0xb5, 0x67, 0xe1, 0x44, 0xd3, 0xd5, 0xb4, 0xf3, 0xdb, 0x0a, 0x6c, 0x9f, 0x25, 0x81, 0xc7, 0xd9,
|
0x85, 0x42, 0x6a, 0xcf, 0xc2, 0x89, 0xa6, 0xab, 0x69, 0xe7, 0x37, 0x15, 0xd8, 0x3e, 0x4f, 0x02,
|
||||||
0x71, 0x1a, 0xfb, 0x2c, 0xcb, 0xc8, 0x24, 0xbb, 0x0b, 0xd5, 0x30, 0x90, 0x3a, 0x9b, 0x2e, 0x8e,
|
0x8f, 0xb3, 0x93, 0x34, 0xf6, 0x59, 0x96, 0x91, 0x49, 0x76, 0x17, 0xaa, 0x61, 0x20, 0x75, 0x36,
|
||||||
0xec, 0x4d, 0xa8, 0x25, 0x08, 0x54, 0x25, 0x20, 0x86, 0xf6, 0x03, 0x00, 0x7f, 0x1c, 0x67, 0xec,
|
0x5d, 0x1c, 0xd9, 0x9b, 0x50, 0x4b, 0x10, 0xa8, 0x4a, 0x40, 0x0c, 0xed, 0x87, 0x00, 0xfe, 0x38,
|
||||||
0x84, 0x07, 0x61, 0x24, 0x35, 0xae, 0xbb, 0x06, 0x22, 0x8c, 0xb9, 0x0a, 0x03, 0x3e, 0x92, 0x3a,
|
0xce, 0xd8, 0x29, 0x0f, 0xc2, 0x48, 0x6a, 0x5c, 0x77, 0x0d, 0x44, 0x18, 0x73, 0x1d, 0x06, 0x7c,
|
||||||
0xd1, 0x18, 0x49, 0xd8, 0xbb, 0xd0, 0x18, 0xb1, 0x70, 0x38, 0xe2, 0xbd, 0xba, 0x84, 0x89, 0x72,
|
0x24, 0x75, 0xa2, 0x31, 0x92, 0xb0, 0x77, 0xa1, 0x31, 0x62, 0xe1, 0x70, 0xc4, 0x7b, 0x75, 0x09,
|
||||||
0xf6, 0x60, 0x67, 0xce, 0x0e, 0xb5, 0x7f, 0xe7, 0xcf, 0x55, 0xd8, 0x3d, 0x4c, 0x19, 0xce, 0x1c,
|
0x13, 0xe5, 0xec, 0xc1, 0xce, 0x9c, 0x1d, 0x6a, 0xff, 0xce, 0xdf, 0xaa, 0xb0, 0x7b, 0x98, 0x32,
|
||||||
0xc6, 0x11, 0xf7, 0xc2, 0x88, 0xa5, 0xab, 0x6c, 0x44, 0x8b, 0xce, 0xa7, 0x51, 0x30, 0x66, 0xc7,
|
0x9c, 0x39, 0x8c, 0x23, 0xee, 0x85, 0x11, 0x4b, 0x57, 0xd9, 0x88, 0x16, 0x5d, 0x4c, 0xa3, 0x60,
|
||||||
0x1e, 0xaa, 0x55, 0xa6, 0x1a, 0x88, 0xb4, 0x78, 0xc4, 0xfc, 0x8b, 0x24, 0x0e, 0x23, 0x2e, 0x2d,
|
0xcc, 0x4e, 0x3c, 0x54, 0xab, 0x4c, 0x35, 0x10, 0x69, 0xf1, 0x88, 0xf9, 0x97, 0x49, 0x1c, 0x46,
|
||||||
0xc6, 0xf9, 0x02, 0x11, 0x16, 0x67, 0x72, 0x33, 0xca, 0x4b, 0x8a, 0x10, 0x16, 0xe3, 0x20, 0x9e,
|
0x5c, 0x5a, 0x8c, 0xf3, 0x05, 0x22, 0x2c, 0xce, 0xe4, 0x66, 0x94, 0x97, 0x14, 0x21, 0x2c, 0xc6,
|
||||||
0x2a, 0x8b, 0x9b, 0x2e, 0x51, 0x84, 0xb3, 0x34, 0xed, 0x35, 0x34, 0x8e, 0x94, 0xc0, 0xc7, 0xde,
|
0x41, 0x3c, 0x55, 0x16, 0x37, 0x5d, 0xa2, 0x08, 0x67, 0x69, 0xda, 0x6b, 0x68, 0x1c, 0x29, 0x81,
|
||||||
0x39, 0x1b, 0x67, 0xbd, 0xb5, 0x87, 0x35, 0x81, 0x2b, 0xca, 0x7e, 0x08, 0xad, 0x28, 0x3e, 0x0e,
|
0x8f, 0xbd, 0x0b, 0x36, 0xce, 0x7a, 0x6b, 0x8f, 0x6a, 0x02, 0x57, 0x94, 0xfd, 0x08, 0x5a, 0x51,
|
||||||
0x2f, 0x63, 0xee, 0xc6, 0x31, 0xef, 0xad, 0x4b, 0x87, 0x99, 0x90, 0xdd, 0x83, 0xb5, 0x74, 0x1a,
|
0x7c, 0x12, 0x5e, 0xc5, 0xdc, 0x8d, 0x63, 0xde, 0x5b, 0x97, 0x0e, 0x33, 0x21, 0xbb, 0x07, 0x6b,
|
||||||
0xf1, 0x70, 0xc2, 0x7a, 0x4d, 0x29, 0x32, 0x27, 0xc5, 0x5a, 0x1a, 0x3e, 0x4b, 0x87, 0x59, 0x0f,
|
0xe9, 0x34, 0xe2, 0xe1, 0x84, 0xf5, 0x9a, 0x52, 0x64, 0x4e, 0x8a, 0xb5, 0x34, 0x7c, 0x9e, 0x0e,
|
||||||
0xa4, 0x60, 0x13, 0x72, 0x5e, 0xc1, 0xde, 0x82, 0x97, 0x28, 0x83, 0xf6, 0xa1, 0xe9, 0xe7, 0xa0,
|
0xb3, 0x1e, 0x48, 0xc1, 0x26, 0x64, 0x7f, 0x04, 0x9d, 0x62, 0x27, 0x47, 0x61, 0xda, 0x6b, 0x49,
|
||||||
0xf4, 0x56, 0xeb, 0x60, 0x73, 0x5f, 0xe6, 0xe4, 0x7e, 0xc1, 0x5c, 0xb0, 0xa0, 0xa8, 0xce, 0x49,
|
0x09, 0x65, 0xd0, 0x79, 0x05, 0x7b, 0x0b, 0xbe, 0xa4, 0x3c, 0xdb, 0x87, 0xa6, 0x9f, 0x83, 0xd2,
|
||||||
0x38, 0x8c, 0xbc, 0xf1, 0xbb, 0xe7, 0x82, 0xf0, 0x85, 0x5c, 0x42, 0x99, 0x47, 0x94, 0xb3, 0x09,
|
0xa7, 0xad, 0x83, 0xcd, 0x7d, 0x99, 0xb9, 0xfb, 0x05, 0x73, 0xc1, 0x82, 0xa2, 0x3a, 0xa7, 0xe1,
|
||||||
0xdd, 0x5c, 0x14, 0x85, 0xf3, 0xaf, 0x35, 0xd8, 0x7a, 0x16, 0x04, 0xb7, 0x64, 0x1b, 0xa6, 0x2c,
|
0x30, 0xf2, 0xc6, 0xef, 0x9e, 0x31, 0xc2, 0x63, 0x72, 0x09, 0xe5, 0x27, 0x51, 0xce, 0x26, 0x74,
|
||||||
0x67, 0x29, 0x26, 0x35, 0x4a, 0xac, 0x4a, 0x47, 0x69, 0xda, 0xfe, 0x00, 0xac, 0x69, 0x86, 0x3b,
|
0x73, 0x51, 0x14, 0xf4, 0x3f, 0xd7, 0x60, 0xeb, 0x79, 0x10, 0xdc, 0x91, 0x93, 0x98, 0xd8, 0x9c,
|
||||||
0xa9, 0xc9, 0x9d, 0xb4, 0x68, 0x27, 0x67, 0x08, 0xb9, 0x72, 0xc2, 0xb6, 0xc1, 0xf2, 0x84, 0x97,
|
0xa5, 0x98, 0xfa, 0x28, 0xb1, 0x2a, 0xdd, 0xa9, 0x69, 0xfb, 0x43, 0xb0, 0xa6, 0x19, 0xee, 0xa4,
|
||||||
0x2c, 0xe9, 0x25, 0x39, 0x16, 0x26, 0xb3, 0xe8, 0x12, 0x23, 0x28, 0x20, 0x31, 0x14, 0x88, 0x7f,
|
0x26, 0x77, 0xd2, 0xa2, 0x9d, 0x9c, 0x23, 0xe4, 0xca, 0x09, 0xdb, 0x06, 0xcb, 0x13, 0xbe, 0xb4,
|
||||||
0x15, 0x50, 0xec, 0xc4, 0x30, 0xdf, 0xd6, 0x5a, 0xb1, 0x2d, 0x9d, 0x10, 0xeb, 0xcb, 0x13, 0xa2,
|
0xa4, 0x2f, 0xe5, 0x58, 0x98, 0xcc, 0xa2, 0x2b, 0x8c, 0xb3, 0x80, 0xc4, 0x50, 0x20, 0xfe, 0x75,
|
||||||
0xb9, 0x22, 0x21, 0xa0, 0x94, 0x10, 0x0e, 0xb4, 0x7d, 0x2f, 0xf1, 0xce, 0xc3, 0x71, 0xc8, 0x43,
|
0x40, 0x11, 0x16, 0xc3, 0x7c, 0x5b, 0x6b, 0xc5, 0xb6, 0x74, 0xda, 0xac, 0x2f, 0x4f, 0x9b, 0xe6,
|
||||||
0x96, 0xf5, 0x5a, 0xd2, 0x88, 0x12, 0x66, 0x3f, 0x82, 0x0d, 0x2f, 0x49, 0xbc, 0x74, 0x12, 0xa7,
|
0x8a, 0xb4, 0x81, 0x52, 0xda, 0x38, 0xd0, 0xf6, 0xbd, 0xc4, 0xbb, 0x08, 0xc7, 0x21, 0x0f, 0x59,
|
||||||
0xe8, 0x9a, 0xb7, 0xe1, 0x98, 0xf5, 0xda, 0x52, 0xc8, 0x3c, 0x2c, 0xa4, 0x65, 0x6c, 0x1c, 0x46,
|
0x86, 0xf1, 0x13, 0x46, 0x94, 0x30, 0xfb, 0x31, 0x6c, 0x78, 0x49, 0xe2, 0xa5, 0x93, 0x38, 0x45,
|
||||||
0xd3, 0xd9, 0x6b, 0x91, 0x57, 0xbd, 0x8e, 0x64, 0x2b, 0x61, 0x42, 0x5a, 0x14, 0x7f, 0xce, 0xae,
|
0xd7, 0xbc, 0x0d, 0xc7, 0xac, 0xd7, 0x96, 0x42, 0xe6, 0x61, 0x21, 0x2d, 0x63, 0xe3, 0x30, 0x9a,
|
||||||
0x8e, 0xd3, 0xf0, 0x12, 0xd7, 0x0c, 0x51, 0x69, 0x57, 0x7a, 0x71, 0x1e, 0xb6, 0x3f, 0xc4, 0x94,
|
0xce, 0x5e, 0x8b, 0xec, 0xeb, 0x75, 0x24, 0x5b, 0x09, 0x13, 0xd2, 0xa2, 0xf8, 0x0b, 0x76, 0x7d,
|
||||||
0x1b, 0x87, 0x93, 0x90, 0x67, 0xbd, 0x0d, 0x34, 0xab, 0x75, 0xd0, 0x21, 0x7f, 0xba, 0x12, 0x75,
|
0x92, 0x86, 0x57, 0xb8, 0x66, 0x88, 0x4a, 0xbb, 0xd2, 0x8b, 0xf3, 0xb0, 0xfd, 0x4d, 0x4c, 0xcc,
|
||||||
0xf3, 0x59, 0xe7, 0x05, 0x34, 0x14, 0x24, 0xdc, 0x2b, 0x58, 0x28, 0x5a, 0x72, 0x2c, 0xb0, 0x2c,
|
0x71, 0x38, 0x09, 0x79, 0xd6, 0xdb, 0x40, 0xb3, 0x5a, 0x07, 0x1d, 0xf2, 0xa7, 0x2b, 0x51, 0x37,
|
||||||
0x7e, 0xcb, 0x65, 0xac, 0x2c, 0x57, 0x8e, 0x05, 0x36, 0xf2, 0xd2, 0x40, 0xc6, 0x09, 0x31, 0x31,
|
0x9f, 0x75, 0x8e, 0xa0, 0xa1, 0x20, 0xe1, 0x5e, 0xc1, 0x42, 0xd1, 0x92, 0x63, 0x81, 0x65, 0xf1,
|
||||||
0x76, 0x5c, 0xb0, 0x44, 0xa0, 0x84, 0xab, 0xa7, 0x14, 0xf0, 0x8e, 0x2b, 0x86, 0x02, 0x19, 0x52,
|
0x5b, 0x2e, 0x63, 0x65, 0xb9, 0x72, 0x2c, 0xb0, 0x91, 0x97, 0x06, 0x32, 0x4e, 0x88, 0x89, 0xb1,
|
||||||
0x4e, 0x21, 0x82, 0x43, 0xfb, 0x9b, 0xd0, 0xf5, 0x82, 0x00, 0xdd, 0x13, 0x63, 0xd4, 0x3f, 0x0d,
|
0xe3, 0x82, 0x25, 0x02, 0x25, 0x5c, 0x3d, 0xa5, 0x80, 0x77, 0x5c, 0x31, 0x14, 0xc8, 0x90, 0x72,
|
||||||
0x83, 0x0c, 0x25, 0xd5, 0x70, 0x72, 0x0e, 0x75, 0xb6, 0xc1, 0x36, 0x13, 0x8a, 0xf2, 0xec, 0x57,
|
0x0a, 0x11, 0x1c, 0xda, 0xdf, 0x80, 0xae, 0x17, 0x04, 0xe8, 0x9e, 0x18, 0xa3, 0xfe, 0x59, 0x18,
|
||||||
0xba, 0x1e, 0x74, 0x7d, 0xaf, 0x4a, 0xb6, 0xef, 0x97, 0xda, 0x42, 0x55, 0xa6, 0xd5, 0x56, 0x5e,
|
0x64, 0x28, 0xa9, 0x86, 0x93, 0x73, 0xa8, 0xb3, 0x0d, 0xb6, 0x99, 0x50, 0x94, 0x67, 0xbf, 0xae,
|
||||||
0x20, 0xc5, 0x6a, 0x83, 0xc9, 0xe9, 0x43, 0x6f, 0x51, 0x3a, 0x69, 0xfe, 0x31, 0xec, 0xbd, 0x60,
|
0xe8, 0x03, 0xa1, 0xcf, 0xc9, 0xaa, 0x6c, 0xfb, 0x7e, 0xa9, 0x7a, 0x54, 0x65, 0x5e, 0x6d, 0xe5,
|
||||||
0x63, 0xf6, 0x2e, 0x9a, 0xd1, 0x45, 0x91, 0x87, 0xd5, 0xae, 0x2a, 0x49, 0x8e, 0x85, 0xe8, 0xc5,
|
0x27, 0xa4, 0x58, 0x6d, 0x16, 0x94, 0x85, 0x43, 0x59, 0x5b, 0x76, 0x28, 0xfb, 0xd0, 0x5b, 0xb4,
|
||||||
0xe5, 0x24, 0xfa, 0x43, 0xd8, 0x79, 0x1d, 0x66, 0xfc, 0x56, 0xc1, 0xce, 0x6f, 0x00, 0x0a, 0x26,
|
0x81, 0x0c, 0xf4, 0x61, 0xef, 0x88, 0x8d, 0xd9, 0xbb, 0xd8, 0x87, 0x9e, 0x8c, 0x3c, 0x2c, 0x1d,
|
||||||
0xad, 0xa6, 0x52, 0xa8, 0x11, 0x18, 0x9b, 0x85, 0x9c, 0xaa, 0x4b, 0x8e, 0x45, 0x0c, 0xb8, 0x9f,
|
0xea, 0xc0, 0xc9, 0xf1, 0xbb, 0x1b, 0xb0, 0xa8, 0x84, 0x0c, 0x38, 0x86, 0x9d, 0xd7, 0x61, 0xc6,
|
||||||
0x50, 0x2b, 0x17, 0x43, 0xd1, 0x77, 0xa6, 0x51, 0x38, 0x3b, 0x89, 0xfd, 0x0b, 0xc6, 0x33, 0xd9,
|
0xef, 0x56, 0xbf, 0xa0, 0xaa, 0xba, 0x4c, 0xd5, 0xaf, 0x00, 0x0a, 0x51, 0xda, 0xe4, 0x8a, 0x61,
|
||||||
0x17, 0xb1, 0x67, 0x19, 0x90, 0x2c, 0x91, 0x11, 0x1b, 0x8f, 0x65, 0x73, 0x5c, 0x77, 0x15, 0xe1,
|
0x32, 0x62, 0x6c, 0x16, 0x72, 0x3a, 0xd0, 0x72, 0x2c, 0xc2, 0xce, 0xfd, 0x84, 0xee, 0x18, 0x31,
|
||||||
0x1c, 0xc1, 0xee, 0xbc, 0xa1, 0xd4, 0x8c, 0x9e, 0x40, 0xab, 0xf0, 0x63, 0x86, 0x26, 0xd5, 0x96,
|
0x14, 0x05, 0x71, 0x1a, 0x85, 0xb3, 0xd3, 0xd8, 0xbf, 0x64, 0x3c, 0x93, 0x05, 0x1b, 0x8b, 0xa9,
|
||||||
0x7b, 0xdb, 0xe4, 0x72, 0x1e, 0x40, 0xfb, 0x84, 0xa3, 0xb7, 0x57, 0x6d, 0xf7, 0x11, 0x74, 0x75,
|
0x01, 0xc9, 0x53, 0x39, 0x62, 0xe3, 0xb1, 0xac, 0xda, 0xeb, 0xae, 0x22, 0x70, 0x3b, 0xbb, 0xf3,
|
||||||
0x27, 0x93, 0x8c, 0xaa, 0x16, 0x3d, 0x3e, 0xcd, 0x88, 0x8b, 0x28, 0xe7, 0x6f, 0x35, 0x58, 0xa3,
|
0xdb, 0xa1, 0xfa, 0xf7, 0x14, 0x5a, 0x85, 0xa9, 0x19, 0x9a, 0x54, 0x5b, 0x1e, 0x5f, 0x93, 0xcb,
|
||||||
0x54, 0xc9, 0xeb, 0xbd, 0x52, 0xd4, 0xfb, 0xff, 0xa5, 0xed, 0xbc, 0x0f, 0xcd, 0xec, 0x3a, 0xe3,
|
0x79, 0x08, 0xed, 0x53, 0x8e, 0x91, 0x5b, 0xe1, 0x14, 0xe7, 0x31, 0x74, 0x75, 0xf1, 0x94, 0x8c,
|
||||||
0x6c, 0x72, 0x4c, 0xcd, 0xa7, 0xe3, 0x16, 0xc0, 0x57, 0x2d, 0xa8, 0x68, 0x41, 0x7f, 0xaf, 0x40,
|
0xea, 0xf8, 0x7b, 0x7c, 0x9a, 0x11, 0x17, 0x51, 0xce, 0x5f, 0x6a, 0xb0, 0x46, 0xd9, 0x99, 0x97,
|
||||||
0x53, 0x87, 0xf9, 0xbf, 0x3e, 0xfc, 0x3f, 0x82, 0x66, 0xa2, 0x02, 0xcf, 0x54, 0x27, 0x69, 0x1d,
|
0x98, 0x4a, 0x51, 0x62, 0xfe, 0x27, 0x95, 0xee, 0x03, 0x68, 0x66, 0x37, 0x19, 0x67, 0x93, 0x13,
|
||||||
0x74, 0x49, 0x51, 0xde, 0x3b, 0x0a, 0x06, 0x23, 0x7f, 0x2c, 0x33, 0x7f, 0x8c, 0xc3, 0xbd, 0x5e,
|
0xaa, 0x77, 0x1d, 0xb7, 0x00, 0xfe, 0x5f, 0xf5, 0x8a, 0xaa, 0xf7, 0xd7, 0x0a, 0x34, 0x75, 0x98,
|
||||||
0x3a, 0xdc, 0x31, 0xf8, 0x89, 0x68, 0x51, 0x0d, 0xd9, 0xa2, 0xe4, 0xd8, 0x3c, 0xce, 0xd7, 0x4a,
|
0xff, 0xe3, 0xae, 0xe4, 0x63, 0x68, 0x26, 0x2a, 0xf0, 0x4c, 0x15, 0xaf, 0xd6, 0x41, 0x97, 0x14,
|
||||||
0xc7, 0xb9, 0xf3, 0x09, 0xac, 0x1d, 0x79, 0xfe, 0x08, 0xf7, 0x21, 0x16, 0xfa, 0x09, 0xa5, 0x29,
|
0xe5, 0xe5, 0xaa, 0x60, 0x30, 0xf2, 0xc7, 0x32, 0xf3, 0xc7, 0xe8, 0x3a, 0xea, 0xa5, 0xae, 0x03,
|
||||||
0x2e, 0x14, 0x63, 0xa1, 0x64, 0xc2, 0xd0, 0xdf, 0xd7, 0xd4, 0x4f, 0x89, 0x72, 0x2e, 0xf0, 0x60,
|
0x83, 0x9f, 0x88, 0xaa, 0xd8, 0x90, 0x55, 0x51, 0x8e, 0xcd, 0x3e, 0x63, 0xad, 0xd4, 0x67, 0x38,
|
||||||
0x56, 0x65, 0x40, 0xc5, 0xf4, 0x18, 0x3b, 0x57, 0xee, 0x90, 0xbc, 0x96, 0x16, 0x8f, 0x76, 0x83,
|
0x9f, 0xc2, 0xda, 0xb1, 0xe7, 0x8f, 0x70, 0x1f, 0x62, 0xa1, 0x9f, 0x50, 0x9a, 0xe2, 0x42, 0x31,
|
||||||
0x07, 0xc3, 0xb2, 0x36, 0x51, 0x9a, 0xa9, 0xd1, 0xe5, 0x3e, 0x20, 0x7b, 0xdc, 0x7c, 0xda, 0xf9,
|
0x16, 0x4a, 0x26, 0x0c, 0xfd, 0x7d, 0x43, 0x25, 0x9c, 0x28, 0xe7, 0x12, 0x7b, 0x01, 0x75, 0x0c,
|
||||||
0x5d, 0x05, 0x76, 0xd5, 0x8d, 0xec, 0xd6, 0x7b, 0xd7, 0xf2, 0xfb, 0x80, 0x72, 0x5f, 0xad, 0xe4,
|
0xe8, 0x30, 0x3d, 0xc1, 0x5a, 0x99, 0x3b, 0x24, 0x3f, 0x4b, 0x8b, 0xdd, 0x84, 0xc1, 0x83, 0x61,
|
||||||
0xbe, 0x27, 0xd0, 0x4c, 0x59, 0x16, 0x4f, 0x53, 0x74, 0xb3, 0xf4, 0x6c, 0xeb, 0x60, 0x27, 0xaf,
|
0x59, 0x9b, 0x28, 0xcd, 0x54, 0x5a, 0x73, 0x1f, 0x90, 0x3d, 0x6e, 0x3e, 0xed, 0xfc, 0xb6, 0x02,
|
||||||
0x24, 0xa9, 0xcb, 0xa5, 0x59, 0xb7, 0xe0, 0x73, 0xfe, 0x59, 0x85, 0x6e, 0x79, 0x56, 0xf4, 0xa5,
|
0xbb, 0xaa, 0x55, 0xbc, 0xb3, 0x21, 0x5c, 0xde, 0x82, 0x28, 0xf7, 0xd5, 0x4a, 0xee, 0x7b, 0x0a,
|
||||||
0xf3, 0xf1, 0x45, 0x18, 0x7f, 0xa1, 0xae, 0x92, 0xca, 0x79, 0x26, 0x24, 0xaa, 0x0a, 0x7d, 0x79,
|
0xcd, 0x94, 0x65, 0xf1, 0x34, 0x45, 0x37, 0x4b, 0xcf, 0xb6, 0x0e, 0x76, 0xf2, 0x93, 0x24, 0x75,
|
||||||
0x82, 0xa7, 0x0e, 0x6a, 0x52, 0xa7, 0x4a, 0x01, 0xd0, 0xec, 0x31, 0x4b, 0xc3, 0x38, 0xa0, 0x2b,
|
0xb9, 0x34, 0xeb, 0x16, 0x7c, 0xce, 0x3f, 0xaa, 0xd0, 0x2d, 0xcf, 0x8a, 0xba, 0x74, 0x31, 0xbe,
|
||||||
0x4b, 0x01, 0x88, 0x36, 0x80, 0xc4, 0x9b, 0x69, 0xcc, 0x3d, 0xba, 0xbc, 0x6a, 0x5a, 0xde, 0x21,
|
0x0c, 0xe3, 0x2f, 0x55, 0x8f, 0xab, 0x9c, 0x67, 0x42, 0xe2, 0x54, 0xa1, 0x2f, 0x4f, 0xf1, 0xa2,
|
||||||
0x31, 0x46, 0x8c, 0x1f, 0x8a, 0xa8, 0xd5, 0xe9, 0x0e, 0xa9, 0x91, 0x62, 0xfe, 0x88, 0x4d, 0x32,
|
0x43, 0x4d, 0xea, 0x22, 0x2b, 0x00, 0x9a, 0x3d, 0x61, 0x69, 0x18, 0x07, 0xd4, 0x25, 0x15, 0x80,
|
||||||
0x2a, 0x73, 0x03, 0x11, 0x96, 0xab, 0x68, 0xbe, 0x16, 0x49, 0x4d, 0xf5, 0x6e, 0x42, 0x42, 0x82,
|
0x28, 0x03, 0x48, 0xbc, 0x99, 0xc6, 0xdc, 0xa3, 0xae, 0x5a, 0xd3, 0xb2, 0xb9, 0xc5, 0x18, 0x31,
|
||||||
0x22, 0x4f, 0xae, 0xbc, 0x44, 0x96, 0x7d, 0xc7, 0x35, 0x10, 0x4c, 0xe4, 0x2d, 0x45, 0xa1, 0x37,
|
0x7e, 0x28, 0xa2, 0x56, 0xa7, 0xe6, 0x56, 0x23, 0xc5, 0xfc, 0x31, 0x9b, 0x64, 0x74, 0xcc, 0x0d,
|
||||||
0xf0, 0x8b, 0xc1, 0x13, 0x47, 0xa1, 0x6c, 0x03, 0x1d, 0x77, 0x71, 0x42, 0x70, 0x5f, 0xb0, 0x34,
|
0x44, 0x58, 0xae, 0xa2, 0xf9, 0x5a, 0x24, 0x35, 0x9d, 0x77, 0x13, 0x12, 0x12, 0x14, 0x79, 0x7a,
|
||||||
0x62, 0xe3, 0x23, 0x43, 0x2b, 0x28, 0xee, 0x85, 0x09, 0xf1, 0x8d, 0xb2, 0x10, 0x73, 0x3a, 0x7b,
|
0xed, 0x25, 0xf2, 0xd8, 0x77, 0x5c, 0x03, 0xc1, 0x44, 0xde, 0x52, 0x14, 0x7a, 0x03, 0x3f, 0x65,
|
||||||
0xbe, 0x0b, 0x9d, 0x97, 0x97, 0x0c, 0xbb, 0x71, 0x9e, 0x05, 0xe8, 0x43, 0x91, 0xcc, 0x18, 0xd9,
|
0x3c, 0x71, 0xfb, 0xca, 0x32, 0xd0, 0x71, 0x17, 0x27, 0x04, 0xf7, 0x25, 0x4b, 0x23, 0x36, 0x3e,
|
||||||
0x49, 0x22, 0x23, 0x60, 0xb9, 0x05, 0xe0, 0x64, 0x50, 0x97, 0xec, 0x4b, 0xaf, 0x0b, 0x2a, 0x81,
|
0x36, 0xb4, 0x82, 0xe2, 0x5e, 0x98, 0x10, 0x1f, 0x4f, 0x0b, 0x31, 0xa7, 0x1b, 0xea, 0xbb, 0xd0,
|
||||||
0xaa, 0x3a, 0x81, 0xca, 0xe9, 0xd2, 0xd1, 0xe9, 0x42, 0x89, 0x65, 0x15, 0x89, 0x55, 0x52, 0x5a,
|
0x79, 0x79, 0xc5, 0xb0, 0x1a, 0xe7, 0x59, 0x80, 0x3e, 0x14, 0xc9, 0x8c, 0x91, 0x9d, 0x24, 0x32,
|
||||||
0x9f, 0x57, 0xfa, 0xfb, 0x2a, 0xb4, 0x3f, 0x67, 0xfc, 0x2a, 0x4e, 0x2f, 0x44, 0xa1, 0x64, 0x4b,
|
0x02, 0x96, 0x5b, 0x00, 0x4e, 0x06, 0x75, 0xc9, 0xbe, 0xb4, 0x43, 0x51, 0x09, 0x54, 0xd5, 0x09,
|
||||||
0x4f, 0xbe, 0x7b, 0xf8, 0x39, 0x34, 0x1b, 0x9c, 0x5f, 0x73, 0x4a, 0x0c, 0x0b, 0xeb, 0x72, 0xf6,
|
0x54, 0x4e, 0x97, 0x8e, 0x4e, 0x17, 0x4a, 0x2c, 0xab, 0x48, 0xac, 0x92, 0xd2, 0xfa, 0xbc, 0xd2,
|
||||||
0x5c, 0x90, 0xf6, 0x7d, 0x00, 0x9c, 0x3a, 0xf6, 0xd4, 0x69, 0xa7, 0x2e, 0x2e, 0xcd, 0x74, 0x46,
|
0xdf, 0x55, 0xa1, 0xfd, 0x05, 0xe3, 0xd7, 0x71, 0x7a, 0x29, 0x0e, 0x4a, 0xb6, 0xf4, 0xe6, 0xbb,
|
||||||
0x80, 0xfd, 0x1e, 0x34, 0xdd, 0xd9, 0x00, 0xfb, 0x69, 0x9c, 0xaa, 0xec, 0xb5, 0xf0, 0x4b, 0x6a,
|
0x8f, 0xdf, 0x69, 0xb3, 0xc1, 0xc5, 0x0d, 0xa7, 0xc4, 0xb0, 0xf0, 0x5c, 0xce, 0x5e, 0x08, 0xd2,
|
||||||
0xf6, 0x52, 0xd2, 0x62, 0x2d, 0x4e, 0x06, 0x69, 0x9c, 0x24, 0x2c, 0xc8, 0x4d, 0x4b, 0x67, 0x2f,
|
0x7e, 0x00, 0x80, 0x53, 0x27, 0x9e, 0xba, 0xed, 0x54, 0xaf, 0xd4, 0x4c, 0x67, 0x04, 0xd8, 0xef,
|
||||||
0x14, 0x20, 0xb4, 0x9e, 0xe6, 0x5a, 0x1b, 0x4a, 0x2b, 0x2f, 0xb4, 0xe2, 0x54, 0x42, 0x5a, 0xd7,
|
0x43, 0xd3, 0x9d, 0x0d, 0xb0, 0x9e, 0xc6, 0xa9, 0xca, 0x5e, 0x0b, 0x3f, 0xf1, 0x66, 0x2f, 0x25,
|
||||||
0x68, 0x53, 0xa6, 0xd6, 0x53, 0xad, 0x75, 0x5d, 0x69, 0xe5, 0x86, 0xd6, 0xd3, 0x42, 0x6b, 0x33,
|
0x2d, 0xd6, 0xe2, 0x64, 0x90, 0xc6, 0x49, 0xc2, 0x82, 0xdc, 0xb4, 0x74, 0x76, 0xa4, 0x00, 0xa1,
|
||||||
0x5f, 0x4b, 0x5a, 0x9d, 0xbf, 0x54, 0x60, 0x1d, 0xd3, 0xf2, 0x2c, 0xf3, 0x86, 0x0c, 0x4f, 0xb0,
|
0xf5, 0x2c, 0xd7, 0xda, 0x50, 0x5a, 0x79, 0xa1, 0x15, 0xa7, 0x12, 0xd2, 0xba, 0x46, 0x9b, 0x32,
|
||||||
0x16, 0xc7, 0x14, 0x1e, 0x0f, 0xa6, 0x82, 0xa4, 0x90, 0x81, 0x84, 0x14, 0xc3, 0xd7, 0xa0, 0x9d,
|
0xb5, 0x9e, 0x69, 0xad, 0xeb, 0x4a, 0x2b, 0x37, 0xb4, 0x9e, 0x15, 0x5a, 0x9b, 0xf9, 0x5a, 0xd2,
|
||||||
0xb0, 0x14, 0x93, 0x95, 0x38, 0xaa, 0xd8, 0x50, 0x2c, 0xb7, 0xa5, 0x30, 0xc5, 0xb2, 0x0f, 0x77,
|
0xea, 0xfc, 0xa9, 0x02, 0xeb, 0x98, 0x96, 0xe7, 0x99, 0x37, 0x64, 0x78, 0x83, 0xb5, 0x38, 0xa6,
|
||||||
0xe5, 0xdc, 0x20, 0x8c, 0x06, 0x2a, 0x7d, 0x26, 0x71, 0xc0, 0xc8, 0x55, 0x5b, 0x72, 0xea, 0x55,
|
0xf0, 0x78, 0x30, 0x15, 0x24, 0x85, 0x0c, 0x24, 0xa4, 0x18, 0xbe, 0x06, 0xed, 0x84, 0xa5, 0x98,
|
||||||
0xf4, 0x99, 0x9e, 0xb0, 0xbf, 0x0d, 0x5b, 0x9a, 0x5f, 0x9c, 0x92, 0x92, 0x5b, 0xb9, 0x6e, 0x83,
|
0xac, 0xc4, 0x51, 0xc5, 0x82, 0x62, 0xb9, 0x2d, 0x85, 0x29, 0x96, 0x7d, 0x78, 0x4f, 0xce, 0x0d,
|
||||||
0xb8, 0xcf, 0x08, 0xc6, 0x4b, 0x4b, 0xf7, 0x74, 0x84, 0x5f, 0xcc, 0x1c, 0x8f, 0x91, 0xe1, 0x0b,
|
0xc2, 0x68, 0xa0, 0xd2, 0x67, 0x12, 0x07, 0x8c, 0x5c, 0xb5, 0x25, 0xa7, 0x5e, 0x45, 0x9f, 0xeb,
|
||||||
0x0f, 0x8b, 0x0d, 0x3b, 0x68, 0x22, 0x4b, 0x32, 0x23, 0x6b, 0x73, 0xd2, 0xfe, 0x0e, 0x6c, 0x71,
|
0x09, 0xfb, 0xdb, 0xb0, 0xa5, 0xf9, 0xc5, 0x2d, 0x29, 0xb9, 0x95, 0xeb, 0x36, 0x88, 0xfb, 0x9c,
|
||||||
0xc5, 0xcb, 0x82, 0x41, 0xce, 0xa3, 0xa2, 0xb9, 0xa9, 0x27, 0x8e, 0x89, 0xf9, 0x1b, 0xd0, 0x2d,
|
0x60, 0x6c, 0x5a, 0xba, 0x67, 0x23, 0xfc, 0x94, 0xe7, 0x78, 0x8d, 0x0c, 0x8f, 0x3c, 0x3c, 0x6c,
|
||||||
0x98, 0x65, 0x3f, 0x56, 0xf6, 0x76, 0x34, 0x7a, 0x2a, 0xba, 0xf2, 0x1f, 0x94, 0xb3, 0x54, 0xe6,
|
0x58, 0x41, 0x13, 0x79, 0x24, 0x33, 0xb2, 0x36, 0x27, 0xed, 0xef, 0xc0, 0x16, 0x57, 0xbc, 0x2c,
|
||||||
0x7c, 0x24, 0x3b, 0x84, 0xe1, 0xaa, 0xd6, 0xc1, 0x46, 0xde, 0x59, 0xc9, 0x19, 0xb2, 0x2b, 0x28,
|
0x18, 0xe4, 0x3c, 0x2a, 0x9a, 0x9b, 0x7a, 0xe2, 0x84, 0x98, 0xbf, 0x0e, 0xdd, 0x82, 0x59, 0xd6,
|
||||||
0xb7, 0xfc, 0x04, 0x36, 0xb8, 0x36, 0x7d, 0x80, 0x05, 0xe4, 0x51, 0x7b, 0xcd, 0xbb, 0x5b, 0x79,
|
0x63, 0x65, 0x6f, 0x47, 0xa3, 0x67, 0xa2, 0x2a, 0xff, 0x5e, 0x39, 0x4b, 0x65, 0xce, 0xc7, 0xb2,
|
||||||
0x63, 0x6e, 0x97, 0x97, 0x37, 0x8a, 0x9e, 0x57, 0x47, 0x3e, 0x29, 0x54, 0xf6, 0xb5, 0x14, 0x26,
|
0x42, 0x18, 0xae, 0x6a, 0x1d, 0x6c, 0xe4, 0x95, 0x95, 0x9c, 0x21, 0xab, 0x82, 0x72, 0xcb, 0x8f,
|
||||||
0x55, 0x38, 0x3f, 0x82, 0x26, 0xde, 0x07, 0x32, 0x65, 0x1d, 0x3a, 0xc6, 0x9f, 0xa6, 0x29, 0xd6,
|
0x61, 0x83, 0x6b, 0xd3, 0x07, 0x78, 0x80, 0x3c, 0x2a, 0xaf, 0x79, 0x75, 0x2b, 0x6f, 0xcc, 0xed,
|
||||||
0x57, 0xee, 0x18, 0x22, 0xc5, 0x7d, 0x41, 0x1e, 0x97, 0xe4, 0x0c, 0x45, 0x38, 0x31, 0x80, 0x2a,
|
0xf2, 0xf2, 0x46, 0xd1, 0xf3, 0xea, 0xca, 0x27, 0x85, 0xca, 0xbe, 0x96, 0xc2, 0xa4, 0x0a, 0xe7,
|
||||||
0x73, 0xa9, 0x0d, 0x79, 0xcc, 0x14, 0x50, 0x84, 0xc8, 0xb3, 0x89, 0x37, 0xd3, 0xa1, 0x97, 0x79,
|
0x47, 0xd0, 0xc4, 0x7e, 0x20, 0x53, 0xd6, 0xa1, 0x63, 0xfc, 0x69, 0x9a, 0xe2, 0xf9, 0xca, 0x1d,
|
||||||
0x86, 0x80, 0xda, 0x20, 0x2a, 0x7c, 0xeb, 0x85, 0x63, 0x9f, 0xbe, 0x9b, 0x51, 0x21, 0x91, 0x85,
|
0x43, 0xa4, 0xe8, 0x17, 0xe4, 0x75, 0x49, 0xce, 0x50, 0x84, 0x13, 0x03, 0xa8, 0x63, 0x2e, 0xb5,
|
||||||
0x42, 0xcb, 0x54, 0xf8, 0xa7, 0x2a, 0xb4, 0x94, 0x46, 0x65, 0x30, 0x72, 0xf9, 0x78, 0xb0, 0x68,
|
0x21, 0x8f, 0x99, 0x02, 0x8a, 0x10, 0x79, 0x36, 0xf1, 0x66, 0x3a, 0xf4, 0x32, 0xcf, 0x10, 0x50,
|
||||||
0x95, 0x92, 0xc0, 0xa3, 0xbf, 0x5e, 0xa8, 0x2b, 0xae, 0x81, 0x85, 0xa9, 0xb9, 0x6d, 0x78, 0xd0,
|
0x1b, 0x44, 0x85, 0x6f, 0xbd, 0x70, 0xec, 0xd3, 0x07, 0x3d, 0x2a, 0x24, 0xb2, 0x50, 0x68, 0x99,
|
||||||
0x65, 0xd8, 0xfb, 0x0c, 0xef, 0x2c, 0xe5, 0x6e, 0x0a, 0x26, 0x65, 0xf0, 0xc7, 0xd0, 0x56, 0xf9,
|
0x0a, 0xff, 0x58, 0x85, 0x96, 0xd2, 0xa8, 0x0c, 0x46, 0x2e, 0x1f, 0x2f, 0x16, 0xad, 0x52, 0x12,
|
||||||
0x49, 0x6b, 0xac, 0x55, 0x6b, 0x5a, 0x8a, 0x4d, 0xad, 0x7a, 0x22, 0x6e, 0x5b, 0x68, 0xaf, 0x3c,
|
0x78, 0xf5, 0xd7, 0x0b, 0x75, 0x45, 0x1b, 0x58, 0x98, 0x9a, 0xdb, 0x86, 0x17, 0x5d, 0x86, 0xb5,
|
||||||
0xdd, 0x5b, 0x07, 0xf7, 0x4b, 0xec, 0x72, 0x27, 0xfb, 0xf2, 0xf7, 0x65, 0xc4, 0xb1, 0xcd, 0x2a,
|
0xcf, 0xf0, 0xce, 0x52, 0xee, 0xa6, 0x60, 0x52, 0x06, 0x7f, 0x02, 0x6d, 0x95, 0x9f, 0xb4, 0xc6,
|
||||||
0xde, 0xfe, 0x53, 0x80, 0x02, 0x14, 0x3d, 0xeb, 0x82, 0x5d, 0xe7, 0xb7, 0x4a, 0x1c, 0x8a, 0xbd,
|
0x5a, 0xb5, 0xa6, 0xa5, 0xd8, 0xd4, 0xaa, 0xa7, 0xa2, 0xdb, 0x42, 0x7b, 0xe5, 0xed, 0xde, 0x3a,
|
||||||
0x5f, 0x7a, 0xe3, 0x69, 0xee, 0x54, 0x45, 0xfc, 0xb0, 0xfa, 0xb4, 0xe2, 0xf8, 0xb0, 0xf1, 0x5c,
|
0x78, 0x50, 0x62, 0x97, 0x3b, 0xd9, 0x97, 0xbf, 0x2f, 0x23, 0x8e, 0x65, 0x56, 0xf1, 0xf6, 0x9f,
|
||||||
0x9c, 0x59, 0xc6, 0xf2, 0xd2, 0x73, 0x8f, 0xb5, 0xf4, 0xb9, 0xc7, 0xca, 0x9f, 0x7b, 0xb0, 0x8d,
|
0x01, 0x14, 0xa0, 0xa8, 0x59, 0x97, 0xec, 0x26, 0xef, 0x2a, 0x71, 0x28, 0xf6, 0x7e, 0xe5, 0x8d,
|
||||||
0xc6, 0x09, 0x9d, 0xb0, 0x38, 0x2a, 0x14, 0x59, 0x86, 0x22, 0xe7, 0x1f, 0x16, 0x40, 0xa1, 0xc5,
|
0xa7, 0xb9, 0x53, 0x15, 0xf1, 0xc3, 0xea, 0xb3, 0x0a, 0x7e, 0x76, 0x6c, 0xbc, 0x10, 0x77, 0x96,
|
||||||
0x3e, 0x81, 0x7e, 0x18, 0x0f, 0xc4, 0x01, 0x11, 0xfa, 0x4c, 0x35, 0xa4, 0x41, 0xca, 0x30, 0x7d,
|
0xb1, 0xbc, 0xf4, 0x0e, 0x65, 0x2d, 0x7d, 0x87, 0xb2, 0xf2, 0x77, 0x28, 0x2c, 0xa3, 0x71, 0x42,
|
||||||
0xb2, 0xf0, 0x92, 0xd1, 0x1d, 0x62, 0x97, 0xf6, 0x3d, 0x67, 0x9c, 0xbb, 0x87, 0x94, 0x5a, 0x28,
|
0x37, 0x2c, 0x8e, 0x0a, 0x45, 0x96, 0xa1, 0xc8, 0xf9, 0xbb, 0x05, 0x50, 0x68, 0xb1, 0x4f, 0xa1,
|
||||||
0x3b, 0x97, 0x9b, 0x2f, 0xb3, 0x7f, 0x0e, 0x3b, 0x85, 0xd0, 0xc0, 0x90, 0x57, 0xbd, 0x51, 0xde,
|
0x1f, 0xc6, 0x03, 0x71, 0x41, 0x84, 0x3e, 0x53, 0x05, 0x69, 0x90, 0x32, 0x4c, 0x9f, 0x2c, 0xbc,
|
||||||
0x5d, 0x2d, 0x2f, 0x28, 0x64, 0xfd, 0x14, 0x10, 0x1e, 0xe0, 0x19, 0x33, 0x2d, 0x49, 0xaa, 0xdd,
|
0x62, 0xd4, 0x43, 0xec, 0xd2, 0xbe, 0xe7, 0x8c, 0x73, 0xf7, 0x90, 0x52, 0x0b, 0x65, 0xe5, 0x72,
|
||||||
0x28, 0x69, 0x2b, 0x8c, 0xdf, 0xc8, 0x15, 0x85, 0x9c, 0x37, 0x70, 0xcf, 0xd8, 0xa8, 0x28, 0x7b,
|
0xf3, 0x65, 0xf6, 0xcf, 0x60, 0xa7, 0x10, 0x1a, 0x18, 0xf2, 0xaa, 0xb7, 0xca, 0x7b, 0x4f, 0xcb,
|
||||||
0x43, 0x9a, 0x75, 0xa3, 0xb4, 0x5d, 0x6d, 0x97, 0x68, 0x0c, 0x85, 0xc8, 0xcf, 0x00, 0x67, 0x06,
|
0x0b, 0x0a, 0x59, 0x3f, 0x01, 0x84, 0x07, 0x78, 0xc7, 0x4c, 0x4b, 0x92, 0x6a, 0xb7, 0x4a, 0xda,
|
||||||
0x57, 0x5e, 0xc8, 0xe7, 0xe5, 0xd5, 0x6f, 0xdb, 0xe7, 0x17, 0xb8, 0xa8, 0x2c, 0x4c, 0xed, 0x73,
|
0x0a, 0xe3, 0x37, 0x72, 0x45, 0x21, 0xe7, 0x0d, 0xdc, 0x37, 0x36, 0x2a, 0x8e, 0xbd, 0x21, 0xcd,
|
||||||
0xc2, 0xd2, 0x61, 0x69, 0x9f, 0x8d, 0xdb, 0xf6, 0x79, 0x24, 0x57, 0x14, 0x72, 0x9e, 0x03, 0x82,
|
0xba, 0x55, 0xda, 0xae, 0xb6, 0x4b, 0x14, 0x86, 0x42, 0xe4, 0xe7, 0x80, 0x33, 0x83, 0x6b, 0x2f,
|
||||||
0xf3, 0xf6, 0xac, 0xdd, 0x28, 0x65, 0x23, 0x8c, 0xcb, 0xb6, 0x1c, 0xc2, 0x56, 0xc6, 0x7c, 0x8e,
|
0xe4, 0xf3, 0xf2, 0xea, 0x77, 0xed, 0xf3, 0x4b, 0x5c, 0x54, 0x16, 0xa6, 0xf6, 0x39, 0x61, 0xe9,
|
||||||
0x27, 0x8a, 0x21, 0x63, 0xfd, 0x46, 0x19, 0x9b, 0xb4, 0x40, 0x0b, 0x71, 0xbe, 0x84, 0xf6, 0xcf,
|
0xb0, 0xb4, 0xcf, 0xc6, 0x5d, 0xfb, 0x3c, 0x96, 0x2b, 0x0a, 0x39, 0x2f, 0x00, 0xc1, 0x79, 0x7b,
|
||||||
0xa6, 0x43, 0xc6, 0xc7, 0xe7, 0xba, 0xe6, 0xff, 0xd7, 0x6d, 0xe6, 0xdf, 0xd8, 0x66, 0x0e, 0x87,
|
0xd6, 0x6e, 0x95, 0xb2, 0x11, 0xc6, 0x65, 0x5b, 0x0e, 0x61, 0x2b, 0x63, 0x3e, 0xc7, 0x1b, 0xc5,
|
||||||
0x69, 0x3c, 0x4d, 0x4a, 0x5d, 0x5b, 0xd5, 0xf0, 0x42, 0xd7, 0x96, 0x3c, 0xb2, 0x6b, 0x2b, 0xee,
|
0x90, 0xb1, 0x7e, 0xab, 0x8c, 0x4d, 0x5a, 0xa0, 0x85, 0x38, 0x5f, 0x41, 0xfb, 0xa7, 0xd3, 0x21,
|
||||||
0x4f, 0xa0, 0xad, 0x2e, 0x4c, 0xb4, 0x40, 0x75, 0x21, 0x7b, 0xb1, 0xe8, 0xf3, 0x0b, 0x9a, 0x5a,
|
0xe3, 0xe3, 0x0b, 0x7d, 0xe6, 0xff, 0xdb, 0x65, 0xe6, 0x5f, 0x58, 0x66, 0x0e, 0x87, 0x69, 0x3c,
|
||||||
0x76, 0x40, 0x97, 0x4f, 0x5a, 0x55, 0xee, 0x46, 0x85, 0x9b, 0xf0, 0xeb, 0xa3, 0xa8, 0xba, 0x57,
|
0x4d, 0x4a, 0x55, 0x5b, 0x9d, 0xe1, 0x85, 0xaa, 0x2d, 0x79, 0x64, 0xd5, 0x56, 0xdc, 0x9f, 0x42,
|
||||||
0xd0, 0x19, 0x29, 0xdf, 0xd0, 0x2a, 0x95, 0x80, 0x5f, 0xcf, 0x8d, 0x2b, 0xf6, 0xb0, 0x6f, 0xfa,
|
0x5b, 0x35, 0x4c, 0xb4, 0x40, 0x55, 0x21, 0x7b, 0xf1, 0xd0, 0xe7, 0x0d, 0x9a, 0x5a, 0x76, 0x40,
|
||||||
0x50, 0xb9, 0xba, 0x3d, 0x32, 0xdd, 0xfa, 0x3d, 0x00, 0xf1, 0x79, 0x31, 0xc8, 0x1b, 0x95, 0xf9,
|
0xcd, 0x27, 0xad, 0x2a, 0x57, 0xa3, 0xc2, 0x4d, 0xf8, 0xf5, 0x51, 0x9c, 0xba, 0x57, 0xd0, 0x19,
|
||||||
0x9e, 0xa7, 0x4f, 0x08, 0xfc, 0x96, 0xc9, 0x87, 0xfd, 0x53, 0xd8, 0x5a, 0x90, 0xb9, 0xa4, 0x4d,
|
0x29, 0xdf, 0xd0, 0x2a, 0x95, 0x80, 0x1f, 0xe5, 0xc6, 0x15, 0x7b, 0xd8, 0x37, 0x7d, 0xa8, 0x5c,
|
||||||
0x7d, 0xcb, 0x6c, 0x53, 0xad, 0x83, 0xbb, 0x24, 0xd2, 0x5c, 0x6a, 0xf6, 0xae, 0x3f, 0x56, 0xd4,
|
0xdd, 0x1e, 0x99, 0x6e, 0xfd, 0x1e, 0x80, 0xf8, 0xbc, 0x18, 0xe4, 0x85, 0xca, 0x7c, 0x42, 0xd4,
|
||||||
0xd7, 0x88, 0x7e, 0x72, 0xb1, 0x9f, 0x42, 0x27, 0x52, 0x97, 0x2f, 0x1d, 0x80, 0x9a, 0x21, 0xc8,
|
0x37, 0x04, 0x7e, 0xcb, 0xe4, 0xc3, 0xfe, 0x19, 0x6c, 0x2d, 0xc8, 0x5c, 0x52, 0xa6, 0xbe, 0x65,
|
||||||
0xbc, 0x98, 0xb9, 0xed, 0xc8, 0xbc, 0xa6, 0x61, 0x20, 0x7c, 0xe9, 0x81, 0xa5, 0x81, 0x30, 0x9c,
|
0x96, 0xa9, 0xd6, 0xc1, 0x7b, 0x24, 0xd2, 0x5c, 0x6a, 0xd6, 0xae, 0x3f, 0x54, 0xd4, 0xd7, 0x88,
|
||||||
0xe3, 0xb6, 0x7c, 0x23, 0xda, 0xa5, 0xcb, 0x60, 0x6d, 0xfe, 0x32, 0x48, 0x8f, 0x06, 0xab, 0xde,
|
0x7e, 0xe5, 0xb1, 0x9f, 0x41, 0x27, 0x52, 0xcd, 0x97, 0x0e, 0x40, 0xcd, 0x10, 0x64, 0x36, 0x66,
|
||||||
0x18, 0x0f, 0xfe, 0xd5, 0x80, 0xda, 0xb3, 0xe3, 0x57, 0xf6, 0x19, 0x6c, 0xce, 0x3f, 0xbe, 0xdb,
|
0x6e, 0x3b, 0x32, 0xdb, 0x34, 0x0c, 0x84, 0x2f, 0x3d, 0xb0, 0x34, 0x10, 0x86, 0x73, 0xdc, 0x96,
|
||||||
0x0f, 0x48, 0xf5, 0x8a, 0x07, 0xfb, 0xfe, 0x07, 0x2b, 0xe7, 0xe9, 0xb6, 0x7c, 0xc7, 0x76, 0x61,
|
0x6f, 0x44, 0xbb, 0xd4, 0x0c, 0xd6, 0xe6, 0x9b, 0x41, 0x7a, 0x34, 0x58, 0xf5, 0xac, 0x79, 0xf0,
|
||||||
0x63, 0xee, 0x41, 0xd6, 0xce, 0x8f, 0x93, 0xe5, 0xcf, 0xd9, 0xfd, 0x07, 0xab, 0xa6, 0x4d, 0x99,
|
0xcf, 0x06, 0xd4, 0x9e, 0x9f, 0xbc, 0xb2, 0xcf, 0x61, 0x73, 0xfe, 0x5f, 0x01, 0xfb, 0x21, 0xa9,
|
||||||
0x73, 0xd7, 0x73, 0x2d, 0x73, 0xf9, 0xa7, 0x9a, 0x96, 0xb9, 0xea, 0x56, 0x7f, 0xc7, 0xfe, 0x01,
|
0x5e, 0xf1, 0x4f, 0x42, 0xff, 0xc3, 0x95, 0xf3, 0xd4, 0x2d, 0xdf, 0xb3, 0x5d, 0xd8, 0x98, 0x7b,
|
||||||
0x34, 0xd4, 0x13, 0xad, 0xbd, 0x4d, 0xbc, 0xa5, 0xc7, 0xdf, 0xfe, 0xce, 0x1c, 0xaa, 0x17, 0xbe,
|
0x03, 0xb6, 0xf3, 0xeb, 0x64, 0xf9, 0x3b, 0x7b, 0xff, 0xe1, 0xaa, 0x69, 0x53, 0xe6, 0x5c, 0x7b,
|
||||||
0x86, 0x4e, 0xe9, 0xc5, 0xde, 0x7e, 0xaf, 0xa4, 0xab, 0xfc, 0xc2, 0xdb, 0x7f, 0x7f, 0xf9, 0xa4,
|
0xae, 0x65, 0x2e, 0xff, 0x54, 0xd3, 0x32, 0x57, 0x75, 0xf5, 0xf7, 0xec, 0x1f, 0x40, 0x43, 0xbd,
|
||||||
0x96, 0x76, 0x08, 0x50, 0xbc, 0xe2, 0xd9, 0x3d, 0xe2, 0x5e, 0x78, 0x29, 0xee, 0xdf, 0x5b, 0x32,
|
0x0a, 0xdb, 0xdb, 0xc4, 0x5b, 0x7a, 0x6f, 0xee, 0xef, 0xcc, 0xa1, 0x7a, 0xe1, 0x6b, 0xe8, 0x94,
|
||||||
0xa3, 0x85, 0x60, 0x28, 0xe7, 0x9f, 0xe5, 0xec, 0x39, 0xaf, 0xce, 0x3f, 0x9d, 0xe9, 0x50, 0xae,
|
0xfe, 0x4a, 0xb0, 0xdf, 0x2f, 0xe9, 0x2a, 0x3f, 0x2a, 0xf7, 0x3f, 0x58, 0x3e, 0xa9, 0xa5, 0x1d,
|
||||||
0x7c, 0xcf, 0x93, 0x62, 0xe7, 0x9f, 0xe4, 0xb4, 0xd8, 0x15, 0x4f, 0x7d, 0x5a, 0xec, 0xca, 0xb7,
|
0x02, 0x14, 0x0f, 0x87, 0x76, 0x8f, 0xb8, 0x17, 0x1e, 0xa7, 0xfb, 0xf7, 0x97, 0xcc, 0x68, 0x21,
|
||||||
0xbc, 0x3b, 0xf6, 0x2f, 0xa0, 0x5b, 0x7e, 0x24, 0xb3, 0x73, 0x27, 0x2d, 0x7d, 0xe4, 0xeb, 0xdf,
|
0x18, 0xca, 0xf9, 0x27, 0x3e, 0x7b, 0xce, 0xab, 0xf3, 0x0f, 0x6c, 0x3a, 0x94, 0x2b, 0xdf, 0x06,
|
||||||
0x5f, 0x31, 0xab, 0x05, 0x7e, 0x0c, 0x75, 0xf5, 0xfa, 0x95, 0x97, 0x9c, 0xf9, 0x68, 0xd6, 0xdf,
|
0xa5, 0xd8, 0xf9, 0x87, 0x3b, 0x2d, 0x76, 0xc5, 0xb3, 0xa1, 0x16, 0xbb, 0xf2, 0xc5, 0xef, 0x9e,
|
||||||
0x2e, 0x83, 0x7a, 0xd5, 0x63, 0x68, 0xa8, 0x0f, 0x3b, 0x9d, 0x00, 0xa5, 0xef, 0xbc, 0x7e, 0xdb,
|
0xfd, 0x73, 0xe8, 0x96, 0x1f, 0xc9, 0xec, 0xdc, 0x49, 0x4b, 0x9f, 0x02, 0xfb, 0x0f, 0x56, 0xcc,
|
||||||
0x44, 0x9d, 0x3b, 0x8f, 0x2b, 0xb9, 0x9e, 0xac, 0xa4, 0x27, 0x5b, 0xa6, 0xc7, 0x08, 0xce, 0x79,
|
0x6a, 0x81, 0x9f, 0x40, 0x5d, 0xbd, 0x7e, 0xe5, 0x47, 0xce, 0x7c, 0x34, 0xeb, 0x6f, 0x97, 0x41,
|
||||||
0x43, 0xfe, 0x1b, 0xf6, 0xe4, 0x3f, 0x01, 0x00, 0x00, 0xff, 0xff, 0xfc, 0x82, 0xee, 0x31, 0x1a,
|
0xbd, 0xea, 0x09, 0x34, 0xd4, 0x87, 0x9d, 0x4e, 0x80, 0xd2, 0x77, 0x5e, 0xbf, 0x6d, 0xa2, 0xce,
|
||||||
0x1b, 0x00, 0x00,
|
0xbd, 0x27, 0x95, 0x5c, 0x4f, 0x56, 0xd2, 0x93, 0x2d, 0xd3, 0x63, 0x04, 0xe7, 0xa2, 0x21, 0xff,
|
||||||
|
0xa6, 0x7b, 0xfa, 0xef, 0x00, 0x00, 0x00, 0xff, 0xff, 0xb7, 0xce, 0x6c, 0xd6, 0xb3, 0x1b, 0x00,
|
||||||
|
0x00,
|
||||||
}
|
}
|
||||||
|
|
|
@ -49,6 +49,7 @@ message CreateContainerRequest {
|
||||||
bool noPivotRoot = 8;
|
bool noPivotRoot = 8;
|
||||||
string runtime = 9;
|
string runtime = 9;
|
||||||
repeated string runtimeArgs = 10;
|
repeated string runtimeArgs = 10;
|
||||||
|
string checkpointDir = 11; // Directory where checkpoints are stored
|
||||||
}
|
}
|
||||||
|
|
||||||
message CreateContainerResponse {
|
message CreateContainerResponse {
|
||||||
|
@ -100,6 +101,7 @@ message AddProcessResponse {
|
||||||
message CreateCheckpointRequest {
|
message CreateCheckpointRequest {
|
||||||
string id = 1; // ID of container
|
string id = 1; // ID of container
|
||||||
Checkpoint checkpoint = 2; // Checkpoint configuration
|
Checkpoint checkpoint = 2; // Checkpoint configuration
|
||||||
|
string checkpointDir = 3; // Directory where checkpoints are stored
|
||||||
}
|
}
|
||||||
|
|
||||||
message CreateCheckpointResponse {
|
message CreateCheckpointResponse {
|
||||||
|
@ -108,6 +110,7 @@ message CreateCheckpointResponse {
|
||||||
message DeleteCheckpointRequest {
|
message DeleteCheckpointRequest {
|
||||||
string id = 1; // ID of container
|
string id = 1; // ID of container
|
||||||
string name = 2; // Name of checkpoint
|
string name = 2; // Name of checkpoint
|
||||||
|
string checkpointDir = 3; // Directory where checkpoints are stored
|
||||||
}
|
}
|
||||||
|
|
||||||
message DeleteCheckpointResponse {
|
message DeleteCheckpointResponse {
|
||||||
|
@ -115,6 +118,7 @@ message DeleteCheckpointResponse {
|
||||||
|
|
||||||
message ListCheckpointRequest {
|
message ListCheckpointRequest {
|
||||||
string id = 1; // ID of container
|
string id = 1; // ID of container
|
||||||
|
string checkpointDir = 2; // Directory where checkpoints are stored
|
||||||
}
|
}
|
||||||
|
|
||||||
message Checkpoint {
|
message Checkpoint {
|
||||||
|
|
|
@ -36,31 +36,32 @@ type checkpoint struct {
|
||||||
|
|
||||||
type processState struct {
|
type processState struct {
|
||||||
specs.ProcessSpec
|
specs.ProcessSpec
|
||||||
Exec bool `json:"exec"`
|
Exec bool `json:"exec"`
|
||||||
Stdin string `json:"containerdStdin"`
|
Stdin string `json:"containerdStdin"`
|
||||||
Stdout string `json:"containerdStdout"`
|
Stdout string `json:"containerdStdout"`
|
||||||
Stderr string `json:"containerdStderr"`
|
Stderr string `json:"containerdStderr"`
|
||||||
RuntimeArgs []string `json:"runtimeArgs"`
|
RuntimeArgs []string `json:"runtimeArgs"`
|
||||||
NoPivotRoot bool `json:"noPivotRoot"`
|
NoPivotRoot bool `json:"noPivotRoot"`
|
||||||
Checkpoint string `json:"checkpoint"`
|
CheckpointPath string `json:"checkpoint"`
|
||||||
RootUID int `json:"rootUID"`
|
RootUID int `json:"rootUID"`
|
||||||
RootGID int `json:"rootGID"`
|
RootGID int `json:"rootGID"`
|
||||||
}
|
}
|
||||||
|
|
||||||
type process struct {
|
type process struct {
|
||||||
sync.WaitGroup
|
sync.WaitGroup
|
||||||
id string
|
id string
|
||||||
bundle string
|
bundle string
|
||||||
stdio *stdio
|
stdio *stdio
|
||||||
exec bool
|
exec bool
|
||||||
containerPid int
|
containerPid int
|
||||||
checkpoint *checkpoint
|
checkpoint *checkpoint
|
||||||
shimIO *IO
|
checkpointPath string
|
||||||
stdinCloser io.Closer
|
shimIO *IO
|
||||||
console *os.File
|
stdinCloser io.Closer
|
||||||
consolePath string
|
console *os.File
|
||||||
state *processState
|
consolePath string
|
||||||
runtime string
|
state *processState
|
||||||
|
runtime string
|
||||||
}
|
}
|
||||||
|
|
||||||
func newProcess(id, bundle, runtimeName string) (*process, error) {
|
func newProcess(id, bundle, runtimeName string) (*process, error) {
|
||||||
|
@ -74,12 +75,13 @@ func newProcess(id, bundle, runtimeName string) (*process, error) {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
p.state = s
|
p.state = s
|
||||||
if s.Checkpoint != "" {
|
if s.CheckpointPath != "" {
|
||||||
cpt, err := loadCheckpoint(bundle, s.Checkpoint)
|
cpt, err := loadCheckpoint(s.CheckpointPath)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
p.checkpoint = cpt
|
p.checkpoint = cpt
|
||||||
|
p.checkpointPath = s.CheckpointPath
|
||||||
}
|
}
|
||||||
if err := p.openIO(); err != nil {
|
if err := p.openIO(); err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
|
@ -100,8 +102,8 @@ func loadProcess() (*processState, error) {
|
||||||
return &s, nil
|
return &s, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func loadCheckpoint(bundle, name string) (*checkpoint, error) {
|
func loadCheckpoint(checkpointPath string) (*checkpoint, error) {
|
||||||
f, err := os.Open(filepath.Join(bundle, "checkpoints", name, "config.json"))
|
f, err := os.Open(filepath.Join(checkpointPath, "config.json"))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
@ -130,7 +132,7 @@ func (p *process) start() error {
|
||||||
)
|
)
|
||||||
} else if p.checkpoint != nil {
|
} else if p.checkpoint != nil {
|
||||||
args = append(args, "restore",
|
args = append(args, "restore",
|
||||||
"--image-path", filepath.Join(p.bundle, "checkpoints", p.checkpoint.Name),
|
"--image-path", filepath.Join(p.checkpointPath),
|
||||||
)
|
)
|
||||||
add := func(flags ...string) {
|
add := func(flags ...string) {
|
||||||
args = append(args, flags...)
|
args = append(args, flags...)
|
||||||
|
|
|
@ -35,6 +35,13 @@ var listCheckpointCommand = cli.Command{
|
||||||
Name: "list",
|
Name: "list",
|
||||||
Usage: "list all checkpoints for a container",
|
Usage: "list all checkpoints for a container",
|
||||||
Action: listCheckpoints,
|
Action: listCheckpoints,
|
||||||
|
Flags: []cli.Flag{
|
||||||
|
cli.StringFlag{
|
||||||
|
Name: "checkpoint-dir",
|
||||||
|
Value: "",
|
||||||
|
Usage: "path to checkpoint directory",
|
||||||
|
},
|
||||||
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
func listCheckpoints(context *cli.Context) {
|
func listCheckpoints(context *cli.Context) {
|
||||||
|
@ -47,6 +54,7 @@ func listCheckpoints(context *cli.Context) {
|
||||||
}
|
}
|
||||||
resp, err := c.ListCheckpoint(netcontext.Background(), &types.ListCheckpointRequest{
|
resp, err := c.ListCheckpoint(netcontext.Background(), &types.ListCheckpointRequest{
|
||||||
Id: id,
|
Id: id,
|
||||||
|
CheckpointDir: context.String("checkpoint-dir"),
|
||||||
})
|
})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
fatal(err.Error(), 1)
|
fatal(err.Error(), 1)
|
||||||
|
@ -81,6 +89,11 @@ var createCheckpointCommand = cli.Command{
|
||||||
Name: "shell",
|
Name: "shell",
|
||||||
Usage: "checkpoint shell jobs",
|
Usage: "checkpoint shell jobs",
|
||||||
},
|
},
|
||||||
|
cli.StringFlag{
|
||||||
|
Name: "checkpoint-dir",
|
||||||
|
Value: "",
|
||||||
|
Usage: "directory to store checkpoints",
|
||||||
|
},
|
||||||
},
|
},
|
||||||
Action: func(context *cli.Context) {
|
Action: func(context *cli.Context) {
|
||||||
var (
|
var (
|
||||||
|
@ -96,6 +109,7 @@ var createCheckpointCommand = cli.Command{
|
||||||
c := getClient(context)
|
c := getClient(context)
|
||||||
if _, err := c.CreateCheckpoint(netcontext.Background(), &types.CreateCheckpointRequest{
|
if _, err := c.CreateCheckpoint(netcontext.Background(), &types.CreateCheckpointRequest{
|
||||||
Id: containerID,
|
Id: containerID,
|
||||||
|
CheckpointDir: context.String("checkpoint-dir"),
|
||||||
Checkpoint: &types.Checkpoint{
|
Checkpoint: &types.Checkpoint{
|
||||||
Name: name,
|
Name: name,
|
||||||
Exit: context.Bool("exit"),
|
Exit: context.Bool("exit"),
|
||||||
|
@ -112,6 +126,13 @@ var createCheckpointCommand = cli.Command{
|
||||||
var deleteCheckpointCommand = cli.Command{
|
var deleteCheckpointCommand = cli.Command{
|
||||||
Name: "delete",
|
Name: "delete",
|
||||||
Usage: "delete a container's checkpoint",
|
Usage: "delete a container's checkpoint",
|
||||||
|
Flags: []cli.Flag{
|
||||||
|
cli.StringFlag{
|
||||||
|
Name: "checkpoint-dir",
|
||||||
|
Value: "",
|
||||||
|
Usage: "path to checkpoint directory",
|
||||||
|
},
|
||||||
|
},
|
||||||
Action: func(context *cli.Context) {
|
Action: func(context *cli.Context) {
|
||||||
var (
|
var (
|
||||||
containerID = context.Args().Get(0)
|
containerID = context.Args().Get(0)
|
||||||
|
@ -125,8 +146,9 @@ var deleteCheckpointCommand = cli.Command{
|
||||||
}
|
}
|
||||||
c := getClient(context)
|
c := getClient(context)
|
||||||
if _, err := c.DeleteCheckpoint(netcontext.Background(), &types.DeleteCheckpointRequest{
|
if _, err := c.DeleteCheckpoint(netcontext.Background(), &types.DeleteCheckpointRequest{
|
||||||
Id: containerID,
|
Id: containerID,
|
||||||
Name: name,
|
Name: name,
|
||||||
|
CheckpointDir: context.String("checkpoint-dir"),
|
||||||
}); err != nil {
|
}); err != nil {
|
||||||
fatal(err.Error(), 1)
|
fatal(err.Error(), 1)
|
||||||
}
|
}
|
||||||
|
|
|
@ -134,6 +134,11 @@ var startCommand = cli.Command{
|
||||||
Value: "",
|
Value: "",
|
||||||
Usage: "checkpoint to start the container from",
|
Usage: "checkpoint to start the container from",
|
||||||
},
|
},
|
||||||
|
cli.StringFlag{
|
||||||
|
Name: "checkpoint-dir",
|
||||||
|
Value: "",
|
||||||
|
Usage: "path to checkpoint directory",
|
||||||
|
},
|
||||||
cli.BoolFlag{
|
cli.BoolFlag{
|
||||||
Name: "attach,a",
|
Name: "attach,a",
|
||||||
Usage: "connect to the stdio of the container",
|
Usage: "connect to the stdio of the container",
|
||||||
|
@ -177,14 +182,15 @@ var startCommand = cli.Command{
|
||||||
tty bool
|
tty bool
|
||||||
c = getClient(context)
|
c = getClient(context)
|
||||||
r = &types.CreateContainerRequest{
|
r = &types.CreateContainerRequest{
|
||||||
Id: id,
|
Id: id,
|
||||||
BundlePath: bpath,
|
BundlePath: bpath,
|
||||||
Checkpoint: context.String("checkpoint"),
|
Checkpoint: context.String("checkpoint"),
|
||||||
Stdin: s.stdin,
|
CheckpointDir: context.String("checkpoint-dir"),
|
||||||
Stdout: s.stdout,
|
Stdin: s.stdin,
|
||||||
Stderr: s.stderr,
|
Stdout: s.stdout,
|
||||||
Labels: context.StringSlice("label"),
|
Stderr: s.stderr,
|
||||||
NoPivotRoot: context.Bool("no-pivot"),
|
Labels: context.StringSlice("label"),
|
||||||
|
NoPivotRoot: context.Bool("no-pivot"),
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
restoreAndCloseStdin = func() {
|
restoreAndCloseStdin = func() {
|
||||||
|
|
|
@ -22,7 +22,7 @@ type Container interface {
|
||||||
// Path returns the path to the bundle
|
// Path returns the path to the bundle
|
||||||
Path() string
|
Path() string
|
||||||
// Start starts the init process of the container
|
// Start starts the init process of the container
|
||||||
Start(checkpoint string, s Stdio) (Process, error)
|
Start(checkpointPath string, s Stdio) (Process, error)
|
||||||
// Exec starts another process in an existing container
|
// Exec starts another process in an existing container
|
||||||
Exec(string, specs.ProcessSpec, Stdio) (Process, error)
|
Exec(string, specs.ProcessSpec, Stdio) (Process, error)
|
||||||
// Delete removes the container's state and any resources
|
// Delete removes the container's state and any resources
|
||||||
|
@ -38,11 +38,11 @@ type Container interface {
|
||||||
// RemoveProcess removes the specified process from the container
|
// RemoveProcess removes the specified process from the container
|
||||||
RemoveProcess(string) error
|
RemoveProcess(string) error
|
||||||
// Checkpoints returns all the checkpoints for a container
|
// Checkpoints returns all the checkpoints for a container
|
||||||
Checkpoints() ([]Checkpoint, error)
|
Checkpoints(checkpointDir string) ([]Checkpoint, error)
|
||||||
// Checkpoint creates a new checkpoint
|
// Checkpoint creates a new checkpoint
|
||||||
Checkpoint(Checkpoint) error
|
Checkpoint(checkpoint Checkpoint, checkpointDir string) error
|
||||||
// DeleteCheckpoint deletes the checkpoint for the provided name
|
// DeleteCheckpoint deletes the checkpoint for the provided name
|
||||||
DeleteCheckpoint(name string) error
|
DeleteCheckpoint(name string, checkpointDir string) error
|
||||||
// Labels are user provided labels for the container
|
// Labels are user provided labels for the container
|
||||||
Labels() []string
|
Labels() []string
|
||||||
// Pids returns all pids inside the container
|
// Pids returns all pids inside the container
|
||||||
|
@ -290,8 +290,12 @@ func (c *container) Resume() error {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *container) Checkpoints() ([]Checkpoint, error) {
|
func (c *container) Checkpoints(checkpointDir string) ([]Checkpoint, error) {
|
||||||
dirs, err := ioutil.ReadDir(filepath.Join(c.bundle, "checkpoints"))
|
if checkpointDir == "" {
|
||||||
|
checkpointDir = filepath.Join(c.bundle, "checkpoints")
|
||||||
|
}
|
||||||
|
|
||||||
|
dirs, err := ioutil.ReadDir(checkpointDir)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
@ -300,7 +304,7 @@ func (c *container) Checkpoints() ([]Checkpoint, error) {
|
||||||
if !d.IsDir() {
|
if !d.IsDir() {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
path := filepath.Join(c.bundle, "checkpoints", d.Name(), "config.json")
|
path := filepath.Join(checkpointDir, d.Name(), "config.json")
|
||||||
data, err := ioutil.ReadFile(path)
|
data, err := ioutil.ReadFile(path)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
|
@ -314,11 +318,16 @@ func (c *container) Checkpoints() ([]Checkpoint, error) {
|
||||||
return out, nil
|
return out, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *container) Checkpoint(cpt Checkpoint) error {
|
func (c *container) Checkpoint(cpt Checkpoint, checkpointDir string) error {
|
||||||
if err := os.MkdirAll(filepath.Join(c.bundle, "checkpoints"), 0755); err != nil {
|
if checkpointDir == "" {
|
||||||
|
checkpointDir = filepath.Join(c.bundle, "checkpoints")
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := os.MkdirAll(checkpointDir, 0755); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
path := filepath.Join(c.bundle, "checkpoints", cpt.Name)
|
|
||||||
|
path := filepath.Join(checkpointDir, cpt.Name)
|
||||||
if err := os.Mkdir(path, 0755); err != nil {
|
if err := os.Mkdir(path, 0755); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
@ -360,11 +369,14 @@ func (c *container) Checkpoint(cpt Checkpoint) error {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *container) DeleteCheckpoint(name string) error {
|
func (c *container) DeleteCheckpoint(name string, checkpointDir string) error {
|
||||||
return os.RemoveAll(filepath.Join(c.bundle, "checkpoints", name))
|
if checkpointDir == "" {
|
||||||
|
checkpointDir = filepath.Join(c.bundle, "checkpoints")
|
||||||
|
}
|
||||||
|
return os.RemoveAll(filepath.Join(checkpointDir, name))
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *container) Start(checkpoint string, s Stdio) (Process, error) {
|
func (c *container) Start(checkpointPath string, s Stdio) (Process, error) {
|
||||||
processRoot := filepath.Join(c.root, c.id, InitProcessID)
|
processRoot := filepath.Join(c.root, c.id, InitProcessID)
|
||||||
if err := os.Mkdir(processRoot, 0755); err != nil {
|
if err := os.Mkdir(processRoot, 0755); err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
|
@ -381,7 +393,7 @@ func (c *container) Start(checkpoint string, s Stdio) (Process, error) {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
config := &processConfig{
|
config := &processConfig{
|
||||||
checkpoint: checkpoint,
|
checkpoint: checkpointPath,
|
||||||
root: processRoot,
|
root: processRoot,
|
||||||
id: InitProcessID,
|
id: InitProcessID,
|
||||||
c: c,
|
c: c,
|
||||||
|
|
|
@ -6,8 +6,9 @@ import "github.com/docker/containerd/runtime"
|
||||||
|
|
||||||
type CreateCheckpointTask struct {
|
type CreateCheckpointTask struct {
|
||||||
baseTask
|
baseTask
|
||||||
ID string
|
ID string
|
||||||
Checkpoint *runtime.Checkpoint
|
CheckpointDir string
|
||||||
|
Checkpoint *runtime.Checkpoint
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *Supervisor) createCheckpoint(t *CreateCheckpointTask) error {
|
func (s *Supervisor) createCheckpoint(t *CreateCheckpointTask) error {
|
||||||
|
@ -15,13 +16,14 @@ func (s *Supervisor) createCheckpoint(t *CreateCheckpointTask) error {
|
||||||
if !ok {
|
if !ok {
|
||||||
return ErrContainerNotFound
|
return ErrContainerNotFound
|
||||||
}
|
}
|
||||||
return i.container.Checkpoint(*t.Checkpoint)
|
return i.container.Checkpoint(*t.Checkpoint, t.CheckpointDir)
|
||||||
}
|
}
|
||||||
|
|
||||||
type DeleteCheckpointTask struct {
|
type DeleteCheckpointTask struct {
|
||||||
baseTask
|
baseTask
|
||||||
ID string
|
ID string
|
||||||
Checkpoint *runtime.Checkpoint
|
CheckpointDir string
|
||||||
|
Checkpoint *runtime.Checkpoint
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *Supervisor) deleteCheckpoint(t *DeleteCheckpointTask) error {
|
func (s *Supervisor) deleteCheckpoint(t *DeleteCheckpointTask) error {
|
||||||
|
@ -29,5 +31,5 @@ func (s *Supervisor) deleteCheckpoint(t *DeleteCheckpointTask) error {
|
||||||
if !ok {
|
if !ok {
|
||||||
return ErrContainerNotFound
|
return ErrContainerNotFound
|
||||||
}
|
}
|
||||||
return i.container.DeleteCheckpoint(t.Checkpoint.Name)
|
return i.container.DeleteCheckpoint(t.Checkpoint.Name, t.CheckpointDir)
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
package supervisor
|
package supervisor
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"path/filepath"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/docker/containerd/runtime"
|
"github.com/docker/containerd/runtime"
|
||||||
|
@ -17,6 +18,7 @@ type StartTask struct {
|
||||||
Labels []string
|
Labels []string
|
||||||
NoPivotRoot bool
|
NoPivotRoot bool
|
||||||
Checkpoint *runtime.Checkpoint
|
Checkpoint *runtime.Checkpoint
|
||||||
|
CheckpointDir string
|
||||||
Runtime string
|
Runtime string
|
||||||
RuntimeArgs []string
|
RuntimeArgs []string
|
||||||
}
|
}
|
||||||
|
@ -56,7 +58,7 @@ func (s *Supervisor) start(t *StartTask) error {
|
||||||
Stderr: t.Stderr,
|
Stderr: t.Stderr,
|
||||||
}
|
}
|
||||||
if t.Checkpoint != nil {
|
if t.Checkpoint != nil {
|
||||||
task.Checkpoint = t.Checkpoint.Name
|
task.CheckpointPath = filepath.Join(t.CheckpointDir, t.Checkpoint.Name)
|
||||||
}
|
}
|
||||||
|
|
||||||
s.startTasks <- task
|
s.startTasks <- task
|
||||||
|
|
|
@ -13,13 +13,13 @@ type Worker interface {
|
||||||
}
|
}
|
||||||
|
|
||||||
type startTask struct {
|
type startTask struct {
|
||||||
Container runtime.Container
|
Container runtime.Container
|
||||||
Checkpoint string
|
CheckpointPath string
|
||||||
Stdin string
|
Stdin string
|
||||||
Stdout string
|
Stdout string
|
||||||
Stderr string
|
Stderr string
|
||||||
Err chan error
|
Err chan error
|
||||||
StartResponse chan StartResponse
|
StartResponse chan StartResponse
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewWorker(s *Supervisor, wg *sync.WaitGroup) Worker {
|
func NewWorker(s *Supervisor, wg *sync.WaitGroup) Worker {
|
||||||
|
@ -38,7 +38,7 @@ func (w *worker) Start() {
|
||||||
defer w.wg.Done()
|
defer w.wg.Done()
|
||||||
for t := range w.s.startTasks {
|
for t := range w.s.startTasks {
|
||||||
started := time.Now()
|
started := time.Now()
|
||||||
process, err := t.Container.Start(t.Checkpoint, runtime.NewStdio(t.Stdin, t.Stdout, t.Stderr))
|
process, err := t.Container.Start(t.CheckpointPath, runtime.NewStdio(t.Stdin, t.Stdout, t.Stderr))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
logrus.WithFields(logrus.Fields{
|
logrus.WithFields(logrus.Fields{
|
||||||
"error": err,
|
"error": err,
|
||||||
|
|
Loading…
Add table
Reference in a new issue