// Code generated by protoc-gen-go. DO NOT EDIT.
// source: chromiumos/bot_scaling.proto

package chromiumos

import (
	fmt "fmt"
	proto "github.com/golang/protobuf/proto"
	math "math"
)

// Reference imports to suppress errors if they are not otherwise used.
var _ = proto.Marshal
var _ = fmt.Errorf
var _ = math.Inf

// This is a compile-time assertion to ensure that this generated file
// is compatible with the proto package it is being compiled against.
// A compilation error at this line likely means your copy of the
// proto package needs to be updated.
const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package

// Specifies mode for a bot policy
type BotPolicy_Mode int32

const (
	BotPolicy_UNKNOWN_MODE BotPolicy_Mode = 0
	// Collect stats only for a bot group.
	BotPolicy_MONITORED BotPolicy_Mode = 1
	// Generate configuration updates for bot group.
	BotPolicy_CONFIGURED BotPolicy_Mode = 2
)

var BotPolicy_Mode_name = map[int32]string{
	0: "UNKNOWN_MODE",
	1: "MONITORED",
	2: "CONFIGURED",
}

var BotPolicy_Mode_value = map[string]int32{
	"UNKNOWN_MODE": 0,
	"MONITORED":    1,
	"CONFIGURED":   2,
}

func (x BotPolicy_Mode) String() string {
	return proto.EnumName(BotPolicy_Mode_name, int32(x))
}

func (BotPolicy_Mode) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_dbe70eabfd64e7ef, []int{2, 0}
}

// Specifies mode for a bot scaling
type BotPolicy_BotScalingMode int32

const (
	BotPolicy_UNKNOWN_SCALING_MODE BotPolicy_BotScalingMode = 0
	// Scale up or down bots by the step size associated with bot group..
	BotPolicy_STEPPED BotPolicy_BotScalingMode = 1
	// Scale up or down bots by the demand on the bot group.
	// For use on smaller bot groups that are susceptible to smaller increases.
	BotPolicy_DEMAND BotPolicy_BotScalingMode = 2
)

var BotPolicy_BotScalingMode_name = map[int32]string{
	0: "UNKNOWN_SCALING_MODE",
	1: "STEPPED",
	2: "DEMAND",
}

var BotPolicy_BotScalingMode_value = map[string]int32{
	"UNKNOWN_SCALING_MODE": 0,
	"STEPPED":              1,
	"DEMAND":               2,
}

func (x BotPolicy_BotScalingMode) String() string {
	return proto.EnumName(BotPolicy_BotScalingMode_name, int32(x))
}

func (BotPolicy_BotScalingMode) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_dbe70eabfd64e7ef, []int{2, 1}
}

// Specifies if there has been a change since the last iteration.
type ScalingAction_Actionable int32

const (
	ScalingAction_UNSPECIFIED ScalingAction_Actionable = 0
	// There is a change since last time.
	ScalingAction_YES ScalingAction_Actionable = 1
	// There is no change since last time.
	ScalingAction_NO ScalingAction_Actionable = 2
)

var ScalingAction_Actionable_name = map[int32]string{
	0: "UNSPECIFIED",
	1: "YES",
	2: "NO",
}

var ScalingAction_Actionable_value = map[string]int32{
	"UNSPECIFIED": 0,
	"YES":         1,
	"NO":          2,
}

func (x ScalingAction_Actionable) String() string {
	return proto.EnumName(ScalingAction_Actionable_name, int32(x))
}

func (ScalingAction_Actionable) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_dbe70eabfd64e7ef, []int{4, 0}
}

// Defines a type of bot associated with a bot group.
type BotType struct {
	// The string bot "shirt size" to be requested for the group.
	BotSize string `protobuf:"bytes,1,opt,name=bot_size,json=botSize,proto3" json:"bot_size,omitempty"`
	// The number of cores per bot. Will be used to limit quota usage.
	CoresPerBot int32 `protobuf:"varint,2,opt,name=cores_per_bot,json=coresPerBot,proto3" json:"cores_per_bot,omitempty"`
	// Estimated hourly cost.
	HourlyCost float32 `protobuf:"fixed32,3,opt,name=hourly_cost,json=hourlyCost,proto3" json:"hourly_cost,omitempty"`
	// Amount of memory in GB allocated to bot.
	MemoryGb             float32  `protobuf:"fixed32,4,opt,name=memory_gb,json=memoryGb,proto3" json:"memory_gb,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *BotType) Reset()         { *m = BotType{} }
func (m *BotType) String() string { return proto.CompactTextString(m) }
func (*BotType) ProtoMessage()    {}
func (*BotType) Descriptor() ([]byte, []int) {
	return fileDescriptor_dbe70eabfd64e7ef, []int{0}
}

func (m *BotType) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_BotType.Unmarshal(m, b)
}
func (m *BotType) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_BotType.Marshal(b, m, deterministic)
}
func (m *BotType) XXX_Merge(src proto.Message) {
	xxx_messageInfo_BotType.Merge(m, src)
}
func (m *BotType) XXX_Size() int {
	return xxx_messageInfo_BotType.Size(m)
}
func (m *BotType) XXX_DiscardUnknown() {
	xxx_messageInfo_BotType.DiscardUnknown(m)
}

var xxx_messageInfo_BotType proto.InternalMessageInfo

func (m *BotType) GetBotSize() string {
	if m != nil {
		return m.BotSize
	}
	return ""
}

func (m *BotType) GetCoresPerBot() int32 {
	if m != nil {
		return m.CoresPerBot
	}
	return 0
}

func (m *BotType) GetHourlyCost() float32 {
	if m != nil {
		return m.HourlyCost
	}
	return 0
}

func (m *BotType) GetMemoryGb() float32 {
	if m != nil {
		return m.MemoryGb
	}
	return 0
}

// Defines Swarming dimensions associated with a bot group.
type SwarmingDimension struct {
	// Dimesion name
	Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
	// Dimension value
	Value string `protobuf:"bytes,2,opt,name=value,proto3" json:"value,omitempty"`
	// Dimension multiple values
	Values               []string `protobuf:"bytes,3,rep,name=values,proto3" json:"values,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *SwarmingDimension) Reset()         { *m = SwarmingDimension{} }
func (m *SwarmingDimension) String() string { return proto.CompactTextString(m) }
func (*SwarmingDimension) ProtoMessage()    {}
func (*SwarmingDimension) Descriptor() ([]byte, []int) {
	return fileDescriptor_dbe70eabfd64e7ef, []int{1}
}

func (m *SwarmingDimension) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_SwarmingDimension.Unmarshal(m, b)
}
func (m *SwarmingDimension) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_SwarmingDimension.Marshal(b, m, deterministic)
}
func (m *SwarmingDimension) XXX_Merge(src proto.Message) {
	xxx_messageInfo_SwarmingDimension.Merge(m, src)
}
func (m *SwarmingDimension) XXX_Size() int {
	return xxx_messageInfo_SwarmingDimension.Size(m)
}
func (m *SwarmingDimension) XXX_DiscardUnknown() {
	xxx_messageInfo_SwarmingDimension.DiscardUnknown(m)
}

var xxx_messageInfo_SwarmingDimension proto.InternalMessageInfo

func (m *SwarmingDimension) GetName() string {
	if m != nil {
		return m.Name
	}
	return ""
}

func (m *SwarmingDimension) GetValue() string {
	if m != nil {
		return m.Value
	}
	return ""
}

func (m *SwarmingDimension) GetValues() []string {
	if m != nil {
		return m.Values
	}
	return nil
}

// Bot Policy to apply to a bot group.
type BotPolicy struct {
	// Bot group controlled by this policy, like, 'cq', 'postsubmit',...
	BotGroup string `protobuf:"bytes,1,opt,name=bot_group,json=botGroup,proto3" json:"bot_group,omitempty"`
	// The type of bot to be requested.
	BotType            *BotType                       `protobuf:"bytes,2,opt,name=bot_type,json=botType,proto3" json:"bot_type,omitempty"`
	ScalingRestriction *BotPolicy_ScalingRestriction  `protobuf:"bytes,3,opt,name=scaling_restriction,json=scalingRestriction,proto3" json:"scaling_restriction,omitempty"`
	RegionRestrictions []*BotPolicy_RegionRestriction `protobuf:"bytes,4,rep,name=region_restrictions,json=regionRestrictions,proto3" json:"region_restrictions,omitempty"`
	// A set of dimensions used to validate current Swarming allocations.
	SwarmingDimensions []*SwarmingDimension `protobuf:"bytes,5,rep,name=swarming_dimensions,json=swarmingDimensions,proto3" json:"swarming_dimensions,omitempty"`
	// Set whether a bot group should be configured or only monitored.
	PolicyMode BotPolicy_Mode `protobuf:"varint,6,opt,name=policy_mode,json=policyMode,proto3,enum=chromiumos.BotPolicy_Mode" json:"policy_mode,omitempty"`
	// Number of hours to lookback for Swarming stats.
	LookbackHours int32 `protobuf:"zigzag32,7,opt,name=lookback_hours,json=lookbackHours,proto3" json:"lookback_hours,omitempty"`
	// Set the scaling approach for the bot group being monitored.
	ScalingMode          BotPolicy_BotScalingMode `protobuf:"varint,8,opt,name=scaling_mode,json=scalingMode,proto3,enum=chromiumos.BotPolicy_BotScalingMode" json:"scaling_mode,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                 `json:"-"`
	XXX_unrecognized     []byte                   `json:"-"`
	XXX_sizecache        int32                    `json:"-"`
}

func (m *BotPolicy) Reset()         { *m = BotPolicy{} }
func (m *BotPolicy) String() string { return proto.CompactTextString(m) }
func (*BotPolicy) ProtoMessage()    {}
func (*BotPolicy) Descriptor() ([]byte, []int) {
	return fileDescriptor_dbe70eabfd64e7ef, []int{2}
}

func (m *BotPolicy) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_BotPolicy.Unmarshal(m, b)
}
func (m *BotPolicy) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_BotPolicy.Marshal(b, m, deterministic)
}
func (m *BotPolicy) XXX_Merge(src proto.Message) {
	xxx_messageInfo_BotPolicy.Merge(m, src)
}
func (m *BotPolicy) XXX_Size() int {
	return xxx_messageInfo_BotPolicy.Size(m)
}
func (m *BotPolicy) XXX_DiscardUnknown() {
	xxx_messageInfo_BotPolicy.DiscardUnknown(m)
}

var xxx_messageInfo_BotPolicy proto.InternalMessageInfo

func (m *BotPolicy) GetBotGroup() string {
	if m != nil {
		return m.BotGroup
	}
	return ""
}

func (m *BotPolicy) GetBotType() *BotType {
	if m != nil {
		return m.BotType
	}
	return nil
}

func (m *BotPolicy) GetScalingRestriction() *BotPolicy_ScalingRestriction {
	if m != nil {
		return m.ScalingRestriction
	}
	return nil
}

func (m *BotPolicy) GetRegionRestrictions() []*BotPolicy_RegionRestriction {
	if m != nil {
		return m.RegionRestrictions
	}
	return nil
}

func (m *BotPolicy) GetSwarmingDimensions() []*SwarmingDimension {
	if m != nil {
		return m.SwarmingDimensions
	}
	return nil
}

func (m *BotPolicy) GetPolicyMode() BotPolicy_Mode {
	if m != nil {
		return m.PolicyMode
	}
	return BotPolicy_UNKNOWN_MODE
}

func (m *BotPolicy) GetLookbackHours() int32 {
	if m != nil {
		return m.LookbackHours
	}
	return 0
}

func (m *BotPolicy) GetScalingMode() BotPolicy_BotScalingMode {
	if m != nil {
		return m.ScalingMode
	}
	return BotPolicy_UNKNOWN_SCALING_MODE
}

// Scaling restriction specifies the limits on how the group can be
// expanded or reduced.
type BotPolicy_ScalingRestriction struct {
	// Hard limit on the maximum number of bots to request.
	BotCeiling int32 `protobuf:"varint,1,opt,name=bot_ceiling,json=botCeiling,proto3" json:"bot_ceiling,omitempty"`
	// Hard limit on the minimum number of bots to request.
	BotFloor int32 `protobuf:"varint,2,opt,name=bot_floor,json=botFloor,proto3" json:"bot_floor,omitempty"`
	// Soft limit on the number of idle bots to maintain.
	MinIdle int32 `protobuf:"varint,3,opt,name=min_idle,json=minIdle,proto3" json:"min_idle,omitempty"`
	// Hard minimum limit on the absolute delta between request amount and
	// existing bot count.
	StepSize int32 `protobuf:"varint,4,opt,name=step_size,json=stepSize,proto3" json:"step_size,omitempty"`
	// Static number to request when demand is not accessible.
	BotFallback          int32    `protobuf:"varint,5,opt,name=bot_fallback,json=botFallback,proto3" json:"bot_fallback,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *BotPolicy_ScalingRestriction) Reset()         { *m = BotPolicy_ScalingRestriction{} }
func (m *BotPolicy_ScalingRestriction) String() string { return proto.CompactTextString(m) }
func (*BotPolicy_ScalingRestriction) ProtoMessage()    {}
func (*BotPolicy_ScalingRestriction) Descriptor() ([]byte, []int) {
	return fileDescriptor_dbe70eabfd64e7ef, []int{2, 0}
}

func (m *BotPolicy_ScalingRestriction) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_BotPolicy_ScalingRestriction.Unmarshal(m, b)
}
func (m *BotPolicy_ScalingRestriction) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_BotPolicy_ScalingRestriction.Marshal(b, m, deterministic)
}
func (m *BotPolicy_ScalingRestriction) XXX_Merge(src proto.Message) {
	xxx_messageInfo_BotPolicy_ScalingRestriction.Merge(m, src)
}
func (m *BotPolicy_ScalingRestriction) XXX_Size() int {
	return xxx_messageInfo_BotPolicy_ScalingRestriction.Size(m)
}
func (m *BotPolicy_ScalingRestriction) XXX_DiscardUnknown() {
	xxx_messageInfo_BotPolicy_ScalingRestriction.DiscardUnknown(m)
}

var xxx_messageInfo_BotPolicy_ScalingRestriction proto.InternalMessageInfo

func (m *BotPolicy_ScalingRestriction) GetBotCeiling() int32 {
	if m != nil {
		return m.BotCeiling
	}
	return 0
}

func (m *BotPolicy_ScalingRestriction) GetBotFloor() int32 {
	if m != nil {
		return m.BotFloor
	}
	return 0
}

func (m *BotPolicy_ScalingRestriction) GetMinIdle() int32 {
	if m != nil {
		return m.MinIdle
	}
	return 0
}

func (m *BotPolicy_ScalingRestriction) GetStepSize() int32 {
	if m != nil {
		return m.StepSize
	}
	return 0
}

func (m *BotPolicy_ScalingRestriction) GetBotFallback() int32 {
	if m != nil {
		return m.BotFallback
	}
	return 0
}

// A set of restrictions on the regions and how to distribute bots
// between them.
type BotPolicy_RegionRestriction struct {
	// Region of the bot sub-group.
	Region string `protobuf:"bytes,1,opt,name=region,proto3" json:"region,omitempty"`
	// Specific prefix of the bot sub-group.
	Prefix string `protobuf:"bytes,2,opt,name=prefix,proto3" json:"prefix,omitempty"`
	// Weight to be applied to this sub-group. The number of bots requested
	// from each region will be proportional to the weight unless a
	// quota limit is violated.
	Weight               float32  `protobuf:"fixed32,3,opt,name=weight,proto3" json:"weight,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *BotPolicy_RegionRestriction) Reset()         { *m = BotPolicy_RegionRestriction{} }
func (m *BotPolicy_RegionRestriction) String() string { return proto.CompactTextString(m) }
func (*BotPolicy_RegionRestriction) ProtoMessage()    {}
func (*BotPolicy_RegionRestriction) Descriptor() ([]byte, []int) {
	return fileDescriptor_dbe70eabfd64e7ef, []int{2, 1}
}

func (m *BotPolicy_RegionRestriction) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_BotPolicy_RegionRestriction.Unmarshal(m, b)
}
func (m *BotPolicy_RegionRestriction) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_BotPolicy_RegionRestriction.Marshal(b, m, deterministic)
}
func (m *BotPolicy_RegionRestriction) XXX_Merge(src proto.Message) {
	xxx_messageInfo_BotPolicy_RegionRestriction.Merge(m, src)
}
func (m *BotPolicy_RegionRestriction) XXX_Size() int {
	return xxx_messageInfo_BotPolicy_RegionRestriction.Size(m)
}
func (m *BotPolicy_RegionRestriction) XXX_DiscardUnknown() {
	xxx_messageInfo_BotPolicy_RegionRestriction.DiscardUnknown(m)
}

var xxx_messageInfo_BotPolicy_RegionRestriction proto.InternalMessageInfo

func (m *BotPolicy_RegionRestriction) GetRegion() string {
	if m != nil {
		return m.Region
	}
	return ""
}

func (m *BotPolicy_RegionRestriction) GetPrefix() string {
	if m != nil {
		return m.Prefix
	}
	return ""
}

func (m *BotPolicy_RegionRestriction) GetWeight() float32 {
	if m != nil {
		return m.Weight
	}
	return 0
}

// Configures the root message.
type BotPolicyCfg struct {
	// All bot policies.
	BotPolicies          []*BotPolicy `protobuf:"bytes,1,rep,name=bot_policies,json=botPolicies,proto3" json:"bot_policies,omitempty"`
	XXX_NoUnkeyedLiteral struct{}     `json:"-"`
	XXX_unrecognized     []byte       `json:"-"`
	XXX_sizecache        int32        `json:"-"`
}

func (m *BotPolicyCfg) Reset()         { *m = BotPolicyCfg{} }
func (m *BotPolicyCfg) String() string { return proto.CompactTextString(m) }
func (*BotPolicyCfg) ProtoMessage()    {}
func (*BotPolicyCfg) Descriptor() ([]byte, []int) {
	return fileDescriptor_dbe70eabfd64e7ef, []int{3}
}

func (m *BotPolicyCfg) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_BotPolicyCfg.Unmarshal(m, b)
}
func (m *BotPolicyCfg) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_BotPolicyCfg.Marshal(b, m, deterministic)
}
func (m *BotPolicyCfg) XXX_Merge(src proto.Message) {
	xxx_messageInfo_BotPolicyCfg.Merge(m, src)
}
func (m *BotPolicyCfg) XXX_Size() int {
	return xxx_messageInfo_BotPolicyCfg.Size(m)
}
func (m *BotPolicyCfg) XXX_DiscardUnknown() {
	xxx_messageInfo_BotPolicyCfg.DiscardUnknown(m)
}

var xxx_messageInfo_BotPolicyCfg proto.InternalMessageInfo

func (m *BotPolicyCfg) GetBotPolicies() []*BotPolicy {
	if m != nil {
		return m.BotPolicies
	}
	return nil
}

// Scaling Action that resulted because of bot demand.
type ScalingAction struct {
	// Bot group modified by the action. Should be the same as BotPolicy.
	BotGroup string `protobuf:"bytes,1,opt,name=bot_group,json=botGroup,proto3" json:"bot_group,omitempty"`
	// The type of bot requested. Should be the same as BotPolicy.
	BotType *BotType `protobuf:"bytes,2,opt,name=bot_type,json=botType,proto3" json:"bot_type,omitempty"`
	// Whether there has been a change in the number of bots requested
	// for this bot group. See step_size for more info.
	Actionable ScalingAction_Actionable `protobuf:"varint,3,opt,name=actionable,proto3,enum=chromiumos.ScalingAction_Actionable" json:"actionable,omitempty"`
	// Total number of bots requested for the group.
	BotsRequested   int32                           `protobuf:"varint,4,opt,name=bots_requested,json=botsRequested,proto3" json:"bots_requested,omitempty"`
	RegionalActions []*ScalingAction_RegionalAction `protobuf:"bytes,5,rep,name=regional_actions,json=regionalActions,proto3" json:"regional_actions,omitempty"`
	// Estimated savings based on current run.
	// Based on current number of bots compared against the max.
	EstimatedSavings     float32  `protobuf:"fixed32,6,opt,name=estimated_savings,json=estimatedSavings,proto3" json:"estimated_savings,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *ScalingAction) Reset()         { *m = ScalingAction{} }
func (m *ScalingAction) String() string { return proto.CompactTextString(m) }
func (*ScalingAction) ProtoMessage()    {}
func (*ScalingAction) Descriptor() ([]byte, []int) {
	return fileDescriptor_dbe70eabfd64e7ef, []int{4}
}

func (m *ScalingAction) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_ScalingAction.Unmarshal(m, b)
}
func (m *ScalingAction) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_ScalingAction.Marshal(b, m, deterministic)
}
func (m *ScalingAction) XXX_Merge(src proto.Message) {
	xxx_messageInfo_ScalingAction.Merge(m, src)
}
func (m *ScalingAction) XXX_Size() int {
	return xxx_messageInfo_ScalingAction.Size(m)
}
func (m *ScalingAction) XXX_DiscardUnknown() {
	xxx_messageInfo_ScalingAction.DiscardUnknown(m)
}

var xxx_messageInfo_ScalingAction proto.InternalMessageInfo

func (m *ScalingAction) GetBotGroup() string {
	if m != nil {
		return m.BotGroup
	}
	return ""
}

func (m *ScalingAction) GetBotType() *BotType {
	if m != nil {
		return m.BotType
	}
	return nil
}

func (m *ScalingAction) GetActionable() ScalingAction_Actionable {
	if m != nil {
		return m.Actionable
	}
	return ScalingAction_UNSPECIFIED
}

func (m *ScalingAction) GetBotsRequested() int32 {
	if m != nil {
		return m.BotsRequested
	}
	return 0
}

func (m *ScalingAction) GetRegionalActions() []*ScalingAction_RegionalAction {
	if m != nil {
		return m.RegionalActions
	}
	return nil
}

func (m *ScalingAction) GetEstimatedSavings() float32 {
	if m != nil {
		return m.EstimatedSavings
	}
	return 0
}

// How the bot requests are distributed between regions & prefixes.
type ScalingAction_RegionalAction struct {
	// Region of the bot sub-group.
	Region string `protobuf:"bytes,1,opt,name=region,proto3" json:"region,omitempty"`
	// Specific prefix of the bot sub-group.
	Prefix string `protobuf:"bytes,2,opt,name=prefix,proto3" json:"prefix,omitempty"`
	// Number of bots requested from the sub-group.
	BotsRequested        int32    `protobuf:"varint,3,opt,name=bots_requested,json=botsRequested,proto3" json:"bots_requested,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *ScalingAction_RegionalAction) Reset()         { *m = ScalingAction_RegionalAction{} }
func (m *ScalingAction_RegionalAction) String() string { return proto.CompactTextString(m) }
func (*ScalingAction_RegionalAction) ProtoMessage()    {}
func (*ScalingAction_RegionalAction) Descriptor() ([]byte, []int) {
	return fileDescriptor_dbe70eabfd64e7ef, []int{4, 0}
}

func (m *ScalingAction_RegionalAction) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_ScalingAction_RegionalAction.Unmarshal(m, b)
}
func (m *ScalingAction_RegionalAction) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_ScalingAction_RegionalAction.Marshal(b, m, deterministic)
}
func (m *ScalingAction_RegionalAction) XXX_Merge(src proto.Message) {
	xxx_messageInfo_ScalingAction_RegionalAction.Merge(m, src)
}
func (m *ScalingAction_RegionalAction) XXX_Size() int {
	return xxx_messageInfo_ScalingAction_RegionalAction.Size(m)
}
func (m *ScalingAction_RegionalAction) XXX_DiscardUnknown() {
	xxx_messageInfo_ScalingAction_RegionalAction.DiscardUnknown(m)
}

var xxx_messageInfo_ScalingAction_RegionalAction proto.InternalMessageInfo

func (m *ScalingAction_RegionalAction) GetRegion() string {
	if m != nil {
		return m.Region
	}
	return ""
}

func (m *ScalingAction_RegionalAction) GetPrefix() string {
	if m != nil {
		return m.Prefix
	}
	return ""
}

func (m *ScalingAction_RegionalAction) GetBotsRequested() int32 {
	if m != nil {
		return m.BotsRequested
	}
	return 0
}

// ResourceUsage based on the current resources assigned.
type ResourceUsage struct {
	// Number of VMs allocated across all bot groups.
	Vms int32 `protobuf:"varint,1,opt,name=vms,proto3" json:"vms,omitempty"`
	// Number of CPUs allocated across all bot groups.
	Cpus float32 `protobuf:"fixed32,2,opt,name=cpus,proto3" json:"cpus,omitempty"`
	// Amount of memory in GB allocated across all bot groups.
	MemoryGb             float32  `protobuf:"fixed32,3,opt,name=memory_gb,json=memoryGb,proto3" json:"memory_gb,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *ResourceUsage) Reset()         { *m = ResourceUsage{} }
func (m *ResourceUsage) String() string { return proto.CompactTextString(m) }
func (*ResourceUsage) ProtoMessage()    {}
func (*ResourceUsage) Descriptor() ([]byte, []int) {
	return fileDescriptor_dbe70eabfd64e7ef, []int{5}
}

func (m *ResourceUsage) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_ResourceUsage.Unmarshal(m, b)
}
func (m *ResourceUsage) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_ResourceUsage.Marshal(b, m, deterministic)
}
func (m *ResourceUsage) XXX_Merge(src proto.Message) {
	xxx_messageInfo_ResourceUsage.Merge(m, src)
}
func (m *ResourceUsage) XXX_Size() int {
	return xxx_messageInfo_ResourceUsage.Size(m)
}
func (m *ResourceUsage) XXX_DiscardUnknown() {
	xxx_messageInfo_ResourceUsage.DiscardUnknown(m)
}

var xxx_messageInfo_ResourceUsage proto.InternalMessageInfo

func (m *ResourceUsage) GetVms() int32 {
	if m != nil {
		return m.Vms
	}
	return 0
}

func (m *ResourceUsage) GetCpus() float32 {
	if m != nil {
		return m.Cpus
	}
	return 0
}

func (m *ResourceUsage) GetMemoryGb() float32 {
	if m != nil {
		return m.MemoryGb
	}
	return 0
}

// Resource utilization based on regional assignment.
type ResourceUtilization struct {
	// Region of the bot sub-group.
	Region string `protobuf:"bytes,1,opt,name=region,proto3" json:"region,omitempty"`
	// Number of VMs allocated across all bot groups.
	Vms int32 `protobuf:"varint,2,opt,name=vms,proto3" json:"vms,omitempty"`
	// Number of CPUs allocated across all bot groups.
	Cpus float32 `protobuf:"fixed32,3,opt,name=cpus,proto3" json:"cpus,omitempty"`
	// Amount of memory in GB allocated across all bot groups.
	MemoryGb float32 `protobuf:"fixed32,4,opt,name=memory_gb,json=memoryGb,proto3" json:"memory_gb,omitempty"`
	// Amount of disk in GB allocated across all bot groups.
	DiskGb float32 `protobuf:"fixed32,5,opt,name=disk_gb,json=diskGb,proto3" json:"disk_gb,omitempty"`
	// NUmber of CPUs that could be allocated based on max values.
	MaxCpus              float32  `protobuf:"fixed32,6,opt,name=max_cpus,json=maxCpus,proto3" json:"max_cpus,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *ResourceUtilization) Reset()         { *m = ResourceUtilization{} }
func (m *ResourceUtilization) String() string { return proto.CompactTextString(m) }
func (*ResourceUtilization) ProtoMessage()    {}
func (*ResourceUtilization) Descriptor() ([]byte, []int) {
	return fileDescriptor_dbe70eabfd64e7ef, []int{6}
}

func (m *ResourceUtilization) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_ResourceUtilization.Unmarshal(m, b)
}
func (m *ResourceUtilization) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_ResourceUtilization.Marshal(b, m, deterministic)
}
func (m *ResourceUtilization) XXX_Merge(src proto.Message) {
	xxx_messageInfo_ResourceUtilization.Merge(m, src)
}
func (m *ResourceUtilization) XXX_Size() int {
	return xxx_messageInfo_ResourceUtilization.Size(m)
}
func (m *ResourceUtilization) XXX_DiscardUnknown() {
	xxx_messageInfo_ResourceUtilization.DiscardUnknown(m)
}

var xxx_messageInfo_ResourceUtilization proto.InternalMessageInfo

func (m *ResourceUtilization) GetRegion() string {
	if m != nil {
		return m.Region
	}
	return ""
}

func (m *ResourceUtilization) GetVms() int32 {
	if m != nil {
		return m.Vms
	}
	return 0
}

func (m *ResourceUtilization) GetCpus() float32 {
	if m != nil {
		return m.Cpus
	}
	return 0
}

func (m *ResourceUtilization) GetMemoryGb() float32 {
	if m != nil {
		return m.MemoryGb
	}
	return 0
}

func (m *ResourceUtilization) GetDiskGb() float32 {
	if m != nil {
		return m.DiskGb
	}
	return 0
}

func (m *ResourceUtilization) GetMaxCpus() float32 {
	if m != nil {
		return m.MaxCpus
	}
	return 0
}

// All the actions that will be executed by RoboCrop.
type RoboCropAction struct {
	// List of an action per bot group scaled by RoboCrop.
	ScalingActions       []*ScalingAction       `protobuf:"bytes,1,rep,name=scaling_actions,json=scalingActions,proto3" json:"scaling_actions,omitempty"`
	ResourceUtilization  []*ResourceUtilization `protobuf:"bytes,2,rep,name=resource_utilization,json=resourceUtilization,proto3" json:"resource_utilization,omitempty"`
	XXX_NoUnkeyedLiteral struct{}               `json:"-"`
	XXX_unrecognized     []byte                 `json:"-"`
	XXX_sizecache        int32                  `json:"-"`
}

func (m *RoboCropAction) Reset()         { *m = RoboCropAction{} }
func (m *RoboCropAction) String() string { return proto.CompactTextString(m) }
func (*RoboCropAction) ProtoMessage()    {}
func (*RoboCropAction) Descriptor() ([]byte, []int) {
	return fileDescriptor_dbe70eabfd64e7ef, []int{7}
}

func (m *RoboCropAction) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_RoboCropAction.Unmarshal(m, b)
}
func (m *RoboCropAction) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_RoboCropAction.Marshal(b, m, deterministic)
}
func (m *RoboCropAction) XXX_Merge(src proto.Message) {
	xxx_messageInfo_RoboCropAction.Merge(m, src)
}
func (m *RoboCropAction) XXX_Size() int {
	return xxx_messageInfo_RoboCropAction.Size(m)
}
func (m *RoboCropAction) XXX_DiscardUnknown() {
	xxx_messageInfo_RoboCropAction.DiscardUnknown(m)
}

var xxx_messageInfo_RoboCropAction proto.InternalMessageInfo

func (m *RoboCropAction) GetScalingActions() []*ScalingAction {
	if m != nil {
		return m.ScalingActions
	}
	return nil
}

func (m *RoboCropAction) GetResourceUtilization() []*ResourceUtilization {
	if m != nil {
		return m.ResourceUtilization
	}
	return nil
}

func init() {
	proto.RegisterEnum("chromiumos.BotPolicy_Mode", BotPolicy_Mode_name, BotPolicy_Mode_value)
	proto.RegisterEnum("chromiumos.BotPolicy_BotScalingMode", BotPolicy_BotScalingMode_name, BotPolicy_BotScalingMode_value)
	proto.RegisterEnum("chromiumos.ScalingAction_Actionable", ScalingAction_Actionable_name, ScalingAction_Actionable_value)
	proto.RegisterType((*BotType)(nil), "chromiumos.BotType")
	proto.RegisterType((*SwarmingDimension)(nil), "chromiumos.SwarmingDimension")
	proto.RegisterType((*BotPolicy)(nil), "chromiumos.BotPolicy")
	proto.RegisterType((*BotPolicy_ScalingRestriction)(nil), "chromiumos.BotPolicy.ScalingRestriction")
	proto.RegisterType((*BotPolicy_RegionRestriction)(nil), "chromiumos.BotPolicy.RegionRestriction")
	proto.RegisterType((*BotPolicyCfg)(nil), "chromiumos.BotPolicyCfg")
	proto.RegisterType((*ScalingAction)(nil), "chromiumos.ScalingAction")
	proto.RegisterType((*ScalingAction_RegionalAction)(nil), "chromiumos.ScalingAction.RegionalAction")
	proto.RegisterType((*ResourceUsage)(nil), "chromiumos.ResourceUsage")
	proto.RegisterType((*ResourceUtilization)(nil), "chromiumos.ResourceUtilization")
	proto.RegisterType((*RoboCropAction)(nil), "chromiumos.RoboCropAction")
}

func init() { proto.RegisterFile("chromiumos/bot_scaling.proto", fileDescriptor_dbe70eabfd64e7ef) }

var fileDescriptor_dbe70eabfd64e7ef = []byte{
	// 1004 bytes of a gzipped FileDescriptorProto
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xac, 0x56, 0xdd, 0x6e, 0xeb, 0x44,
	0x10, 0x3e, 0x4e, 0x9a, 0xe6, 0x64, 0xd2, 0xa4, 0xe9, 0xa6, 0x80, 0x4f, 0x01, 0x9d, 0x10, 0x81,
	0x88, 0x84, 0x94, 0x4a, 0x05, 0x01, 0x12, 0x57, 0xcd, 0x4f, 0x73, 0x22, 0x68, 0x12, 0x6d, 0x5a,
	0xc1, 0x81, 0x0b, 0xcb, 0x76, 0xb6, 0xee, 0xaa, 0xb6, 0xd7, 0xec, 0x3a, 0x3d, 0x6d, 0x1f, 0x80,
	0x37, 0xe0, 0x0d, 0xb8, 0xe0, 0x86, 0xb7, 0xe2, 0x41, 0xd0, 0xfe, 0x38, 0xff, 0x45, 0x42, 0xe2,
	0x6e, 0xe7, 0xdb, 0x9d, 0x6f, 0x76, 0x66, 0xbe, 0xf1, 0x1a, 0x3e, 0xf2, 0x6f, 0x39, 0x8b, 0xe8,
	0x3c, 0x62, 0xe2, 0xd4, 0x63, 0xa9, 0x23, 0x7c, 0x37, 0xa4, 0x71, 0xd0, 0x4e, 0x38, 0x4b, 0x19,
	0x82, 0xe5, 0x6e, 0xf3, 0x37, 0x0b, 0x8a, 0x1d, 0x96, 0x5e, 0x3d, 0x26, 0x04, 0xbd, 0x82, 0x97,
	0xea, 0x30, 0x7d, 0x22, 0xb6, 0xd5, 0xb0, 0x5a, 0x25, 0x5c, 0xf4, 0x58, 0x3a, 0xa5, 0x4f, 0x04,
	0x35, 0xa1, 0xe2, 0x33, 0x4e, 0x84, 0x93, 0x10, 0xee, 0x78, 0x2c, 0xb5, 0x73, 0x0d, 0xab, 0x55,
	0xc0, 0x65, 0x05, 0x4e, 0x08, 0xef, 0xb0, 0x14, 0xbd, 0x86, 0xf2, 0x2d, 0x9b, 0xf3, 0xf0, 0xd1,
	0xf1, 0x99, 0x48, 0xed, 0x7c, 0xc3, 0x6a, 0xe5, 0x30, 0x68, 0xa8, 0xcb, 0x44, 0x8a, 0x3e, 0x84,
	0x52, 0x44, 0x22, 0xc6, 0x1f, 0x9d, 0xc0, 0xb3, 0xf7, 0xd4, 0xf6, 0x4b, 0x0d, 0x0c, 0xbc, 0xe6,
	0x35, 0x1c, 0x4d, 0xdf, 0xb9, 0x3c, 0xa2, 0x71, 0xd0, 0xa3, 0x11, 0x89, 0x05, 0x65, 0x31, 0x42,
	0xb0, 0x17, 0xbb, 0x51, 0x76, 0x1b, 0xb5, 0x46, 0xc7, 0x50, 0xb8, 0x77, 0xc3, 0x39, 0x51, 0x57,
	0x28, 0x61, 0x6d, 0xa0, 0xf7, 0x61, 0x5f, 0x2d, 0x84, 0x9d, 0x6f, 0xe4, 0x5b, 0x25, 0x6c, 0xac,
	0xe6, 0xef, 0x45, 0x28, 0x75, 0x58, 0x3a, 0x61, 0x21, 0xf5, 0x1f, 0xe5, 0x0d, 0x64, 0x86, 0x01,
	0x67, 0xf3, 0xc4, 0x90, 0xca, 0x94, 0x07, 0xd2, 0x46, 0x6d, 0x9d, 0x7e, 0xfa, 0x98, 0x68, 0xee,
	0xf2, 0x59, 0xbd, 0xbd, 0xac, 0x54, 0xdb, 0x54, 0x49, 0xd5, 0x44, 0x95, 0xeb, 0x2d, 0xd4, 0x4d,
	0x5d, 0x1d, 0x4e, 0x44, 0xca, 0xa9, 0x9f, 0x52, 0x16, 0xab, 0xbc, 0xcb, 0x67, 0xad, 0x0d, 0x57,
	0x7d, 0x81, 0xf6, 0x54, 0x3b, 0xe0, 0xe5, 0x79, 0x8c, 0xc4, 0x16, 0x86, 0x7e, 0x82, 0x3a, 0x27,
	0x01, 0x65, 0xf1, 0x2a, 0xb3, 0xb0, 0xf7, 0x1a, 0xf9, 0x56, 0xf9, 0xec, 0xf3, 0xdd, 0xd4, 0x58,
	0x39, 0xac, 0x31, 0xf3, 0x4d, 0x48, 0xa0, 0x11, 0xd4, 0x85, 0x29, 0xb3, 0x33, 0xcb, 0xea, 0x2c,
	0xec, 0x82, 0x62, 0xfe, 0x78, 0x95, 0x79, 0xab, 0x1b, 0x18, 0x89, 0x4d, 0x48, 0xa0, 0xef, 0xa0,
	0x9c, 0xa8, 0xf8, 0x4e, 0xc4, 0x66, 0xc4, 0xde, 0x6f, 0x58, 0xad, 0xea, 0xd9, 0xc9, 0xee, 0x1b,
	0x5e, 0xb2, 0x19, 0xc1, 0xa0, 0x8f, 0xcb, 0x35, 0xfa, 0x0c, 0xaa, 0x21, 0x63, 0x77, 0x9e, 0xeb,
	0xdf, 0x39, 0x52, 0x27, 0xc2, 0x2e, 0x36, 0xac, 0xd6, 0x11, 0xae, 0x64, 0xe8, 0x1b, 0x09, 0xa2,
	0x01, 0x1c, 0x64, 0x85, 0x56, 0x41, 0x5e, 0xaa, 0x20, 0x9f, 0xee, 0x0e, 0xd2, 0x61, 0xa9, 0x29,
	0xb2, 0x0a, 0x57, 0x16, 0x4b, 0xe3, 0xe4, 0x2f, 0x0b, 0xd0, 0x76, 0x07, 0xa4, 0x70, 0x65, 0xe3,
	0x7d, 0x42, 0xe5, 0x8e, 0xd2, 0x45, 0x01, 0x83, 0xc7, 0xd2, 0xae, 0x46, 0x32, 0xd9, 0xdc, 0x84,
	0x8c, 0x71, 0xa3, 0x7c, 0x29, 0x95, 0x0b, 0x69, 0xcb, 0xa9, 0x89, 0x68, 0xec, 0xd0, 0x59, 0x48,
	0x54, 0xef, 0x0b, 0xb8, 0x18, 0xd1, 0x78, 0x38, 0x0b, 0x89, 0xf4, 0x13, 0x29, 0x49, 0xf4, 0x44,
	0xed, 0x69, 0x3f, 0x09, 0xa8, 0x91, 0xfa, 0x04, 0x0e, 0x14, 0xa9, 0x1b, 0x86, 0x32, 0x55, 0xbb,
	0xa0, 0x27, 0x4a, 0xf2, 0x1a, 0xe8, 0xe4, 0x17, 0x38, 0xda, 0xea, 0xaa, 0x54, 0xba, 0xee, 0xab,
	0x11, 0xb0, 0xb1, 0x24, 0x9e, 0x70, 0x72, 0x43, 0x1f, 0xcc, 0x60, 0x18, 0x4b, 0xe2, 0xef, 0x08,
	0x0d, 0x6e, 0xb3, 0x89, 0x34, 0x56, 0xf3, 0x1b, 0xd8, 0x53, 0x4d, 0xa8, 0xc1, 0xc1, 0xf5, 0xe8,
	0xfb, 0xd1, 0xf8, 0xc7, 0x91, 0x73, 0x39, 0xee, 0xf5, 0x6b, 0x2f, 0x50, 0x05, 0x4a, 0x97, 0xe3,
	0xd1, 0xf0, 0x6a, 0x8c, 0xfb, 0xbd, 0x9a, 0x85, 0xaa, 0x00, 0xdd, 0xf1, 0xe8, 0x62, 0x38, 0xb8,
	0x96, 0x76, 0xae, 0xd9, 0x85, 0xea, 0x7a, 0x91, 0x91, 0x0d, 0xc7, 0x19, 0xc5, 0xb4, 0x7b, 0xfe,
	0xc3, 0x70, 0x34, 0xc8, 0xa8, 0xca, 0x50, 0x9c, 0x5e, 0xf5, 0x27, 0x13, 0x45, 0x04, 0xb0, 0xdf,
	0xeb, 0x5f, 0x9e, 0x8f, 0x24, 0xc9, 0x1b, 0x38, 0x58, 0xf4, 0xac, 0x7b, 0x13, 0xa0, 0x6f, 0x75,
	0x35, 0x94, 0x38, 0x28, 0x11, 0xb6, 0xa5, 0x04, 0xf9, 0xde, 0xce, 0x1e, 0xab, 0x22, 0x4d, 0xcc,
	0xc9, 0xe6, 0xdf, 0x79, 0xa8, 0x98, 0xcb, 0x9c, 0xeb, 0x0a, 0xfd, 0xaf, 0x53, 0xde, 0x03, 0x70,
	0x15, 0xad, 0xeb, 0x99, 0x06, 0x6f, 0x48, 0x6f, 0x2d, 0x76, 0xfb, 0x7c, 0x71, 0x16, 0xaf, 0xf8,
	0x49, 0xa5, 0x7b, 0x2c, 0x15, 0x0e, 0x27, 0xbf, 0xce, 0x89, 0x48, 0xc9, 0xcc, 0xc8, 0xa1, 0x22,
	0x51, 0x9c, 0x81, 0x68, 0x0a, 0x35, 0xdd, 0x4d, 0x37, 0x74, 0x5c, 0x33, 0xf4, 0x7a, 0x34, 0x5b,
	0xcf, 0x87, 0xc4, 0xc6, 0x43, 0x9b, 0xf8, 0x90, 0xaf, 0xd9, 0x02, 0x7d, 0x01, 0x47, 0x44, 0xa4,
	0x34, 0x72, 0x53, 0x32, 0x73, 0x84, 0x7b, 0x4f, 0xe3, 0x40, 0xa8, 0x41, 0xcd, 0xe1, 0xda, 0x62,
	0x63, 0xaa, 0xf1, 0x93, 0x00, 0xaa, 0xeb, 0x7c, 0xff, 0x59, 0x6f, 0xdb, 0xa9, 0xe6, 0x77, 0xa4,
	0xda, 0x6c, 0x03, 0x2c, 0x6b, 0x85, 0x0e, 0xa1, 0x7c, 0x3d, 0x9a, 0x4e, 0xfa, 0xdd, 0xe1, 0xc5,
	0xb0, 0xdf, 0xab, 0xbd, 0x40, 0x45, 0xc8, 0xbf, 0xed, 0x4f, 0x6b, 0x16, 0xda, 0x87, 0xdc, 0x68,
	0x5c, 0xcb, 0x35, 0x31, 0x54, 0x30, 0x11, 0x6c, 0xce, 0x7d, 0x72, 0x2d, 0xdc, 0x40, 0xea, 0x36,
	0x7f, 0x1f, 0x09, 0x33, 0xad, 0x72, 0x29, 0x5f, 0x0b, 0x3f, 0x99, 0x0b, 0x75, 0x9f, 0x1c, 0x56,
	0xeb, 0xf5, 0x37, 0x27, 0xbf, 0xf1, 0xe6, 0xfc, 0x61, 0x41, 0x7d, 0x41, 0x9a, 0xd2, 0x90, 0x3e,
	0xb9, 0xff, 0x9a, 0xb2, 0x09, 0x99, 0xdb, 0x0e, 0x99, 0x7f, 0x2e, 0xe4, 0xc6, 0x33, 0x87, 0x3e,
	0x80, 0xe2, 0x8c, 0x8a, 0x3b, 0xb9, 0x55, 0xd0, 0xe3, 0x28, 0xcd, 0x81, 0xa7, 0x3e, 0x23, 0xee,
	0x83, 0xa3, 0xd8, 0x74, 0x73, 0x8a, 0x91, 0xfb, 0xd0, 0x4d, 0xe6, 0xa2, 0xf9, 0xa7, 0x05, 0x55,
	0xcc, 0x3c, 0xd6, 0xe5, 0x2c, 0x31, 0x4d, 0xe9, 0xc0, 0x61, 0xf6, 0x49, 0xcc, 0x74, 0xa2, 0x27,
	0xe6, 0xd5, 0xb3, 0x3a, 0xc1, 0x55, 0xb1, 0x6a, 0x0a, 0x84, 0xe1, 0x98, 0x9b, 0xe4, 0x9d, 0xf9,
	0x32, 0x7b, 0x3b, 0xa7, 0x88, 0x5e, 0xaf, 0x12, 0xed, 0x28, 0x12, 0xae, 0xf3, 0x6d, 0xb0, 0xf3,
	0xf5, 0xcf, 0x5f, 0x05, 0x6c, 0xe1, 0xd9, 0x66, 0x3c, 0x38, 0x5d, 0xf9, 0x15, 0xa1, 0xf1, 0x0d,
	0x77, 0x4f, 0xd5, 0x4f, 0xc8, 0x69, 0xc0, 0x56, 0x76, 0xbc, 0x7d, 0x05, 0x7e, 0xf9, 0x4f, 0x00,
	0x00, 0x00, 0xff, 0xff, 0x2a, 0x51, 0xcd, 0xd4, 0xb9, 0x08, 0x00, 0x00,
}
