// Code generated by protoc-gen-go. DO NOT EDIT.
// source: prototype/client_profile.proto

package prototype

import (
	fmt "fmt"
	proto "github.com/golang/protobuf/proto"
	duration "github.com/golang/protobuf/ptypes/duration"
	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

// Profile to coordinate behavioral configs of internal sub services e.g. test
// platform Next Tag: 4
type ClientProfile struct {
	Name                 string               `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
	Id                   *ClientProfileId     `protobuf:"bytes,2,opt,name=id,proto3" json:"id,omitempty"`
	TestPlatformProfile  *TestPlatformProfile `protobuf:"bytes,3,opt,name=test_platform_profile,json=testPlatformProfile,proto3" json:"test_platform_profile,omitempty"`
	XXX_NoUnkeyedLiteral struct{}             `json:"-"`
	XXX_unrecognized     []byte               `json:"-"`
	XXX_sizecache        int32                `json:"-"`
}

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

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

var xxx_messageInfo_ClientProfile proto.InternalMessageInfo

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

func (m *ClientProfile) GetId() *ClientProfileId {
	if m != nil {
		return m.Id
	}
	return nil
}

func (m *ClientProfile) GetTestPlatformProfile() *TestPlatformProfile {
	if m != nil {
		return m.TestPlatformProfile
	}
	return nil
}

// TestPlatformProfile configures aspects of the test platform behaviour
// per-request. Configure the scheduling priorities in the test platform, retry
// behavior, timeout characteristics and alerting thresholds throughout the test
// platform stack. Next Tag: 5
type TestPlatformProfile struct {
	Scheduler            *SchedulerProfile  `protobuf:"bytes,1,opt,name=scheduler,proto3" json:"scheduler,omitempty"`
	Retry                *RetryProfile      `protobuf:"bytes,2,opt,name=retry,proto3" json:"retry,omitempty"`
	Timeout              *TimeoutProfile    `protobuf:"bytes,3,opt,name=timeout,proto3" json:"timeout,omitempty"`
	Monitoring           *MonitoringProfile `protobuf:"bytes,4,opt,name=monitoring,proto3" json:"monitoring,omitempty"`
	XXX_NoUnkeyedLiteral struct{}           `json:"-"`
	XXX_unrecognized     []byte             `json:"-"`
	XXX_sizecache        int32              `json:"-"`
}

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

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

var xxx_messageInfo_TestPlatformProfile proto.InternalMessageInfo

func (m *TestPlatformProfile) GetScheduler() *SchedulerProfile {
	if m != nil {
		return m.Scheduler
	}
	return nil
}

func (m *TestPlatformProfile) GetRetry() *RetryProfile {
	if m != nil {
		return m.Retry
	}
	return nil
}

func (m *TestPlatformProfile) GetTimeout() *TimeoutProfile {
	if m != nil {
		return m.Timeout
	}
	return nil
}

func (m *TestPlatformProfile) GetMonitoring() *MonitoringProfile {
	if m != nil {
		return m.Monitoring
	}
	return nil
}

// SchedulerProfile controls the test platform scheduling behaviour.
// Next Tag: 5
type SchedulerProfile struct {
	// The task scheduling pools this device may be used for.
	//
	// Historical note: The concept of managed pools (e.g.: DUT_POOL_CQ) was used
	// for automatic balancing of healthy devices in critical pools. Due to
	// merging of critical pools into a common scheduler pool, this auto-balancing
	// service is no longer required.
	//
	// Old enum values are now serialized to the JSON encoding of those enums
	// (e.g. "DUT_POOL_QUOTA").
	// See lab/device.proto:DeviceUnderTest::DutPool.
	Pools []string `protobuf:"bytes,1,rep,name=pools,proto3" json:"pools,omitempty"`
	// Types that are valid to be assigned to QosChannel:
	//	*SchedulerProfile_Priority
	//	*SchedulerProfile_QuotaAccount
	QosChannel           isSchedulerProfile_QosChannel `protobuf_oneof:"qos_channel"`
	XXX_NoUnkeyedLiteral struct{}                      `json:"-"`
	XXX_unrecognized     []byte                        `json:"-"`
	XXX_sizecache        int32                         `json:"-"`
}

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

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

var xxx_messageInfo_SchedulerProfile proto.InternalMessageInfo

func (m *SchedulerProfile) GetPools() []string {
	if m != nil {
		return m.Pools
	}
	return nil
}

type isSchedulerProfile_QosChannel interface {
	isSchedulerProfile_QosChannel()
}

type SchedulerProfile_Priority struct {
	Priority uint32 `protobuf:"varint,2,opt,name=priority,proto3,oneof"`
}

type SchedulerProfile_QuotaAccount struct {
	QuotaAccount string `protobuf:"bytes,3,opt,name=quota_account,json=quotaAccount,proto3,oneof"`
}

func (*SchedulerProfile_Priority) isSchedulerProfile_QosChannel() {}

func (*SchedulerProfile_QuotaAccount) isSchedulerProfile_QosChannel() {}

func (m *SchedulerProfile) GetQosChannel() isSchedulerProfile_QosChannel {
	if m != nil {
		return m.QosChannel
	}
	return nil
}

func (m *SchedulerProfile) GetPriority() uint32 {
	if x, ok := m.GetQosChannel().(*SchedulerProfile_Priority); ok {
		return x.Priority
	}
	return 0
}

func (m *SchedulerProfile) GetQuotaAccount() string {
	if x, ok := m.GetQosChannel().(*SchedulerProfile_QuotaAccount); ok {
		return x.QuotaAccount
	}
	return ""
}

// XXX_OneofWrappers is for the internal use of the proto package.
func (*SchedulerProfile) XXX_OneofWrappers() []interface{} {
	return []interface{}{
		(*SchedulerProfile_Priority)(nil),
		(*SchedulerProfile_QuotaAccount)(nil),
	}
}

// RetryPrfoile defines parameters that affect how failed tests within
// a request are retried.
type RetryProfile struct {
	// Whether to allow test retries.
	Allow bool `protobuf:"varint,1,opt,name=allow,proto3" json:"allow,omitempty"`
	// Maximum number of retries of tests within this invocation to allow.
	// 0 = unlimited.
	Max                  uint32   `protobuf:"varint,2,opt,name=max,proto3" json:"max,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_RetryProfile proto.InternalMessageInfo

func (m *RetryProfile) GetAllow() bool {
	if m != nil {
		return m.Allow
	}
	return false
}

func (m *RetryProfile) GetMax() uint32 {
	if m != nil {
		return m.Max
	}
	return 0
}

// TimeoutProfile defines parameters related to timeouts.
type TimeoutProfile struct {
	// Maximum duration for the entire request to be handled.
	MaximumDuration      *duration.Duration `protobuf:"bytes,1,opt,name=maximum_duration,json=maximumDuration,proto3" json:"maximum_duration,omitempty"`
	XXX_NoUnkeyedLiteral struct{}           `json:"-"`
	XXX_unrecognized     []byte             `json:"-"`
	XXX_sizecache        int32              `json:"-"`
}

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

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

var xxx_messageInfo_TimeoutProfile proto.InternalMessageInfo

func (m *TimeoutProfile) GetMaximumDuration() *duration.Duration {
	if m != nil {
		return m.MaximumDuration
	}
	return nil
}

// MonitoringProfile controls the alerting and monitoring of requests
// associated with the profile throughout the test infrastructure
// stack.
type MonitoringProfile struct {
	TestPlatformAlertingThresholds *TestPlatformAlertingThresholds `protobuf:"bytes,1,opt,name=test_platform_alerting_thresholds,json=testPlatformAlertingThresholds,proto3" json:"test_platform_alerting_thresholds,omitempty"`
	XXX_NoUnkeyedLiteral           struct{}                        `json:"-"`
	XXX_unrecognized               []byte                          `json:"-"`
	XXX_sizecache                  int32                           `json:"-"`
}

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

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

var xxx_messageInfo_MonitoringProfile proto.InternalMessageInfo

func (m *MonitoringProfile) GetTestPlatformAlertingThresholds() *TestPlatformAlertingThresholds {
	if m != nil {
		return m.TestPlatformAlertingThresholds
	}
	return nil
}

// TestPlatformAlertingThresholds capture alerting thresholds for test platform.
type TestPlatformAlertingThresholds struct {
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_TestPlatformAlertingThresholds proto.InternalMessageInfo

func init() {
	proto.RegisterType((*ClientProfile)(nil), "prototype.ClientProfile")
	proto.RegisterType((*TestPlatformProfile)(nil), "prototype.TestPlatformProfile")
	proto.RegisterType((*SchedulerProfile)(nil), "prototype.SchedulerProfile")
	proto.RegisterType((*RetryProfile)(nil), "prototype.RetryProfile")
	proto.RegisterType((*TimeoutProfile)(nil), "prototype.TimeoutProfile")
	proto.RegisterType((*MonitoringProfile)(nil), "prototype.MonitoringProfile")
	proto.RegisterType((*TestPlatformAlertingThresholds)(nil), "prototype.TestPlatformAlertingThresholds")
}

func init() { proto.RegisterFile("prototype/client_profile.proto", fileDescriptor_c9e2e9de991f0d94) }

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