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

package prototype

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

type Platform2Config struct {
	BluetoothConfig      *BluetoothConfig `protobuf:"bytes,1,opt,name=bluetooth_config,json=bluetoothConfig,proto3" json:"bluetooth_config,omitempty"`
	PowerdConfig         *PowerdConfig    `protobuf:"bytes,2,opt,name=powerd_config,json=powerdConfig,proto3" json:"powerd_config,omitempty"`
	XXX_NoUnkeyedLiteral struct{}         `json:"-"`
	XXX_unrecognized     []byte           `json:"-"`
	XXX_sizecache        int32            `json:"-"`
}

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

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

var xxx_messageInfo_Platform2Config proto.InternalMessageInfo

func (m *Platform2Config) GetBluetoothConfig() *BluetoothConfig {
	if m != nil {
		return m.BluetoothConfig
	}
	return nil
}

func (m *Platform2Config) GetPowerdConfig() *PowerdConfig {
	if m != nil {
		return m.PowerdConfig
	}
	return nil
}

func init() {
	proto.RegisterType((*Platform2Config)(nil), "prototype.Platform2Config")
}

func init() {
	proto.RegisterFile("prototype/src/platform2/config.proto", fileDescriptor_b1a0dc096fd50f70)
}

var fileDescriptor_b1a0dc096fd50f70 = []byte{
	// 198 bytes of a gzipped FileDescriptorProto
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x52, 0x29, 0x28, 0xca, 0x2f,
	0xc9, 0x2f, 0xa9, 0x2c, 0x48, 0xd5, 0x2f, 0x2e, 0x4a, 0xd6, 0x2f, 0xc8, 0x49, 0x2c, 0x49, 0xcb,
	0x2f, 0xca, 0x35, 0xd2, 0x4f, 0xce, 0xcf, 0x4b, 0xcb, 0x4c, 0xd7, 0x03, 0x4b, 0x0b, 0x71, 0xc2,
	0x55, 0x49, 0xe9, 0xe1, 0xd2, 0x90, 0x94, 0x53, 0x9a, 0x5a, 0x92, 0x9f, 0x5f, 0x92, 0x81, 0xa2,
	0x55, 0x4a, 0x1b, 0x97, 0xfa, 0x82, 0xfc, 0xf2, 0xd4, 0xa2, 0x14, 0x14, 0xc5, 0x4a, 0xd3, 0x18,
	0xb9, 0xf8, 0x03, 0x60, 0x2a, 0x9c, 0xc1, 0x32, 0x42, 0xae, 0x5c, 0x02, 0x70, 0xa3, 0xe3, 0x21,
	0xaa, 0x25, 0x18, 0x15, 0x18, 0x35, 0xb8, 0x8d, 0x90, 0xdc, 0xa2, 0xe7, 0x04, 0x53, 0x02, 0xd1,
	0x15, 0xc4, 0x9f, 0x84, 0x2a, 0x20, 0x64, 0xc3, 0xc5, 0x0b, 0xb1, 0x11, 0x66, 0x06, 0x13, 0xd8,
	0x0c, 0x71, 0x24, 0x33, 0x02, 0xc0, 0xf2, 0x50, 0x03, 0x78, 0x0a, 0x90, 0x78, 0x4e, 0xa6, 0x51,
	0xc6, 0xe9, 0xf9, 0x7a, 0xc9, 0x19, 0x45, 0xf9, 0xb9, 0x99, 0xa5, 0xb9, 0x7a, 0xf9, 0x45, 0xe9,
	0xfa, 0x30, 0x4e, 0x7e, 0xb1, 0x7e, 0x66, 0x5e, 0x5a, 0x51, 0xa2, 0x3e, 0xd8, 0x20, 0xfd, 0xf4,
	0x7c, 0x7d, 0xb8, 0x89, 0x49, 0x6c, 0x60, 0xa6, 0x31, 0x20, 0x00, 0x00, 0xff, 0xff, 0xca, 0x6c,
	0x39, 0xd7, 0x66, 0x01, 0x00, 0x00,
}
