// Code generated by protoc-gen-go. DO NOT EDIT.
// source: test/lab_condition.proto

package test_condition

import (
	fmt "fmt"
	proto "github.com/golang/protobuf/proto"
	lab "go.chromium.org/chromiumos/infra/proto/go/lab"
	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

// Represents boolean and "missing" value. If UNSPECIFIED, this matches with
// any bool value. If TRUE or FALSE, these matches true and false respectively.
type Tribool int32

const (
	Tribool_UNSPECIFIED Tribool = 0
	Tribool_TRUE        Tribool = 1
	Tribool_FALSE       Tribool = 2
)

var Tribool_name = map[int32]string{
	0: "UNSPECIFIED",
	1: "TRUE",
	2: "FALSE",
}

var Tribool_value = map[string]int32{
	"UNSPECIFIED": 0,
	"TRUE":        1,
	"FALSE":       2,
}

func (x Tribool) String() string {
	return proto.EnumName(Tribool_name, int32(x))
}

func (Tribool) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_992288fca85f5f34, []int{0}
}

// Represents the condition of lab.Peripherals message. If all conditions for
// each field are satisfied, this message is considered as satisfied.
type LabPeripheralsCondition struct {
	// Condition of lab.Chameleon. This condition needs to be satisfied by
	// lab.Peripherals.chameleon.
	Chameleon *LabChameleonCondition `protobuf:"bytes,1,opt,name=chameleon,proto3" json:"chameleon,omitempty"`
	// Condition of lab.Servo. This condition needs to be satisfied by
	// lab.Peripherals.servo.
	Servo *LabServoCondition `protobuf:"bytes,2,opt,name=servo,proto3" json:"servo,omitempty"`
	// Condition of lab.RPM. This condition needs to be satisfied by
	// lab.Peripherals.rpm.
	Rpm *LabRPMCondition `protobuf:"bytes,3,opt,name=rpm,proto3" json:"rpm,omitempty"`
	// Condition of lab.Audio. This condition needs to be satisfied by
	// lab.Peripherals.audio.
	Audio *LabAudioCondition `protobuf:"bytes,4,opt,name=audio,proto3" json:"audio,omitempty"`
	// Condition of lab.Wifi. This condition needs to be satisfied by
	// lab.Peripherals.wifi.
	Wifi *LabWifiCondition `protobuf:"bytes,5,opt,name=wifi,proto3" json:"wifi,omitempty"`
	// Condition of lab.Camera. If not empty, all the condition in this field
	// needs to be satisfied by any of lab.Peripherals.camera.
	Cameras []*LabCameraCondition `protobuf:"bytes,6,rep,name=cameras,proto3" json:"cameras,omitempty"`
	// Condition of lab.Camera. If not empty, any value in lab.Peripherals.camera
	// must not satisfy any condition in this field.
	NoCameras []*LabCameraCondition `protobuf:"bytes,7,rep,name=no_cameras,json=noCameras,proto3" json:"no_cameras,omitempty"`
	// Condition of lab.Touch. This condition needs to be satisfied by
	// lab.Peripherals.touch.
	Touch                *LabTouchCondition `protobuf:"bytes,8,opt,name=touch,proto3" json:"touch,omitempty"`
	XXX_NoUnkeyedLiteral struct{}           `json:"-"`
	XXX_unrecognized     []byte             `json:"-"`
	XXX_sizecache        int32              `json:"-"`
}

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

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

var xxx_messageInfo_LabPeripheralsCondition proto.InternalMessageInfo

func (m *LabPeripheralsCondition) GetChameleon() *LabChameleonCondition {
	if m != nil {
		return m.Chameleon
	}
	return nil
}

func (m *LabPeripheralsCondition) GetServo() *LabServoCondition {
	if m != nil {
		return m.Servo
	}
	return nil
}

func (m *LabPeripheralsCondition) GetRpm() *LabRPMCondition {
	if m != nil {
		return m.Rpm
	}
	return nil
}

func (m *LabPeripheralsCondition) GetAudio() *LabAudioCondition {
	if m != nil {
		return m.Audio
	}
	return nil
}

func (m *LabPeripheralsCondition) GetWifi() *LabWifiCondition {
	if m != nil {
		return m.Wifi
	}
	return nil
}

func (m *LabPeripheralsCondition) GetCameras() []*LabCameraCondition {
	if m != nil {
		return m.Cameras
	}
	return nil
}

func (m *LabPeripheralsCondition) GetNoCameras() []*LabCameraCondition {
	if m != nil {
		return m.NoCameras
	}
	return nil
}

func (m *LabPeripheralsCondition) GetTouch() *LabTouchCondition {
	if m != nil {
		return m.Touch
	}
	return nil
}

// Represents the condition of lab.Chameleon message. If all conditions for
// each field are satisfied, this message is considered as satisfied.
type LabChameleonCondition struct {
	// If this is not CHAMELEON_TYPE_INVALID, chameleon_peripherals and
	// labs.Chameleon.chameleon_peripherals must have same value.
	ChameleonPeripherals []lab.ChameleonType `protobuf:"varint,4,rep,packed,name=chameleon_peripherals,json=chameleonPeripherals,proto3,enum=lab.ChameleonType" json:"chameleon_peripherals,omitempty"`
	// If not empty, the value of lab.Chameleon.chameleon_type must not be
	// contained in this field.
	NoChameleonTypes []lab.ChameleonType `protobuf:"varint,2,rep,packed,name=no_chameleon_types,json=noChameleonTypes,proto3,enum=lab.ChameleonType" json:"no_chameleon_types,omitempty"`
	// If this is not UNSPECIFIED, the value of audio_board needs to be matched
	// with the value in lab.Chameleon.audio_board.
	AudioBoard           Tribool  `protobuf:"varint,3,opt,name=audio_board,json=audioBoard,proto3,enum=test_condition.Tribool" json:"audio_board,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_LabChameleonCondition proto.InternalMessageInfo

func (m *LabChameleonCondition) GetChameleonPeripherals() []lab.ChameleonType {
	if m != nil {
		return m.ChameleonPeripherals
	}
	return nil
}

func (m *LabChameleonCondition) GetNoChameleonTypes() []lab.ChameleonType {
	if m != nil {
		return m.NoChameleonTypes
	}
	return nil
}

func (m *LabChameleonCondition) GetAudioBoard() Tribool {
	if m != nil {
		return m.AudioBoard
	}
	return Tribool_UNSPECIFIED
}

// Represents the condition of lab.Servo message. If all conditions for
// each field are satisfied, this message is considered as satisfied.
type LabServoCondition struct {
	// If not empty, servo_hostname and lab.Servo.servo_hostname must have
	// same value.
	ServoHostname string `protobuf:"bytes,2,opt,name=servo_hostname,json=servoHostname,proto3" json:"servo_hostname,omitempty"`
	// If not empty, the value of lab.Servo.servo_hostname must not be
	// contained in this field.
	NoServoHostnames []string `protobuf:"bytes,3,rep,name=no_servo_hostnames,json=noServoHostnames,proto3" json:"no_servo_hostnames,omitempty"`
	// If servo_port is not 0, servo_port and lab.Servo.servo_port must have
	// same value.
	ServoPort int32 `protobuf:"varint,4,opt,name=servo_port,json=servoPort,proto3" json:"servo_port,omitempty"`
	// If not empty, the value of lab.Servo.servo_port must not be contained
	// in this field.
	NoServoPorts []int32 `protobuf:"varint,5,rep,packed,name=no_servo_ports,json=noServoPorts,proto3" json:"no_servo_ports,omitempty"`
	// If not empty, servo_serial and lab.Servo.servo_serial must have same
	// value.
	ServoSerial string `protobuf:"bytes,6,opt,name=servo_serial,json=servoSerial,proto3" json:"servo_serial,omitempty"`
	// If not empty, the value of lab.Servo.servo_serial must not be contained
	// in this field.
	NoServoSerials []string `protobuf:"bytes,7,rep,name=no_servo_serials,json=noServoSerials,proto3" json:"no_servo_serials,omitempty"`
	// If not empty, servo_type and lab.Servo.servo_type must have same value.
	ServoType string `protobuf:"bytes,8,opt,name=servo_type,json=servoType,proto3" json:"servo_type,omitempty"`
	// If not empty, the value of lab.Servo.servo_type must not be contained
	// in this field.
	NoServoTypes         []string `protobuf:"bytes,9,rep,name=no_servo_types,json=noServoTypes,proto3" json:"no_servo_types,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_LabServoCondition proto.InternalMessageInfo

func (m *LabServoCondition) GetServoHostname() string {
	if m != nil {
		return m.ServoHostname
	}
	return ""
}

func (m *LabServoCondition) GetNoServoHostnames() []string {
	if m != nil {
		return m.NoServoHostnames
	}
	return nil
}

func (m *LabServoCondition) GetServoPort() int32 {
	if m != nil {
		return m.ServoPort
	}
	return 0
}

func (m *LabServoCondition) GetNoServoPorts() []int32 {
	if m != nil {
		return m.NoServoPorts
	}
	return nil
}

func (m *LabServoCondition) GetServoSerial() string {
	if m != nil {
		return m.ServoSerial
	}
	return ""
}

func (m *LabServoCondition) GetNoServoSerials() []string {
	if m != nil {
		return m.NoServoSerials
	}
	return nil
}

func (m *LabServoCondition) GetServoType() string {
	if m != nil {
		return m.ServoType
	}
	return ""
}

func (m *LabServoCondition) GetNoServoTypes() []string {
	if m != nil {
		return m.NoServoTypes
	}
	return nil
}

// Represents the condition of lab.RPM message. If all conditions for
// each field are satisfied, this message is considered as satisfied.
type LabRPMCondition struct {
	// If not empty, powerunit_name and lab.RPM.powerunit_name must have same
	// value.
	PowerunitName string `protobuf:"bytes,1,opt,name=powerunit_name,json=powerunitName,proto3" json:"powerunit_name,omitempty"`
	// If not empty, the value of lab.RPM.powerunit_name must not be contained
	// in this field.
	NoPowerunitNames []string `protobuf:"bytes,2,rep,name=no_powerunit_names,json=noPowerunitNames,proto3" json:"no_powerunit_names,omitempty"`
	// If not empty, powerunit_outlet and lab.RPM.powerunit_outlet must have
	// same value.
	PowerunitOutlet string `protobuf:"bytes,3,opt,name=powerunit_outlet,json=powerunitOutlet,proto3" json:"powerunit_outlet,omitempty"`
	// If not empty, the value of lab.RPM.powerunit_outlet must not be
	// contained in this field.
	NoPowerunitOutlets   []string `protobuf:"bytes,4,rep,name=no_powerunit_outlets,json=noPowerunitOutlets,proto3" json:"no_powerunit_outlets,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_LabRPMCondition proto.InternalMessageInfo

func (m *LabRPMCondition) GetPowerunitName() string {
	if m != nil {
		return m.PowerunitName
	}
	return ""
}

func (m *LabRPMCondition) GetNoPowerunitNames() []string {
	if m != nil {
		return m.NoPowerunitNames
	}
	return nil
}

func (m *LabRPMCondition) GetPowerunitOutlet() string {
	if m != nil {
		return m.PowerunitOutlet
	}
	return ""
}

func (m *LabRPMCondition) GetNoPowerunitOutlets() []string {
	if m != nil {
		return m.NoPowerunitOutlets
	}
	return nil
}

// Represents the condition of lab.Audio message. If all conditions for
// each field are satisfied, this message is considered as satisfied.
type LabAudioCondition struct {
	// If this is not UNSPECIFIED, the value of audio_box needs to be matched
	// with the value in lab.Audio.audio_box.
	AudioBox Tribool `protobuf:"varint,1,opt,name=audio_box,json=audioBox,proto3,enum=test_condition.Tribool" json:"audio_box,omitempty"`
	// If this is not UNSPECIFIED, the value of atrus needs to be matched
	// with the value in lab.Audio.atrus.
	Atrus                Tribool  `protobuf:"varint,2,opt,name=atrus,proto3,enum=test_condition.Tribool" json:"atrus,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_LabAudioCondition proto.InternalMessageInfo

func (m *LabAudioCondition) GetAudioBox() Tribool {
	if m != nil {
		return m.AudioBox
	}
	return Tribool_UNSPECIFIED
}

func (m *LabAudioCondition) GetAtrus() Tribool {
	if m != nil {
		return m.Atrus
	}
	return Tribool_UNSPECIFIED
}

// Represents the condition of lab.Wifi message. If all conditions for
// each field are satisfied, this message is considered as satisfied.
type LabWifiCondition struct {
	// If this is not UNSPECIFIED, the value of wificell needs to be matched
	// with the value in lab.Wifi.wificell.
	Wificell Tribool `protobuf:"varint,1,opt,name=wificell,proto3,enum=test_condition.Tribool" json:"wificell,omitempty"`
	// If this is not CONN_UNKNOWN, antenna_conn and lab.Wifi.antenna_conn must
	// have same value.
	AntennaConn lab.Wifi_AntennaConnection `protobuf:"varint,2,opt,name=antenna_conn,json=antennaConn,proto3,enum=lab.Wifi_AntennaConnection" json:"antenna_conn,omitempty"`
	// If not empty, the value of lab.Wifi.antenna_conn must not be contained
	// in this field.
	NoAntennaConns       []lab.Wifi_AntennaConnection `protobuf:"varint,3,rep,packed,name=no_antenna_conns,json=noAntennaConns,proto3,enum=lab.Wifi_AntennaConnection" json:"no_antenna_conns,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                     `json:"-"`
	XXX_unrecognized     []byte                       `json:"-"`
	XXX_sizecache        int32                        `json:"-"`
}

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

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

var xxx_messageInfo_LabWifiCondition proto.InternalMessageInfo

func (m *LabWifiCondition) GetWificell() Tribool {
	if m != nil {
		return m.Wificell
	}
	return Tribool_UNSPECIFIED
}

func (m *LabWifiCondition) GetAntennaConn() lab.Wifi_AntennaConnection {
	if m != nil {
		return m.AntennaConn
	}
	return lab.Wifi_CONN_UNKNOWN
}

func (m *LabWifiCondition) GetNoAntennaConns() []lab.Wifi_AntennaConnection {
	if m != nil {
		return m.NoAntennaConns
	}
	return nil
}

// Represents the condition of lab.Camera message. If all conditions for
// each field are satisfied, this message is considered as satisfied.
type LabCameraCondition struct {
	// If this is not CAMERA_INVALID, camera_type and lab.Camera.camera_type
	// must have same value.
	CameraType lab.CameraType `protobuf:"varint,1,opt,name=camera_type,json=cameraType,proto3,enum=lab.CameraType" json:"camera_type,omitempty"`
	// If not empty, the value of lab.Camera.camera_type must not be contained
	// in this field.
	NoCameraTypes        []lab.CameraType `protobuf:"varint,2,rep,packed,name=no_camera_types,json=noCameraTypes,proto3,enum=lab.CameraType" json:"no_camera_types,omitempty"`
	XXX_NoUnkeyedLiteral struct{}         `json:"-"`
	XXX_unrecognized     []byte           `json:"-"`
	XXX_sizecache        int32            `json:"-"`
}

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

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

var xxx_messageInfo_LabCameraCondition proto.InternalMessageInfo

func (m *LabCameraCondition) GetCameraType() lab.CameraType {
	if m != nil {
		return m.CameraType
	}
	return lab.CameraType_CAMERA_INVALID
}

func (m *LabCameraCondition) GetNoCameraTypes() []lab.CameraType {
	if m != nil {
		return m.NoCameraTypes
	}
	return nil
}

// Represents the condition of lab.Touch message. If all conditions for
// each field are satisfied, this message is considered as satisfied.
type LabTouchCondition struct {
	// If this is not UNSPECIFIED, the value of mino needs to be matched
	// with the value in lab.Touch.mino.
	Mino                 Tribool  `protobuf:"varint,1,opt,name=mino,proto3,enum=test_condition.Tribool" json:"mino,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_LabTouchCondition proto.InternalMessageInfo

func (m *LabTouchCondition) GetMino() Tribool {
	if m != nil {
		return m.Mino
	}
	return Tribool_UNSPECIFIED
}

func init() {
	proto.RegisterEnum("test_condition.Tribool", Tribool_name, Tribool_value)
	proto.RegisterType((*LabPeripheralsCondition)(nil), "test_condition.LabPeripheralsCondition")
	proto.RegisterType((*LabChameleonCondition)(nil), "test_condition.LabChameleonCondition")
	proto.RegisterType((*LabServoCondition)(nil), "test_condition.LabServoCondition")
	proto.RegisterType((*LabRPMCondition)(nil), "test_condition.LabRPMCondition")
	proto.RegisterType((*LabAudioCondition)(nil), "test_condition.LabAudioCondition")
	proto.RegisterType((*LabWifiCondition)(nil), "test_condition.LabWifiCondition")
	proto.RegisterType((*LabCameraCondition)(nil), "test_condition.LabCameraCondition")
	proto.RegisterType((*LabTouchCondition)(nil), "test_condition.LabTouchCondition")
}

func init() { proto.RegisterFile("test/lab_condition.proto", fileDescriptor_992288fca85f5f34) }

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