Merge pull request #5032 from hashicorp/f-driver-env

Store device envs separately and pass to drivers
This commit is contained in:
Alex Dadgar 2018-12-20 13:38:27 -08:00 committed by GitHub
commit d7d32c2f61
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
9 changed files with 427 additions and 266 deletions

View File

@ -11,6 +11,11 @@ import (
"github.com/hashicorp/nomad/plugins/drivers"
)
const (
// HookNameDevices is the name of the devices hook
HookNameDevices = "devices"
)
// deviceHook is used to retrieve device mounting information.
type deviceHook struct {
logger log.Logger
@ -26,7 +31,7 @@ func newDeviceHook(dm devicemanager.Manager, logger log.Logger) *deviceHook {
}
func (*deviceHook) Name() string {
return "devices"
return HookNameDevices
}
func (h *deviceHook) Prestart(ctx context.Context, req *interfaces.TaskPrestartRequest, resp *interfaces.TaskPrestartResponse) error {

View File

@ -676,6 +676,7 @@ func (tr *TaskRunner) buildTaskConfig() *drivers.TaskConfig {
alloc := tr.Alloc()
invocationid := uuid.Generate()[:8]
taskResources := tr.taskResources
env := tr.envBuilder.Build()
return &drivers.TaskConfig{
ID: fmt.Sprintf("%s/%s/%s", alloc.ID, task.Name, invocationid),
@ -691,7 +692,8 @@ func (tr *TaskRunner) buildTaskConfig() *drivers.TaskConfig {
},
Devices: tr.hookResources.getDevices(),
Mounts: tr.hookResources.getMounts(),
Env: tr.envBuilder.Build().Map(),
Env: env.Map(),
DeviceEnv: env.DeviceEnv(),
User: task.User,
AllocDir: tr.taskDir.AllocDir,
StdoutPath: tr.logmonHookConfig.stdoutFifo,

View File

@ -165,8 +165,14 @@ func (tr *TaskRunner) prestart() error {
if origHookState != nil {
if origHookState.PrestartDone {
tr.logger.Trace("skipping done prestart hook", "name", pre.Name())
// Always set env vars from hooks
tr.envBuilder.SetHookEnv(name, origHookState.Env)
if name == HookNameDevices {
tr.envBuilder.SetDeviceHookEnv(name, origHookState.Env)
} else {
tr.envBuilder.SetHookEnv(name, origHookState.Env)
}
continue
}
@ -211,7 +217,11 @@ func (tr *TaskRunner) prestart() error {
}
// Store the environment variables returned by the hook
tr.envBuilder.SetHookEnv(name, resp.Env)
if name == HookNameDevices {
tr.envBuilder.SetDeviceHookEnv(name, origHookState.Env)
} else {
tr.envBuilder.SetHookEnv(name, origHookState.Env)
}
// Store the resources
if len(resp.Devices) != 0 {

View File

@ -109,15 +109,19 @@ type TaskEnv struct {
// EnvMap is the map of environment variables
EnvMap map[string]string
// deviceEnv is the environment variables populated from the device hooks.
deviceEnv map[string]string
// envList is a memoized list created by List()
envList []string
}
// NewTaskEnv creates a new task environment with the given environment and
// node attribute maps.
func NewTaskEnv(env, node map[string]string) *TaskEnv {
// NewTaskEnv creates a new task environment with the given environment, device
// environment and node attribute maps.
func NewTaskEnv(env, deviceEnv, node map[string]string) *TaskEnv {
return &TaskEnv{
NodeAttrs: node,
deviceEnv: deviceEnv,
EnvMap: env,
}
}
@ -136,6 +140,16 @@ func (t *TaskEnv) List() []string {
return env
}
// DeviceEnv returns the task's environment variables set by device hooks.
func (t *TaskEnv) DeviceEnv() map[string]string {
m := make(map[string]string, len(t.deviceEnv))
for k, v := range t.deviceEnv {
m[k] = v
}
return m
}
// Map of the task's environment variables.
func (t *TaskEnv) Map() map[string]string {
m := make(map[string]string, len(t.EnvMap))
@ -306,6 +320,11 @@ type Builder struct {
// order the hooks are run.
hookNames []string
// deviceHookName is the device hook name. It is set only if device hooks
// are set. While a bit round about, this enables us to return device hook
// environment variables without having to hardcode the name of the hook.
deviceHookName string
mu *sync.RWMutex
}
@ -329,6 +348,7 @@ func NewEmptyBuilder() *Builder {
func (b *Builder) Build() *TaskEnv {
nodeAttrs := make(map[string]string)
envMap := make(map[string]string)
var deviceEnvs map[string]string
b.mu.RLock()
defer b.mu.RUnlock()
@ -417,7 +437,16 @@ func (b *Builder) Build() *TaskEnv {
// Copy hook env vars in the order the hooks were run
for _, h := range b.hookNames {
for k, v := range b.hookEnvs[h] {
envMap[k] = hargs.ReplaceEnv(v, nodeAttrs, envMap)
e := hargs.ReplaceEnv(v, nodeAttrs, envMap)
envMap[k] = e
if h == b.deviceHookName {
if deviceEnvs == nil {
deviceEnvs = make(map[string]string, len(b.hookEnvs[h]))
}
deviceEnvs[k] = e
}
}
}
@ -433,7 +462,16 @@ func (b *Builder) Build() *TaskEnv {
cleanedEnv[cleanedK] = v
}
return NewTaskEnv(cleanedEnv, nodeAttrs)
var cleanedDeviceEnvs map[string]string
if deviceEnvs != nil {
cleanedDeviceEnvs = make(map[string]string, len(deviceEnvs))
for k, v := range deviceEnvs {
cleanedK := helper.CleanEnvVar(k, '_')
cleanedDeviceEnvs[cleanedK] = v
}
}
return NewTaskEnv(cleanedEnv, cleanedDeviceEnvs, nodeAttrs)
}
// Update task updates the environment based on a new alloc and task.
@ -449,7 +487,12 @@ func (b *Builder) UpdateTask(alloc *structs.Allocation, task *structs.Task) *Bui
func (b *Builder) SetHookEnv(hook string, envs map[string]string) *Builder {
b.mu.Lock()
defer b.mu.Unlock()
return b.setHookEnvLocked(hook, envs)
}
// setHookEnvLocked is the implementation of setting hook environemnt variables
// and should be called with the lock held
func (b *Builder) setHookEnvLocked(hook string, envs map[string]string) *Builder {
if _, exists := b.hookEnvs[hook]; !exists {
b.hookNames = append(b.hookNames, hook)
}
@ -458,6 +501,18 @@ func (b *Builder) SetHookEnv(hook string, envs map[string]string) *Builder {
return b
}
// SetDeviceHookEnv sets environment variables from a device hook. Variables are
// Last-Write-Wins, so if a hook writes a variable that's also written by a
// later hook, the later hooks value always gets used.
func (b *Builder) SetDeviceHookEnv(hookName string, envs map[string]string) *Builder {
b.mu.Lock()
defer b.mu.Unlock()
// Store the device hook name
b.deviceHookName = hookName
return b.setHookEnvLocked(hookName, envs)
}
// setTask is called from NewBuilder to populate task related environment
// variables.
func (b *Builder) setTask(task *structs.Task) *Builder {

View File

@ -548,6 +548,33 @@ func TestEnvironment_HookVars(t *testing.T) {
}
}
// TestEnvironment_DeviceHookVars asserts device hook env vars are accessible
// separately.
func TestEnvironment_DeviceHookVars(t *testing.T) {
require := require.New(t)
n := mock.Node()
a := mock.Alloc()
builder := NewBuilder(n, a, a.Job.TaskGroups[0].Tasks[0], "global")
// Add vars from two hooks and assert the second one wins on
// conflicting keys.
builder.SetHookEnv("hookA", map[string]string{
"foo": "bar",
"baz": "quux",
})
builder.SetDeviceHookEnv("devices", map[string]string{
"hook": "wins",
})
b := builder.Build()
deviceEnv := b.DeviceEnv()
require.Len(deviceEnv, 1)
require.Contains(deviceEnv, "hook")
all := b.Map()
require.Contains(all, "foo")
}
func TestEnvironment_Interpolate(t *testing.T) {
n := mock.Node()
n.Attributes["arch"] = "x86"

View File

@ -103,6 +103,7 @@ type TaskConfig struct {
TaskGroupName string
Name string
Env map[string]string
DeviceEnv map[string]string
Resources *Resources
Devices []*DeviceConfig
Mounts []*MountConfig
@ -121,7 +122,25 @@ func (tc *TaskConfig) Copy() *TaskConfig {
c := new(TaskConfig)
*c = *tc
c.Env = helper.CopyMapStringString(c.Env)
c.DeviceEnv = helper.CopyMapStringString(c.DeviceEnv)
c.Resources = tc.Resources.Copy()
if c.Devices != nil {
dc := make([]*DeviceConfig, len(c.Devices))
for i, c := range c.Devices {
dc[i] = c.Copy()
}
c.Devices = dc
}
if c.Mounts != nil {
mc := make([]*MountConfig, len(c.Mounts))
for i, m := range c.Mounts {
mc[i] = m.Copy()
}
c.Mounts = mc
}
return c
}
@ -221,12 +240,32 @@ type DeviceConfig struct {
Permissions string
}
func (d *DeviceConfig) Copy() *DeviceConfig {
if d == nil {
return nil
}
dc := new(DeviceConfig)
*dc = *d
return dc
}
type MountConfig struct {
TaskPath string
HostPath string
Readonly bool
}
func (m *MountConfig) Copy() *MountConfig {
if m == nil {
return nil
}
mc := new(MountConfig)
*mc = *m
return mc
}
const (
TaskStateUnknown TaskState = "unknown"
TaskStateRunning TaskState = "running"

View File

@ -50,7 +50,7 @@ func (x TaskState) String() string {
return proto.EnumName(TaskState_name, int32(x))
}
func (TaskState) EnumDescriptor() ([]byte, []int) {
return fileDescriptor_driver_f8179d6379690e6b, []int{0}
return fileDescriptor_driver_de29bfae7a3376ed, []int{0}
}
type FingerprintResponse_HealthState int32
@ -76,7 +76,7 @@ func (x FingerprintResponse_HealthState) String() string {
return proto.EnumName(FingerprintResponse_HealthState_name, int32(x))
}
func (FingerprintResponse_HealthState) EnumDescriptor() ([]byte, []int) {
return fileDescriptor_driver_f8179d6379690e6b, []int{5, 0}
return fileDescriptor_driver_de29bfae7a3376ed, []int{5, 0}
}
type StartTaskResponse_Result int32
@ -102,7 +102,7 @@ func (x StartTaskResponse_Result) String() string {
return proto.EnumName(StartTaskResponse_Result_name, int32(x))
}
func (StartTaskResponse_Result) EnumDescriptor() ([]byte, []int) {
return fileDescriptor_driver_f8179d6379690e6b, []int{9, 0}
return fileDescriptor_driver_de29bfae7a3376ed, []int{9, 0}
}
type DriverCapabilities_FSIsolation int32
@ -128,7 +128,7 @@ func (x DriverCapabilities_FSIsolation) String() string {
return proto.EnumName(DriverCapabilities_FSIsolation_name, int32(x))
}
func (DriverCapabilities_FSIsolation) EnumDescriptor() ([]byte, []int) {
return fileDescriptor_driver_f8179d6379690e6b, []int{25, 0}
return fileDescriptor_driver_de29bfae7a3376ed, []int{25, 0}
}
type CPUUsage_Fields int32
@ -163,7 +163,7 @@ func (x CPUUsage_Fields) String() string {
return proto.EnumName(CPUUsage_Fields_name, int32(x))
}
func (CPUUsage_Fields) EnumDescriptor() ([]byte, []int) {
return fileDescriptor_driver_f8179d6379690e6b, []int{43, 0}
return fileDescriptor_driver_de29bfae7a3376ed, []int{43, 0}
}
type MemoryUsage_Fields int32
@ -195,7 +195,7 @@ func (x MemoryUsage_Fields) String() string {
return proto.EnumName(MemoryUsage_Fields_name, int32(x))
}
func (MemoryUsage_Fields) EnumDescriptor() ([]byte, []int) {
return fileDescriptor_driver_f8179d6379690e6b, []int{44, 0}
return fileDescriptor_driver_de29bfae7a3376ed, []int{44, 0}
}
type TaskConfigSchemaRequest struct {
@ -208,7 +208,7 @@ func (m *TaskConfigSchemaRequest) Reset() { *m = TaskConfigSchemaRequest
func (m *TaskConfigSchemaRequest) String() string { return proto.CompactTextString(m) }
func (*TaskConfigSchemaRequest) ProtoMessage() {}
func (*TaskConfigSchemaRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_driver_f8179d6379690e6b, []int{0}
return fileDescriptor_driver_de29bfae7a3376ed, []int{0}
}
func (m *TaskConfigSchemaRequest) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_TaskConfigSchemaRequest.Unmarshal(m, b)
@ -240,7 +240,7 @@ func (m *TaskConfigSchemaResponse) Reset() { *m = TaskConfigSchemaRespon
func (m *TaskConfigSchemaResponse) String() string { return proto.CompactTextString(m) }
func (*TaskConfigSchemaResponse) ProtoMessage() {}
func (*TaskConfigSchemaResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_driver_f8179d6379690e6b, []int{1}
return fileDescriptor_driver_de29bfae7a3376ed, []int{1}
}
func (m *TaskConfigSchemaResponse) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_TaskConfigSchemaResponse.Unmarshal(m, b)
@ -277,7 +277,7 @@ func (m *CapabilitiesRequest) Reset() { *m = CapabilitiesRequest{} }
func (m *CapabilitiesRequest) String() string { return proto.CompactTextString(m) }
func (*CapabilitiesRequest) ProtoMessage() {}
func (*CapabilitiesRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_driver_f8179d6379690e6b, []int{2}
return fileDescriptor_driver_de29bfae7a3376ed, []int{2}
}
func (m *CapabilitiesRequest) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_CapabilitiesRequest.Unmarshal(m, b)
@ -312,7 +312,7 @@ func (m *CapabilitiesResponse) Reset() { *m = CapabilitiesResponse{} }
func (m *CapabilitiesResponse) String() string { return proto.CompactTextString(m) }
func (*CapabilitiesResponse) ProtoMessage() {}
func (*CapabilitiesResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_driver_f8179d6379690e6b, []int{3}
return fileDescriptor_driver_de29bfae7a3376ed, []int{3}
}
func (m *CapabilitiesResponse) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_CapabilitiesResponse.Unmarshal(m, b)
@ -349,7 +349,7 @@ func (m *FingerprintRequest) Reset() { *m = FingerprintRequest{} }
func (m *FingerprintRequest) String() string { return proto.CompactTextString(m) }
func (*FingerprintRequest) ProtoMessage() {}
func (*FingerprintRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_driver_f8179d6379690e6b, []int{4}
return fileDescriptor_driver_de29bfae7a3376ed, []int{4}
}
func (m *FingerprintRequest) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_FingerprintRequest.Unmarshal(m, b)
@ -392,7 +392,7 @@ func (m *FingerprintResponse) Reset() { *m = FingerprintResponse{} }
func (m *FingerprintResponse) String() string { return proto.CompactTextString(m) }
func (*FingerprintResponse) ProtoMessage() {}
func (*FingerprintResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_driver_f8179d6379690e6b, []int{5}
return fileDescriptor_driver_de29bfae7a3376ed, []int{5}
}
func (m *FingerprintResponse) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_FingerprintResponse.Unmarshal(m, b)
@ -447,7 +447,7 @@ func (m *RecoverTaskRequest) Reset() { *m = RecoverTaskRequest{} }
func (m *RecoverTaskRequest) String() string { return proto.CompactTextString(m) }
func (*RecoverTaskRequest) ProtoMessage() {}
func (*RecoverTaskRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_driver_f8179d6379690e6b, []int{6}
return fileDescriptor_driver_de29bfae7a3376ed, []int{6}
}
func (m *RecoverTaskRequest) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_RecoverTaskRequest.Unmarshal(m, b)
@ -491,7 +491,7 @@ func (m *RecoverTaskResponse) Reset() { *m = RecoverTaskResponse{} }
func (m *RecoverTaskResponse) String() string { return proto.CompactTextString(m) }
func (*RecoverTaskResponse) ProtoMessage() {}
func (*RecoverTaskResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_driver_f8179d6379690e6b, []int{7}
return fileDescriptor_driver_de29bfae7a3376ed, []int{7}
}
func (m *RecoverTaskResponse) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_RecoverTaskResponse.Unmarshal(m, b)
@ -523,7 +523,7 @@ func (m *StartTaskRequest) Reset() { *m = StartTaskRequest{} }
func (m *StartTaskRequest) String() string { return proto.CompactTextString(m) }
func (*StartTaskRequest) ProtoMessage() {}
func (*StartTaskRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_driver_f8179d6379690e6b, []int{8}
return fileDescriptor_driver_de29bfae7a3376ed, []int{8}
}
func (m *StartTaskRequest) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_StartTaskRequest.Unmarshal(m, b)
@ -577,7 +577,7 @@ func (m *StartTaskResponse) Reset() { *m = StartTaskResponse{} }
func (m *StartTaskResponse) String() string { return proto.CompactTextString(m) }
func (*StartTaskResponse) ProtoMessage() {}
func (*StartTaskResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_driver_f8179d6379690e6b, []int{9}
return fileDescriptor_driver_de29bfae7a3376ed, []int{9}
}
func (m *StartTaskResponse) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_StartTaskResponse.Unmarshal(m, b)
@ -637,7 +637,7 @@ func (m *WaitTaskRequest) Reset() { *m = WaitTaskRequest{} }
func (m *WaitTaskRequest) String() string { return proto.CompactTextString(m) }
func (*WaitTaskRequest) ProtoMessage() {}
func (*WaitTaskRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_driver_f8179d6379690e6b, []int{10}
return fileDescriptor_driver_de29bfae7a3376ed, []int{10}
}
func (m *WaitTaskRequest) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_WaitTaskRequest.Unmarshal(m, b)
@ -678,7 +678,7 @@ func (m *WaitTaskResponse) Reset() { *m = WaitTaskResponse{} }
func (m *WaitTaskResponse) String() string { return proto.CompactTextString(m) }
func (*WaitTaskResponse) ProtoMessage() {}
func (*WaitTaskResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_driver_f8179d6379690e6b, []int{11}
return fileDescriptor_driver_de29bfae7a3376ed, []int{11}
}
func (m *WaitTaskResponse) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_WaitTaskResponse.Unmarshal(m, b)
@ -730,7 +730,7 @@ func (m *StopTaskRequest) Reset() { *m = StopTaskRequest{} }
func (m *StopTaskRequest) String() string { return proto.CompactTextString(m) }
func (*StopTaskRequest) ProtoMessage() {}
func (*StopTaskRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_driver_f8179d6379690e6b, []int{12}
return fileDescriptor_driver_de29bfae7a3376ed, []int{12}
}
func (m *StopTaskRequest) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_StopTaskRequest.Unmarshal(m, b)
@ -781,7 +781,7 @@ func (m *StopTaskResponse) Reset() { *m = StopTaskResponse{} }
func (m *StopTaskResponse) String() string { return proto.CompactTextString(m) }
func (*StopTaskResponse) ProtoMessage() {}
func (*StopTaskResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_driver_f8179d6379690e6b, []int{13}
return fileDescriptor_driver_de29bfae7a3376ed, []int{13}
}
func (m *StopTaskResponse) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_StopTaskResponse.Unmarshal(m, b)
@ -815,7 +815,7 @@ func (m *DestroyTaskRequest) Reset() { *m = DestroyTaskRequest{} }
func (m *DestroyTaskRequest) String() string { return proto.CompactTextString(m) }
func (*DestroyTaskRequest) ProtoMessage() {}
func (*DestroyTaskRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_driver_f8179d6379690e6b, []int{14}
return fileDescriptor_driver_de29bfae7a3376ed, []int{14}
}
func (m *DestroyTaskRequest) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_DestroyTaskRequest.Unmarshal(m, b)
@ -859,7 +859,7 @@ func (m *DestroyTaskResponse) Reset() { *m = DestroyTaskResponse{} }
func (m *DestroyTaskResponse) String() string { return proto.CompactTextString(m) }
func (*DestroyTaskResponse) ProtoMessage() {}
func (*DestroyTaskResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_driver_f8179d6379690e6b, []int{15}
return fileDescriptor_driver_de29bfae7a3376ed, []int{15}
}
func (m *DestroyTaskResponse) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_DestroyTaskResponse.Unmarshal(m, b)
@ -891,7 +891,7 @@ func (m *InspectTaskRequest) Reset() { *m = InspectTaskRequest{} }
func (m *InspectTaskRequest) String() string { return proto.CompactTextString(m) }
func (*InspectTaskRequest) ProtoMessage() {}
func (*InspectTaskRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_driver_f8179d6379690e6b, []int{16}
return fileDescriptor_driver_de29bfae7a3376ed, []int{16}
}
func (m *InspectTaskRequest) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_InspectTaskRequest.Unmarshal(m, b)
@ -934,7 +934,7 @@ func (m *InspectTaskResponse) Reset() { *m = InspectTaskResponse{} }
func (m *InspectTaskResponse) String() string { return proto.CompactTextString(m) }
func (*InspectTaskResponse) ProtoMessage() {}
func (*InspectTaskResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_driver_f8179d6379690e6b, []int{17}
return fileDescriptor_driver_de29bfae7a3376ed, []int{17}
}
func (m *InspectTaskResponse) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_InspectTaskResponse.Unmarshal(m, b)
@ -987,7 +987,7 @@ func (m *TaskStatsRequest) Reset() { *m = TaskStatsRequest{} }
func (m *TaskStatsRequest) String() string { return proto.CompactTextString(m) }
func (*TaskStatsRequest) ProtoMessage() {}
func (*TaskStatsRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_driver_f8179d6379690e6b, []int{18}
return fileDescriptor_driver_de29bfae7a3376ed, []int{18}
}
func (m *TaskStatsRequest) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_TaskStatsRequest.Unmarshal(m, b)
@ -1026,7 +1026,7 @@ func (m *TaskStatsResponse) Reset() { *m = TaskStatsResponse{} }
func (m *TaskStatsResponse) String() string { return proto.CompactTextString(m) }
func (*TaskStatsResponse) ProtoMessage() {}
func (*TaskStatsResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_driver_f8179d6379690e6b, []int{19}
return fileDescriptor_driver_de29bfae7a3376ed, []int{19}
}
func (m *TaskStatsResponse) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_TaskStatsResponse.Unmarshal(m, b)
@ -1063,7 +1063,7 @@ func (m *TaskEventsRequest) Reset() { *m = TaskEventsRequest{} }
func (m *TaskEventsRequest) String() string { return proto.CompactTextString(m) }
func (*TaskEventsRequest) ProtoMessage() {}
func (*TaskEventsRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_driver_f8179d6379690e6b, []int{20}
return fileDescriptor_driver_de29bfae7a3376ed, []int{20}
}
func (m *TaskEventsRequest) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_TaskEventsRequest.Unmarshal(m, b)
@ -1097,7 +1097,7 @@ func (m *SignalTaskRequest) Reset() { *m = SignalTaskRequest{} }
func (m *SignalTaskRequest) String() string { return proto.CompactTextString(m) }
func (*SignalTaskRequest) ProtoMessage() {}
func (*SignalTaskRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_driver_f8179d6379690e6b, []int{21}
return fileDescriptor_driver_de29bfae7a3376ed, []int{21}
}
func (m *SignalTaskRequest) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_SignalTaskRequest.Unmarshal(m, b)
@ -1141,7 +1141,7 @@ func (m *SignalTaskResponse) Reset() { *m = SignalTaskResponse{} }
func (m *SignalTaskResponse) String() string { return proto.CompactTextString(m) }
func (*SignalTaskResponse) ProtoMessage() {}
func (*SignalTaskResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_driver_f8179d6379690e6b, []int{22}
return fileDescriptor_driver_de29bfae7a3376ed, []int{22}
}
func (m *SignalTaskResponse) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_SignalTaskResponse.Unmarshal(m, b)
@ -1178,7 +1178,7 @@ func (m *ExecTaskRequest) Reset() { *m = ExecTaskRequest{} }
func (m *ExecTaskRequest) String() string { return proto.CompactTextString(m) }
func (*ExecTaskRequest) ProtoMessage() {}
func (*ExecTaskRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_driver_f8179d6379690e6b, []int{23}
return fileDescriptor_driver_de29bfae7a3376ed, []int{23}
}
func (m *ExecTaskRequest) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_ExecTaskRequest.Unmarshal(m, b)
@ -1235,7 +1235,7 @@ func (m *ExecTaskResponse) Reset() { *m = ExecTaskResponse{} }
func (m *ExecTaskResponse) String() string { return proto.CompactTextString(m) }
func (*ExecTaskResponse) ProtoMessage() {}
func (*ExecTaskResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_driver_f8179d6379690e6b, []int{24}
return fileDescriptor_driver_de29bfae7a3376ed, []int{24}
}
func (m *ExecTaskResponse) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_ExecTaskResponse.Unmarshal(m, b)
@ -1294,7 +1294,7 @@ func (m *DriverCapabilities) Reset() { *m = DriverCapabilities{} }
func (m *DriverCapabilities) String() string { return proto.CompactTextString(m) }
func (*DriverCapabilities) ProtoMessage() {}
func (*DriverCapabilities) Descriptor() ([]byte, []int) {
return fileDescriptor_driver_f8179d6379690e6b, []int{25}
return fileDescriptor_driver_de29bfae7a3376ed, []int{25}
}
func (m *DriverCapabilities) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_DriverCapabilities.Unmarshal(m, b)
@ -1344,28 +1344,33 @@ type TaskConfig struct {
MsgpackDriverConfig []byte `protobuf:"bytes,3,opt,name=msgpack_driver_config,json=msgpackDriverConfig,proto3" json:"msgpack_driver_config,omitempty"`
// Env is the a set of key/value pairs to be set as environment variables
Env map[string]string `protobuf:"bytes,4,rep,name=env,proto3" json:"env,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"`
// DeviceEnv is the set of environment variables that are defined by device
// plugins. This allows the driver to differentiate environemnt variables
// set by the device plugins and those by the user. When populating the
// task's environment env should be used.
DeviceEnv map[string]string `protobuf:"bytes,5,rep,name=device_env,json=deviceEnv,proto3" json:"device_env,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"`
// Resources defines the resources to isolate
Resources *Resources `protobuf:"bytes,5,opt,name=resources,proto3" json:"resources,omitempty"`
Resources *Resources `protobuf:"bytes,6,opt,name=resources,proto3" json:"resources,omitempty"`
// Mounts is a list of targets to bind mount into the task directory
Mounts []*Mount `protobuf:"bytes,6,rep,name=mounts,proto3" json:"mounts,omitempty"`
Mounts []*Mount `protobuf:"bytes,7,rep,name=mounts,proto3" json:"mounts,omitempty"`
// Devices is a list of system devices to mount into the task's execution
// environment.
Devices []*Device `protobuf:"bytes,7,rep,name=devices,proto3" json:"devices,omitempty"`
Devices []*Device `protobuf:"bytes,8,rep,name=devices,proto3" json:"devices,omitempty"`
// User defines the operating system user the tasks should run as
User string `protobuf:"bytes,8,opt,name=user,proto3" json:"user,omitempty"`
User string `protobuf:"bytes,9,opt,name=user,proto3" json:"user,omitempty"`
// AllocDir is the directory on the host where the allocation directory
// exists.
AllocDir string `protobuf:"bytes,9,opt,name=alloc_dir,json=allocDir,proto3" json:"alloc_dir,omitempty"`
AllocDir string `protobuf:"bytes,10,opt,name=alloc_dir,json=allocDir,proto3" json:"alloc_dir,omitempty"`
// StdoutPath is the path to the file to open and write task stdout to
StdoutPath string `protobuf:"bytes,10,opt,name=stdout_path,json=stdoutPath,proto3" json:"stdout_path,omitempty"`
StdoutPath string `protobuf:"bytes,11,opt,name=stdout_path,json=stdoutPath,proto3" json:"stdout_path,omitempty"`
// StderrPath is the path to the file to open and write task stderr to
StderrPath string `protobuf:"bytes,11,opt,name=stderr_path,json=stderrPath,proto3" json:"stderr_path,omitempty"`
StderrPath string `protobuf:"bytes,12,opt,name=stderr_path,json=stderrPath,proto3" json:"stderr_path,omitempty"`
// TaskGroupName is the name of the task group which this task is a member of
TaskGroupName string `protobuf:"bytes,12,opt,name=task_group_name,json=taskGroupName,proto3" json:"task_group_name,omitempty"`
TaskGroupName string `protobuf:"bytes,13,opt,name=task_group_name,json=taskGroupName,proto3" json:"task_group_name,omitempty"`
// JobName is the name of the job of which this task is part of
JobName string `protobuf:"bytes,13,opt,name=job_name,json=jobName,proto3" json:"job_name,omitempty"`
JobName string `protobuf:"bytes,14,opt,name=job_name,json=jobName,proto3" json:"job_name,omitempty"`
// AllocId is the ID of the associated allocation
AllocId string `protobuf:"bytes,14,opt,name=alloc_id,json=allocId,proto3" json:"alloc_id,omitempty"`
AllocId string `protobuf:"bytes,15,opt,name=alloc_id,json=allocId,proto3" json:"alloc_id,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
@ -1375,7 +1380,7 @@ func (m *TaskConfig) Reset() { *m = TaskConfig{} }
func (m *TaskConfig) String() string { return proto.CompactTextString(m) }
func (*TaskConfig) ProtoMessage() {}
func (*TaskConfig) Descriptor() ([]byte, []int) {
return fileDescriptor_driver_f8179d6379690e6b, []int{26}
return fileDescriptor_driver_de29bfae7a3376ed, []int{26}
}
func (m *TaskConfig) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_TaskConfig.Unmarshal(m, b)
@ -1423,6 +1428,13 @@ func (m *TaskConfig) GetEnv() map[string]string {
return nil
}
func (m *TaskConfig) GetDeviceEnv() map[string]string {
if m != nil {
return m.DeviceEnv
}
return nil
}
func (m *TaskConfig) GetResources() *Resources {
if m != nil {
return m.Resources
@ -1507,7 +1519,7 @@ func (m *Resources) Reset() { *m = Resources{} }
func (m *Resources) String() string { return proto.CompactTextString(m) }
func (*Resources) ProtoMessage() {}
func (*Resources) Descriptor() ([]byte, []int) {
return fileDescriptor_driver_f8179d6379690e6b, []int{27}
return fileDescriptor_driver_de29bfae7a3376ed, []int{27}
}
func (m *Resources) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_Resources.Unmarshal(m, b)
@ -1554,7 +1566,7 @@ func (m *AllocatedTaskResources) Reset() { *m = AllocatedTaskResources{}
func (m *AllocatedTaskResources) String() string { return proto.CompactTextString(m) }
func (*AllocatedTaskResources) ProtoMessage() {}
func (*AllocatedTaskResources) Descriptor() ([]byte, []int) {
return fileDescriptor_driver_f8179d6379690e6b, []int{28}
return fileDescriptor_driver_de29bfae7a3376ed, []int{28}
}
func (m *AllocatedTaskResources) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_AllocatedTaskResources.Unmarshal(m, b)
@ -1606,7 +1618,7 @@ func (m *AllocatedCpuResources) Reset() { *m = AllocatedCpuResources{} }
func (m *AllocatedCpuResources) String() string { return proto.CompactTextString(m) }
func (*AllocatedCpuResources) ProtoMessage() {}
func (*AllocatedCpuResources) Descriptor() ([]byte, []int) {
return fileDescriptor_driver_f8179d6379690e6b, []int{29}
return fileDescriptor_driver_de29bfae7a3376ed, []int{29}
}
func (m *AllocatedCpuResources) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_AllocatedCpuResources.Unmarshal(m, b)
@ -1644,7 +1656,7 @@ func (m *AllocatedMemoryResources) Reset() { *m = AllocatedMemoryResourc
func (m *AllocatedMemoryResources) String() string { return proto.CompactTextString(m) }
func (*AllocatedMemoryResources) ProtoMessage() {}
func (*AllocatedMemoryResources) Descriptor() ([]byte, []int) {
return fileDescriptor_driver_f8179d6379690e6b, []int{30}
return fileDescriptor_driver_de29bfae7a3376ed, []int{30}
}
func (m *AllocatedMemoryResources) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_AllocatedMemoryResources.Unmarshal(m, b)
@ -1687,7 +1699,7 @@ func (m *NetworkResource) Reset() { *m = NetworkResource{} }
func (m *NetworkResource) String() string { return proto.CompactTextString(m) }
func (*NetworkResource) ProtoMessage() {}
func (*NetworkResource) Descriptor() ([]byte, []int) {
return fileDescriptor_driver_f8179d6379690e6b, []int{31}
return fileDescriptor_driver_de29bfae7a3376ed, []int{31}
}
func (m *NetworkResource) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_NetworkResource.Unmarshal(m, b)
@ -1761,7 +1773,7 @@ func (m *NetworkPort) Reset() { *m = NetworkPort{} }
func (m *NetworkPort) String() string { return proto.CompactTextString(m) }
func (*NetworkPort) ProtoMessage() {}
func (*NetworkPort) Descriptor() ([]byte, []int) {
return fileDescriptor_driver_f8179d6379690e6b, []int{32}
return fileDescriptor_driver_de29bfae7a3376ed, []int{32}
}
func (m *NetworkPort) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_NetworkPort.Unmarshal(m, b)
@ -1821,7 +1833,7 @@ func (m *LinuxResources) Reset() { *m = LinuxResources{} }
func (m *LinuxResources) String() string { return proto.CompactTextString(m) }
func (*LinuxResources) ProtoMessage() {}
func (*LinuxResources) Descriptor() ([]byte, []int) {
return fileDescriptor_driver_f8179d6379690e6b, []int{33}
return fileDescriptor_driver_de29bfae7a3376ed, []int{33}
}
func (m *LinuxResources) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_LinuxResources.Unmarshal(m, b)
@ -1913,7 +1925,7 @@ func (m *Mount) Reset() { *m = Mount{} }
func (m *Mount) String() string { return proto.CompactTextString(m) }
func (*Mount) ProtoMessage() {}
func (*Mount) Descriptor() ([]byte, []int) {
return fileDescriptor_driver_f8179d6379690e6b, []int{34}
return fileDescriptor_driver_de29bfae7a3376ed, []int{34}
}
func (m *Mount) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_Mount.Unmarshal(m, b)
@ -1976,7 +1988,7 @@ func (m *Device) Reset() { *m = Device{} }
func (m *Device) String() string { return proto.CompactTextString(m) }
func (*Device) ProtoMessage() {}
func (*Device) Descriptor() ([]byte, []int) {
return fileDescriptor_driver_f8179d6379690e6b, []int{35}
return fileDescriptor_driver_de29bfae7a3376ed, []int{35}
}
func (m *Device) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_Device.Unmarshal(m, b)
@ -2034,7 +2046,7 @@ func (m *TaskHandle) Reset() { *m = TaskHandle{} }
func (m *TaskHandle) String() string { return proto.CompactTextString(m) }
func (*TaskHandle) ProtoMessage() {}
func (*TaskHandle) Descriptor() ([]byte, []int) {
return fileDescriptor_driver_f8179d6379690e6b, []int{36}
return fileDescriptor_driver_de29bfae7a3376ed, []int{36}
}
func (m *TaskHandle) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_TaskHandle.Unmarshal(m, b)
@ -2094,7 +2106,7 @@ func (m *NetworkOverride) Reset() { *m = NetworkOverride{} }
func (m *NetworkOverride) String() string { return proto.CompactTextString(m) }
func (*NetworkOverride) ProtoMessage() {}
func (*NetworkOverride) Descriptor() ([]byte, []int) {
return fileDescriptor_driver_f8179d6379690e6b, []int{37}
return fileDescriptor_driver_de29bfae7a3376ed, []int{37}
}
func (m *NetworkOverride) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_NetworkOverride.Unmarshal(m, b)
@ -2152,7 +2164,7 @@ func (m *ExitResult) Reset() { *m = ExitResult{} }
func (m *ExitResult) String() string { return proto.CompactTextString(m) }
func (*ExitResult) ProtoMessage() {}
func (*ExitResult) Descriptor() ([]byte, []int) {
return fileDescriptor_driver_f8179d6379690e6b, []int{38}
return fileDescriptor_driver_de29bfae7a3376ed, []int{38}
}
func (m *ExitResult) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_ExitResult.Unmarshal(m, b)
@ -2215,7 +2227,7 @@ func (m *TaskStatus) Reset() { *m = TaskStatus{} }
func (m *TaskStatus) String() string { return proto.CompactTextString(m) }
func (*TaskStatus) ProtoMessage() {}
func (*TaskStatus) Descriptor() ([]byte, []int) {
return fileDescriptor_driver_f8179d6379690e6b, []int{39}
return fileDescriptor_driver_de29bfae7a3376ed, []int{39}
}
func (m *TaskStatus) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_TaskStatus.Unmarshal(m, b)
@ -2290,7 +2302,7 @@ func (m *TaskDriverStatus) Reset() { *m = TaskDriverStatus{} }
func (m *TaskDriverStatus) String() string { return proto.CompactTextString(m) }
func (*TaskDriverStatus) ProtoMessage() {}
func (*TaskDriverStatus) Descriptor() ([]byte, []int) {
return fileDescriptor_driver_f8179d6379690e6b, []int{40}
return fileDescriptor_driver_de29bfae7a3376ed, []int{40}
}
func (m *TaskDriverStatus) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_TaskDriverStatus.Unmarshal(m, b)
@ -2335,7 +2347,7 @@ func (m *TaskStats) Reset() { *m = TaskStats{} }
func (m *TaskStats) String() string { return proto.CompactTextString(m) }
func (*TaskStats) ProtoMessage() {}
func (*TaskStats) Descriptor() ([]byte, []int) {
return fileDescriptor_driver_f8179d6379690e6b, []int{41}
return fileDescriptor_driver_de29bfae7a3376ed, []int{41}
}
func (m *TaskStats) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_TaskStats.Unmarshal(m, b)
@ -2397,7 +2409,7 @@ func (m *TaskResourceUsage) Reset() { *m = TaskResourceUsage{} }
func (m *TaskResourceUsage) String() string { return proto.CompactTextString(m) }
func (*TaskResourceUsage) ProtoMessage() {}
func (*TaskResourceUsage) Descriptor() ([]byte, []int) {
return fileDescriptor_driver_f8179d6379690e6b, []int{42}
return fileDescriptor_driver_de29bfae7a3376ed, []int{42}
}
func (m *TaskResourceUsage) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_TaskResourceUsage.Unmarshal(m, b)
@ -2449,7 +2461,7 @@ func (m *CPUUsage) Reset() { *m = CPUUsage{} }
func (m *CPUUsage) String() string { return proto.CompactTextString(m) }
func (*CPUUsage) ProtoMessage() {}
func (*CPUUsage) Descriptor() ([]byte, []int) {
return fileDescriptor_driver_f8179d6379690e6b, []int{43}
return fileDescriptor_driver_de29bfae7a3376ed, []int{43}
}
func (m *CPUUsage) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_CPUUsage.Unmarshal(m, b)
@ -2535,7 +2547,7 @@ func (m *MemoryUsage) Reset() { *m = MemoryUsage{} }
func (m *MemoryUsage) String() string { return proto.CompactTextString(m) }
func (*MemoryUsage) ProtoMessage() {}
func (*MemoryUsage) Descriptor() ([]byte, []int) {
return fileDescriptor_driver_f8179d6379690e6b, []int{44}
return fileDescriptor_driver_de29bfae7a3376ed, []int{44}
}
func (m *MemoryUsage) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_MemoryUsage.Unmarshal(m, b)
@ -2619,7 +2631,7 @@ func (m *DriverTaskEvent) Reset() { *m = DriverTaskEvent{} }
func (m *DriverTaskEvent) String() string { return proto.CompactTextString(m) }
func (*DriverTaskEvent) ProtoMessage() {}
func (*DriverTaskEvent) Descriptor() ([]byte, []int) {
return fileDescriptor_driver_f8179d6379690e6b, []int{45}
return fileDescriptor_driver_de29bfae7a3376ed, []int{45}
}
func (m *DriverTaskEvent) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_DriverTaskEvent.Unmarshal(m, b)
@ -2710,6 +2722,7 @@ func init() {
proto.RegisterType((*ExecTaskResponse)(nil), "hashicorp.nomad.plugins.drivers.proto.ExecTaskResponse")
proto.RegisterType((*DriverCapabilities)(nil), "hashicorp.nomad.plugins.drivers.proto.DriverCapabilities")
proto.RegisterType((*TaskConfig)(nil), "hashicorp.nomad.plugins.drivers.proto.TaskConfig")
proto.RegisterMapType((map[string]string)(nil), "hashicorp.nomad.plugins.drivers.proto.TaskConfig.DeviceEnvEntry")
proto.RegisterMapType((map[string]string)(nil), "hashicorp.nomad.plugins.drivers.proto.TaskConfig.EnvEntry")
proto.RegisterType((*Resources)(nil), "hashicorp.nomad.plugins.drivers.proto.Resources")
proto.RegisterType((*AllocatedTaskResources)(nil), "hashicorp.nomad.plugins.drivers.proto.AllocatedTaskResources")
@ -3326,191 +3339,193 @@ var _Driver_serviceDesc = grpc.ServiceDesc{
}
func init() {
proto.RegisterFile("plugins/drivers/proto/driver.proto", fileDescriptor_driver_f8179d6379690e6b)
proto.RegisterFile("plugins/drivers/proto/driver.proto", fileDescriptor_driver_de29bfae7a3376ed)
}
var fileDescriptor_driver_f8179d6379690e6b = []byte{
// 2908 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xac, 0x59, 0x4b, 0x6f, 0x23, 0xc7,
0xf1, 0x17, 0x9f, 0x22, 0x8b, 0x12, 0x35, 0xdb, 0xbb, 0x6b, 0xd3, 0x34, 0xfe, 0x7f, 0xaf, 0x07,
0x70, 0xb0, 0xb0, 0xbd, 0x94, 0x2d, 0x23, 0xfb, 0x4a, 0xfc, 0xa0, 0xa9, 0x59, 0x49, 0x5e, 0x89,
0x52, 0x9a, 0x14, 0xd6, 0x9b, 0xc4, 0x9e, 0x8c, 0x66, 0x7a, 0xc9, 0x59, 0x71, 0x1e, 0xee, 0xe9,
0x91, 0x25, 0x04, 0x41, 0x82, 0x04, 0x08, 0x92, 0x43, 0x80, 0x5c, 0x8c, 0x00, 0x39, 0x26, 0xc7,
0x7c, 0x83, 0x04, 0xbe, 0xe4, 0x53, 0x04, 0xc8, 0x25, 0x39, 0x04, 0xc8, 0x35, 0xdf, 0x20, 0xe8,
0xc7, 0x0c, 0x87, 0x92, 0xd6, 0x3b, 0xe4, 0xe6, 0x44, 0x76, 0x75, 0xd7, 0xaf, 0x6b, 0xaa, 0xaa,
0xab, 0xaa, 0xbb, 0x40, 0x0f, 0x27, 0xf1, 0xc8, 0xf5, 0xa3, 0x75, 0x87, 0xba, 0x27, 0x84, 0x46,
0xeb, 0x21, 0x0d, 0x58, 0xa0, 0x46, 0x1d, 0x31, 0x40, 0x6f, 0x8c, 0xad, 0x68, 0xec, 0xda, 0x01,
0x0d, 0x3b, 0x7e, 0xe0, 0x59, 0x4e, 0x47, 0xf1, 0x74, 0x14, 0x8f, 0x5c, 0xd6, 0xfe, 0xff, 0x51,
0x10, 0x8c, 0x26, 0x44, 0x22, 0x1c, 0xc5, 0x4f, 0xd6, 0x9d, 0x98, 0x5a, 0xcc, 0x0d, 0x7c, 0x35,
0xff, 0xda, 0xf9, 0x79, 0xe6, 0x7a, 0x24, 0x62, 0x96, 0x17, 0xaa, 0x05, 0x1f, 0x8d, 0x5c, 0x36,
0x8e, 0x8f, 0x3a, 0x76, 0xe0, 0xad, 0xa7, 0x5b, 0xae, 0x8b, 0x2d, 0xd7, 0x13, 0x31, 0xa3, 0xb1,
0x45, 0x89, 0xb3, 0x3e, 0xb6, 0x27, 0x51, 0x48, 0x6c, 0xfe, 0x6b, 0xf2, 0x3f, 0x0a, 0x61, 0x2b,
0x3f, 0x42, 0xc4, 0x68, 0x6c, 0xb3, 0xe4, 0x7b, 0x2d, 0xc6, 0xa8, 0x7b, 0x14, 0x33, 0x22, 0x81,
0xf4, 0x57, 0xe0, 0xe5, 0xa1, 0x15, 0x1d, 0xf7, 0x02, 0xff, 0x89, 0x3b, 0x1a, 0xd8, 0x63, 0xe2,
0x59, 0x98, 0x7c, 0x11, 0x93, 0x88, 0xe9, 0x3f, 0x84, 0xd6, 0xc5, 0xa9, 0x28, 0x0c, 0xfc, 0x88,
0xa0, 0x8f, 0xa0, 0xcc, 0xa5, 0x69, 0x15, 0x6e, 0x14, 0x6e, 0x36, 0x36, 0xde, 0xee, 0x3c, 0x4b,
0x71, 0x52, 0x86, 0x8e, 0xfa, 0x8a, 0xce, 0x20, 0x24, 0x36, 0x16, 0x9c, 0xfa, 0x75, 0xb8, 0xda,
0xb3, 0x42, 0xeb, 0xc8, 0x9d, 0xb8, 0xcc, 0x25, 0x51, 0xb2, 0x69, 0x0c, 0xd7, 0x66, 0xc9, 0x6a,
0xc3, 0xcf, 0x60, 0xc5, 0xce, 0xd0, 0xd5, 0xc6, 0xf7, 0x3a, 0xb9, 0x2c, 0xd6, 0xd9, 0x14, 0xa3,
0x19, 0xe0, 0x19, 0x38, 0xfd, 0x1a, 0xa0, 0x07, 0xae, 0x3f, 0x22, 0x34, 0xa4, 0xae, 0xcf, 0x12,
0x61, 0xbe, 0x2e, 0xc1, 0xd5, 0x19, 0xb2, 0x12, 0xe6, 0x29, 0x40, 0xaa, 0x47, 0x2e, 0x4a, 0xe9,
0x66, 0x63, 0xe3, 0x93, 0x9c, 0xa2, 0x5c, 0x82, 0xd7, 0xe9, 0xa6, 0x60, 0x86, 0xcf, 0xe8, 0x19,
0xce, 0xa0, 0xa3, 0xcf, 0xa1, 0x3a, 0x26, 0xd6, 0x84, 0x8d, 0x5b, 0xc5, 0x1b, 0x85, 0x9b, 0xcd,
0x8d, 0x07, 0x2f, 0xb0, 0xcf, 0xb6, 0x00, 0x1a, 0x30, 0x8b, 0x11, 0xac, 0x50, 0xd1, 0x2d, 0x40,
0xf2, 0x9f, 0xe9, 0x90, 0xc8, 0xa6, 0x6e, 0xc8, 0x1d, 0xb9, 0x55, 0xba, 0x51, 0xb8, 0x59, 0xc7,
0x57, 0xe4, 0xcc, 0xe6, 0x74, 0xa2, 0x1d, 0xc2, 0xda, 0x39, 0x69, 0x91, 0x06, 0xa5, 0x63, 0x72,
0x26, 0x2c, 0x52, 0xc7, 0xfc, 0x2f, 0xda, 0x82, 0xca, 0x89, 0x35, 0x89, 0x89, 0x10, 0xb9, 0xb1,
0xf1, 0xee, 0xf3, 0xdc, 0x43, 0xb9, 0xe8, 0x54, 0x0f, 0x58, 0xf2, 0xdf, 0x2f, 0xde, 0x2d, 0xe8,
0xf7, 0xa0, 0x91, 0x91, 0x1b, 0x35, 0x01, 0x0e, 0xfb, 0x9b, 0xc6, 0xd0, 0xe8, 0x0d, 0x8d, 0x4d,
0x6d, 0x09, 0xad, 0x42, 0xfd, 0xb0, 0xbf, 0x6d, 0x74, 0x77, 0x87, 0xdb, 0x8f, 0xb5, 0x02, 0x6a,
0xc0, 0x72, 0x32, 0x28, 0xea, 0xa7, 0x80, 0x30, 0xb1, 0x83, 0x13, 0x42, 0xb9, 0x23, 0x2b, 0xab,
0xa2, 0x97, 0x61, 0x99, 0x59, 0xd1, 0xb1, 0xe9, 0x3a, 0x4a, 0xe6, 0x2a, 0x1f, 0xee, 0x38, 0x68,
0x07, 0xaa, 0x63, 0xcb, 0x77, 0x26, 0xcf, 0x97, 0x7b, 0x56, 0xd5, 0x1c, 0x7c, 0x5b, 0x30, 0x62,
0x05, 0xc0, 0xbd, 0x7b, 0x66, 0x67, 0x69, 0x00, 0xfd, 0x31, 0x68, 0x03, 0x66, 0x51, 0x96, 0x15,
0xc7, 0x80, 0x32, 0xdf, 0x5f, 0x79, 0xf4, 0x3c, 0x7b, 0xca, 0x93, 0x89, 0x05, 0xbb, 0xfe, 0x9f,
0x22, 0x5c, 0xc9, 0x60, 0x2b, 0x4f, 0x7d, 0x04, 0x55, 0x4a, 0xa2, 0x78, 0xc2, 0x04, 0x7c, 0x73,
0xe3, 0xc3, 0x9c, 0xf0, 0x17, 0x90, 0x3a, 0x58, 0xc0, 0x60, 0x05, 0x87, 0x6e, 0x82, 0x26, 0x39,
0x4c, 0x42, 0x69, 0x40, 0x4d, 0x2f, 0x1a, 0x09, 0xad, 0xd5, 0x71, 0x53, 0xd2, 0x0d, 0x4e, 0xde,
0x8b, 0x46, 0x19, 0xad, 0x96, 0x5e, 0x50, 0xab, 0xc8, 0x02, 0xcd, 0x27, 0xec, 0xcb, 0x80, 0x1e,
0x9b, 0x5c, 0xb5, 0xd4, 0x75, 0x48, 0xab, 0x2c, 0x40, 0x6f, 0xe7, 0x04, 0xed, 0x4b, 0xf6, 0x7d,
0xc5, 0x8d, 0xd7, 0xfc, 0x59, 0x82, 0xfe, 0x16, 0x54, 0xe5, 0x97, 0x72, 0x4f, 0x1a, 0x1c, 0xf6,
0x7a, 0xc6, 0x60, 0xa0, 0x2d, 0xa1, 0x3a, 0x54, 0xb0, 0x31, 0xc4, 0xdc, 0xc3, 0xea, 0x50, 0x79,
0xd0, 0x1d, 0x76, 0x77, 0xb5, 0xa2, 0xfe, 0x26, 0xac, 0x3d, 0xb2, 0x5c, 0x96, 0xc7, 0xb9, 0xf4,
0x00, 0xb4, 0xe9, 0x5a, 0x65, 0x9d, 0x9d, 0x19, 0xeb, 0xe4, 0x57, 0x8d, 0x71, 0xea, 0xb2, 0x73,
0xf6, 0xd0, 0xa0, 0x44, 0x28, 0x55, 0x26, 0xe0, 0x7f, 0xf5, 0x2f, 0x61, 0x6d, 0xc0, 0x82, 0x30,
0x97, 0xe7, 0xbf, 0x07, 0xcb, 0x3c, 0x47, 0x05, 0x31, 0x53, 0xae, 0xff, 0x4a, 0x47, 0xe6, 0xb0,
0x4e, 0x92, 0xc3, 0x3a, 0x9b, 0x2a, 0xc7, 0xe1, 0x64, 0x25, 0x7a, 0x09, 0xaa, 0x91, 0x3b, 0xf2,
0xad, 0x89, 0x8a, 0x16, 0x6a, 0xa4, 0x23, 0xee, 0xe4, 0xc9, 0xc6, 0xca, 0xf1, 0x7b, 0x80, 0x36,
0x49, 0xc4, 0x68, 0x70, 0x96, 0x4b, 0x9e, 0x6b, 0x50, 0x79, 0x12, 0x50, 0x5b, 0x1e, 0xc4, 0x1a,
0x96, 0x03, 0x7e, 0xa8, 0x66, 0x40, 0x14, 0xf6, 0x2d, 0x40, 0x3b, 0x3e, 0xcf, 0x29, 0xf9, 0x0c,
0xf1, 0xdb, 0x22, 0x5c, 0x9d, 0x59, 0xaf, 0x8c, 0xb1, 0xf8, 0x39, 0xe4, 0x81, 0x29, 0x8e, 0xe4,
0x39, 0x44, 0xfb, 0x50, 0x95, 0x2b, 0x94, 0x26, 0xef, 0xcc, 0x01, 0x24, 0xd3, 0x94, 0x82, 0x53,
0x30, 0x97, 0x3a, 0x7d, 0xe9, 0x7f, 0xed, 0xf4, 0x5a, 0xf2, 0x1d, 0xd1, 0x73, 0xf5, 0xf7, 0x03,
0xb8, 0x92, 0x59, 0xac, 0x94, 0xf7, 0x00, 0x2a, 0x11, 0x27, 0x28, 0xed, 0xbd, 0x33, 0xa7, 0xf6,
0x22, 0x2c, 0xd9, 0xf5, 0xab, 0x12, 0xdc, 0x38, 0x21, 0x7e, 0x2a, 0x8a, 0xbe, 0x09, 0x57, 0x06,
0xc2, 0xb5, 0x72, 0xf9, 0xce, 0xd4, 0x2d, 0x8b, 0x33, 0x6e, 0x79, 0x0d, 0x50, 0x16, 0x45, 0x39,
0xcf, 0x19, 0xac, 0x19, 0xa7, 0xc4, 0xce, 0x85, 0xdc, 0x82, 0x65, 0x3b, 0xf0, 0x3c, 0xcb, 0x77,
0x5a, 0xc5, 0x1b, 0xa5, 0x9b, 0x75, 0x9c, 0x0c, 0xb3, 0xe7, 0xa7, 0x94, 0xf7, 0xfc, 0xe8, 0xbf,
0x29, 0x80, 0x36, 0xdd, 0x5b, 0x29, 0x92, 0x4b, 0xcf, 0x1c, 0x0e, 0xc4, 0xf7, 0x5e, 0xc1, 0x6a,
0xa4, 0xe8, 0xc9, 0x11, 0x97, 0x74, 0x42, 0x69, 0x26, 0x84, 0x94, 0x5e, 0x30, 0x84, 0xe8, 0xff,
0x2a, 0x00, 0xba, 0x58, 0x28, 0xa1, 0xd7, 0x61, 0x25, 0x22, 0xbe, 0x63, 0x4a, 0x35, 0x4a, 0x0b,
0xd7, 0x70, 0x83, 0xd3, 0xa4, 0x3e, 0x23, 0x84, 0xa0, 0x4c, 0x4e, 0x89, 0xad, 0x4e, 0xab, 0xf8,
0x8f, 0xc6, 0xb0, 0xf2, 0x24, 0x32, 0xdd, 0x28, 0x98, 0x58, 0x69, 0x45, 0xd1, 0xdc, 0x30, 0x16,
0x2e, 0xd8, 0x3a, 0x0f, 0x06, 0x3b, 0x09, 0x18, 0x6e, 0x3c, 0x89, 0xd2, 0x81, 0xde, 0x81, 0x46,
0x66, 0x0e, 0xd5, 0xa0, 0xdc, 0xdf, 0xef, 0x1b, 0xda, 0x12, 0x02, 0xa8, 0xf6, 0xb6, 0xf1, 0xfe,
0xfe, 0x50, 0x46, 0xed, 0x9d, 0xbd, 0xee, 0x96, 0xa1, 0x15, 0xf5, 0xdf, 0x57, 0x00, 0xa6, 0xe9,
0x13, 0x35, 0xa1, 0x98, 0x5a, 0xba, 0xe8, 0x3a, 0xfc, 0x63, 0x7c, 0xcb, 0x23, 0xca, 0x7b, 0xc4,
0x7f, 0xb4, 0x01, 0xd7, 0xbd, 0x68, 0x14, 0x5a, 0xf6, 0xb1, 0xa9, 0xb2, 0x9e, 0x2d, 0x98, 0xc5,
0x57, 0xad, 0xe0, 0xab, 0x6a, 0x52, 0x49, 0x2d, 0x71, 0x77, 0xa1, 0x44, 0xfc, 0x93, 0x56, 0x59,
0x54, 0x87, 0xf7, 0xe7, 0x4e, 0xeb, 0x1d, 0xc3, 0x3f, 0x91, 0xd5, 0x20, 0x87, 0x41, 0x7d, 0xa8,
0x53, 0x12, 0x05, 0x31, 0xb5, 0x49, 0xd4, 0xaa, 0xcc, 0x75, 0xc8, 0x70, 0xc2, 0x87, 0xa7, 0x10,
0x68, 0x13, 0xaa, 0x5e, 0x10, 0xfb, 0x2c, 0x6a, 0x55, 0x85, 0x80, 0x6f, 0xe7, 0x04, 0xdb, 0xe3,
0x4c, 0x58, 0xf1, 0xa2, 0x2d, 0x58, 0x76, 0xc8, 0x89, 0xcb, 0x65, 0x5a, 0x16, 0x30, 0xb7, 0xf2,
0xda, 0x57, 0x70, 0xe1, 0x84, 0x9b, 0x2b, 0x3d, 0x8e, 0x08, 0x6d, 0xd5, 0xa4, 0xd2, 0xf9, 0x7f,
0xf4, 0x2a, 0xd4, 0xad, 0xc9, 0x24, 0xb0, 0x4d, 0xc7, 0xa5, 0xad, 0xba, 0x98, 0xa8, 0x09, 0xc2,
0xa6, 0x4b, 0xd1, 0x6b, 0xd0, 0x90, 0x27, 0xc3, 0x0c, 0x2d, 0x36, 0x6e, 0x81, 0x98, 0x06, 0x49,
0x3a, 0xb0, 0xd8, 0x58, 0x2d, 0x20, 0x94, 0xca, 0x05, 0x8d, 0x74, 0x01, 0xa1, 0x54, 0x2c, 0xf8,
0x16, 0xac, 0x89, 0x63, 0x3e, 0xa2, 0x41, 0x1c, 0x9a, 0xc2, 0xe4, 0x2b, 0x62, 0xd1, 0x2a, 0x27,
0x6f, 0x71, 0x6a, 0x9f, 0xdb, 0xfe, 0x15, 0xa8, 0x3d, 0x0d, 0x8e, 0xe4, 0x82, 0x55, 0xb1, 0x60,
0xf9, 0x69, 0x70, 0x94, 0x4c, 0x49, 0x09, 0x5d, 0xa7, 0xd5, 0x94, 0x53, 0x62, 0xbc, 0xe3, 0xb4,
0x6f, 0x43, 0x2d, 0x31, 0xe0, 0x25, 0x05, 0xf2, 0xb5, 0x6c, 0x81, 0x5c, 0xcf, 0x56, 0xbb, 0x7f,
0x2f, 0x40, 0x3d, 0x35, 0x18, 0xf2, 0xe1, 0xaa, 0x00, 0xb4, 0x18, 0x71, 0xcc, 0xa9, 0xfd, 0x65,
0x90, 0x7d, 0x3f, 0xa7, 0xae, 0xbb, 0x09, 0x82, 0x0a, 0x34, 0xca, 0x19, 0x50, 0x8a, 0x3c, 0xdd,
0xef, 0x73, 0x58, 0x9b, 0xb8, 0x7e, 0x7c, 0x9a, 0xd9, 0x4b, 0x66, 0xb1, 0x6f, 0xe7, 0xdc, 0x6b,
0x97, 0x73, 0x4f, 0xf7, 0x68, 0x4e, 0x66, 0xc6, 0xfa, 0x57, 0x45, 0x78, 0xe9, 0x72, 0x71, 0x50,
0x1f, 0x4a, 0x76, 0x18, 0xab, 0x4f, 0xfb, 0xee, 0xbc, 0x9f, 0xd6, 0x0b, 0xe3, 0xe9, 0xae, 0x1c,
0x88, 0x57, 0xbe, 0x1e, 0xf1, 0x02, 0x7a, 0xa6, 0xbe, 0xe0, 0xc3, 0x79, 0x21, 0xf7, 0x04, 0xf7,
0x14, 0x55, 0xc1, 0x21, 0x0c, 0x35, 0x95, 0x3f, 0xf9, 0x41, 0x2c, 0xcd, 0x9f, 0x87, 0x13, 0x48,
0x9c, 0xe2, 0xe8, 0xb7, 0xe1, 0xfa, 0xa5, 0x9f, 0x82, 0xfe, 0x0f, 0xc0, 0x0e, 0x63, 0x53, 0xdc,
0x93, 0xa4, 0xdd, 0x4b, 0xb8, 0x6e, 0x87, 0xf1, 0x40, 0x10, 0xf4, 0x3b, 0xd0, 0x7a, 0x96, 0xbc,
0xfc, 0xf8, 0x48, 0x89, 0x4d, 0xef, 0x48, 0xe8, 0xa0, 0x84, 0x6b, 0x92, 0xb0, 0x77, 0xa4, 0xff,
0xae, 0x08, 0x6b, 0xe7, 0xc4, 0xe1, 0x29, 0x46, 0x1e, 0xc7, 0x24, 0xed, 0xc9, 0x11, 0x3f, 0x9b,
0xb6, 0xeb, 0x24, 0xb5, 0xa5, 0xf8, 0x2f, 0x82, 0x66, 0xa8, 0xea, 0xbe, 0xa2, 0x1b, 0x72, 0x87,
0xf6, 0x8e, 0x5c, 0x16, 0x89, 0x72, 0xbc, 0x82, 0xe5, 0x00, 0x3d, 0x86, 0x26, 0x25, 0x11, 0xa1,
0x27, 0xc4, 0x31, 0xc3, 0x80, 0xb2, 0x44, 0x61, 0x1b, 0xf3, 0x29, 0xec, 0x20, 0xa0, 0x0c, 0xaf,
0x26, 0x48, 0x7c, 0x14, 0xa1, 0x47, 0xb0, 0xea, 0x9c, 0xf9, 0x96, 0xe7, 0xda, 0x0a, 0xb9, 0xba,
0x30, 0xf2, 0x8a, 0x02, 0x12, 0xc0, 0xfc, 0xba, 0x99, 0x99, 0xe4, 0x1f, 0x36, 0xb1, 0x8e, 0xc8,
0x44, 0xe9, 0x44, 0x0e, 0x66, 0xcf, 0x6f, 0x45, 0x9d, 0x5f, 0xfd, 0x8f, 0x45, 0x68, 0xce, 0x1e,
0x80, 0xc4, 0x7e, 0x21, 0xa1, 0x6e, 0xe0, 0x64, 0xec, 0x77, 0x20, 0x08, 0xdc, 0x46, 0x7c, 0xfa,
0x8b, 0x38, 0x60, 0x56, 0x62, 0x23, 0x3b, 0x8c, 0xbf, 0xc7, 0xc7, 0xe7, 0x6c, 0x5f, 0x3a, 0x67,
0x7b, 0xf4, 0x36, 0x20, 0x65, 0xdf, 0x89, 0xeb, 0xb9, 0xcc, 0x3c, 0x3a, 0x63, 0x44, 0xea, 0xbf,
0x84, 0x35, 0x39, 0xb3, 0xcb, 0x27, 0x3e, 0xe6, 0x74, 0xa4, 0xc3, 0x6a, 0x10, 0x78, 0x66, 0x64,
0x07, 0x94, 0x98, 0x96, 0xf3, 0x54, 0xe4, 0x90, 0x12, 0x6e, 0x04, 0x81, 0x37, 0xe0, 0xb4, 0xae,
0xf3, 0x94, 0x87, 0x4c, 0x3b, 0x8c, 0x23, 0xc2, 0x4c, 0xfe, 0xd3, 0xaa, 0xca, 0x90, 0x29, 0x49,
0xbd, 0x30, 0x8e, 0x32, 0x0b, 0x3c, 0xe2, 0xf1, 0x90, 0x9f, 0x59, 0xb0, 0x47, 0x3c, 0xbe, 0xcb,
0xca, 0x01, 0xa1, 0x36, 0xf1, 0xd9, 0xd0, 0xb5, 0x8f, 0x23, 0x11, 0xce, 0x0b, 0x78, 0x86, 0xa6,
0x7f, 0x06, 0x15, 0x91, 0x44, 0xf8, 0xc7, 0x8b, 0x00, 0x2c, 0xe2, 0xb3, 0x54, 0x6f, 0x8d, 0x13,
0x44, 0x74, 0x7e, 0x15, 0xea, 0xe3, 0x20, 0x52, 0xd1, 0x5d, 0x7a, 0x5e, 0x8d, 0x13, 0xc4, 0x64,
0x1b, 0x6a, 0x94, 0x58, 0x4e, 0xe0, 0x4f, 0xce, 0x84, 0x5e, 0x6a, 0x38, 0x1d, 0xeb, 0x5f, 0x40,
0x55, 0x26, 0x97, 0x17, 0xc0, 0xbf, 0x05, 0xc8, 0x96, 0x69, 0x21, 0x24, 0xd4, 0x73, 0xa3, 0xc8,
0x0d, 0xfc, 0x28, 0x79, 0x13, 0x91, 0x33, 0x07, 0xd3, 0x09, 0xfd, 0xaf, 0x05, 0x59, 0x50, 0xc8,
0xdb, 0x2a, 0x2f, 0xc9, 0x54, 0x75, 0xb0, 0xf0, 0x95, 0x5e, 0x01, 0x24, 0x65, 0x35, 0x51, 0x6f,
0x3f, 0xf3, 0x96, 0xd5, 0x44, 0x96, 0xd5, 0x84, 0xd7, 0x70, 0xaa, 0x6e, 0x91, 0x70, 0xb2, 0x6c,
0x69, 0x38, 0xe9, 0x7d, 0x83, 0xe8, 0xff, 0x2e, 0xa4, 0x11, 0x21, 0xb9, 0x17, 0xa0, 0xcf, 0xa1,
0xc6, 0x0f, 0x97, 0xe9, 0x59, 0xa1, 0x7a, 0xe5, 0xea, 0x2d, 0x76, 0xe5, 0xe8, 0xf0, 0xb3, 0xb4,
0x67, 0x85, 0xb2, 0xa0, 0x59, 0x0e, 0xe5, 0x88, 0x47, 0x16, 0xcb, 0x99, 0x46, 0x16, 0xfe, 0x1f,
0xbd, 0x01, 0x4d, 0x2b, 0x66, 0x81, 0x69, 0x39, 0x27, 0x84, 0x32, 0x37, 0x22, 0xca, 0xc2, 0xab,
0x9c, 0xda, 0x4d, 0x88, 0xed, 0xfb, 0xb0, 0x92, 0xc5, 0x7c, 0x5e, 0x8e, 0xad, 0x64, 0x73, 0xec,
0x8f, 0x00, 0xa6, 0xe5, 0x2f, 0xf7, 0x04, 0x72, 0xea, 0x32, 0xd3, 0x0e, 0x1c, 0x19, 0xf9, 0x2a,
0xb8, 0xc6, 0x09, 0xbd, 0xc0, 0x21, 0xe7, 0x2e, 0x13, 0x95, 0xe4, 0x32, 0xc1, 0xcf, 0x26, 0x3f,
0x4e, 0xc7, 0xee, 0x64, 0x42, 0x1c, 0x25, 0x61, 0x3d, 0x08, 0xbc, 0x87, 0x82, 0xa0, 0x7f, 0x5d,
0x94, 0x1e, 0x21, 0xaf, 0x72, 0xb9, 0x4a, 0xcc, 0xd4, 0xd4, 0xa5, 0x17, 0x33, 0xf5, 0x3d, 0x80,
0x88, 0x59, 0x94, 0x17, 0x0c, 0x16, 0x53, 0xaf, 0x23, 0xed, 0x0b, 0xb7, 0x91, 0x61, 0xf2, 0x22,
0x8d, 0xeb, 0x6a, 0x75, 0x97, 0xa1, 0xf7, 0x61, 0xc5, 0x0e, 0xbc, 0x70, 0x42, 0x14, 0x73, 0xe5,
0xb9, 0xcc, 0x8d, 0x74, 0x7d, 0x97, 0x65, 0xae, 0x22, 0xd5, 0x17, 0xbd, 0x8a, 0xfc, 0xb9, 0x20,
0x6f, 0xa4, 0xd9, 0x0b, 0x31, 0x1a, 0x5d, 0xf2, 0xea, 0xba, 0xb5, 0xe0, 0xed, 0xfa, 0x9b, 0x9e,
0x5c, 0xdb, 0xef, 0xe7, 0x79, 0xe3, 0x7c, 0x76, 0x09, 0xf7, 0x97, 0x12, 0xd4, 0xd3, 0x8b, 0xed,
0x05, 0xdb, 0xdf, 0x85, 0x7a, 0xda, 0x0e, 0x50, 0xa5, 0xc9, 0x37, 0x9a, 0x27, 0x5d, 0x8c, 0x9e,
0x00, 0xb2, 0x46, 0xa3, 0xb4, 0x34, 0x33, 0xe3, 0xc8, 0x1a, 0x25, 0x4f, 0x01, 0x77, 0xe7, 0xd0,
0x43, 0x92, 0x9d, 0x0e, 0x39, 0x3f, 0xd6, 0xac, 0xd1, 0x68, 0x86, 0x82, 0x7e, 0x0c, 0xd7, 0x67,
0xf7, 0x30, 0x8f, 0xce, 0xcc, 0xd0, 0x75, 0xd4, 0x55, 0x66, 0x7b, 0xde, 0xbb, 0x7d, 0x67, 0x06,
0xfe, 0xe3, 0xb3, 0x03, 0xd7, 0x91, 0x3a, 0x47, 0xf4, 0xc2, 0x44, 0xfb, 0xa7, 0xf0, 0xf2, 0x33,
0x96, 0x5f, 0x62, 0x83, 0xfe, 0xec, 0x3b, 0xf3, 0xe2, 0x4a, 0xc8, 0x58, 0xef, 0x0f, 0x05, 0xf9,
0x04, 0x31, 0xab, 0x93, 0x6e, 0xb6, 0x3a, 0x5d, 0xcf, 0xb9, 0x4f, 0xef, 0xe0, 0x50, 0xc2, 0x8b,
0x82, 0xf4, 0x93, 0x73, 0x05, 0x69, 0xde, 0x52, 0x45, 0xd6, 0x75, 0x12, 0x48, 0x21, 0xe8, 0x7f,
0x2a, 0x41, 0x2d, 0x41, 0x17, 0x37, 0x9d, 0xb3, 0x88, 0x11, 0xcf, 0xf4, 0x92, 0x10, 0x56, 0xc0,
0x20, 0x49, 0x7b, 0x3c, 0x88, 0xbd, 0x0a, 0x75, 0x7e, 0xa1, 0x92, 0xd3, 0x45, 0x31, 0x5d, 0xe3,
0x04, 0x31, 0xf9, 0x1a, 0x34, 0x58, 0xc0, 0xac, 0x89, 0xc9, 0x44, 0xc6, 0x2e, 0x49, 0x6e, 0x41,
0x12, 0xf9, 0x1a, 0xbd, 0x05, 0x57, 0xd8, 0x98, 0x06, 0x8c, 0x4d, 0x78, 0x15, 0x27, 0xea, 0x16,
0x59, 0x66, 0x94, 0xb1, 0x96, 0x4e, 0xc8, 0x7a, 0x26, 0xe2, 0xd1, 0x7b, 0xba, 0x98, 0xbb, 0xae,
0x08, 0x22, 0x65, 0xbc, 0x9a, 0x52, 0xb9, 0x6b, 0xa3, 0x16, 0x2c, 0x87, 0xb2, 0x26, 0x10, 0xb1,
0xa2, 0x80, 0x93, 0x21, 0x32, 0x61, 0xcd, 0x23, 0x56, 0x14, 0x53, 0xe2, 0x98, 0x4f, 0x5c, 0x32,
0x71, 0xe4, 0xcd, 0xb2, 0x99, 0xbb, 0xc8, 0x4e, 0xd4, 0xd2, 0x79, 0x20, 0xb8, 0x71, 0x33, 0x81,
0x93, 0x63, 0x5e, 0x1f, 0xc8, 0x7f, 0x68, 0x0d, 0x1a, 0x83, 0xc7, 0x83, 0xa1, 0xb1, 0x67, 0xee,
0xed, 0x6f, 0x1a, 0xaa, 0x95, 0x30, 0x30, 0xb0, 0x1c, 0x16, 0xf8, 0xfc, 0x70, 0x7f, 0xd8, 0xdd,
0x35, 0x87, 0x3b, 0xbd, 0x87, 0x03, 0xad, 0x88, 0xae, 0xc3, 0x95, 0xe1, 0x36, 0xde, 0x1f, 0x0e,
0x77, 0x8d, 0x4d, 0xf3, 0xc0, 0xc0, 0x3b, 0xfb, 0x9b, 0x03, 0xad, 0x84, 0x10, 0x34, 0xa7, 0xe4,
0xe1, 0xce, 0x9e, 0xa1, 0x95, 0x51, 0x03, 0x96, 0x0f, 0x0c, 0xdc, 0x33, 0xfa, 0x43, 0xad, 0xa2,
0xff, 0xad, 0x08, 0x8d, 0x8c, 0x15, 0xb9, 0x23, 0xd3, 0x48, 0x56, 0xf3, 0x65, 0xcc, 0xff, 0xf2,
0x60, 0x62, 0x5b, 0xf6, 0x58, 0x5a, 0xa7, 0x8c, 0xe5, 0x40, 0x54, 0xf0, 0xd6, 0x69, 0xe6, 0x9c,
0x97, 0x71, 0xcd, 0xb3, 0x4e, 0x25, 0xc8, 0xeb, 0xb0, 0x72, 0x4c, 0xa8, 0x4f, 0x26, 0x6a, 0x5e,
0x5a, 0xa4, 0x21, 0x69, 0x72, 0xc9, 0x4d, 0xd0, 0xd4, 0x92, 0x29, 0x8c, 0x34, 0x47, 0x53, 0xd2,
0xf7, 0x12, 0xb0, 0xa3, 0x8b, 0x5a, 0xaf, 0x0a, 0xad, 0xdf, 0x9b, 0xdf, 0x49, 0x9f, 0xa5, 0xf8,
0x41, 0xaa, 0xf8, 0x65, 0x28, 0xe1, 0xe4, 0x55, 0xbd, 0xd7, 0xed, 0x6d, 0x73, 0x65, 0xaf, 0x42,
0x7d, 0xaf, 0xfb, 0xa9, 0x79, 0x38, 0x10, 0x6f, 0x34, 0x48, 0x83, 0x95, 0x87, 0x06, 0xee, 0x1b,
0xbb, 0x8a, 0x52, 0x42, 0xd7, 0x40, 0x53, 0x94, 0xe9, 0xba, 0xb2, 0xfe, 0xcf, 0x22, 0xac, 0xc9,
0xb8, 0x9e, 0x3e, 0x1b, 0x3e, 0xfb, 0xfd, 0x2e, 0x7b, 0x5d, 0x2f, 0xce, 0x5c, 0xd7, 0xd3, 0x5a,
0x51, 0xa4, 0xe5, 0xd2, 0xb4, 0x56, 0x14, 0xd7, 0xfc, 0x99, 0x90, 0x5d, 0x9e, 0x27, 0x64, 0xb7,
0x60, 0xd9, 0x23, 0x51, 0xaa, 0xf8, 0x3a, 0x4e, 0x86, 0xc8, 0x85, 0x86, 0xe5, 0xfb, 0x01, 0x13,
0x6f, 0x56, 0xc9, 0xed, 0x65, 0x6b, 0xae, 0xd7, 0xb1, 0xf4, 0x8b, 0x3b, 0xdd, 0x29, 0x92, 0x8c,
0xac, 0x59, 0xec, 0xf6, 0x07, 0xa0, 0x9d, 0x5f, 0x30, 0x4f, 0x3e, 0x7b, 0xf3, 0xdd, 0x69, 0x3a,
0x23, 0xdc, 0xb1, 0x0f, 0xfb, 0x0f, 0xfb, 0xfb, 0x8f, 0xfa, 0xda, 0x12, 0x1f, 0xe0, 0xc3, 0x7e,
0x7f, 0xa7, 0xbf, 0xa5, 0x15, 0x10, 0x40, 0xd5, 0xf8, 0x74, 0x67, 0x68, 0x6c, 0x6a, 0xc5, 0x8d,
0x7f, 0xac, 0x42, 0x55, 0x0a, 0x89, 0xbe, 0x52, 0xa9, 0x3c, 0xdb, 0x46, 0x46, 0x1f, 0xcc, 0x5d,
0x12, 0xcf, 0xb4, 0xa6, 0xdb, 0x1f, 0x2e, 0xcc, 0xaf, 0x9e, 0x7d, 0x97, 0xd0, 0xaf, 0x0b, 0xb0,
0x32, 0xf3, 0xce, 0x99, 0xf7, 0x89, 0xee, 0x92, 0xae, 0x75, 0xfb, 0x3b, 0x0b, 0xf1, 0xa6, 0xb2,
0xfc, 0xaa, 0x00, 0x8d, 0x4c, 0xbf, 0x16, 0xdd, 0x5b, 0xa4, 0xc7, 0x2b, 0x25, 0xb9, 0xbf, 0x78,
0x7b, 0x58, 0x5f, 0x7a, 0xa7, 0x80, 0x7e, 0x59, 0x80, 0x46, 0xa6, 0x73, 0x99, 0x5b, 0x94, 0x8b,
0x7d, 0xd6, 0xdc, 0xa2, 0x5c, 0xd6, 0x28, 0x5d, 0x42, 0x3f, 0x2b, 0x40, 0x3d, 0xed, 0x42, 0xa2,
0x3b, 0xf3, 0xf7, 0x2d, 0xa5, 0x10, 0x77, 0x17, 0x6d, 0x78, 0xea, 0x4b, 0xe8, 0x27, 0x50, 0x4b,
0x5a, 0x76, 0x28, 0x6f, 0xfa, 0x39, 0xd7, 0x0f, 0x6c, 0xdf, 0x99, 0x9b, 0x2f, 0xbb, 0x7d, 0xd2,
0x47, 0xcb, 0xbd, 0xfd, 0xb9, 0x8e, 0x5f, 0xfb, 0xce, 0xdc, 0x7c, 0xe9, 0xf6, 0xdc, 0x13, 0x32,
0xed, 0xb6, 0xdc, 0x9e, 0x70, 0xb1, 0xcf, 0x97, 0xdb, 0x13, 0x2e, 0xeb, 0xee, 0x49, 0x41, 0x32,
0x0d, 0xbb, 0xdc, 0x82, 0x5c, 0x6c, 0x0a, 0xe6, 0x16, 0xe4, 0x92, 0xfe, 0xa0, 0x72, 0xc9, 0x69,
0x61, 0x7f, 0x67, 0xee, 0x1e, 0xd7, 0x9c, 0x2e, 0x79, 0xa1, 0xcb, 0xa6, 0x2f, 0xa1, 0x9f, 0xab,
0xa7, 0x06, 0xd9, 0x20, 0x43, 0xf3, 0x40, 0xcd, 0xf4, 0xd4, 0xda, 0xb7, 0x17, 0x4b, 0x35, 0x22,
0x46, 0xfc, 0xa2, 0x00, 0x30, 0x6d, 0xa5, 0xe5, 0x16, 0xe2, 0x42, 0x0f, 0xaf, 0x7d, 0x6f, 0x01,
0xce, 0xec, 0xf1, 0x48, 0xba, 0x67, 0xb9, 0x8f, 0xc7, 0xb9, 0x56, 0x5f, 0xee, 0xe3, 0x71, 0xbe,
0x4d, 0xa7, 0x2f, 0x7d, 0xbc, 0xfc, 0xfd, 0x8a, 0xcc, 0xfd, 0x55, 0xf1, 0xf3, 0xde, 0x7f, 0x03,
0x00, 0x00, 0xff, 0xff, 0xa1, 0x73, 0x76, 0xe7, 0x61, 0x26, 0x00, 0x00,
var fileDescriptor_driver_de29bfae7a3376ed = []byte{
// 2940 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xac, 0x59, 0xcb, 0x6f, 0x23, 0xc7,
0xd1, 0x17, 0x9f, 0x22, 0x8b, 0x12, 0x35, 0xdb, 0xbb, 0x6b, 0xd3, 0x34, 0xbe, 0xcf, 0xeb, 0x01,
0xfc, 0x41, 0xb0, 0xbd, 0x94, 0x2d, 0xe3, 0xdb, 0x57, 0xfc, 0xa2, 0xc9, 0x59, 0x49, 0x5e, 0x89,
0x52, 0x9a, 0x14, 0xd6, 0x9b, 0xc4, 0x9e, 0x8c, 0x66, 0x5a, 0xe4, 0xac, 0x38, 0x0f, 0xcf, 0xf4,
0xc8, 0x12, 0x82, 0x20, 0x41, 0x02, 0x04, 0xc9, 0x21, 0x40, 0x2e, 0x46, 0xee, 0xc9, 0x31, 0x7f,
0x41, 0x12, 0xf8, 0x92, 0xbf, 0x22, 0x40, 0x2e, 0xc9, 0x21, 0x40, 0xae, 0xf9, 0x0f, 0x82, 0x7e,
0xcc, 0x70, 0x46, 0xd2, 0x7a, 0x87, 0xdc, 0x9c, 0xc8, 0xae, 0xee, 0xfa, 0x75, 0x4d, 0x55, 0x75,
0x55, 0x75, 0x17, 0xa8, 0xfe, 0x34, 0x1a, 0xdb, 0x6e, 0xb8, 0x61, 0x05, 0xf6, 0x29, 0x09, 0xc2,
0x0d, 0x3f, 0xf0, 0xa8, 0x27, 0x47, 0x1d, 0x3e, 0x40, 0x6f, 0x4c, 0x8c, 0x70, 0x62, 0x9b, 0x5e,
0xe0, 0x77, 0x5c, 0xcf, 0x31, 0xac, 0x8e, 0xe4, 0xe9, 0x48, 0x1e, 0xb1, 0xac, 0xfd, 0xbf, 0x63,
0xcf, 0x1b, 0x4f, 0x89, 0x40, 0x38, 0x8a, 0x8e, 0x37, 0xac, 0x28, 0x30, 0xa8, 0xed, 0xb9, 0x72,
0xfe, 0xb5, 0x8b, 0xf3, 0xd4, 0x76, 0x48, 0x48, 0x0d, 0xc7, 0x97, 0x0b, 0x3e, 0x1e, 0xdb, 0x74,
0x12, 0x1d, 0x75, 0x4c, 0xcf, 0xd9, 0x48, 0xb6, 0xdc, 0xe0, 0x5b, 0x6e, 0xc4, 0x62, 0x86, 0x13,
0x23, 0x20, 0xd6, 0xc6, 0xc4, 0x9c, 0x86, 0x3e, 0x31, 0xd9, 0xaf, 0xce, 0xfe, 0x48, 0x84, 0xad,
0xfc, 0x08, 0x21, 0x0d, 0x22, 0x93, 0xc6, 0xdf, 0x6b, 0x50, 0x1a, 0xd8, 0x47, 0x11, 0x25, 0x02,
0x48, 0x7d, 0x05, 0x5e, 0x1e, 0x19, 0xe1, 0x49, 0xcf, 0x73, 0x8f, 0xed, 0xf1, 0xd0, 0x9c, 0x10,
0xc7, 0xc0, 0xe4, 0xcb, 0x88, 0x84, 0x54, 0xfd, 0x01, 0xb4, 0x2e, 0x4f, 0x85, 0xbe, 0xe7, 0x86,
0x04, 0x7d, 0x0c, 0x65, 0x26, 0x4d, 0xab, 0x70, 0xab, 0xb0, 0xde, 0xd8, 0x7c, 0xbb, 0xf3, 0x2c,
0xc5, 0x09, 0x19, 0x3a, 0xf2, 0x2b, 0x3a, 0x43, 0x9f, 0x98, 0x98, 0x73, 0xaa, 0x37, 0xe1, 0x7a,
0xcf, 0xf0, 0x8d, 0x23, 0x7b, 0x6a, 0x53, 0x9b, 0x84, 0xf1, 0xa6, 0x11, 0xdc, 0xc8, 0x92, 0xe5,
0x86, 0x9f, 0xc3, 0x8a, 0x99, 0xa2, 0xcb, 0x8d, 0xef, 0x77, 0x72, 0x59, 0xac, 0xd3, 0xe7, 0xa3,
0x0c, 0x70, 0x06, 0x4e, 0xbd, 0x01, 0xe8, 0xa1, 0xed, 0x8e, 0x49, 0xe0, 0x07, 0xb6, 0x4b, 0x63,
0x61, 0xbe, 0x29, 0xc1, 0xf5, 0x0c, 0x59, 0x0a, 0xf3, 0x14, 0x20, 0xd1, 0x23, 0x13, 0xa5, 0xb4,
0xde, 0xd8, 0xfc, 0x34, 0xa7, 0x28, 0x57, 0xe0, 0x75, 0xba, 0x09, 0x98, 0xe6, 0xd2, 0xe0, 0x1c,
0xa7, 0xd0, 0xd1, 0x17, 0x50, 0x9d, 0x10, 0x63, 0x4a, 0x27, 0xad, 0xe2, 0xad, 0xc2, 0x7a, 0x73,
0xf3, 0xe1, 0x0b, 0xec, 0xb3, 0xcd, 0x81, 0x86, 0xd4, 0xa0, 0x04, 0x4b, 0x54, 0x74, 0x1b, 0x90,
0xf8, 0xa7, 0x5b, 0x24, 0x34, 0x03, 0xdb, 0x67, 0x8e, 0xdc, 0x2a, 0xdd, 0x2a, 0xac, 0xd7, 0xf1,
0x35, 0x31, 0xd3, 0x9f, 0x4d, 0xb4, 0x7d, 0x58, 0xbb, 0x20, 0x2d, 0x52, 0xa0, 0x74, 0x42, 0xce,
0xb9, 0x45, 0xea, 0x98, 0xfd, 0x45, 0x5b, 0x50, 0x39, 0x35, 0xa6, 0x11, 0xe1, 0x22, 0x37, 0x36,
0xdf, 0x7d, 0x9e, 0x7b, 0x48, 0x17, 0x9d, 0xe9, 0x01, 0x0b, 0xfe, 0x07, 0xc5, 0x7b, 0x05, 0xf5,
0x3e, 0x34, 0x52, 0x72, 0xa3, 0x26, 0xc0, 0xe1, 0xa0, 0xaf, 0x8d, 0xb4, 0xde, 0x48, 0xeb, 0x2b,
0x4b, 0x68, 0x15, 0xea, 0x87, 0x83, 0x6d, 0xad, 0xbb, 0x3b, 0xda, 0x7e, 0xa2, 0x14, 0x50, 0x03,
0x96, 0xe3, 0x41, 0x51, 0x3d, 0x03, 0x84, 0x89, 0xe9, 0x9d, 0x92, 0x80, 0x39, 0xb2, 0xb4, 0x2a,
0x7a, 0x19, 0x96, 0xa9, 0x11, 0x9e, 0xe8, 0xb6, 0x25, 0x65, 0xae, 0xb2, 0xe1, 0x8e, 0x85, 0x76,
0xa0, 0x3a, 0x31, 0x5c, 0x6b, 0xfa, 0x7c, 0xb9, 0xb3, 0xaa, 0x66, 0xe0, 0xdb, 0x9c, 0x11, 0x4b,
0x00, 0xe6, 0xdd, 0x99, 0x9d, 0x85, 0x01, 0xd4, 0x27, 0xa0, 0x0c, 0xa9, 0x11, 0xd0, 0xb4, 0x38,
0x1a, 0x94, 0xd9, 0xfe, 0xd2, 0xa3, 0xe7, 0xd9, 0x53, 0x9c, 0x4c, 0xcc, 0xd9, 0xd5, 0x7f, 0x17,
0xe1, 0x5a, 0x0a, 0x5b, 0x7a, 0xea, 0x63, 0xa8, 0x06, 0x24, 0x8c, 0xa6, 0x94, 0xc3, 0x37, 0x37,
0x3f, 0xca, 0x09, 0x7f, 0x09, 0xa9, 0x83, 0x39, 0x0c, 0x96, 0x70, 0x68, 0x1d, 0x14, 0xc1, 0xa1,
0x93, 0x20, 0xf0, 0x02, 0xdd, 0x09, 0xc7, 0x5c, 0x6b, 0x75, 0xdc, 0x14, 0x74, 0x8d, 0x91, 0xf7,
0xc2, 0x71, 0x4a, 0xab, 0xa5, 0x17, 0xd4, 0x2a, 0x32, 0x40, 0x71, 0x09, 0xfd, 0xca, 0x0b, 0x4e,
0x74, 0xa6, 0xda, 0xc0, 0xb6, 0x48, 0xab, 0xcc, 0x41, 0xef, 0xe4, 0x04, 0x1d, 0x08, 0xf6, 0x7d,
0xc9, 0x8d, 0xd7, 0xdc, 0x2c, 0x41, 0x7d, 0x0b, 0xaa, 0xe2, 0x4b, 0x99, 0x27, 0x0d, 0x0f, 0x7b,
0x3d, 0x6d, 0x38, 0x54, 0x96, 0x50, 0x1d, 0x2a, 0x58, 0x1b, 0x61, 0xe6, 0x61, 0x75, 0xa8, 0x3c,
0xec, 0x8e, 0xba, 0xbb, 0x4a, 0x51, 0x7d, 0x13, 0xd6, 0x1e, 0x1b, 0x36, 0xcd, 0xe3, 0x5c, 0xaa,
0x07, 0xca, 0x6c, 0xad, 0xb4, 0xce, 0x4e, 0xc6, 0x3a, 0xf9, 0x55, 0xa3, 0x9d, 0xd9, 0xf4, 0x82,
0x3d, 0x14, 0x28, 0x91, 0x20, 0x90, 0x26, 0x60, 0x7f, 0xd5, 0xaf, 0x60, 0x6d, 0x48, 0x3d, 0x3f,
0x97, 0xe7, 0xbf, 0x07, 0xcb, 0x2c, 0x47, 0x79, 0x11, 0x95, 0xae, 0xff, 0x4a, 0x47, 0xe4, 0xb0,
0x4e, 0x9c, 0xc3, 0x3a, 0x7d, 0x99, 0xe3, 0x70, 0xbc, 0x12, 0xbd, 0x04, 0xd5, 0xd0, 0x1e, 0xbb,
0xc6, 0x54, 0x46, 0x0b, 0x39, 0x52, 0x11, 0x73, 0xf2, 0x78, 0x63, 0xe9, 0xf8, 0x3d, 0x40, 0x7d,
0x12, 0xd2, 0xc0, 0x3b, 0xcf, 0x25, 0xcf, 0x0d, 0xa8, 0x1c, 0x7b, 0x81, 0x29, 0x0e, 0x62, 0x0d,
0x8b, 0x01, 0x3b, 0x54, 0x19, 0x10, 0x89, 0x7d, 0x1b, 0xd0, 0x8e, 0xcb, 0x72, 0x4a, 0x3e, 0x43,
0xfc, 0xa6, 0x08, 0xd7, 0x33, 0xeb, 0xa5, 0x31, 0x16, 0x3f, 0x87, 0x2c, 0x30, 0x45, 0xa1, 0x38,
0x87, 0x68, 0x1f, 0xaa, 0x62, 0x85, 0xd4, 0xe4, 0xdd, 0x39, 0x80, 0x44, 0x9a, 0x92, 0x70, 0x12,
0xe6, 0x4a, 0xa7, 0x2f, 0xfd, 0xb7, 0x9d, 0x5e, 0x89, 0xbf, 0x23, 0x7c, 0xae, 0xfe, 0xbe, 0x0f,
0xd7, 0x52, 0x8b, 0xa5, 0xf2, 0x1e, 0x42, 0x25, 0x64, 0x04, 0xa9, 0xbd, 0x77, 0xe6, 0xd4, 0x5e,
0x88, 0x05, 0xbb, 0x7a, 0x5d, 0x80, 0x6b, 0xa7, 0xc4, 0x4d, 0x44, 0x51, 0xfb, 0x70, 0x6d, 0xc8,
0x5d, 0x2b, 0x97, 0xef, 0xcc, 0xdc, 0xb2, 0x98, 0x71, 0xcb, 0x1b, 0x80, 0xd2, 0x28, 0xd2, 0x79,
0xce, 0x61, 0x4d, 0x3b, 0x23, 0x66, 0x2e, 0xe4, 0x16, 0x2c, 0x9b, 0x9e, 0xe3, 0x18, 0xae, 0xd5,
0x2a, 0xde, 0x2a, 0xad, 0xd7, 0x71, 0x3c, 0x4c, 0x9f, 0x9f, 0x52, 0xde, 0xf3, 0xa3, 0xfe, 0xba,
0x00, 0xca, 0x6c, 0x6f, 0xa9, 0x48, 0x26, 0x3d, 0xb5, 0x18, 0x10, 0xdb, 0x7b, 0x05, 0xcb, 0x91,
0xa4, 0xc7, 0x47, 0x5c, 0xd0, 0x49, 0x10, 0xa4, 0x42, 0x48, 0xe9, 0x05, 0x43, 0x88, 0xfa, 0xcf,
0x02, 0xa0, 0xcb, 0x85, 0x12, 0x7a, 0x1d, 0x56, 0x42, 0xe2, 0x5a, 0xba, 0x50, 0xa3, 0xb0, 0x70,
0x0d, 0x37, 0x18, 0x4d, 0xe8, 0x33, 0x44, 0x08, 0xca, 0xe4, 0x8c, 0x98, 0xf2, 0xb4, 0xf2, 0xff,
0x68, 0x02, 0x2b, 0xc7, 0xa1, 0x6e, 0x87, 0xde, 0xd4, 0x48, 0x2a, 0x8a, 0xe6, 0xa6, 0xb6, 0x70,
0xc1, 0xd6, 0x79, 0x38, 0xdc, 0x89, 0xc1, 0x70, 0xe3, 0x38, 0x4c, 0x06, 0x6a, 0x07, 0x1a, 0xa9,
0x39, 0x54, 0x83, 0xf2, 0x60, 0x7f, 0xa0, 0x29, 0x4b, 0x08, 0xa0, 0xda, 0xdb, 0xc6, 0xfb, 0xfb,
0x23, 0x11, 0xb5, 0x77, 0xf6, 0xba, 0x5b, 0x9a, 0x52, 0x54, 0xff, 0x58, 0x05, 0x98, 0xa5, 0x4f,
0xd4, 0x84, 0x62, 0x62, 0xe9, 0xa2, 0x6d, 0xb1, 0x8f, 0x71, 0x0d, 0x87, 0x48, 0xef, 0xe1, 0xff,
0xd1, 0x26, 0xdc, 0x74, 0xc2, 0xb1, 0x6f, 0x98, 0x27, 0xba, 0xcc, 0x7a, 0x26, 0x67, 0xe6, 0x5f,
0xb5, 0x82, 0xaf, 0xcb, 0x49, 0x29, 0xb5, 0xc0, 0xdd, 0x85, 0x12, 0x71, 0x4f, 0x5b, 0x65, 0x5e,
0x1d, 0x3e, 0x98, 0x3b, 0xad, 0x77, 0x34, 0xf7, 0x54, 0x54, 0x83, 0x0c, 0x06, 0xe9, 0x00, 0x16,
0x39, 0xb5, 0x4d, 0xa2, 0x33, 0xd0, 0x0a, 0x07, 0xfd, 0x78, 0x7e, 0xd0, 0x3e, 0xc7, 0x48, 0xa0,
0xeb, 0x56, 0x3c, 0x46, 0x03, 0xa8, 0x07, 0x24, 0xf4, 0xa2, 0xc0, 0x24, 0x61, 0xab, 0x3a, 0xd7,
0x29, 0xc6, 0x31, 0x1f, 0x9e, 0x41, 0xa0, 0x3e, 0x54, 0x1d, 0x2f, 0x72, 0x69, 0xd8, 0x5a, 0xe6,
0xc2, 0xbe, 0x9d, 0x13, 0x6c, 0x8f, 0x31, 0x61, 0xc9, 0x8b, 0xb6, 0x60, 0x59, 0x88, 0x18, 0xb6,
0x6a, 0x1c, 0xe6, 0x76, 0x5e, 0x07, 0xe2, 0x5c, 0x38, 0xe6, 0x66, 0x56, 0x8d, 0x42, 0x12, 0xb4,
0xea, 0xc2, 0xaa, 0xec, 0x3f, 0x7a, 0x15, 0xea, 0xc6, 0x74, 0xea, 0x99, 0xba, 0x65, 0x07, 0x2d,
0xe0, 0x13, 0x35, 0x4e, 0xe8, 0xdb, 0x01, 0x7a, 0x0d, 0x1a, 0xe2, 0xe8, 0xe9, 0xbe, 0x41, 0x27,
0xad, 0x06, 0x9f, 0x06, 0x41, 0x3a, 0x30, 0xe8, 0x44, 0x2e, 0x20, 0x41, 0x20, 0x16, 0xac, 0x24,
0x0b, 0x48, 0x10, 0xf0, 0x05, 0xff, 0x07, 0x6b, 0x3c, 0x8e, 0x8c, 0x03, 0x2f, 0xf2, 0x75, 0xee,
0x53, 0xab, 0x7c, 0xd1, 0x2a, 0x23, 0x6f, 0x31, 0xea, 0x80, 0x39, 0xd7, 0x2b, 0x50, 0x7b, 0xea,
0x1d, 0x89, 0x05, 0x4d, 0xbe, 0x60, 0xf9, 0xa9, 0x77, 0x14, 0x4f, 0x09, 0x09, 0x6d, 0xab, 0xb5,
0x26, 0xa6, 0xf8, 0x78, 0xc7, 0x6a, 0xdf, 0x81, 0x5a, 0x6c, 0xc6, 0x2b, 0x2a, 0xf0, 0x1b, 0xe9,
0x0a, 0xbc, 0x9e, 0x2a, 0xa7, 0xdb, 0xef, 0x43, 0x33, 0xeb, 0x04, 0xf3, 0x70, 0xab, 0x7f, 0x2b,
0x40, 0x3d, 0x31, 0x37, 0x72, 0xe1, 0x3a, 0x17, 0xc7, 0xa0, 0xc4, 0xd2, 0x67, 0xde, 0x23, 0x72,
0xc0, 0x07, 0x39, 0x2d, 0xd5, 0x8d, 0x11, 0x64, 0x1c, 0x94, 0xae, 0x84, 0x12, 0xe4, 0xd9, 0x7e,
0x5f, 0xc0, 0xda, 0xd4, 0x76, 0xa3, 0xb3, 0xd4, 0x5e, 0x22, 0xc9, 0xfe, 0x7f, 0xce, 0xbd, 0x76,
0x19, 0xf7, 0x6c, 0x8f, 0xe6, 0x34, 0x33, 0x56, 0xbf, 0x2e, 0xc2, 0x4b, 0x57, 0x8b, 0x83, 0x06,
0x50, 0x32, 0xfd, 0x48, 0x7e, 0xda, 0xfb, 0xf3, 0x7e, 0x5a, 0xcf, 0x8f, 0x66, 0xbb, 0x32, 0x20,
0x56, 0x98, 0x3b, 0xc4, 0xf1, 0x82, 0x73, 0xf9, 0x05, 0x1f, 0xcd, 0x0b, 0xb9, 0xc7, 0xb9, 0x67,
0xa8, 0x12, 0x0e, 0x61, 0xa8, 0xc9, 0xf4, 0x1e, 0xca, 0x30, 0x31, 0x67, 0x99, 0x10, 0x43, 0xe2,
0x04, 0x47, 0xbd, 0x03, 0x37, 0xaf, 0xfc, 0x14, 0xf4, 0x3f, 0x00, 0xa6, 0x1f, 0xe9, 0xfc, 0x1a,
0x27, 0xec, 0x5e, 0xc2, 0x75, 0xd3, 0x8f, 0x86, 0x9c, 0xa0, 0xde, 0x85, 0xd6, 0xb3, 0xe4, 0x65,
0x87, 0x4f, 0x48, 0xac, 0x3b, 0x47, 0x5c, 0x07, 0x25, 0x5c, 0x13, 0x84, 0xbd, 0x23, 0xf5, 0xb7,
0x45, 0x58, 0xbb, 0x20, 0x0e, 0xcb, 0x80, 0xe2, 0x30, 0xc7, 0x59, 0x59, 0x8c, 0xd8, 0xc9, 0x36,
0x6d, 0x2b, 0x2e, 0x7d, 0xf9, 0x7f, 0x1e, 0xd3, 0x7d, 0x59, 0x96, 0x16, 0x6d, 0x9f, 0x39, 0xb4,
0x73, 0x64, 0xd3, 0x90, 0xdf, 0x16, 0x2a, 0x58, 0x0c, 0xd0, 0x13, 0x68, 0x06, 0x24, 0x24, 0xc1,
0x29, 0xb1, 0x74, 0xdf, 0x0b, 0x68, 0xac, 0xb0, 0xcd, 0xf9, 0x14, 0x76, 0xe0, 0x05, 0x14, 0xaf,
0xc6, 0x48, 0x6c, 0x14, 0xa2, 0xc7, 0xb0, 0x6a, 0x9d, 0xbb, 0x86, 0x63, 0x9b, 0x12, 0xb9, 0xba,
0x30, 0xf2, 0x8a, 0x04, 0xe2, 0xc0, 0xec, 0x36, 0x9c, 0x9a, 0x64, 0x1f, 0x36, 0x35, 0x8e, 0xc8,
0x54, 0xea, 0x44, 0x0c, 0xb2, 0xe7, 0xb7, 0x22, 0xcf, 0xaf, 0xfa, 0xfb, 0x22, 0x34, 0xb3, 0x07,
0x20, 0xb6, 0x9f, 0x4f, 0x02, 0xdb, 0xb3, 0x52, 0xf6, 0x3b, 0xe0, 0x04, 0x66, 0x23, 0x36, 0xfd,
0x65, 0xe4, 0x51, 0x23, 0xb6, 0x91, 0xe9, 0x47, 0xdf, 0x65, 0xe3, 0x0b, 0xb6, 0x2f, 0x5d, 0xb0,
0x3d, 0x7a, 0x1b, 0x90, 0xb4, 0xef, 0xd4, 0x76, 0x6c, 0xaa, 0x1f, 0x9d, 0x53, 0x22, 0xf4, 0x5f,
0xc2, 0x8a, 0x98, 0xd9, 0x65, 0x13, 0x9f, 0x30, 0x3a, 0x52, 0x61, 0xd5, 0xf3, 0x1c, 0x3d, 0x34,
0xbd, 0x80, 0xe8, 0x86, 0xf5, 0xb4, 0x55, 0xe1, 0x0b, 0x1b, 0x9e, 0xe7, 0x0c, 0x19, 0xad, 0x6b,
0x3d, 0x65, 0x01, 0xd7, 0xf4, 0xa3, 0x90, 0x50, 0x9d, 0xfd, 0xf0, 0x1c, 0x55, 0xc7, 0x20, 0x48,
0x3d, 0x3f, 0x0a, 0x53, 0x0b, 0x1c, 0xe2, 0xb0, 0xbc, 0x93, 0x5a, 0xb0, 0x47, 0x1c, 0xb6, 0xcb,
0xca, 0x01, 0x09, 0x4c, 0xe2, 0xd2, 0x91, 0x6d, 0x9e, 0xb0, 0x94, 0x52, 0x58, 0x2f, 0xe0, 0x0c,
0x4d, 0xfd, 0x1c, 0x2a, 0x3c, 0x05, 0xb1, 0x8f, 0xe7, 0xe1, 0x9b, 0x47, 0x77, 0xa1, 0xde, 0x1a,
0x23, 0xf0, 0xd8, 0xfe, 0x2a, 0xd4, 0x27, 0x5e, 0x28, 0x73, 0x83, 0xf0, 0xbc, 0x1a, 0x23, 0xf0,
0xc9, 0x36, 0xd4, 0x02, 0x62, 0x58, 0x9e, 0x3b, 0x3d, 0xe7, 0x7a, 0xa9, 0xe1, 0x64, 0xac, 0x7e,
0x09, 0x55, 0x11, 0x7e, 0x5f, 0x00, 0xff, 0x36, 0x20, 0x53, 0x24, 0x15, 0x9f, 0x04, 0x8e, 0x1d,
0x86, 0xb6, 0xe7, 0x86, 0xf1, 0x93, 0x8d, 0x98, 0x39, 0x98, 0x4d, 0xa8, 0x7f, 0x29, 0x88, 0x7a,
0x47, 0x5c, 0xa6, 0x59, 0xc5, 0x28, 0x8b, 0x97, 0x85, 0x5f, 0x1c, 0x24, 0x40, 0x5c, 0xf5, 0x13,
0xf9, 0x34, 0x35, 0x6f, 0xd5, 0x4f, 0x44, 0xd5, 0x4f, 0x58, 0x89, 0x29, 0xcb, 0x2a, 0x01, 0x27,
0xaa, 0xaa, 0x86, 0x95, 0x5c, 0x87, 0x88, 0xfa, 0xaf, 0x42, 0x12, 0x11, 0xe2, 0x6b, 0x0b, 0xfa,
0x02, 0x6a, 0xec, 0x70, 0xe9, 0x8e, 0xe1, 0xcb, 0x47, 0xb8, 0xde, 0x62, 0x37, 0xa2, 0x0e, 0x3b,
0x4b, 0x7b, 0x86, 0x2f, 0x8a, 0xa2, 0x65, 0x5f, 0x8c, 0x58, 0x64, 0x31, 0xac, 0x59, 0x64, 0x61,
0xff, 0xd1, 0x1b, 0xd0, 0x34, 0x22, 0xea, 0xe9, 0x86, 0x75, 0x4a, 0x02, 0x6a, 0x87, 0x44, 0x5a,
0x78, 0x95, 0x51, 0xbb, 0x31, 0xb1, 0xfd, 0x00, 0x56, 0xd2, 0x98, 0xcf, 0xcb, 0xb1, 0x95, 0x74,
0x8e, 0xfd, 0x21, 0xc0, 0xac, 0x3a, 0x67, 0x9e, 0x40, 0xce, 0x6c, 0xaa, 0x9b, 0x9e, 0x25, 0x22,
0x5f, 0x05, 0xd7, 0x18, 0xa1, 0xe7, 0x59, 0xe4, 0xc2, 0x5d, 0xa7, 0x12, 0xdf, 0x75, 0xd8, 0xd9,
0x64, 0xc7, 0xe9, 0xc4, 0x9e, 0x4e, 0x89, 0x25, 0x25, 0xac, 0x7b, 0x9e, 0xf3, 0x88, 0x13, 0xd4,
0x6f, 0x8a, 0xc2, 0x23, 0xc4, 0x4d, 0x33, 0x57, 0x05, 0x9c, 0x98, 0xba, 0xf4, 0x62, 0xa6, 0xbe,
0x0f, 0x10, 0x52, 0x23, 0x60, 0x05, 0x83, 0x41, 0xe5, 0xe3, 0x4d, 0xfb, 0xd2, 0x65, 0x69, 0x14,
0x3f, 0x98, 0xe3, 0xba, 0x5c, 0xdd, 0xa5, 0xe8, 0x03, 0x58, 0x31, 0x3d, 0xc7, 0x9f, 0x12, 0xc9,
0x5c, 0x79, 0x2e, 0x73, 0x23, 0x59, 0xdf, 0xa5, 0xa9, 0x9b, 0x52, 0xf5, 0x45, 0x6f, 0x4a, 0x7f,
0x2a, 0x88, 0x0b, 0x73, 0xfa, 0xbe, 0x8e, 0xc6, 0x57, 0x3c, 0x0a, 0x6f, 0x2d, 0x78, 0xf9, 0xff,
0xb6, 0x17, 0xe1, 0xf6, 0x07, 0x79, 0x9e, 0x60, 0x9f, 0x5d, 0xc2, 0xfd, 0xb9, 0x04, 0xf5, 0xe4,
0xde, 0x7d, 0xc9, 0xf6, 0xf7, 0xa0, 0x9e, 0x74, 0x2b, 0x64, 0x69, 0xf2, 0xad, 0xe6, 0x49, 0x16,
0xa3, 0x63, 0x40, 0xc6, 0x78, 0x9c, 0x94, 0x66, 0x7a, 0x14, 0x1a, 0xe3, 0xf8, 0xa5, 0xe2, 0xde,
0x1c, 0x7a, 0x88, 0xb3, 0xd3, 0x21, 0xe3, 0xc7, 0x8a, 0x31, 0x1e, 0x67, 0x28, 0xe8, 0x47, 0x70,
0x33, 0xbb, 0x87, 0x7e, 0x74, 0xae, 0xfb, 0xb6, 0x25, 0x6f, 0x5a, 0xdb, 0xf3, 0x3e, 0x3d, 0x74,
0x32, 0xf0, 0x9f, 0x9c, 0x1f, 0xd8, 0x96, 0xd0, 0x39, 0x0a, 0x2e, 0x4d, 0xb4, 0x7f, 0x02, 0x2f,
0x3f, 0x63, 0xf9, 0x15, 0x36, 0x18, 0x64, 0x9f, 0xc1, 0x17, 0x57, 0x42, 0xca, 0x7a, 0xbf, 0x2b,
0x88, 0x17, 0x92, 0xac, 0x4e, 0xba, 0xe9, 0xea, 0x74, 0x23, 0xe7, 0x3e, 0xbd, 0x83, 0x43, 0x01,
0xcf, 0x0b, 0xd2, 0x4f, 0x2f, 0x14, 0xa4, 0x79, 0x4b, 0x15, 0x51, 0xd7, 0x09, 0x20, 0x89, 0xa0,
0xfe, 0xa1, 0x04, 0xb5, 0x18, 0x9d, 0xdf, 0x93, 0xce, 0x43, 0x4a, 0x1c, 0xdd, 0x89, 0x43, 0x58,
0x01, 0x83, 0x20, 0xed, 0xb1, 0x20, 0xf6, 0x2a, 0xd4, 0xd9, 0x75, 0x4c, 0x4c, 0x17, 0xf9, 0x74,
0x8d, 0x11, 0xf8, 0xe4, 0x6b, 0xd0, 0xa0, 0x1e, 0x35, 0xa6, 0x3a, 0xe5, 0x19, 0xbb, 0x24, 0xb8,
0x39, 0x89, 0xe7, 0x6b, 0xf4, 0x16, 0x5c, 0xa3, 0x93, 0xc0, 0xa3, 0x74, 0xca, 0xaa, 0x38, 0x5e,
0xb7, 0x88, 0x32, 0xa3, 0x8c, 0x95, 0x64, 0x42, 0xd4, 0x33, 0x21, 0x8b, 0xde, 0xb3, 0xc5, 0xcc,
0x75, 0x79, 0x10, 0x29, 0xe3, 0xd5, 0x84, 0xca, 0x5c, 0x1b, 0xb5, 0x60, 0xd9, 0x17, 0x35, 0x01,
0x8f, 0x15, 0x05, 0x1c, 0x0f, 0x91, 0x0e, 0x6b, 0x0e, 0x31, 0xc2, 0x28, 0x20, 0x96, 0x7e, 0x6c,
0x93, 0xa9, 0x25, 0xae, 0xb7, 0xcd, 0xdc, 0x45, 0x76, 0xac, 0x96, 0xce, 0x43, 0xce, 0x8d, 0x9b,
0x31, 0x9c, 0x18, 0xb3, 0xfa, 0x40, 0xfc, 0x43, 0x6b, 0xd0, 0x18, 0x3e, 0x19, 0x8e, 0xb4, 0x3d,
0x7d, 0x6f, 0xbf, 0xaf, 0xc9, 0x4e, 0xc7, 0x50, 0xc3, 0x62, 0x58, 0x60, 0xf3, 0xa3, 0xfd, 0x51,
0x77, 0x57, 0x1f, 0xed, 0xf4, 0x1e, 0x0d, 0x95, 0x22, 0xba, 0x09, 0xd7, 0x46, 0xdb, 0x78, 0x7f,
0x34, 0xda, 0xd5, 0xfa, 0xfa, 0x81, 0x86, 0x77, 0xf6, 0xfb, 0x43, 0xa5, 0x84, 0x10, 0x34, 0x67,
0xe4, 0xd1, 0xce, 0x9e, 0xa6, 0x94, 0x51, 0x03, 0x96, 0x0f, 0x34, 0xdc, 0xd3, 0x06, 0x23, 0xa5,
0xa2, 0xfe, 0xb5, 0x08, 0x8d, 0x94, 0x15, 0x99, 0x23, 0x07, 0xa1, 0xa8, 0xe6, 0xcb, 0x98, 0xfd,
0x65, 0xc1, 0xc4, 0x34, 0xcc, 0x89, 0xb0, 0x4e, 0x19, 0x8b, 0x01, 0xaf, 0xe0, 0x8d, 0xb3, 0xd4,
0x39, 0x2f, 0xe3, 0x9a, 0x63, 0x9c, 0x09, 0x90, 0xd7, 0x61, 0xe5, 0x84, 0x04, 0x2e, 0x99, 0xca,
0x79, 0x61, 0x91, 0x86, 0xa0, 0x89, 0x25, 0xeb, 0xa0, 0xc8, 0x25, 0x33, 0x18, 0x61, 0x8e, 0xa6,
0xa0, 0xef, 0xc5, 0x60, 0x47, 0x97, 0xb5, 0x5e, 0xe5, 0x5a, 0xbf, 0x3f, 0xbf, 0x93, 0x3e, 0x4b,
0xf1, 0xc3, 0x44, 0xf1, 0xcb, 0x50, 0xc2, 0xf1, 0xa3, 0x7f, 0xaf, 0xdb, 0xdb, 0x66, 0xca, 0x5e,
0x85, 0xfa, 0x5e, 0xf7, 0x33, 0xfd, 0x70, 0xc8, 0x9f, 0x90, 0x90, 0x02, 0x2b, 0x8f, 0x34, 0x3c,
0xd0, 0x76, 0x25, 0xa5, 0x84, 0x6e, 0x80, 0x22, 0x29, 0xb3, 0x75, 0x65, 0xf5, 0x1f, 0x45, 0x58,
0x13, 0x71, 0x3d, 0x79, 0xd5, 0x7c, 0xf6, 0xf3, 0x62, 0xfa, 0xb2, 0x5f, 0xcc, 0x5c, 0xf6, 0x93,
0x5a, 0x91, 0xa7, 0xe5, 0xd2, 0xac, 0x56, 0xe4, 0x8f, 0x04, 0x99, 0x90, 0x5d, 0x9e, 0x27, 0x64,
0xb7, 0x60, 0xd9, 0x21, 0x61, 0xa2, 0xf8, 0x3a, 0x8e, 0x87, 0xc8, 0x86, 0x86, 0xe1, 0xba, 0x1e,
0xe5, 0x4f, 0x6a, 0xf1, 0xed, 0x65, 0x6b, 0xae, 0xc7, 0xbb, 0xe4, 0x8b, 0x3b, 0xdd, 0x19, 0x92,
0x88, 0xac, 0x69, 0xec, 0xf6, 0x87, 0xa0, 0x5c, 0x5c, 0x30, 0x4f, 0x3e, 0x7b, 0xf3, 0xdd, 0x59,
0x3a, 0x23, 0xcc, 0xb1, 0x0f, 0x07, 0x8f, 0x06, 0xfb, 0x8f, 0x07, 0xca, 0x12, 0x1b, 0xe0, 0xc3,
0xc1, 0x60, 0x67, 0xb0, 0xa5, 0x14, 0x10, 0x40, 0x55, 0xfb, 0x6c, 0x67, 0xa4, 0xf5, 0x95, 0xe2,
0xe6, 0xdf, 0x57, 0xa1, 0x2a, 0x84, 0x44, 0x5f, 0xcb, 0x54, 0x9e, 0xee, 0x72, 0xa3, 0x0f, 0xe7,
0x2e, 0x89, 0x33, 0x9d, 0xf3, 0xf6, 0x47, 0x0b, 0xf3, 0xcb, 0x57, 0xe9, 0x25, 0xf4, 0xab, 0x02,
0xac, 0x64, 0x9e, 0x61, 0xf3, 0xbe, 0x20, 0x5e, 0xd1, 0x54, 0x6f, 0x7f, 0x67, 0x21, 0xde, 0x44,
0x96, 0x5f, 0x16, 0xa0, 0x91, 0x6a, 0x27, 0xa3, 0xfb, 0x8b, 0xb4, 0xa0, 0x85, 0x24, 0x0f, 0x16,
0xef, 0x5e, 0xab, 0x4b, 0xef, 0x14, 0xd0, 0x2f, 0x0a, 0xd0, 0x48, 0x35, 0x56, 0x73, 0x8b, 0x72,
0xb9, 0x0d, 0x9c, 0x5b, 0x94, 0xab, 0xfa, 0xb8, 0x4b, 0xe8, 0xa7, 0x05, 0xa8, 0x27, 0x4d, 0x52,
0x74, 0x77, 0xfe, 0xb6, 0xaa, 0x10, 0xe2, 0xde, 0xa2, 0xfd, 0x58, 0x75, 0x09, 0xfd, 0x18, 0x6a,
0x71, 0x47, 0x11, 0xe5, 0x4d, 0x3f, 0x17, 0xda, 0x95, 0xed, 0xbb, 0x73, 0xf3, 0xa5, 0xb7, 0x8f,
0xdb, 0x7c, 0xb9, 0xb7, 0xbf, 0xd0, 0x90, 0x6c, 0xdf, 0x9d, 0x9b, 0x2f, 0xd9, 0x9e, 0x79, 0x42,
0xaa, 0x1b, 0x98, 0xdb, 0x13, 0x2e, 0xb7, 0x21, 0x73, 0x7b, 0xc2, 0x55, 0xcd, 0x47, 0x21, 0x48,
0xaa, 0x9f, 0x98, 0x5b, 0x90, 0xcb, 0x3d, 0xcb, 0xdc, 0x82, 0x5c, 0xd1, 0xbe, 0x94, 0x2e, 0x39,
0x2b, 0xec, 0xef, 0xce, 0xdd, 0x82, 0x9b, 0xd3, 0x25, 0x2f, 0x35, 0x01, 0xd5, 0x25, 0xf4, 0x33,
0xf9, 0xd4, 0x20, 0xfa, 0x77, 0x68, 0x1e, 0xa8, 0x4c, 0xcb, 0xaf, 0x7d, 0x67, 0xb1, 0x54, 0xc3,
0x63, 0xc4, 0xcf, 0x0b, 0x00, 0xb3, 0x4e, 0x5f, 0x6e, 0x21, 0x2e, 0xb5, 0x18, 0xdb, 0xf7, 0x17,
0xe0, 0x4c, 0x1f, 0x8f, 0xb8, 0xb9, 0x97, 0xfb, 0x78, 0x5c, 0xe8, 0x44, 0xe6, 0x3e, 0x1e, 0x17,
0xbb, 0x88, 0xea, 0xd2, 0x27, 0xcb, 0xdf, 0xab, 0x88, 0xdc, 0x5f, 0xe5, 0x3f, 0xef, 0xfd, 0x27,
0x00, 0x00, 0xff, 0xff, 0x33, 0x61, 0xdc, 0x03, 0x00, 0x27, 0x00, 0x00,
}

View File

@ -310,37 +310,43 @@ message TaskConfig {
// Env is the a set of key/value pairs to be set as environment variables
map<string, string> env = 4;
// DeviceEnv is the set of environment variables that are defined by device
// plugins. This allows the driver to differentiate environemnt variables
// set by the device plugins and those by the user. When populating the
// task's environment env should be used.
map<string, string> device_env = 5;
// Resources defines the resources to isolate
Resources resources = 5;
Resources resources = 6;
// Mounts is a list of targets to bind mount into the task directory
repeated Mount mounts = 6;
repeated Mount mounts = 7;
// Devices is a list of system devices to mount into the task's execution
// environment.
repeated Device devices = 7;
repeated Device devices = 8;
// User defines the operating system user the tasks should run as
string user = 8;
string user = 9;
// AllocDir is the directory on the host where the allocation directory
// exists.
string alloc_dir = 9;
string alloc_dir = 10;
// StdoutPath is the path to the file to open and write task stdout to
string stdout_path = 10;
string stdout_path = 11;
// StderrPath is the path to the file to open and write task stderr to
string stderr_path = 11;
string stderr_path = 12;
// TaskGroupName is the name of the task group which this task is a member of
string task_group_name = 12;
string task_group_name = 13;
// JobName is the name of the job of which this task is part of
string job_name = 13;
string job_name = 14;
// AllocId is the ID of the associated allocation
string alloc_id = 14;
string alloc_id = 15;
}
message Resources {

View File

@ -55,6 +55,7 @@ func taskConfigFromProto(pb *proto.TaskConfig) *TaskConfig {
TaskGroupName: pb.TaskGroupName,
Name: pb.Name,
Env: pb.Env,
DeviceEnv: pb.DeviceEnv,
rawDriverConfig: pb.MsgpackDriverConfig,
Resources: ResourcesFromProto(pb.Resources),
Devices: DevicesFromProto(pb.Devices),
@ -77,6 +78,7 @@ func taskConfigToProto(cfg *TaskConfig) *proto.TaskConfig {
TaskGroupName: cfg.TaskGroupName,
Name: cfg.Name,
Env: cfg.Env,
DeviceEnv: cfg.DeviceEnv,
Resources: ResourcesToProto(cfg.Resources),
Devices: DevicesToProto(cfg.Devices),
Mounts: MountsToProto(cfg.Mounts),