driver/base: add task event emitting to proto

This commit is contained in:
Nick Ethier 2018-08-15 00:06:08 -04:00 committed by Nick Ethier
parent a2c32dda57
commit 3a817dc7c9
2 changed files with 350 additions and 184 deletions

View file

@ -9,6 +9,7 @@ import math "math"
import duration "github.com/golang/protobuf/ptypes/duration" import duration "github.com/golang/protobuf/ptypes/duration"
import empty "github.com/golang/protobuf/ptypes/empty" import empty "github.com/golang/protobuf/ptypes/empty"
import timestamp "github.com/golang/protobuf/ptypes/timestamp" import timestamp "github.com/golang/protobuf/ptypes/timestamp"
import hclspec "github.com/hashicorp/nomad/plugins/shared/hclspec"
import ( import (
context "golang.org/x/net/context" context "golang.org/x/net/context"
@ -29,27 +30,27 @@ const _ = proto.ProtoPackageIsVersion2 // please upgrade the proto package
type TaskState int32 type TaskState int32
const ( const (
TaskState_TASK_UNKNOWN TaskState = 0 TaskState_UNKNOWN TaskState = 0
TaskState_TASK_RUNNING TaskState = 1 TaskState_RUNNING TaskState = 1
TaskState_TASK_EXITED TaskState = 2 TaskState_EXITED TaskState = 2
) )
var TaskState_name = map[int32]string{ var TaskState_name = map[int32]string{
0: "TASK_UNKNOWN", 0: "UNKNOWN",
1: "TASK_RUNNING", 1: "RUNNING",
2: "TASK_EXITED", 2: "EXITED",
} }
var TaskState_value = map[string]int32{ var TaskState_value = map[string]int32{
"TASK_UNKNOWN": 0, "UNKNOWN": 0,
"TASK_RUNNING": 1, "RUNNING": 1,
"TASK_EXITED": 2, "EXITED": 2,
} }
func (x TaskState) String() string { func (x TaskState) String() string {
return proto.EnumName(TaskState_name, int32(x)) return proto.EnumName(TaskState_name, int32(x))
} }
func (TaskState) EnumDescriptor() ([]byte, []int) { func (TaskState) EnumDescriptor() ([]byte, []int) {
return fileDescriptor_driver_b830f3fbdc9ff108, []int{0} return fileDescriptor_driver_b26cb45d2a523f58, []int{0}
} }
type CPUUsage_Fields int32 type CPUUsage_Fields int32
@ -84,7 +85,7 @@ func (x CPUUsage_Fields) String() string {
return proto.EnumName(CPUUsage_Fields_name, int32(x)) return proto.EnumName(CPUUsage_Fields_name, int32(x))
} }
func (CPUUsage_Fields) EnumDescriptor() ([]byte, []int) { func (CPUUsage_Fields) EnumDescriptor() ([]byte, []int) {
return fileDescriptor_driver_b830f3fbdc9ff108, []int{27, 0} return fileDescriptor_driver_b26cb45d2a523f58, []int{27, 0}
} }
type MemoryUsage_Fields int32 type MemoryUsage_Fields int32
@ -116,21 +117,23 @@ func (x MemoryUsage_Fields) String() string {
return proto.EnumName(MemoryUsage_Fields_name, int32(x)) return proto.EnumName(MemoryUsage_Fields_name, int32(x))
} }
func (MemoryUsage_Fields) EnumDescriptor() ([]byte, []int) { func (MemoryUsage_Fields) EnumDescriptor() ([]byte, []int) {
return fileDescriptor_driver_b830f3fbdc9ff108, []int{28, 0} return fileDescriptor_driver_b26cb45d2a523f58, []int{28, 0}
} }
type FingerprintResponse struct { type FingerprintResponse struct {
// Spec is the configuration schema for the job driver config stanza
Spec *hclspec.Spec `protobuf:"bytes,1,opt,name=spec,proto3" json:"spec,omitempty"`
// Capabilities provides a way for the driver to denote if it implements // Capabilities provides a way for the driver to denote if it implements
// non-core RPCs. Some Driver service RPCs expose additional information // non-core RPCs. Some Driver service RPCs expose additional information
// or functionality outside of the core task management functions. These // or functionality outside of the core task management functions. These
// RPCs are only implemented if the driver sets the corresponding capability. // RPCs are only implemented if the driver sets the corresponding capability.
Capabilities *DriverCapabilities `protobuf:"bytes,1,opt,name=capabilities,proto3" json:"capabilities,omitempty"` Capabilities *DriverCapabilities `protobuf:"bytes,2,opt,name=capabilities,proto3" json:"capabilities,omitempty"`
// Attributes are key/value pairs that annotate the nomad client and can be // Attributes are key/value pairs that annotate the nomad client and can be
// used in scheduling contraints and affinities. // used in scheduling contraints and affinities.
Attributes map[string]string `protobuf:"bytes,2,rep,name=attributes,proto3" json:"attributes,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` Attributes map[string]string `protobuf:"bytes,3,rep,name=attributes,proto3" json:"attributes,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"`
// Detected signifies if the necessary dependancies of the drive are met for // Detected signifies if the necessary dependancies of the drive are met for
// nominal operation. // nominal operation.
Detected bool `protobuf:"varint,3,opt,name=detected,proto3" json:"detected,omitempty"` Detected bool `protobuf:"varint,4,opt,name=detected,proto3" json:"detected,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"` XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"` XXX_sizecache int32 `json:"-"`
@ -140,7 +143,7 @@ func (m *FingerprintResponse) Reset() { *m = FingerprintResponse{} }
func (m *FingerprintResponse) String() string { return proto.CompactTextString(m) } func (m *FingerprintResponse) String() string { return proto.CompactTextString(m) }
func (*FingerprintResponse) ProtoMessage() {} func (*FingerprintResponse) ProtoMessage() {}
func (*FingerprintResponse) Descriptor() ([]byte, []int) { func (*FingerprintResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_driver_b830f3fbdc9ff108, []int{0} return fileDescriptor_driver_b26cb45d2a523f58, []int{0}
} }
func (m *FingerprintResponse) XXX_Unmarshal(b []byte) error { func (m *FingerprintResponse) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_FingerprintResponse.Unmarshal(m, b) return xxx_messageInfo_FingerprintResponse.Unmarshal(m, b)
@ -160,6 +163,13 @@ func (m *FingerprintResponse) XXX_DiscardUnknown() {
var xxx_messageInfo_FingerprintResponse proto.InternalMessageInfo var xxx_messageInfo_FingerprintResponse proto.InternalMessageInfo
func (m *FingerprintResponse) GetSpec() *hclspec.Spec {
if m != nil {
return m.Spec
}
return nil
}
func (m *FingerprintResponse) GetCapabilities() *DriverCapabilities { func (m *FingerprintResponse) GetCapabilities() *DriverCapabilities {
if m != nil { if m != nil {
return m.Capabilities return m.Capabilities
@ -195,7 +205,7 @@ func (m *RecoverTaskRequest) Reset() { *m = RecoverTaskRequest{} }
func (m *RecoverTaskRequest) String() string { return proto.CompactTextString(m) } func (m *RecoverTaskRequest) String() string { return proto.CompactTextString(m) }
func (*RecoverTaskRequest) ProtoMessage() {} func (*RecoverTaskRequest) ProtoMessage() {}
func (*RecoverTaskRequest) Descriptor() ([]byte, []int) { func (*RecoverTaskRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_driver_b830f3fbdc9ff108, []int{1} return fileDescriptor_driver_b26cb45d2a523f58, []int{1}
} }
func (m *RecoverTaskRequest) XXX_Unmarshal(b []byte) error { func (m *RecoverTaskRequest) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_RecoverTaskRequest.Unmarshal(m, b) return xxx_messageInfo_RecoverTaskRequest.Unmarshal(m, b)
@ -241,7 +251,7 @@ func (m *StartTaskRequest) Reset() { *m = StartTaskRequest{} }
func (m *StartTaskRequest) String() string { return proto.CompactTextString(m) } func (m *StartTaskRequest) String() string { return proto.CompactTextString(m) }
func (*StartTaskRequest) ProtoMessage() {} func (*StartTaskRequest) ProtoMessage() {}
func (*StartTaskRequest) Descriptor() ([]byte, []int) { func (*StartTaskRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_driver_b830f3fbdc9ff108, []int{2} return fileDescriptor_driver_b26cb45d2a523f58, []int{2}
} }
func (m *StartTaskRequest) XXX_Unmarshal(b []byte) error { func (m *StartTaskRequest) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_StartTaskRequest.Unmarshal(m, b) return xxx_messageInfo_StartTaskRequest.Unmarshal(m, b)
@ -281,7 +291,7 @@ func (m *StartTaskResponse) Reset() { *m = StartTaskResponse{} }
func (m *StartTaskResponse) String() string { return proto.CompactTextString(m) } func (m *StartTaskResponse) String() string { return proto.CompactTextString(m) }
func (*StartTaskResponse) ProtoMessage() {} func (*StartTaskResponse) ProtoMessage() {}
func (*StartTaskResponse) Descriptor() ([]byte, []int) { func (*StartTaskResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_driver_b830f3fbdc9ff108, []int{3} return fileDescriptor_driver_b26cb45d2a523f58, []int{3}
} }
func (m *StartTaskResponse) XXX_Unmarshal(b []byte) error { func (m *StartTaskResponse) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_StartTaskResponse.Unmarshal(m, b) return xxx_messageInfo_StartTaskResponse.Unmarshal(m, b)
@ -320,7 +330,7 @@ func (m *WaitTaskRequest) Reset() { *m = WaitTaskRequest{} }
func (m *WaitTaskRequest) String() string { return proto.CompactTextString(m) } func (m *WaitTaskRequest) String() string { return proto.CompactTextString(m) }
func (*WaitTaskRequest) ProtoMessage() {} func (*WaitTaskRequest) ProtoMessage() {}
func (*WaitTaskRequest) Descriptor() ([]byte, []int) { func (*WaitTaskRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_driver_b830f3fbdc9ff108, []int{4} return fileDescriptor_driver_b26cb45d2a523f58, []int{4}
} }
func (m *WaitTaskRequest) XXX_Unmarshal(b []byte) error { func (m *WaitTaskRequest) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_WaitTaskRequest.Unmarshal(m, b) return xxx_messageInfo_WaitTaskRequest.Unmarshal(m, b)
@ -363,7 +373,7 @@ func (m *WaitTaskResponse) Reset() { *m = WaitTaskResponse{} }
func (m *WaitTaskResponse) String() string { return proto.CompactTextString(m) } func (m *WaitTaskResponse) String() string { return proto.CompactTextString(m) }
func (*WaitTaskResponse) ProtoMessage() {} func (*WaitTaskResponse) ProtoMessage() {}
func (*WaitTaskResponse) Descriptor() ([]byte, []int) { func (*WaitTaskResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_driver_b830f3fbdc9ff108, []int{5} return fileDescriptor_driver_b26cb45d2a523f58, []int{5}
} }
func (m *WaitTaskResponse) XXX_Unmarshal(b []byte) error { func (m *WaitTaskResponse) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_WaitTaskResponse.Unmarshal(m, b) return xxx_messageInfo_WaitTaskResponse.Unmarshal(m, b)
@ -422,7 +432,7 @@ func (m *StopTaskRequest) Reset() { *m = StopTaskRequest{} }
func (m *StopTaskRequest) String() string { return proto.CompactTextString(m) } func (m *StopTaskRequest) String() string { return proto.CompactTextString(m) }
func (*StopTaskRequest) ProtoMessage() {} func (*StopTaskRequest) ProtoMessage() {}
func (*StopTaskRequest) Descriptor() ([]byte, []int) { func (*StopTaskRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_driver_b830f3fbdc9ff108, []int{6} return fileDescriptor_driver_b26cb45d2a523f58, []int{6}
} }
func (m *StopTaskRequest) XXX_Unmarshal(b []byte) error { func (m *StopTaskRequest) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_StopTaskRequest.Unmarshal(m, b) return xxx_messageInfo_StopTaskRequest.Unmarshal(m, b)
@ -475,7 +485,7 @@ func (m *DestroyTaskRequest) Reset() { *m = DestroyTaskRequest{} }
func (m *DestroyTaskRequest) String() string { return proto.CompactTextString(m) } func (m *DestroyTaskRequest) String() string { return proto.CompactTextString(m) }
func (*DestroyTaskRequest) ProtoMessage() {} func (*DestroyTaskRequest) ProtoMessage() {}
func (*DestroyTaskRequest) Descriptor() ([]byte, []int) { func (*DestroyTaskRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_driver_b830f3fbdc9ff108, []int{7} return fileDescriptor_driver_b26cb45d2a523f58, []int{7}
} }
func (m *DestroyTaskRequest) XXX_Unmarshal(b []byte) error { func (m *DestroyTaskRequest) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_DestroyTaskRequest.Unmarshal(m, b) return xxx_messageInfo_DestroyTaskRequest.Unmarshal(m, b)
@ -512,7 +522,7 @@ func (m *ListTasksRequest) Reset() { *m = ListTasksRequest{} }
func (m *ListTasksRequest) String() string { return proto.CompactTextString(m) } func (m *ListTasksRequest) String() string { return proto.CompactTextString(m) }
func (*ListTasksRequest) ProtoMessage() {} func (*ListTasksRequest) ProtoMessage() {}
func (*ListTasksRequest) Descriptor() ([]byte, []int) { func (*ListTasksRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_driver_b830f3fbdc9ff108, []int{8} return fileDescriptor_driver_b26cb45d2a523f58, []int{8}
} }
func (m *ListTasksRequest) XXX_Unmarshal(b []byte) error { func (m *ListTasksRequest) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_ListTasksRequest.Unmarshal(m, b) return xxx_messageInfo_ListTasksRequest.Unmarshal(m, b)
@ -544,7 +554,7 @@ func (m *ListTasksResponse) Reset() { *m = ListTasksResponse{} }
func (m *ListTasksResponse) String() string { return proto.CompactTextString(m) } func (m *ListTasksResponse) String() string { return proto.CompactTextString(m) }
func (*ListTasksResponse) ProtoMessage() {} func (*ListTasksResponse) ProtoMessage() {}
func (*ListTasksResponse) Descriptor() ([]byte, []int) { func (*ListTasksResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_driver_b830f3fbdc9ff108, []int{9} return fileDescriptor_driver_b26cb45d2a523f58, []int{9}
} }
func (m *ListTasksResponse) XXX_Unmarshal(b []byte) error { func (m *ListTasksResponse) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_ListTasksResponse.Unmarshal(m, b) return xxx_messageInfo_ListTasksResponse.Unmarshal(m, b)
@ -583,7 +593,7 @@ func (m *InspectTaskRequest) Reset() { *m = InspectTaskRequest{} }
func (m *InspectTaskRequest) String() string { return proto.CompactTextString(m) } func (m *InspectTaskRequest) String() string { return proto.CompactTextString(m) }
func (*InspectTaskRequest) ProtoMessage() {} func (*InspectTaskRequest) ProtoMessage() {}
func (*InspectTaskRequest) Descriptor() ([]byte, []int) { func (*InspectTaskRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_driver_b830f3fbdc9ff108, []int{10} return fileDescriptor_driver_b26cb45d2a523f58, []int{10}
} }
func (m *InspectTaskRequest) XXX_Unmarshal(b []byte) error { func (m *InspectTaskRequest) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_InspectTaskRequest.Unmarshal(m, b) return xxx_messageInfo_InspectTaskRequest.Unmarshal(m, b)
@ -622,7 +632,7 @@ func (m *InspectTaskResponse) Reset() { *m = InspectTaskResponse{} }
func (m *InspectTaskResponse) String() string { return proto.CompactTextString(m) } func (m *InspectTaskResponse) String() string { return proto.CompactTextString(m) }
func (*InspectTaskResponse) ProtoMessage() {} func (*InspectTaskResponse) ProtoMessage() {}
func (*InspectTaskResponse) Descriptor() ([]byte, []int) { func (*InspectTaskResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_driver_b830f3fbdc9ff108, []int{11} return fileDescriptor_driver_b26cb45d2a523f58, []int{11}
} }
func (m *InspectTaskResponse) XXX_Unmarshal(b []byte) error { func (m *InspectTaskResponse) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_InspectTaskResponse.Unmarshal(m, b) return xxx_messageInfo_InspectTaskResponse.Unmarshal(m, b)
@ -661,7 +671,7 @@ func (m *TaskStatsRequest) Reset() { *m = TaskStatsRequest{} }
func (m *TaskStatsRequest) String() string { return proto.CompactTextString(m) } func (m *TaskStatsRequest) String() string { return proto.CompactTextString(m) }
func (*TaskStatsRequest) ProtoMessage() {} func (*TaskStatsRequest) ProtoMessage() {}
func (*TaskStatsRequest) Descriptor() ([]byte, []int) { func (*TaskStatsRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_driver_b830f3fbdc9ff108, []int{12} return fileDescriptor_driver_b26cb45d2a523f58, []int{12}
} }
func (m *TaskStatsRequest) XXX_Unmarshal(b []byte) error { func (m *TaskStatsRequest) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_TaskStatsRequest.Unmarshal(m, b) return xxx_messageInfo_TaskStatsRequest.Unmarshal(m, b)
@ -700,7 +710,7 @@ func (m *TaskStatsResponse) Reset() { *m = TaskStatsResponse{} }
func (m *TaskStatsResponse) String() string { return proto.CompactTextString(m) } func (m *TaskStatsResponse) String() string { return proto.CompactTextString(m) }
func (*TaskStatsResponse) ProtoMessage() {} func (*TaskStatsResponse) ProtoMessage() {}
func (*TaskStatsResponse) Descriptor() ([]byte, []int) { func (*TaskStatsResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_driver_b830f3fbdc9ff108, []int{13} return fileDescriptor_driver_b26cb45d2a523f58, []int{13}
} }
func (m *TaskStatsResponse) XXX_Unmarshal(b []byte) error { func (m *TaskStatsResponse) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_TaskStatsResponse.Unmarshal(m, b) return xxx_messageInfo_TaskStatsResponse.Unmarshal(m, b)
@ -741,7 +751,7 @@ func (m *SignalTaskRequest) Reset() { *m = SignalTaskRequest{} }
func (m *SignalTaskRequest) String() string { return proto.CompactTextString(m) } func (m *SignalTaskRequest) String() string { return proto.CompactTextString(m) }
func (*SignalTaskRequest) ProtoMessage() {} func (*SignalTaskRequest) ProtoMessage() {}
func (*SignalTaskRequest) Descriptor() ([]byte, []int) { func (*SignalTaskRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_driver_b830f3fbdc9ff108, []int{14} return fileDescriptor_driver_b26cb45d2a523f58, []int{14}
} }
func (m *SignalTaskRequest) XXX_Unmarshal(b []byte) error { func (m *SignalTaskRequest) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_SignalTaskRequest.Unmarshal(m, b) return xxx_messageInfo_SignalTaskRequest.Unmarshal(m, b)
@ -792,7 +802,7 @@ func (m *ExecTaskRequest) Reset() { *m = ExecTaskRequest{} }
func (m *ExecTaskRequest) String() string { return proto.CompactTextString(m) } func (m *ExecTaskRequest) String() string { return proto.CompactTextString(m) }
func (*ExecTaskRequest) ProtoMessage() {} func (*ExecTaskRequest) ProtoMessage() {}
func (*ExecTaskRequest) Descriptor() ([]byte, []int) { func (*ExecTaskRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_driver_b830f3fbdc9ff108, []int{15} return fileDescriptor_driver_b26cb45d2a523f58, []int{15}
} }
func (m *ExecTaskRequest) XXX_Unmarshal(b []byte) error { func (m *ExecTaskRequest) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_ExecTaskRequest.Unmarshal(m, b) return xxx_messageInfo_ExecTaskRequest.Unmarshal(m, b)
@ -843,7 +853,7 @@ func (m *ExecTaskResponse) Reset() { *m = ExecTaskResponse{} }
func (m *ExecTaskResponse) String() string { return proto.CompactTextString(m) } func (m *ExecTaskResponse) String() string { return proto.CompactTextString(m) }
func (*ExecTaskResponse) ProtoMessage() {} func (*ExecTaskResponse) ProtoMessage() {}
func (*ExecTaskResponse) Descriptor() ([]byte, []int) { func (*ExecTaskResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_driver_b830f3fbdc9ff108, []int{16} return fileDescriptor_driver_b26cb45d2a523f58, []int{16}
} }
func (m *ExecTaskResponse) XXX_Unmarshal(b []byte) error { func (m *ExecTaskResponse) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_ExecTaskResponse.Unmarshal(m, b) return xxx_messageInfo_ExecTaskResponse.Unmarshal(m, b)
@ -879,7 +889,7 @@ func (m *DriverCapabilities) Reset() { *m = DriverCapabilities{} }
func (m *DriverCapabilities) String() string { return proto.CompactTextString(m) } func (m *DriverCapabilities) String() string { return proto.CompactTextString(m) }
func (*DriverCapabilities) ProtoMessage() {} func (*DriverCapabilities) ProtoMessage() {}
func (*DriverCapabilities) Descriptor() ([]byte, []int) { func (*DriverCapabilities) Descriptor() ([]byte, []int) {
return fileDescriptor_driver_b830f3fbdc9ff108, []int{17} return fileDescriptor_driver_b26cb45d2a523f58, []int{17}
} }
func (m *DriverCapabilities) XXX_Unmarshal(b []byte) error { func (m *DriverCapabilities) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_DriverCapabilities.Unmarshal(m, b) return xxx_messageInfo_DriverCapabilities.Unmarshal(m, b)
@ -944,7 +954,7 @@ func (m *TaskConfig) Reset() { *m = TaskConfig{} }
func (m *TaskConfig) String() string { return proto.CompactTextString(m) } func (m *TaskConfig) String() string { return proto.CompactTextString(m) }
func (*TaskConfig) ProtoMessage() {} func (*TaskConfig) ProtoMessage() {}
func (*TaskConfig) Descriptor() ([]byte, []int) { func (*TaskConfig) Descriptor() ([]byte, []int) {
return fileDescriptor_driver_b830f3fbdc9ff108, []int{18} return fileDescriptor_driver_b26cb45d2a523f58, []int{18}
} }
func (m *TaskConfig) XXX_Unmarshal(b []byte) error { func (m *TaskConfig) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_TaskConfig.Unmarshal(m, b) return xxx_messageInfo_TaskConfig.Unmarshal(m, b)
@ -1051,7 +1061,7 @@ func (m *Resources) Reset() { *m = Resources{} }
func (m *Resources) String() string { return proto.CompactTextString(m) } func (m *Resources) String() string { return proto.CompactTextString(m) }
func (*Resources) ProtoMessage() {} func (*Resources) ProtoMessage() {}
func (*Resources) Descriptor() ([]byte, []int) { func (*Resources) Descriptor() ([]byte, []int) {
return fileDescriptor_driver_b830f3fbdc9ff108, []int{19} return fileDescriptor_driver_b26cb45d2a523f58, []int{19}
} }
func (m *Resources) XXX_Unmarshal(b []byte) error { func (m *Resources) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_Resources.Unmarshal(m, b) return xxx_messageInfo_Resources.Unmarshal(m, b)
@ -1136,7 +1146,7 @@ func (m *Mount) Reset() { *m = Mount{} }
func (m *Mount) String() string { return proto.CompactTextString(m) } func (m *Mount) String() string { return proto.CompactTextString(m) }
func (*Mount) ProtoMessage() {} func (*Mount) ProtoMessage() {}
func (*Mount) Descriptor() ([]byte, []int) { func (*Mount) Descriptor() ([]byte, []int) {
return fileDescriptor_driver_b830f3fbdc9ff108, []int{20} return fileDescriptor_driver_b26cb45d2a523f58, []int{20}
} }
func (m *Mount) XXX_Unmarshal(b []byte) error { func (m *Mount) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_Mount.Unmarshal(m, b) return xxx_messageInfo_Mount.Unmarshal(m, b)
@ -1199,7 +1209,7 @@ func (m *Device) Reset() { *m = Device{} }
func (m *Device) String() string { return proto.CompactTextString(m) } func (m *Device) String() string { return proto.CompactTextString(m) }
func (*Device) ProtoMessage() {} func (*Device) ProtoMessage() {}
func (*Device) Descriptor() ([]byte, []int) { func (*Device) Descriptor() ([]byte, []int) {
return fileDescriptor_driver_b830f3fbdc9ff108, []int{21} return fileDescriptor_driver_b26cb45d2a523f58, []int{21}
} }
func (m *Device) XXX_Unmarshal(b []byte) error { func (m *Device) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_Device.Unmarshal(m, b) return xxx_messageInfo_Device.Unmarshal(m, b)
@ -1259,7 +1269,7 @@ func (m *TaskHandle) Reset() { *m = TaskHandle{} }
func (m *TaskHandle) String() string { return proto.CompactTextString(m) } func (m *TaskHandle) String() string { return proto.CompactTextString(m) }
func (*TaskHandle) ProtoMessage() {} func (*TaskHandle) ProtoMessage() {}
func (*TaskHandle) Descriptor() ([]byte, []int) { func (*TaskHandle) Descriptor() ([]byte, []int) {
return fileDescriptor_driver_b830f3fbdc9ff108, []int{22} return fileDescriptor_driver_b26cb45d2a523f58, []int{22}
} }
func (m *TaskHandle) XXX_Unmarshal(b []byte) error { func (m *TaskHandle) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_TaskHandle.Unmarshal(m, b) return xxx_messageInfo_TaskHandle.Unmarshal(m, b)
@ -1297,7 +1307,7 @@ func (m *TaskHandle) GetState() TaskState {
if m != nil { if m != nil {
return m.State return m.State
} }
return TaskState_TASK_UNKNOWN return TaskState_UNKNOWN
} }
func (m *TaskHandle) GetDriverState() []byte { func (m *TaskHandle) GetDriverState() []byte {
@ -1325,7 +1335,7 @@ func (m *TaskSummary) Reset() { *m = TaskSummary{} }
func (m *TaskSummary) String() string { return proto.CompactTextString(m) } func (m *TaskSummary) String() string { return proto.CompactTextString(m) }
func (*TaskSummary) ProtoMessage() {} func (*TaskSummary) ProtoMessage() {}
func (*TaskSummary) Descriptor() ([]byte, []int) { func (*TaskSummary) Descriptor() ([]byte, []int) {
return fileDescriptor_driver_b830f3fbdc9ff108, []int{23} return fileDescriptor_driver_b26cb45d2a523f58, []int{23}
} }
func (m *TaskSummary) XXX_Unmarshal(b []byte) error { func (m *TaskSummary) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_TaskSummary.Unmarshal(m, b) return xxx_messageInfo_TaskSummary.Unmarshal(m, b)
@ -1363,7 +1373,7 @@ func (m *TaskSummary) GetState() TaskState {
if m != nil { if m != nil {
return m.State return m.State
} }
return TaskState_TASK_UNKNOWN return TaskState_UNKNOWN
} }
func (m *TaskSummary) GetStartedAt() *timestamp.Timestamp { func (m *TaskSummary) GetStartedAt() *timestamp.Timestamp {
@ -1398,7 +1408,7 @@ func (m *TaskStatus) Reset() { *m = TaskStatus{} }
func (m *TaskStatus) String() string { return proto.CompactTextString(m) } func (m *TaskStatus) String() string { return proto.CompactTextString(m) }
func (*TaskStatus) ProtoMessage() {} func (*TaskStatus) ProtoMessage() {}
func (*TaskStatus) Descriptor() ([]byte, []int) { func (*TaskStatus) Descriptor() ([]byte, []int) {
return fileDescriptor_driver_b830f3fbdc9ff108, []int{24} return fileDescriptor_driver_b26cb45d2a523f58, []int{24}
} }
func (m *TaskStatus) XXX_Unmarshal(b []byte) error { func (m *TaskStatus) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_TaskStatus.Unmarshal(m, b) return xxx_messageInfo_TaskStatus.Unmarshal(m, b)
@ -1436,7 +1446,7 @@ func (m *TaskStatus) GetState() TaskState {
if m != nil { if m != nil {
return m.State return m.State
} }
return TaskState_TASK_UNKNOWN return TaskState_UNKNOWN
} }
func (m *TaskStatus) GetStartedAt() *timestamp.Timestamp { func (m *TaskStatus) GetStartedAt() *timestamp.Timestamp {
@ -1485,7 +1495,7 @@ func (m *TaskStats) Reset() { *m = TaskStats{} }
func (m *TaskStats) String() string { return proto.CompactTextString(m) } func (m *TaskStats) String() string { return proto.CompactTextString(m) }
func (*TaskStats) ProtoMessage() {} func (*TaskStats) ProtoMessage() {}
func (*TaskStats) Descriptor() ([]byte, []int) { func (*TaskStats) Descriptor() ([]byte, []int) {
return fileDescriptor_driver_b830f3fbdc9ff108, []int{25} return fileDescriptor_driver_b26cb45d2a523f58, []int{25}
} }
func (m *TaskStats) XXX_Unmarshal(b []byte) error { func (m *TaskStats) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_TaskStats.Unmarshal(m, b) return xxx_messageInfo_TaskStats.Unmarshal(m, b)
@ -1547,7 +1557,7 @@ func (m *TaskResourceUsage) Reset() { *m = TaskResourceUsage{} }
func (m *TaskResourceUsage) String() string { return proto.CompactTextString(m) } func (m *TaskResourceUsage) String() string { return proto.CompactTextString(m) }
func (*TaskResourceUsage) ProtoMessage() {} func (*TaskResourceUsage) ProtoMessage() {}
func (*TaskResourceUsage) Descriptor() ([]byte, []int) { func (*TaskResourceUsage) Descriptor() ([]byte, []int) {
return fileDescriptor_driver_b830f3fbdc9ff108, []int{26} return fileDescriptor_driver_b26cb45d2a523f58, []int{26}
} }
func (m *TaskResourceUsage) XXX_Unmarshal(b []byte) error { func (m *TaskResourceUsage) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_TaskResourceUsage.Unmarshal(m, b) return xxx_messageInfo_TaskResourceUsage.Unmarshal(m, b)
@ -1599,7 +1609,7 @@ func (m *CPUUsage) Reset() { *m = CPUUsage{} }
func (m *CPUUsage) String() string { return proto.CompactTextString(m) } func (m *CPUUsage) String() string { return proto.CompactTextString(m) }
func (*CPUUsage) ProtoMessage() {} func (*CPUUsage) ProtoMessage() {}
func (*CPUUsage) Descriptor() ([]byte, []int) { func (*CPUUsage) Descriptor() ([]byte, []int) {
return fileDescriptor_driver_b830f3fbdc9ff108, []int{27} return fileDescriptor_driver_b26cb45d2a523f58, []int{27}
} }
func (m *CPUUsage) XXX_Unmarshal(b []byte) error { func (m *CPUUsage) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_CPUUsage.Unmarshal(m, b) return xxx_messageInfo_CPUUsage.Unmarshal(m, b)
@ -1685,7 +1695,7 @@ func (m *MemoryUsage) Reset() { *m = MemoryUsage{} }
func (m *MemoryUsage) String() string { return proto.CompactTextString(m) } func (m *MemoryUsage) String() string { return proto.CompactTextString(m) }
func (*MemoryUsage) ProtoMessage() {} func (*MemoryUsage) ProtoMessage() {}
func (*MemoryUsage) Descriptor() ([]byte, []int) { func (*MemoryUsage) Descriptor() ([]byte, []int) {
return fileDescriptor_driver_b830f3fbdc9ff108, []int{28} return fileDescriptor_driver_b26cb45d2a523f58, []int{28}
} }
func (m *MemoryUsage) XXX_Unmarshal(b []byte) error { func (m *MemoryUsage) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_MemoryUsage.Unmarshal(m, b) return xxx_messageInfo_MemoryUsage.Unmarshal(m, b)
@ -1747,6 +1757,63 @@ func (m *MemoryUsage) GetMeasuredFields() []MemoryUsage_Fields {
return nil return nil
} }
type TaskEvent struct {
// TaskId is the id of the task for the event
TaskId string `protobuf:"bytes,1,opt,name=task_id,json=taskId,proto3" json:"task_id,omitempty"`
// Message is the body of the event
Message string `protobuf:"bytes,2,opt,name=message,proto3" json:"message,omitempty"`
// Annotations allows for additional key/value data to be sent along with the event
Annotations map[string]string `protobuf:"bytes,3,rep,name=annotations,proto3" json:"annotations,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
}
func (m *TaskEvent) Reset() { *m = TaskEvent{} }
func (m *TaskEvent) String() string { return proto.CompactTextString(m) }
func (*TaskEvent) ProtoMessage() {}
func (*TaskEvent) Descriptor() ([]byte, []int) {
return fileDescriptor_driver_b26cb45d2a523f58, []int{29}
}
func (m *TaskEvent) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_TaskEvent.Unmarshal(m, b)
}
func (m *TaskEvent) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
return xxx_messageInfo_TaskEvent.Marshal(b, m, deterministic)
}
func (dst *TaskEvent) XXX_Merge(src proto.Message) {
xxx_messageInfo_TaskEvent.Merge(dst, src)
}
func (m *TaskEvent) XXX_Size() int {
return xxx_messageInfo_TaskEvent.Size(m)
}
func (m *TaskEvent) XXX_DiscardUnknown() {
xxx_messageInfo_TaskEvent.DiscardUnknown(m)
}
var xxx_messageInfo_TaskEvent proto.InternalMessageInfo
func (m *TaskEvent) GetTaskId() string {
if m != nil {
return m.TaskId
}
return ""
}
func (m *TaskEvent) GetMessage() string {
if m != nil {
return m.Message
}
return ""
}
func (m *TaskEvent) GetAnnotations() map[string]string {
if m != nil {
return m.Annotations
}
return nil
}
func init() { func init() {
proto.RegisterType((*FingerprintResponse)(nil), "hashicorp.nomad.plugins.drivers.base.proto.FingerprintResponse") proto.RegisterType((*FingerprintResponse)(nil), "hashicorp.nomad.plugins.drivers.base.proto.FingerprintResponse")
proto.RegisterMapType((map[string]string)(nil), "hashicorp.nomad.plugins.drivers.base.proto.FingerprintResponse.AttributesEntry") proto.RegisterMapType((map[string]string)(nil), "hashicorp.nomad.plugins.drivers.base.proto.FingerprintResponse.AttributesEntry")
@ -1781,6 +1848,8 @@ func init() {
proto.RegisterType((*TaskResourceUsage)(nil), "hashicorp.nomad.plugins.drivers.base.proto.TaskResourceUsage") proto.RegisterType((*TaskResourceUsage)(nil), "hashicorp.nomad.plugins.drivers.base.proto.TaskResourceUsage")
proto.RegisterType((*CPUUsage)(nil), "hashicorp.nomad.plugins.drivers.base.proto.CPUUsage") proto.RegisterType((*CPUUsage)(nil), "hashicorp.nomad.plugins.drivers.base.proto.CPUUsage")
proto.RegisterType((*MemoryUsage)(nil), "hashicorp.nomad.plugins.drivers.base.proto.MemoryUsage") proto.RegisterType((*MemoryUsage)(nil), "hashicorp.nomad.plugins.drivers.base.proto.MemoryUsage")
proto.RegisterType((*TaskEvent)(nil), "hashicorp.nomad.plugins.drivers.base.proto.TaskEvent")
proto.RegisterMapType((map[string]string)(nil), "hashicorp.nomad.plugins.drivers.base.proto.TaskEvent.AnnotationsEntry")
proto.RegisterEnum("hashicorp.nomad.plugins.drivers.base.proto.TaskState", TaskState_name, TaskState_value) proto.RegisterEnum("hashicorp.nomad.plugins.drivers.base.proto.TaskState", TaskState_name, TaskState_value)
proto.RegisterEnum("hashicorp.nomad.plugins.drivers.base.proto.CPUUsage_Fields", CPUUsage_Fields_name, CPUUsage_Fields_value) proto.RegisterEnum("hashicorp.nomad.plugins.drivers.base.proto.CPUUsage_Fields", CPUUsage_Fields_name, CPUUsage_Fields_value)
proto.RegisterEnum("hashicorp.nomad.plugins.drivers.base.proto.MemoryUsage_Fields", MemoryUsage_Fields_name, MemoryUsage_Fields_value) proto.RegisterEnum("hashicorp.nomad.plugins.drivers.base.proto.MemoryUsage_Fields", MemoryUsage_Fields_name, MemoryUsage_Fields_value)
@ -1814,8 +1883,9 @@ type DriverClient interface {
// If the task does not exit on its own within the given timeout, it will be // If the task does not exit on its own within the given timeout, it will be
// forcefully killed. // forcefully killed.
StopTask(ctx context.Context, in *StopTaskRequest, opts ...grpc.CallOption) (*empty.Empty, error) StopTask(ctx context.Context, in *StopTaskRequest, opts ...grpc.CallOption) (*empty.Empty, error)
// DestroyTask removes the task from the driver's internal state. It cannot // DestroyTask removes the task from the driver's internal state and cleans
// be called on a running task. // up any additional resources created by the driver. It cannot be called
// on a running task.
DestroyTask(ctx context.Context, in *DestroyTaskRequest, opts ...grpc.CallOption) (*empty.Empty, error) DestroyTask(ctx context.Context, in *DestroyTaskRequest, opts ...grpc.CallOption) (*empty.Empty, error)
// ListTasks returns a list of summary information of all the tasks the // ListTasks returns a list of summary information of all the tasks the
// driver is tracking. // driver is tracking.
@ -1824,6 +1894,9 @@ type DriverClient interface {
InspectTask(ctx context.Context, in *InspectTaskRequest, opts ...grpc.CallOption) (*InspectTaskResponse, error) InspectTask(ctx context.Context, in *InspectTaskRequest, opts ...grpc.CallOption) (*InspectTaskResponse, error)
// TaskStats collects and returns runtime metrics for the given task // TaskStats collects and returns runtime metrics for the given task
TaskStats(ctx context.Context, in *TaskStatsRequest, opts ...grpc.CallOption) (*TaskStatsResponse, error) TaskStats(ctx context.Context, in *TaskStatsRequest, opts ...grpc.CallOption) (*TaskStatsResponse, error)
// TaskEvents starts a streaming RPC where all task events emitted by the
// driver are streamed to the caller.
TaskEvents(ctx context.Context, in *empty.Empty, opts ...grpc.CallOption) (Driver_TaskEventsClient, error)
// SignalTask sends a signal to the task // SignalTask sends a signal to the task
SignalTask(ctx context.Context, in *SignalTaskRequest, opts ...grpc.CallOption) (*empty.Empty, error) SignalTask(ctx context.Context, in *SignalTaskRequest, opts ...grpc.CallOption) (*empty.Empty, error)
// ExecTask executes a command inside the tasks execution context // ExecTask executes a command inside the tasks execution context
@ -1919,6 +1992,38 @@ func (c *driverClient) TaskStats(ctx context.Context, in *TaskStatsRequest, opts
return out, nil return out, nil
} }
func (c *driverClient) TaskEvents(ctx context.Context, in *empty.Empty, opts ...grpc.CallOption) (Driver_TaskEventsClient, error) {
stream, err := c.cc.NewStream(ctx, &_Driver_serviceDesc.Streams[0], "/hashicorp.nomad.plugins.drivers.base.proto.Driver/TaskEvents", opts...)
if err != nil {
return nil, err
}
x := &driverTaskEventsClient{stream}
if err := x.ClientStream.SendMsg(in); err != nil {
return nil, err
}
if err := x.ClientStream.CloseSend(); err != nil {
return nil, err
}
return x, nil
}
type Driver_TaskEventsClient interface {
Recv() (*TaskEvent, error)
grpc.ClientStream
}
type driverTaskEventsClient struct {
grpc.ClientStream
}
func (x *driverTaskEventsClient) Recv() (*TaskEvent, error) {
m := new(TaskEvent)
if err := x.ClientStream.RecvMsg(m); err != nil {
return nil, err
}
return m, nil
}
func (c *driverClient) SignalTask(ctx context.Context, in *SignalTaskRequest, opts ...grpc.CallOption) (*empty.Empty, error) { func (c *driverClient) SignalTask(ctx context.Context, in *SignalTaskRequest, opts ...grpc.CallOption) (*empty.Empty, error) {
out := new(empty.Empty) out := new(empty.Empty)
err := c.cc.Invoke(ctx, "/hashicorp.nomad.plugins.drivers.base.proto.Driver/SignalTask", in, out, opts...) err := c.cc.Invoke(ctx, "/hashicorp.nomad.plugins.drivers.base.proto.Driver/SignalTask", in, out, opts...)
@ -1955,8 +2060,9 @@ type DriverServer interface {
// If the task does not exit on its own within the given timeout, it will be // If the task does not exit on its own within the given timeout, it will be
// forcefully killed. // forcefully killed.
StopTask(context.Context, *StopTaskRequest) (*empty.Empty, error) StopTask(context.Context, *StopTaskRequest) (*empty.Empty, error)
// DestroyTask removes the task from the driver's internal state. It cannot // DestroyTask removes the task from the driver's internal state and cleans
// be called on a running task. // up any additional resources created by the driver. It cannot be called
// on a running task.
DestroyTask(context.Context, *DestroyTaskRequest) (*empty.Empty, error) DestroyTask(context.Context, *DestroyTaskRequest) (*empty.Empty, error)
// ListTasks returns a list of summary information of all the tasks the // ListTasks returns a list of summary information of all the tasks the
// driver is tracking. // driver is tracking.
@ -1965,6 +2071,9 @@ type DriverServer interface {
InspectTask(context.Context, *InspectTaskRequest) (*InspectTaskResponse, error) InspectTask(context.Context, *InspectTaskRequest) (*InspectTaskResponse, error)
// TaskStats collects and returns runtime metrics for the given task // TaskStats collects and returns runtime metrics for the given task
TaskStats(context.Context, *TaskStatsRequest) (*TaskStatsResponse, error) TaskStats(context.Context, *TaskStatsRequest) (*TaskStatsResponse, error)
// TaskEvents starts a streaming RPC where all task events emitted by the
// driver are streamed to the caller.
TaskEvents(*empty.Empty, Driver_TaskEventsServer) error
// SignalTask sends a signal to the task // SignalTask sends a signal to the task
SignalTask(context.Context, *SignalTaskRequest) (*empty.Empty, error) SignalTask(context.Context, *SignalTaskRequest) (*empty.Empty, error)
// ExecTask executes a command inside the tasks execution context // ExecTask executes a command inside the tasks execution context
@ -2137,6 +2246,27 @@ func _Driver_TaskStats_Handler(srv interface{}, ctx context.Context, dec func(in
return interceptor(ctx, in, info, handler) return interceptor(ctx, in, info, handler)
} }
func _Driver_TaskEvents_Handler(srv interface{}, stream grpc.ServerStream) error {
m := new(empty.Empty)
if err := stream.RecvMsg(m); err != nil {
return err
}
return srv.(DriverServer).TaskEvents(m, &driverTaskEventsServer{stream})
}
type Driver_TaskEventsServer interface {
Send(*TaskEvent) error
grpc.ServerStream
}
type driverTaskEventsServer struct {
grpc.ServerStream
}
func (x *driverTaskEventsServer) Send(m *TaskEvent) error {
return x.ServerStream.SendMsg(m)
}
func _Driver_SignalTask_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { func _Driver_SignalTask_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
in := new(SignalTaskRequest) in := new(SignalTaskRequest)
if err := dec(in); err != nil { if err := dec(in); err != nil {
@ -2222,134 +2352,148 @@ var _Driver_serviceDesc = grpc.ServiceDesc{
Handler: _Driver_ExecTask_Handler, Handler: _Driver_ExecTask_Handler,
}, },
}, },
Streams: []grpc.StreamDesc{}, Streams: []grpc.StreamDesc{
{
StreamName: "TaskEvents",
Handler: _Driver_TaskEvents_Handler,
ServerStreams: true,
},
},
Metadata: "driver.proto", Metadata: "driver.proto",
} }
func init() { proto.RegisterFile("driver.proto", fileDescriptor_driver_b830f3fbdc9ff108) } func init() { proto.RegisterFile("driver.proto", fileDescriptor_driver_b26cb45d2a523f58) }
var fileDescriptor_driver_b830f3fbdc9ff108 = []byte{ var fileDescriptor_driver_b26cb45d2a523f58 = []byte{
// 1941 bytes of a gzipped FileDescriptorProto // 2071 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xd4, 0x58, 0x4b, 0x73, 0x23, 0x49, 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xd4, 0x58, 0x4b, 0x73, 0x23, 0x49,
0xf1, 0xb7, 0x9e, 0x96, 0xb2, 0xfd, 0x68, 0xd7, 0xec, 0xec, 0xea, 0xaf, 0x89, 0x3f, 0x33, 0xdb, 0x11, 0x76, 0xeb, 0x65, 0x29, 0xdb, 0x8f, 0x76, 0xed, 0xce, 0xae, 0xd0, 0x04, 0x8c, 0xb7, 0x23,
0x11, 0x44, 0x4c, 0xcc, 0x06, 0xda, 0x58, 0x2f, 0x2c, 0x0b, 0xcc, 0x03, 0x8d, 0xad, 0x99, 0x31, 0x88, 0x70, 0xcc, 0x82, 0xcc, 0x78, 0xd9, 0x65, 0x81, 0x79, 0xac, 0xc6, 0xd6, 0xcc, 0x18, 0x5b,
0xb6, 0x6c, 0x6f, 0xb5, 0x1c, 0xbb, 0x4b, 0x04, 0x34, 0xe5, 0xee, 0x1a, 0xa9, 0xd7, 0xea, 0xc7, 0xb6, 0xb7, 0x5a, 0x8e, 0xdd, 0x25, 0x02, 0x9a, 0x76, 0x77, 0x8d, 0xd4, 0x6b, 0xf5, 0x63, 0xba,
0x74, 0x55, 0x1b, 0xeb, 0x40, 0x04, 0x07, 0x22, 0x88, 0xe0, 0x40, 0xf0, 0x41, 0x38, 0x70, 0xe5, 0xaa, 0x8d, 0x75, 0x20, 0x82, 0x03, 0x11, 0x1b, 0xc1, 0x81, 0xe0, 0x87, 0x70, 0xe0, 0xca, 0x81,
0x0e, 0x37, 0x3e, 0x02, 0xdc, 0xf8, 0x1e, 0x10, 0xf5, 0x68, 0xa9, 0x2d, 0xcd, 0x43, 0x2d, 0xef, 0x1b, 0x47, 0xfe, 0x02, 0x37, 0x0e, 0xfc, 0x0b, 0x88, 0x7a, 0xb4, 0xd4, 0x96, 0xc6, 0x33, 0x6e,
0x85, 0x93, 0xba, 0x32, 0xb3, 0xb2, 0xb2, 0xf2, 0x97, 0x99, 0x95, 0x4a, 0xd8, 0xf0, 0x12, 0xff, 0x79, 0x2f, 0x9c, 0xba, 0x2b, 0x33, 0xeb, 0xab, 0xac, 0xcc, 0xac, 0xac, 0xac, 0x84, 0x15, 0x2f,
0x92, 0x26, 0x9d, 0x38, 0x89, 0x78, 0x84, 0x1e, 0x8c, 0x08, 0x1b, 0xf9, 0x6e, 0x94, 0xc4, 0x9d, 0xf1, 0x2f, 0x48, 0xd2, 0x8e, 0x93, 0x88, 0x45, 0xe8, 0xfe, 0xd0, 0xa1, 0x43, 0xdf, 0x8d, 0x92,
0x30, 0x0a, 0x88, 0xd7, 0x89, 0xc7, 0xe9, 0xd0, 0x0f, 0x59, 0x47, 0x49, 0xb1, 0xce, 0x39, 0x61, 0xb8, 0x1d, 0x46, 0x81, 0xe3, 0xb5, 0xe3, 0x51, 0x3a, 0xf0, 0x43, 0xda, 0x96, 0x52, 0xb4, 0x7d,
0x54, 0xc9, 0xb6, 0xef, 0x0c, 0xa3, 0x68, 0x38, 0xa6, 0x1f, 0xcb, 0xd5, 0x79, 0xfa, 0xf2, 0x63, 0xe6, 0x50, 0x22, 0x65, 0x5b, 0x77, 0x07, 0x51, 0x34, 0x18, 0x91, 0x6d, 0x31, 0x3a, 0x4b, 0x5f,
0x1a, 0xc4, 0x7c, 0xa2, 0x99, 0xdf, 0x99, 0x67, 0x7a, 0x69, 0x42, 0xb8, 0x1f, 0x85, 0x9a, 0x7f, 0x6e, 0x93, 0x20, 0x66, 0x63, 0xc5, 0xfc, 0xde, 0x2c, 0xd3, 0x4b, 0x13, 0x87, 0xf9, 0x51, 0xa8,
0x77, 0x9e, 0xcf, 0xfd, 0x80, 0x32, 0x4e, 0x82, 0x58, 0x09, 0x58, 0x7f, 0x2f, 0xc3, 0xad, 0x67, 0xf8, 0xf7, 0x66, 0xf9, 0xcc, 0x0f, 0x08, 0x65, 0x4e, 0x10, 0x2b, 0x81, 0xcf, 0x06, 0x3e, 0x1b,
0x7e, 0x38, 0xa4, 0x49, 0x9c, 0xf8, 0x21, 0xc7, 0x94, 0xc5, 0x51, 0xc8, 0x28, 0x3a, 0x87, 0x0d, 0xa6, 0x67, 0x6d, 0x37, 0x0a, 0xb6, 0x27, 0x4a, 0x6d, 0x0b, 0xa5, 0xb6, 0x95, 0x52, 0xdb, 0x74,
0x97, 0xc4, 0xe4, 0xdc, 0x1f, 0xfb, 0xdc, 0xa7, 0xac, 0x55, 0xba, 0x57, 0xba, 0x6f, 0xec, 0x3e, 0xe8, 0x24, 0xc4, 0xdb, 0x1e, 0xba, 0x23, 0x1a, 0x13, 0x97, 0x7f, 0x6d, 0xfe, 0x23, 0x11, 0xcc,
0xee, 0x2c, 0x6f, 0x78, 0x67, 0x5f, 0x92, 0xf6, 0x72, 0x5a, 0xf0, 0x35, 0x9d, 0x28, 0x02, 0x20, 0x6f, 0xca, 0xf0, 0xce, 0x33, 0x3f, 0x1c, 0x90, 0x24, 0x4e, 0xfc, 0x90, 0x61, 0x42, 0xe3, 0x28,
0x9c, 0x27, 0xfe, 0x79, 0xca, 0x29, 0x6b, 0x95, 0xef, 0x55, 0xee, 0x1b, 0xbb, 0x27, 0x45, 0x4e, 0xa4, 0x04, 0x7d, 0x06, 0x15, 0x2e, 0xd5, 0xd4, 0x36, 0xb5, 0x2d, 0x7d, 0xe7, 0x07, 0xed, 0xeb,
0x78, 0x8d, 0xe1, 0x9d, 0xee, 0x54, 0x63, 0x2f, 0xe4, 0xc9, 0x04, 0xe7, 0x8e, 0x40, 0x6d, 0x68, 0xb6, 0x2c, 0xd1, 0xdb, 0x0a, 0xbd, 0x6d, 0xc5, 0xc4, 0xc5, 0x62, 0x26, 0x3a, 0x83, 0x15, 0xd7,
0x78, 0x94, 0x53, 0x97, 0x53, 0xaf, 0x55, 0xb9, 0x57, 0xba, 0xdf, 0xc0, 0xd3, 0x75, 0xfb, 0x11, 0x89, 0x9d, 0x33, 0x7f, 0xe4, 0x33, 0x9f, 0xd0, 0x66, 0x49, 0x20, 0x3d, 0x6e, 0xdf, 0xdc, 0x78,
0x6c, 0xcf, 0x6d, 0x45, 0x26, 0x54, 0x2e, 0xe8, 0x44, 0x5e, 0xbd, 0x89, 0xc5, 0x27, 0x7a, 0x0f, 0xed, 0x3d, 0x41, 0xda, 0xcd, 0xa1, 0xe0, 0x2b, 0x98, 0x28, 0x02, 0x70, 0x18, 0x4b, 0xfc, 0xb3,
0x6a, 0x97, 0x64, 0x9c, 0xd2, 0x56, 0x59, 0xd2, 0xd4, 0xe2, 0xc7, 0xe5, 0xcf, 0x4b, 0xd6, 0x6f, 0x94, 0x11, 0xda, 0x2c, 0x6f, 0x96, 0xb7, 0xf4, 0x9d, 0xe3, 0x22, 0x2b, 0xbc, 0x66, 0xeb, 0xed,
0x00, 0x61, 0xea, 0x46, 0x97, 0x34, 0x19, 0x10, 0x76, 0x81, 0xe9, 0xab, 0x94, 0x32, 0x8e, 0x3e, 0xce, 0x04, 0xb1, 0x1b, 0xb2, 0x64, 0x8c, 0x73, 0x4b, 0xa0, 0x16, 0xd4, 0x3d, 0xc2, 0x88, 0xcb,
0x80, 0x75, 0x4e, 0xd8, 0x85, 0xe3, 0x7b, 0x5a, 0x4b, 0x5d, 0x2c, 0x0f, 0x3c, 0x74, 0x0c, 0xf5, 0x88, 0xd7, 0xac, 0x6c, 0x6a, 0x5b, 0x75, 0x3c, 0x19, 0xb7, 0x1e, 0xc1, 0xfa, 0xcc, 0x54, 0x64,
0x11, 0x09, 0xbd, 0xb1, 0xd2, 0x64, 0xec, 0x7e, 0x56, 0xe4, 0xda, 0xe2, 0x84, 0x17, 0x72, 0x37, 0x40, 0xf9, 0x9c, 0x8c, 0x85, 0x11, 0x1b, 0x98, 0xff, 0xa2, 0x77, 0xa1, 0x7a, 0xe1, 0x8c, 0x52,
0xd6, 0x5a, 0xac, 0x5f, 0x82, 0x69, 0x73, 0x92, 0xf0, 0xfc, 0xe1, 0x3f, 0x83, 0xaa, 0x38, 0x4d, 0x22, 0xcc, 0xd1, 0xc0, 0x72, 0xf0, 0xb3, 0xd2, 0xa7, 0x9a, 0xf9, 0x3b, 0x40, 0x98, 0xb8, 0xd1,
0x43, 0x57, 0xf8, 0x84, 0xbd, 0x28, 0x7c, 0xe9, 0x0f, 0xb1, 0xd4, 0x61, 0xb9, 0xb0, 0x93, 0xd3, 0x05, 0x49, 0xfa, 0x0e, 0x3d, 0xc7, 0xe4, 0x55, 0x4a, 0x28, 0x43, 0xef, 0xc3, 0x32, 0x73, 0xe8,
0xaf, 0x63, 0x64, 0x76, 0x89, 0xd2, 0xb7, 0x72, 0x89, 0x07, 0xb0, 0xfd, 0x25, 0xf1, 0xf9, 0x32, 0xb9, 0xed, 0x7b, 0x0a, 0xa5, 0xc6, 0x87, 0xfb, 0x1e, 0x3a, 0x82, 0xda, 0xd0, 0x09, 0xbd, 0x11,
0x0e, 0xb4, 0xbe, 0x06, 0x73, 0x26, 0xab, 0xed, 0xb9, 0x03, 0x4d, 0x7a, 0xe5, 0x73, 0xc7, 0x8d, 0x51, 0x86, 0xfd, 0xa4, 0xc8, 0xb6, 0xf9, 0x0a, 0x2f, 0xc4, 0x6c, 0xac, 0x50, 0xcc, 0x5f, 0x83,
0x3c, 0x65, 0x52, 0x0d, 0x37, 0x04, 0x61, 0x2f, 0xf2, 0x28, 0x7a, 0x1f, 0xea, 0xcc, 0x1f, 0x86, 0x61, 0x31, 0x27, 0x61, 0xf9, 0xc5, 0x7f, 0x01, 0x15, 0xbe, 0x9a, 0x0a, 0x82, 0xc2, 0x2b, 0xec,
0x64, 0x2c, 0x3d, 0x5e, 0xc3, 0x7a, 0x25, 0x40, 0xa6, 0x49, 0x22, 0xc3, 0xa1, 0x89, 0xc5, 0xa7, 0x46, 0xe1, 0x4b, 0x7f, 0x80, 0x05, 0x86, 0xe9, 0xc2, 0x46, 0x0e, 0x5f, 0x45, 0xd9, 0x74, 0x13,
0xf5, 0x6b, 0xd8, 0xb6, 0x79, 0x14, 0x2f, 0x85, 0xe3, 0xa7, 0xb0, 0x2e, 0x32, 0x2a, 0x4a, 0xb9, 0xda, 0xb7, 0xb2, 0x89, 0xfb, 0xb0, 0xfe, 0x85, 0xe3, 0xb3, 0x9b, 0x18, 0xd0, 0xfc, 0x0a, 0x8c,
0x06, 0xf2, 0xff, 0x3a, 0x2a, 0xe3, 0x3a, 0x59, 0xc6, 0x75, 0xf6, 0x75, 0x46, 0xe2, 0x4c, 0x32, 0xa9, 0xac, 0xd2, 0xe7, 0x2e, 0x34, 0xc8, 0xa5, 0xcf, 0x6c, 0x37, 0xf2, 0xa4, 0x4a, 0x55, 0x5c,
0x67, 0x8a, 0x3a, 0x55, 0xaf, 0xac, 0xef, 0x01, 0xda, 0xa7, 0x8c, 0x27, 0xd1, 0x64, 0x29, 0x17, 0xe7, 0x84, 0xdd, 0xc8, 0x23, 0xe8, 0x3d, 0xa8, 0x51, 0x7f, 0x10, 0x3a, 0x23, 0x61, 0xf1, 0x2a,
0x20, 0x30, 0x8f, 0x7c, 0x26, 0x5d, 0xc0, 0xb4, 0xb0, 0x75, 0x0e, 0x3b, 0x39, 0x9a, 0xf6, 0x4b, 0x56, 0x23, 0xee, 0x64, 0x92, 0x24, 0xcd, 0xb2, 0x74, 0x32, 0x49, 0x12, 0xf3, 0xb7, 0xb0, 0x6e,
0x1f, 0x6a, 0x62, 0x8b, 0x48, 0x62, 0x91, 0x62, 0x3f, 0x2c, 0x0a, 0x93, 0x9d, 0x06, 0x01, 0x49, 0xb1, 0x28, 0xbe, 0x91, 0x1f, 0x3f, 0x82, 0x65, 0x7e, 0xaa, 0xa3, 0x94, 0x29, 0x47, 0x7e, 0xa7,
0x26, 0x58, 0x69, 0x11, 0x66, 0x1e, 0x84, 0x2c, 0xa6, 0xee, 0x72, 0x48, 0x11, 0xb8, 0x75, 0x4d, 0x2d, 0x4f, 0x7d, 0x3b, 0x3b, 0xf5, 0xed, 0x3d, 0x95, 0x15, 0x70, 0x26, 0x99, 0x53, 0x45, 0xae,
0x5c, 0x1b, 0x75, 0xc3, 0xe8, 0xb4, 0x39, 0xe1, 0x29, 0xd3, 0xd1, 0xf9, 0x11, 0x98, 0x19, 0x8d, 0xaa, 0x46, 0xe6, 0x0f, 0x01, 0xed, 0x11, 0xca, 0x92, 0x68, 0x7c, 0x23, 0x13, 0x20, 0x30, 0x0e,
0xbd, 0xd3, 0x9e, 0x5f, 0xc1, 0x4e, 0x4e, 0x58, 0x5b, 0x73, 0x08, 0x35, 0x26, 0x08, 0xda, 0x9c, 0x7d, 0x2a, 0x4c, 0x40, 0x95, 0xb0, 0x79, 0x06, 0x1b, 0x39, 0x9a, 0xb2, 0x4b, 0x0f, 0xaa, 0x7c,
0x1f, 0xac, 0x62, 0x0e, 0xc3, 0x4a, 0x87, 0xb5, 0x0f, 0x3b, 0xb6, 0x44, 0x74, 0xa9, 0x10, 0xba, 0x0a, 0x6d, 0x6a, 0xe2, 0x88, 0xfd, 0xa4, 0xa8, 0x9b, 0xac, 0x34, 0x08, 0x9c, 0x64, 0x8c, 0x25,
0x1e, 0x98, 0xb3, 0x68, 0x98, 0xc0, 0x76, 0xef, 0x8a, 0xba, 0x4b, 0xe9, 0x68, 0xc1, 0xba, 0x1b, 0x0a, 0x57, 0x73, 0x3f, 0xe4, 0x49, 0xe2, 0x66, 0x9e, 0x72, 0xe0, 0x9d, 0x2b, 0xe2, 0x4a, 0xa9,
0x05, 0x01, 0x09, 0x3d, 0x59, 0x46, 0x9b, 0x38, 0x5b, 0xe6, 0x03, 0xb4, 0xb2, 0x6c, 0x80, 0x8a, 0x5b, 0x46, 0xa7, 0xc5, 0x1c, 0x96, 0x52, 0x15, 0x9d, 0x1f, 0x82, 0x91, 0xd1, 0xe8, 0x5b, 0xf5,
0xc8, 0x9a, 0x1d, 0xad, 0x3c, 0x64, 0x1d, 0x02, 0x5a, 0x2c, 0xe8, 0xe8, 0x43, 0xd8, 0x60, 0x34, 0xf9, 0x0d, 0x6c, 0xe4, 0x84, 0x95, 0x36, 0x07, 0x50, 0xa5, 0x9c, 0xa0, 0xd4, 0xf9, 0x78, 0x11,
0xf4, 0x1c, 0x65, 0xb3, 0x72, 0x5f, 0x03, 0x1b, 0x82, 0xa6, 0x5c, 0xc0, 0x10, 0x82, 0x2a, 0xbd, 0x75, 0x28, 0x96, 0x18, 0xe6, 0x1e, 0x6c, 0x58, 0xc2, 0xa3, 0x37, 0x0a, 0xa1, 0xab, 0x81, 0x39,
0xa2, 0xae, 0xbc, 0x5d, 0x03, 0xcb, 0x6f, 0xeb, 0x8f, 0x55, 0x80, 0x59, 0x8d, 0x41, 0x5b, 0x50, 0x8d, 0x86, 0x31, 0xac, 0x77, 0x2f, 0x89, 0x7b, 0x23, 0x8c, 0x26, 0x2c, 0xbb, 0x51, 0x10, 0x38,
0x9e, 0x5e, 0xa9, 0xec, 0x7b, 0x62, 0x4b, 0x48, 0x82, 0xac, 0xca, 0xca, 0x6f, 0xb4, 0x0b, 0xb7, 0xa1, 0xd7, 0x2c, 0x6d, 0x96, 0xb7, 0x1a, 0x38, 0x1b, 0xe6, 0x03, 0xb4, 0x7c, 0xd3, 0x00, 0xe5,
0x03, 0x36, 0x8c, 0x89, 0x7b, 0xe1, 0x28, 0x0c, 0x1c, 0x57, 0x6e, 0x96, 0xd7, 0xda, 0xc0, 0xb7, 0x91, 0x35, 0x5d, 0x5a, 0x5a, 0xc8, 0x3c, 0x00, 0x34, 0x9f, 0xd0, 0xd1, 0x07, 0xb0, 0x42, 0x49,
0x34, 0x53, 0xdb, 0xa8, 0xf4, 0x7e, 0x01, 0x15, 0x1a, 0x5e, 0xb6, 0xaa, 0x32, 0xec, 0x9f, 0xac, 0xe8, 0xd9, 0x52, 0x67, 0x69, 0xbe, 0x3a, 0xd6, 0x39, 0x4d, 0x9a, 0x80, 0x22, 0x04, 0x15, 0x72,
0x56, 0x00, 0x3b, 0xbd, 0xf0, 0x52, 0xbd, 0x24, 0x42, 0x17, 0xb2, 0xa1, 0x99, 0x50, 0x16, 0xa5, 0x49, 0x5c, 0xb1, 0xbb, 0x3a, 0x16, 0xff, 0xe6, 0x9f, 0x2a, 0x00, 0xd3, 0x1c, 0x83, 0xd6, 0xa0,
0x89, 0x4b, 0x59, 0xab, 0x56, 0x3c, 0x58, 0x70, 0xb6, 0x19, 0xcf, 0xf4, 0xa0, 0x03, 0xa8, 0x07, 0x34, 0xd9, 0x52, 0xc9, 0xf7, 0xf8, 0x94, 0xd0, 0x09, 0xb2, 0x2c, 0x2b, 0xfe, 0xd1, 0x0e, 0xdc,
0x51, 0x1a, 0x72, 0xd6, 0xaa, 0x4b, 0x53, 0x3f, 0x29, 0xa2, 0xb1, 0x2f, 0x76, 0x62, 0xad, 0x00, 0x09, 0xe8, 0x20, 0x76, 0xdc, 0x73, 0x5b, 0xfa, 0xc0, 0x76, 0xc5, 0x64, 0xb1, 0xad, 0x15, 0xfc,
0x1d, 0xc1, 0xba, 0x47, 0x2f, 0x7d, 0x61, 0xdd, 0xba, 0xd4, 0xb5, 0x5b, 0xe8, 0xc9, 0x96, 0x5b, 0x8e, 0x62, 0x2a, 0x1d, 0x25, 0xee, 0xe7, 0x50, 0x26, 0xe1, 0x45, 0xb3, 0x22, 0xc2, 0xfe, 0xc9,
0x71, 0xa6, 0x42, 0x00, 0x91, 0x32, 0x9a, 0xb4, 0x1a, 0x0a, 0x08, 0xf1, 0x2d, 0xaa, 0x2c, 0x19, 0x62, 0x09, 0xb0, 0xdd, 0x0d, 0x2f, 0xe4, 0x4d, 0xc2, 0xb1, 0x90, 0x05, 0x8d, 0x84, 0xd0, 0x28,
0x8f, 0x23, 0xd7, 0xf1, 0xfc, 0xa4, 0xd5, 0x94, 0x8c, 0x86, 0x24, 0xec, 0xfb, 0x49, 0xfb, 0x33, 0x4d, 0x5c, 0x42, 0x9b, 0xd5, 0xe2, 0xc1, 0x82, 0xb3, 0xc9, 0x78, 0x8a, 0x83, 0xf6, 0xa1, 0x16,
0x68, 0x64, 0xfe, 0x2a, 0xf4, 0x7c, 0xfe, 0xa7, 0x04, 0xcd, 0xa9, 0x6b, 0xd0, 0xff, 0x03, 0xb8, 0x44, 0x69, 0xc8, 0x68, 0xb3, 0x26, 0x54, 0x7d, 0x50, 0x04, 0xb1, 0xc7, 0x67, 0x62, 0x05, 0x80,
0x71, 0xea, 0xc4, 0x34, 0xf1, 0x23, 0x15, 0x17, 0x15, 0xdc, 0x74, 0xe3, 0xf4, 0x54, 0x12, 0x84, 0x0e, 0x61, 0xd9, 0x23, 0x17, 0x3e, 0xd7, 0x6e, 0x59, 0x60, 0xed, 0x14, 0xba, 0xb2, 0xc5, 0x54,
0x05, 0x82, 0xfd, 0x2a, 0x8d, 0x38, 0x91, 0xaa, 0x2a, 0xb8, 0xe1, 0xc6, 0xe9, 0x17, 0x62, 0x9d, 0x9c, 0x41, 0x70, 0x47, 0xa4, 0x94, 0x24, 0xcd, 0xba, 0x74, 0x04, 0xff, 0xe7, 0x59, 0xd6, 0x19,
0xed, 0x65, 0x23, 0x92, 0x50, 0x26, 0x83, 0x43, 0xed, 0xb5, 0x25, 0x01, 0x7d, 0x02, 0xb7, 0x03, 0x8d, 0x22, 0xd7, 0xf6, 0xfc, 0xa4, 0xd9, 0x10, 0x8c, 0xba, 0x20, 0xec, 0xf9, 0x49, 0xeb, 0x13,
0x1a, 0x44, 0xc9, 0xc4, 0x19, 0xfb, 0x81, 0xcf, 0x1d, 0x3f, 0x74, 0xce, 0x27, 0xa2, 0xfd, 0xa8, 0xa8, 0x67, 0xf6, 0x2a, 0x74, 0x7d, 0xfe, 0x57, 0x83, 0xc6, 0xc4, 0x34, 0xe8, 0xbb, 0x00, 0x6e,
0x4a, 0x49, 0xa4, 0x98, 0x47, 0x82, 0x77, 0x10, 0x3e, 0x15, 0x1c, 0x64, 0xc1, 0x66, 0x14, 0x05, 0x9c, 0xda, 0x31, 0x49, 0xfc, 0x48, 0xc6, 0x45, 0x19, 0x37, 0xdc, 0x38, 0x3d, 0x11, 0x04, 0xae,
0x0e, 0x73, 0xa3, 0x84, 0x3a, 0xc4, 0xfb, 0x46, 0xc2, 0x5e, 0xc1, 0x46, 0x14, 0x05, 0xb6, 0xa0, 0x01, 0x67, 0xbf, 0x4a, 0x23, 0xe6, 0x08, 0xa8, 0x32, 0xae, 0xbb, 0x71, 0xfa, 0x39, 0x1f, 0x67,
0x75, 0xbd, 0x6f, 0xd0, 0x5d, 0x30, 0xdc, 0x38, 0x65, 0x94, 0x3b, 0xe2, 0xa7, 0x55, 0x97, 0xf7, 0x73, 0x45, 0x65, 0x43, 0x45, 0x70, 0xc8, 0xb9, 0x96, 0x20, 0xa0, 0x07, 0x70, 0x27, 0x20, 0x41,
0x03, 0x45, 0xda, 0x8b, 0x53, 0x96, 0x13, 0x08, 0x68, 0x20, 0xb0, 0xc9, 0x09, 0xf4, 0x69, 0xc0, 0x94, 0x8c, 0xed, 0x91, 0x1f, 0xf8, 0xcc, 0xf6, 0x43, 0xfb, 0x6c, 0xcc, 0xcb, 0x8f, 0x8a, 0x90,
0xac, 0x5f, 0x40, 0x4d, 0x22, 0x29, 0x6e, 0x27, 0x93, 0x3c, 0x26, 0x7c, 0xa4, 0x9d, 0xd7, 0x10, 0x44, 0x92, 0x79, 0xc8, 0x79, 0xfb, 0xe1, 0x53, 0xce, 0x41, 0x26, 0xac, 0x46, 0x51, 0x60, 0x53,
0x84, 0x53, 0xc2, 0x47, 0x82, 0x39, 0x8a, 0x18, 0x57, 0x4c, 0xe5, 0xc5, 0x86, 0x20, 0x48, 0x66, 0x37, 0x4a, 0x88, 0xed, 0x78, 0x5f, 0x0b, 0xb7, 0x97, 0xb1, 0x1e, 0x45, 0x81, 0xc5, 0x69, 0x1d,
0x1b, 0x1a, 0x09, 0x25, 0x5e, 0x14, 0x8e, 0x27, 0x59, 0x7b, 0x93, 0xad, 0x2d, 0x0f, 0xea, 0x0a, 0xef, 0x6b, 0x74, 0x0f, 0x74, 0x37, 0x4e, 0x29, 0x61, 0x36, 0xff, 0x34, 0x6b, 0x62, 0x7f, 0x20,
0xdc, 0x1b, 0xe8, 0xbf, 0x07, 0x46, 0x4c, 0x93, 0xc0, 0x67, 0xcc, 0x8f, 0x42, 0xa6, 0x1f, 0xaf, 0x49, 0xbb, 0x71, 0x4a, 0x73, 0x02, 0x01, 0x09, 0xb8, 0x6f, 0x72, 0x02, 0x3d, 0x12, 0x50, 0xf3,
0x3c, 0xc9, 0xfa, 0x77, 0x49, 0xe5, 0xb5, 0x7a, 0xd8, 0x45, 0x69, 0x53, 0x41, 0x96, 0x95, 0x2b, 0x57, 0x50, 0x15, 0x9e, 0xe4, 0xbb, 0x13, 0x87, 0x3c, 0x76, 0xd8, 0x50, 0x19, 0xaf, 0xce, 0x09,
0xb5, 0x12, 0x8d, 0x83, 0x4e, 0xde, 0xf2, 0x8d, 0x7a, 0x13, 0xad, 0x25, 0xab, 0xde, 0x54, 0x9a, 0x27, 0x0e, 0x1b, 0x72, 0xe6, 0x30, 0xa2, 0x4c, 0x32, 0xa5, 0x15, 0xeb, 0x9c, 0x20, 0x98, 0x2d,
0xb4, 0xb5, 0x5a, 0xf5, 0xa6, 0xaa, 0x7a, 0x53, 0x51, 0xd2, 0x74, 0x81, 0x51, 0x3a, 0xab, 0xb2, 0xa8, 0x27, 0xc4, 0xf1, 0xa2, 0x70, 0x34, 0x16, 0x1b, 0xaf, 0xe3, 0xc9, 0xd8, 0xf4, 0xa0, 0x26,
0xbe, 0x18, 0x8a, 0x26, 0x25, 0xad, 0xbf, 0x96, 0xc0, 0xc8, 0x3d, 0x8c, 0x4b, 0xd5, 0xaf, 0x6f, 0x9d, 0x7b, 0x0b, 0xfc, 0x4d, 0xd0, 0x63, 0x92, 0x04, 0x3e, 0xa5, 0x7e, 0x14, 0x52, 0x75, 0x79,
0xd5, 0xc6, 0x1f, 0x01, 0x30, 0xd1, 0x8e, 0x51, 0xcf, 0x21, 0x5c, 0x5a, 0x68, 0xec, 0xb6, 0x17, 0xe5, 0x49, 0xe6, 0xbf, 0x35, 0x79, 0xae, 0xe5, 0xc5, 0xce, 0x53, 0x9b, 0x0c, 0xb2, 0x2c, 0x5d,
0x0a, 0xfb, 0x20, 0xeb, 0xf5, 0x71, 0x53, 0x4b, 0x77, 0xb9, 0xf5, 0xb7, 0x8a, 0x82, 0x48, 0x3d, 0xc9, 0x11, 0x2f, 0x1c, 0xd4, 0xe1, 0x2d, 0xdd, 0xaa, 0x36, 0x51, 0x28, 0x59, 0xf6, 0x26, 0x42,
0xa0, 0xff, 0x4b, 0xa6, 0xa3, 0x47, 0xb0, 0xe1, 0x46, 0x41, 0x3c, 0xa6, 0x7a, 0x73, 0xed, 0x9d, 0xa5, 0xb5, 0xc5, 0xb2, 0x37, 0x91, 0xd9, 0x9b, 0xf0, 0x94, 0xa6, 0x12, 0x8c, 0xc4, 0xac, 0x88,
0x9b, 0x8d, 0xa9, 0x7c, 0x97, 0x5f, 0x6f, 0x0f, 0xeb, 0x73, 0xed, 0x61, 0x00, 0x9b, 0x39, 0xd4, 0xfc, 0xa2, 0x4b, 0x9a, 0x90, 0x34, 0xff, 0xa6, 0x81, 0x9e, 0xbb, 0x18, 0x6f, 0x94, 0xbf, 0xbe,
0xd3, 0xac, 0x7a, 0xbe, 0x58, 0xad, 0x2f, 0xd1, 0xff, 0x7d, 0xd4, 0x42, 0xbd, 0x1e, 0x1b, 0x5e, 0x55, 0x1d, 0x7f, 0x0a, 0x40, 0x79, 0x39, 0x46, 0x3c, 0xdb, 0x61, 0x42, 0x43, 0x7d, 0xa7, 0x35,
0x8e, 0xd4, 0x7e, 0x02, 0x3b, 0x0b, 0x22, 0x85, 0x0a, 0xe6, 0x3f, 0x2a, 0xd0, 0x9c, 0x36, 0x1e, 0x97, 0xd8, 0xfb, 0xd9, 0x7b, 0x03, 0x37, 0x94, 0x74, 0x87, 0x99, 0xff, 0x28, 0x4b, 0x17, 0xc9,
0x0b, 0x28, 0x7e, 0x0e, 0xcd, 0xe9, 0x1f, 0x3d, 0x9d, 0x63, 0x6f, 0xf5, 0xf1, 0x54, 0x18, 0x5d, 0x0b, 0xf4, 0xff, 0x49, 0x75, 0xf4, 0x08, 0x56, 0xdc, 0x28, 0x88, 0x47, 0x44, 0x4d, 0xae, 0xbe,
0x00, 0x22, 0xc3, 0xa1, 0x93, 0xbd, 0x4d, 0x4e, 0xca, 0xc8, 0x90, 0xea, 0xd6, 0xe1, 0x51, 0x51, 0x75, 0xb2, 0x3e, 0x91, 0xef, 0xb0, 0xab, 0xe5, 0x61, 0x6d, 0xa6, 0x3c, 0x0c, 0x60, 0x35, 0xe7,
0x67, 0x64, 0x15, 0xfd, 0x4c, 0x28, 0xc1, 0x26, 0x19, 0x0e, 0xaf, 0x51, 0xd0, 0x6f, 0x4b, 0x70, 0xf5, 0x34, 0xcb, 0x9e, 0x2f, 0x16, 0xab, 0x4b, 0xd4, 0xdb, 0x47, 0x0e, 0xe4, 0xed, 0xb1, 0xe2,
0xfb, 0xfa, 0x49, 0xce, 0xf9, 0xc4, 0x89, 0x7d, 0x4f, 0x3f, 0xd9, 0xfd, 0x95, 0xda, 0xb0, 0xce, 0xe5, 0x48, 0xad, 0x27, 0xb0, 0x31, 0x27, 0x52, 0x28, 0x61, 0xfe, 0xb3, 0x0c, 0x8d, 0x49, 0xe1,
0xb5, 0x43, 0x9e, 0x4e, 0x4e, 0x7d, 0x4f, 0x41, 0x80, 0x92, 0x05, 0x46, 0xfb, 0x77, 0x25, 0xf8, 0x31, 0xe7, 0xc5, 0x4f, 0xa1, 0x31, 0x79, 0x6c, 0xaa, 0x33, 0xf6, 0x46, 0x1b, 0x4f, 0x84, 0xd1,
0xe0, 0x0d, 0xf2, 0xaf, 0xc1, 0xc3, 0xce, 0xe3, 0x71, 0x63, 0x87, 0xe4, 0xe0, 0xfc, 0x73, 0x49, 0x39, 0x20, 0x67, 0x30, 0xb0, 0xb3, 0xbb, 0xc9, 0x4e, 0xa9, 0x33, 0x20, 0xaa, 0x74, 0x78, 0x54,
0x75, 0xa5, 0xd7, 0xfd, 0xf3, 0x0c, 0x2a, 0x6e, 0x9c, 0xea, 0x9e, 0xf4, 0xfb, 0x45, 0x0e, 0xdb, 0xd4, 0x18, 0x59, 0x46, 0x3f, 0xe5, 0x20, 0xd8, 0x70, 0x06, 0x83, 0x2b, 0x14, 0xf4, 0x7b, 0x0d,
0x3b, 0x3d, 0x53, 0x67, 0x08, 0x05, 0xe8, 0x04, 0xea, 0xea, 0x5d, 0xd3, 0x76, 0x17, 0xfa, 0x07, 0xee, 0x5c, 0x5d, 0xc9, 0x3e, 0x1b, 0xdb, 0xb1, 0xef, 0xa9, 0x2b, 0xbb, 0xb7, 0x50, 0x19, 0xd6,
0xd0, 0x97, 0x3b, 0x95, 0x36, 0xad, 0xc6, 0xfa, 0x4b, 0x05, 0x1a, 0xd9, 0x11, 0xe2, 0x69, 0x63, 0xbe, 0xb2, 0xc8, 0xd3, 0xf1, 0x89, 0xef, 0x49, 0x17, 0xa0, 0x64, 0x8e, 0xd1, 0xfa, 0x83, 0x06,
0x13, 0xc6, 0x69, 0xe0, 0x04, 0xd9, 0x1f, 0xaf, 0x12, 0x06, 0x45, 0xea, 0x8b, 0xdc, 0xba, 0x03, 0xef, 0x5f, 0x23, 0xff, 0x1a, 0x7f, 0x58, 0x79, 0x7f, 0xdc, 0xda, 0x20, 0x39, 0x77, 0xfe, 0x45,
0x4d, 0xd1, 0x39, 0x28, 0x76, 0x59, 0xb2, 0x1b, 0x82, 0x20, 0x99, 0x77, 0xc1, 0xe0, 0x11, 0x27, 0x93, 0x55, 0xe9, 0x55, 0xfb, 0x3c, 0x83, 0xb2, 0x1b, 0xa7, 0xaa, 0x26, 0xfd, 0x71, 0x91, 0xc5,
0x63, 0x87, 0xfb, 0xee, 0x85, 0x7a, 0x54, 0x4a, 0x18, 0x24, 0x69, 0x20, 0x28, 0xe8, 0x23, 0xd8, 0x76, 0x4f, 0x4e, 0xe5, 0x1a, 0x1c, 0x00, 0x1d, 0x43, 0x4d, 0xde, 0x6b, 0x4a, 0xef, 0x42, 0x2f,
0xe1, 0xa3, 0x24, 0xe2, 0x7c, 0x4c, 0x3d, 0xdd, 0x12, 0xa8, 0xd7, 0xba, 0x8a, 0xcd, 0x29, 0x43, 0x80, 0x9e, 0x98, 0x29, 0xd1, 0x14, 0x8c, 0xf9, 0xd7, 0x32, 0xd4, 0xb3, 0x25, 0xf8, 0xd5, 0x46,
0x75, 0x06, 0x0c, 0x7d, 0x17, 0xb6, 0x66, 0xc2, 0x22, 0xaa, 0x65, 0x91, 0xa8, 0xe2, 0xcd, 0x29, 0xc7, 0x94, 0x91, 0xc0, 0x0e, 0xb2, 0x87, 0x97, 0x86, 0x41, 0x92, 0x7a, 0xfc, 0x6c, 0xdd, 0x85,
0x55, 0x44, 0xbd, 0xe8, 0x97, 0x63, 0x9a, 0xb8, 0x34, 0xe4, 0xb2, 0x10, 0x94, 0x70, 0xb6, 0x44, 0x06, 0xaf, 0x1c, 0x24, 0xbb, 0x24, 0xd8, 0x75, 0x4e, 0x10, 0xcc, 0x7b, 0xa0, 0xb3, 0x88, 0x39,
0x1e, 0x6c, 0x07, 0x94, 0xb0, 0x34, 0xa1, 0x9e, 0xf3, 0xd2, 0xa7, 0x63, 0x4f, 0x55, 0x82, 0xad, 0x23, 0x9b, 0xf9, 0xee, 0xb9, 0xbc, 0x54, 0x34, 0x0c, 0x82, 0xd4, 0xe7, 0x14, 0xf4, 0x21, 0x6c,
0xdd, 0x9f, 0xac, 0xe2, 0xfe, 0xce, 0x33, 0xa9, 0x02, 0x6f, 0x65, 0x3a, 0xd5, 0xda, 0x7a, 0x05, 0xb0, 0x61, 0x12, 0x31, 0x36, 0x22, 0x9e, 0x2a, 0x09, 0xe4, 0x6d, 0x5d, 0xc1, 0xc6, 0x84, 0x21,
0x75, 0xf5, 0x85, 0xb6, 0xc1, 0xb0, 0xbf, 0xb6, 0x07, 0xbd, 0xbe, 0xd3, 0x3f, 0xd9, 0xef, 0x99, 0x2b, 0x03, 0x8a, 0xbe, 0x0f, 0x6b, 0x53, 0x61, 0x1e, 0xd5, 0x22, 0x49, 0x54, 0xf0, 0xea, 0x84,
0x6b, 0x68, 0x13, 0x9a, 0x67, 0x76, 0x0f, 0xab, 0x65, 0x49, 0xf0, 0x07, 0x27, 0x83, 0xee, 0x91, 0xca, 0xa3, 0x9e, 0xd7, 0xcb, 0x31, 0x49, 0x5c, 0x12, 0x32, 0x91, 0x08, 0x34, 0x9c, 0x0d, 0x91,
0x33, 0x38, 0xd8, 0x3b, 0xb4, 0xcd, 0x32, 0xba, 0x0d, 0x3b, 0x83, 0x17, 0xf8, 0x64, 0x30, 0x38, 0x07, 0xeb, 0x01, 0x71, 0x68, 0x9a, 0x10, 0xcf, 0x7e, 0xe9, 0x93, 0x91, 0x27, 0x33, 0xc1, 0xda,
0xea, 0xed, 0x3b, 0xa7, 0x3d, 0x7c, 0x70, 0xb2, 0x6f, 0x9b, 0x15, 0x84, 0x60, 0x6b, 0x46, 0x1e, 0xce, 0xcf, 0x17, 0x31, 0x7f, 0xfb, 0x99, 0x80, 0xc0, 0x6b, 0x19, 0xa6, 0x1c, 0x9b, 0xaf, 0xa0,
0x1c, 0xf4, 0x7b, 0x66, 0x15, 0x19, 0xb0, 0x7e, 0xda, 0xc3, 0x7b, 0xbd, 0xe3, 0x81, 0x59, 0xb3, 0x26, 0xff, 0xd0, 0x3a, 0xe8, 0xd6, 0x57, 0x56, 0xbf, 0xdb, 0xb3, 0x7b, 0xc7, 0x7b, 0x5d, 0x63,
0xfe, 0x55, 0x06, 0x23, 0x07, 0xa5, 0x08, 0xee, 0x84, 0xa9, 0x86, 0xbd, 0x8a, 0xc5, 0xa7, 0x28, 0x09, 0xad, 0x42, 0xe3, 0xd4, 0xea, 0x62, 0x39, 0xd4, 0x38, 0xbf, 0x7f, 0xdc, 0xef, 0x1c, 0xda,
0x36, 0x2e, 0x71, 0x47, 0x0a, 0xa2, 0x2a, 0x56, 0x0b, 0x01, 0x5e, 0x40, 0xae, 0x72, 0x75, 0xa0, 0xfd, 0xfd, 0xdd, 0x03, 0xcb, 0x28, 0xa1, 0x3b, 0xb0, 0xd1, 0x7f, 0x81, 0x8f, 0xfb, 0xfd, 0xc3,
0x8a, 0x1b, 0x01, 0xb9, 0x52, 0x4a, 0x3e, 0x84, 0x8d, 0x0b, 0x9a, 0x84, 0x74, 0xac, 0xf9, 0x0a, 0xee, 0x9e, 0x7d, 0xd2, 0xc5, 0xfb, 0xc7, 0x7b, 0x96, 0x51, 0x46, 0x08, 0xd6, 0xa6, 0xe4, 0xfe,
0x16, 0x43, 0xd1, 0x94, 0xc8, 0x7d, 0x30, 0xb5, 0xc8, 0x4c, 0x8d, 0xc2, 0x64, 0x4b, 0xd1, 0xfb, 0x7e, 0xaf, 0x6b, 0x54, 0x90, 0x0e, 0xcb, 0x27, 0x5d, 0xbc, 0xdb, 0x3d, 0xea, 0x1b, 0x55, 0xf3,
0x99, 0xb2, 0xe1, 0xa2, 0xeb, 0xeb, 0xd2, 0xf5, 0x8f, 0x57, 0x0c, 0xd7, 0x37, 0x79, 0xdf, 0x9e, 0x5f, 0x25, 0xd0, 0x73, 0xae, 0xe4, 0xc1, 0x9d, 0x50, 0x59, 0xb0, 0x57, 0x30, 0xff, 0xe5, 0xc9,
0x7a, 0x7f, 0x1d, 0x2a, 0xd8, 0xb6, 0xcd, 0x35, 0xd4, 0x84, 0xda, 0x5e, 0x77, 0xef, 0x85, 0xf0, 0xc6, 0x75, 0xdc, 0xa1, 0x74, 0x51, 0x05, 0xcb, 0x01, 0x77, 0x5e, 0xe0, 0x5c, 0xe6, 0xf2, 0x40,
0xf8, 0x26, 0x34, 0xfb, 0xdd, 0xaf, 0x9c, 0xb3, 0xae, 0xfd, 0xbc, 0x67, 0x96, 0x91, 0x09, 0x1b, 0x05, 0xd7, 0x03, 0xe7, 0x52, 0x82, 0x7c, 0x00, 0x2b, 0xe7, 0x24, 0x09, 0xc9, 0x48, 0xf1, 0xa5,
0x87, 0x3d, 0x7c, 0xdc, 0x3b, 0x72, 0xce, 0xec, 0xee, 0xf3, 0x9e, 0x59, 0x41, 0xef, 0x81, 0xa9, 0x5b, 0x74, 0x49, 0x93, 0x22, 0x5b, 0x60, 0x28, 0x91, 0x29, 0x8c, 0xf4, 0xc9, 0x9a, 0xa4, 0xf7,
0x29, 0x52, 0x4e, 0x52, 0xab, 0x0f, 0x7e, 0x3a, 0xab, 0xc7, 0xc2, 0xb9, 0x1b, 0x83, 0xae, 0x7d, 0x32, 0xb0, 0xc1, 0xbc, 0xe9, 0x6b, 0xc2, 0xf4, 0x8f, 0x17, 0x0c, 0xd7, 0xeb, 0xac, 0x6f, 0x4d,
0xe8, 0x9c, 0x1d, 0x1f, 0x1e, 0x9f, 0x7c, 0x79, 0x6c, 0xae, 0x4d, 0x29, 0xf8, 0xec, 0xf8, 0xf8, 0xac, 0xbf, 0x0c, 0x65, 0x6c, 0x59, 0xc6, 0x12, 0x6a, 0x40, 0x75, 0xb7, 0xb3, 0xfb, 0x82, 0x5b,
0xe0, 0xf8, 0xb9, 0x46, 0x56, 0x50, 0x7a, 0x5f, 0x1d, 0x0c, 0x7a, 0xfb, 0x66, 0x79, 0xf7, 0x9f, 0x7c, 0x15, 0x1a, 0xbd, 0xce, 0x97, 0xf6, 0x69, 0xc7, 0x7a, 0xde, 0x35, 0x4a, 0xc8, 0x80, 0x95,
0x00, 0x75, 0xf5, 0x28, 0xa0, 0x11, 0x18, 0xb9, 0xd9, 0x16, 0x7a, 0x7f, 0xa1, 0x76, 0xf7, 0x82, 0x83, 0x2e, 0x3e, 0xea, 0x1e, 0xda, 0xa7, 0x56, 0xe7, 0x79, 0xd7, 0x28, 0xa3, 0x77, 0xc1, 0x50,
0x98, 0x4f, 0xda, 0x4f, 0x6e, 0x38, 0x2c, 0xb3, 0xd6, 0xd0, 0x10, 0x8c, 0xdc, 0xdc, 0x0a, 0x3d, 0x14, 0x21, 0x27, 0xa8, 0x15, 0xf3, 0x3f, 0x9a, 0x4c, 0xc8, 0xdd, 0x0b, 0x1e, 0x46, 0x6f, 0x7a,
0x2e, 0xf6, 0x5f, 0x66, 0x7e, 0xe0, 0xd5, 0x7e, 0x83, 0xa5, 0xd6, 0x1a, 0xfa, 0x43, 0x09, 0x9a, 0xa9, 0x05, 0x84, 0x0a, 0x2b, 0xc8, 0x9c, 0x9e, 0x0d, 0xd1, 0x10, 0x74, 0x27, 0x0c, 0x23, 0x26,
0xd3, 0x11, 0x12, 0x7a, 0x58, 0xe4, 0x9c, 0xf9, 0xc9, 0x56, 0xfb, 0xd1, 0x8a, 0xbb, 0xa7, 0xb7, 0xde, 0x62, 0x59, 0x3b, 0xec, 0x59, 0xd1, 0x0c, 0x23, 0x96, 0x6f, 0x77, 0xa6, 0x40, 0x32, 0xf5,
0xfe, 0x7d, 0x09, 0x1a, 0xd9, 0xf8, 0x08, 0x15, 0xca, 0xec, 0xb9, 0x01, 0x55, 0xfb, 0xe1, 0x6a, 0xe5, 0xa1, 0x5b, 0x8f, 0xc1, 0x98, 0x15, 0x28, 0x72, 0xf7, 0xdc, 0x7f, 0x30, 0xbd, 0x7a, 0x08,
0x9b, 0xa7, 0x96, 0x10, 0x68, 0x64, 0xc3, 0xa6, 0x62, 0x86, 0xcc, 0x8d, 0xa8, 0xde, 0xe2, 0xf9, 0x0f, 0xb2, 0xd3, 0xa3, 0x83, 0xa3, 0xe3, 0x2f, 0x8e, 0x8c, 0x25, 0x3e, 0xc0, 0xa7, 0x47, 0x47,
0x21, 0x18, 0xb9, 0xb1, 0x52, 0x31, 0x88, 0x17, 0xe7, 0x51, 0xef, 0x80, 0x78, 0x3a, 0x7d, 0x2a, 0xfb, 0x47, 0xcf, 0x0d, 0x0d, 0x01, 0xd4, 0xba, 0x5f, 0xee, 0xf7, 0xbb, 0x7b, 0x46, 0x69, 0xe7,
0x06, 0xf1, 0xfc, 0x20, 0xab, 0x18, 0xc4, 0x0b, 0x23, 0x2f, 0x6b, 0x0d, 0xfd, 0xa9, 0x04, 0x46, 0xef, 0x3a, 0xd4, 0xe4, 0x85, 0xc7, 0xf7, 0x99, 0xeb, 0xdb, 0xa1, 0xf7, 0xe6, 0xee, 0xa5, 0x6e,
0x6e, 0xee, 0x54, 0xec, 0xda, 0x8b, 0xf3, 0xad, 0x62, 0xb9, 0xf6, 0x9a, 0x81, 0x97, 0xf6, 0xcf, 0x10, 0xb3, 0x71, 0xeb, 0xc9, 0x2d, 0x1b, 0x81, 0xe6, 0x12, 0x1a, 0x80, 0x9e, 0xeb, 0xc9, 0xa1,
0xac, 0x67, 0x7b, 0xb8, 0xda, 0x8c, 0x69, 0x15, 0xff, 0x2c, 0xcc, 0xbb, 0xac, 0x35, 0x44, 0x01, 0xc7, 0xc5, 0xde, 0x69, 0xb3, 0xcd, 0xbc, 0xd6, 0x35, 0x9a, 0x9a, 0x4b, 0xe8, 0x8f, 0x1a, 0x34,
0x66, 0x43, 0x2a, 0x54, 0x2c, 0xa3, 0xe6, 0x87, 0x5b, 0x6f, 0x89, 0x09, 0x91, 0x69, 0xd9, 0x2c, 0x26, 0xed, 0x31, 0xf4, 0xb0, 0xc8, 0x3a, 0xb3, 0x5d, 0xbb, 0xd6, 0xa3, 0x05, 0x67, 0x4f, 0x76,
0xa9, 0x58, 0x80, 0xcf, 0x0d, 0xbf, 0x8a, 0x65, 0xda, 0xc2, 0xf8, 0x6a, 0xed, 0xe9, 0xfa, 0xcf, 0xfd, 0x8d, 0x06, 0xf5, 0xac, 0x35, 0x86, 0x0a, 0x65, 0xad, 0x99, 0xe6, 0x5b, 0xeb, 0xe1, 0x62,
0x6b, 0xca, 0xba, 0xba, 0xfc, 0xf9, 0xf4, 0xbf, 0x01, 0x00, 0x00, 0xff, 0xff, 0x1a, 0xa5, 0xc9, 0x93, 0x27, 0x9a, 0x38, 0x50, 0xcf, 0x1a, 0x69, 0xc5, 0x14, 0x99, 0x69, 0xbf, 0xbd, 0xc1, 0xf2,
0x69, 0x93, 0x19, 0x00, 0x00, 0x03, 0xd0, 0x73, 0x2d, 0xb3, 0x62, 0x2e, 0x9e, 0xef, 0xb5, 0xbd, 0xc5, 0xc5, 0x93, 0xce, 0x5a,
0x31, 0x17, 0xcf, 0x36, 0xe9, 0x8a, 0xb9, 0x78, 0xae, 0x9d, 0x67, 0x2e, 0xa1, 0x3f, 0x6b, 0xa0,
0xe7, 0x7a, 0x6a, 0xc5, 0xb6, 0x3d, 0xdf, 0xbb, 0x2b, 0x76, 0xd6, 0x5e, 0xd3, 0xcc, 0x53, 0xf6,
0x99, 0xd6, 0xa3, 0x0f, 0x17, 0xeb, 0x9f, 0x2d, 0x62, 0x9f, 0xb9, 0x5e, 0x9e, 0xb9, 0x84, 0x6c,
0xf9, 0xc4, 0x11, 0xb9, 0x90, 0x5e, 0x9b, 0x61, 0x3e, 0x5e, 0x28, 0xb7, 0x9a, 0x4b, 0x3f, 0xd2,
0x10, 0x01, 0x98, 0x76, 0xf8, 0x50, 0xb1, 0x23, 0x3b, 0xdb, 0x19, 0x7c, 0x43, 0xd0, 0xf1, 0xa3,
0x9c, 0x35, 0xe2, 0x8a, 0x9d, 0xa0, 0x99, 0xce, 0x61, 0xb1, 0xa3, 0x3c, 0xd7, 0xfb, 0x5b, 0x7a,
0xba, 0xfc, 0xcb, 0xaa, 0xd4, 0xae, 0x26, 0x3e, 0x1f, 0xfd, 0x2f, 0x00, 0x00, 0xff, 0xff, 0x09,
0xb8, 0x19, 0x07, 0x54, 0x1b, 0x00, 0x00,
} }

View file

@ -6,6 +6,8 @@ import "google/protobuf/empty.proto";
import "google/protobuf/duration.proto"; import "google/protobuf/duration.proto";
import "google/protobuf/timestamp.proto"; import "google/protobuf/timestamp.proto";
import "github.com/hashicorp/nomad/plugins/shared/hclspec/hcl_spec.proto";
// Driver service defines RPCs used to communicate with a nomad runtime driver. // Driver service defines RPCs used to communicate with a nomad runtime driver.
// Some rpcs may not be implemented by the driver based on it's capabilities. // Some rpcs may not be implemented by the driver based on it's capabilities.
service Driver { service Driver {
@ -31,8 +33,9 @@ service Driver {
// forcefully killed. // forcefully killed.
rpc StopTask(StopTaskRequest) returns (google.protobuf.Empty) {} rpc StopTask(StopTaskRequest) returns (google.protobuf.Empty) {}
// DestroyTask removes the task from the driver's internal state. It cannot // DestroyTask removes the task from the driver's internal state and cleans
// be called on a running task. // up any additional resources created by the driver. It cannot be called
// on a running task.
rpc DestroyTask(DestroyTaskRequest) returns (google.protobuf.Empty) {} rpc DestroyTask(DestroyTaskRequest) returns (google.protobuf.Empty) {}
// ListTasks returns a list of summary information of all the tasks the // ListTasks returns a list of summary information of all the tasks the
@ -45,6 +48,10 @@ service Driver {
// TaskStats collects and returns runtime metrics for the given task // TaskStats collects and returns runtime metrics for the given task
rpc TaskStats(TaskStatsRequest) returns (TaskStatsResponse) {} rpc TaskStats(TaskStatsRequest) returns (TaskStatsResponse) {}
// TaskEvents starts a streaming RPC where all task events emitted by the
// driver are streamed to the caller.
rpc TaskEvents(google.protobuf.Empty) returns (stream TaskEvent) {}
// The following RPCs are only implemented if the driver sets the // The following RPCs are only implemented if the driver sets the
// corresponding capability. // corresponding capability.
@ -58,19 +65,22 @@ service Driver {
message FingerprintResponse { message FingerprintResponse {
// Spec is the configuration schema for the job driver config stanza
hashicorp.nomad.plugins.shared.hclspec.Spec spec = 1;
// Capabilities provides a way for the driver to denote if it implements // Capabilities provides a way for the driver to denote if it implements
// non-core RPCs. Some Driver service RPCs expose additional information // non-core RPCs. Some Driver service RPCs expose additional information
// or functionality outside of the core task management functions. These // or functionality outside of the core task management functions. These
// RPCs are only implemented if the driver sets the corresponding capability. // RPCs are only implemented if the driver sets the corresponding capability.
DriverCapabilities capabilities = 1; DriverCapabilities capabilities = 2;
// Attributes are key/value pairs that annotate the nomad client and can be // Attributes are key/value pairs that annotate the nomad client and can be
// used in scheduling contraints and affinities. // used in scheduling contraints and affinities.
map<string, string> attributes = 2; map<string, string> attributes = 3;
// Detected signifies if the necessary dependancies of the drive are met for // Detected signifies if the necessary dependancies of the drive are met for
// nominal operation. // nominal operation.
bool detected = 3; bool detected = 4;
} }
message RecoverTaskRequest { message RecoverTaskRequest {
@ -281,9 +291,9 @@ message Device {
} }
enum TaskState { enum TaskState {
TASK_UNKNOWN = 0; UNKNOWN = 0;
TASK_RUNNING = 1; RUNNING = 1;
TASK_EXITED = 2; EXITED = 2;
} }
// TaskHandle is created when starting a task and is used to recover task // TaskHandle is created when starting a task and is used to recover task
@ -401,3 +411,15 @@ message MemoryUsage {
// MeasuredFields indicates which fields were actually sampled // MeasuredFields indicates which fields were actually sampled
repeated Fields measured_fields = 6; repeated Fields measured_fields = 6;
} }
message TaskEvent {
// TaskId is the id of the task for the event
string task_id = 1;
// Message is the body of the event
string message = 2;
// Annotations allows for additional key/value data to be sent along with the event
map<string,string> annotations = 3;
}