// Code generated by protoc-gen-go. DO NOT EDIT.
// source: dmi/hw.proto

package dmi

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

const (
	ComponentType_COMPONENT_TYPE_UNDEFINED    ComponentType = 0
	ComponentType_COMPONENT_TYPE_UNKNOWN      ComponentType = 1
	ComponentType_COMPONENT_TYPE_CHASSIS      ComponentType = 2
	ComponentType_COMPONENT_TYPE_BACKPLANE    ComponentType = 3
	ComponentType_COMPONENT_TYPE_CONTAINER    ComponentType = 4
	ComponentType_COMPONENT_TYPE_POWER_SUPPLY ComponentType = 5
	ComponentType_COMPONENT_TYPE_FAN          ComponentType = 6
	ComponentType_COMPONENT_TYPE_SENSOR       ComponentType = 7
	ComponentType_COMPONENT_TYPE_MODULE       ComponentType = 8
	ComponentType_COMPONENT_TYPE_PORT         ComponentType = 9
	ComponentType_COMPONENT_TYPE_CPU          ComponentType = 10
	ComponentType_COMPONENT_TYPE_BATTERY      ComponentType = 11
	ComponentType_COMPONENT_TYPE_STORAGE      ComponentType = 12
	ComponentType_COMPONENT_TYPE_MEMORY       ComponentType = 13
	// A component of type "TRANSCEIVER" could have 0 or more components of type "PORT" as children.
	ComponentType_COMPONENT_TYPE_TRANSCEIVER ComponentType = 14
)

var ComponentType_name = map[int32]string{
	0:  "COMPONENT_TYPE_UNDEFINED",
	1:  "COMPONENT_TYPE_UNKNOWN",
	2:  "COMPONENT_TYPE_CHASSIS",
	3:  "COMPONENT_TYPE_BACKPLANE",
	4:  "COMPONENT_TYPE_CONTAINER",
	5:  "COMPONENT_TYPE_POWER_SUPPLY",
	6:  "COMPONENT_TYPE_FAN",
	7:  "COMPONENT_TYPE_SENSOR",
	8:  "COMPONENT_TYPE_MODULE",
	9:  "COMPONENT_TYPE_PORT",
	10: "COMPONENT_TYPE_CPU",
	11: "COMPONENT_TYPE_BATTERY",
	12: "COMPONENT_TYPE_STORAGE",
	13: "COMPONENT_TYPE_MEMORY",
	14: "COMPONENT_TYPE_TRANSCEIVER",
}

var ComponentType_value = map[string]int32{
	"COMPONENT_TYPE_UNDEFINED":    0,
	"COMPONENT_TYPE_UNKNOWN":      1,
	"COMPONENT_TYPE_CHASSIS":      2,
	"COMPONENT_TYPE_BACKPLANE":    3,
	"COMPONENT_TYPE_CONTAINER":    4,
	"COMPONENT_TYPE_POWER_SUPPLY": 5,
	"COMPONENT_TYPE_FAN":          6,
	"COMPONENT_TYPE_SENSOR":       7,
	"COMPONENT_TYPE_MODULE":       8,
	"COMPONENT_TYPE_PORT":         9,
	"COMPONENT_TYPE_CPU":          10,
	"COMPONENT_TYPE_BATTERY":      11,
	"COMPONENT_TYPE_STORAGE":      12,
	"COMPONENT_TYPE_MEMORY":       13,
	"COMPONENT_TYPE_TRANSCEIVER":  14,
}

func (x ComponentType) String() string {
	return proto.EnumName(ComponentType_name, int32(x))
}

func (ComponentType) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_d7c33d745c4ab367, []int{0}
}

type ComponentAdminState int32

const (
	ComponentAdminState_COMP_ADMIN_STATE_UNDEFINED     ComponentAdminState = 0
	ComponentAdminState_COMP_ADMIN_STATE_UNKNOWN       ComponentAdminState = 1
	ComponentAdminState_COMP_ADMIN_STATE_LOCKED        ComponentAdminState = 2
	ComponentAdminState_COMP_ADMIN_STATE_SHUTTING_DOWN ComponentAdminState = 3
	ComponentAdminState_COMP_ADMIN_STATE_UNLOCKED      ComponentAdminState = 4
)

var ComponentAdminState_name = map[int32]string{
	0: "COMP_ADMIN_STATE_UNDEFINED",
	1: "COMP_ADMIN_STATE_UNKNOWN",
	2: "COMP_ADMIN_STATE_LOCKED",
	3: "COMP_ADMIN_STATE_SHUTTING_DOWN",
	4: "COMP_ADMIN_STATE_UNLOCKED",
}

var ComponentAdminState_value = map[string]int32{
	"COMP_ADMIN_STATE_UNDEFINED":     0,
	"COMP_ADMIN_STATE_UNKNOWN":       1,
	"COMP_ADMIN_STATE_LOCKED":        2,
	"COMP_ADMIN_STATE_SHUTTING_DOWN": 3,
	"COMP_ADMIN_STATE_UNLOCKED":      4,
}

func (x ComponentAdminState) String() string {
	return proto.EnumName(ComponentAdminState_name, int32(x))
}

func (ComponentAdminState) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_d7c33d745c4ab367, []int{1}
}

type ComponentOperState int32

const (
	ComponentOperState_COMP_OPER_STATE_UNDEFINED ComponentOperState = 0
	ComponentOperState_COMP_OPER_STATE_UNKNOWN   ComponentOperState = 1
	ComponentOperState_COMP_OPER_STATE_DISABLED  ComponentOperState = 2
	ComponentOperState_COMP_OPER_STATE_ENABLED   ComponentOperState = 3
	ComponentOperState_COMP_OPER_STATE_TESTING   ComponentOperState = 4
)

var ComponentOperState_name = map[int32]string{
	0: "COMP_OPER_STATE_UNDEFINED",
	1: "COMP_OPER_STATE_UNKNOWN",
	2: "COMP_OPER_STATE_DISABLED",
	3: "COMP_OPER_STATE_ENABLED",
	4: "COMP_OPER_STATE_TESTING",
}

var ComponentOperState_value = map[string]int32{
	"COMP_OPER_STATE_UNDEFINED": 0,
	"COMP_OPER_STATE_UNKNOWN":   1,
	"COMP_OPER_STATE_DISABLED":  2,
	"COMP_OPER_STATE_ENABLED":   3,
	"COMP_OPER_STATE_TESTING":   4,
}

func (x ComponentOperState) String() string {
	return proto.EnumName(ComponentOperState_name, int32(x))
}

func (ComponentOperState) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_d7c33d745c4ab367, []int{2}
}

type ComponentUsageState int32

const (
	ComponentUsageState_COMP_USAGE_STATE_UNDEFINED ComponentUsageState = 0
	ComponentUsageState_COMP_USAGE_STATE_UNKNOWN   ComponentUsageState = 1
	ComponentUsageState_COMP_USAGE_STATE_IDLE      ComponentUsageState = 2
	ComponentUsageState_COMP_USAGE_STATE_ACTIVE    ComponentUsageState = 3
	ComponentUsageState_COMP_USAGE_STATE_BUSY      ComponentUsageState = 4
)

var ComponentUsageState_name = map[int32]string{
	0: "COMP_USAGE_STATE_UNDEFINED",
	1: "COMP_USAGE_STATE_UNKNOWN",
	2: "COMP_USAGE_STATE_IDLE",
	3: "COMP_USAGE_STATE_ACTIVE",
	4: "COMP_USAGE_STATE_BUSY",
}

var ComponentUsageState_value = map[string]int32{
	"COMP_USAGE_STATE_UNDEFINED": 0,
	"COMP_USAGE_STATE_UNKNOWN":   1,
	"COMP_USAGE_STATE_IDLE":      2,
	"COMP_USAGE_STATE_ACTIVE":    3,
	"COMP_USAGE_STATE_BUSY":      4,
}

func (x ComponentUsageState) String() string {
	return proto.EnumName(ComponentUsageState_name, int32(x))
}

func (ComponentUsageState) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_d7c33d745c4ab367, []int{3}
}

type ComponentAlarmState int32

const (
	ComponentAlarmState_COMP_ALARM_STATE_UNDEFINED     ComponentAlarmState = 0
	ComponentAlarmState_COMP_ALARM_STATE_UNKNOWN       ComponentAlarmState = 1
	ComponentAlarmState_COMP_ALARM_STATE_UNDER_REPAIR  ComponentAlarmState = 2
	ComponentAlarmState_COMP_ALARM_STATE_CRITICAL      ComponentAlarmState = 3
	ComponentAlarmState_COMP_ALARM_STATE_MAJOR         ComponentAlarmState = 4
	ComponentAlarmState_COMP_ALARM_STATE_MINOR         ComponentAlarmState = 5
	ComponentAlarmState_COMP_ALARM_STATE_WARNING       ComponentAlarmState = 6
	ComponentAlarmState_COMP_ALARM_STATE_INDETERMINATE ComponentAlarmState = 7
)

var ComponentAlarmState_name = map[int32]string{
	0: "COMP_ALARM_STATE_UNDEFINED",
	1: "COMP_ALARM_STATE_UNKNOWN",
	2: "COMP_ALARM_STATE_UNDER_REPAIR",
	3: "COMP_ALARM_STATE_CRITICAL",
	4: "COMP_ALARM_STATE_MAJOR",
	5: "COMP_ALARM_STATE_MINOR",
	6: "COMP_ALARM_STATE_WARNING",
	7: "COMP_ALARM_STATE_INDETERMINATE",
}

var ComponentAlarmState_value = map[string]int32{
	"COMP_ALARM_STATE_UNDEFINED":     0,
	"COMP_ALARM_STATE_UNKNOWN":       1,
	"COMP_ALARM_STATE_UNDER_REPAIR":  2,
	"COMP_ALARM_STATE_CRITICAL":      3,
	"COMP_ALARM_STATE_MAJOR":         4,
	"COMP_ALARM_STATE_MINOR":         5,
	"COMP_ALARM_STATE_WARNING":       6,
	"COMP_ALARM_STATE_INDETERMINATE": 7,
}

func (x ComponentAlarmState) String() string {
	return proto.EnumName(ComponentAlarmState_name, int32(x))
}

func (ComponentAlarmState) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_d7c33d745c4ab367, []int{4}
}

type ComponentStandbyState int32

const (
	ComponentStandbyState_COMP_STANDBY_STATE_UNDEFINED         ComponentStandbyState = 0
	ComponentStandbyState_COMP_STANDBY_STATE_UNKNOWN           ComponentStandbyState = 1
	ComponentStandbyState_COMP_STANDBY_STATE_HOT               ComponentStandbyState = 2
	ComponentStandbyState_COMP_STANDBY_STATE_COLD              ComponentStandbyState = 3
	ComponentStandbyState_COMP_STANDBY_STATE_PROVIDING_SERVICE ComponentStandbyState = 4
)

var ComponentStandbyState_name = map[int32]string{
	0: "COMP_STANDBY_STATE_UNDEFINED",
	1: "COMP_STANDBY_STATE_UNKNOWN",
	2: "COMP_STANDBY_STATE_HOT",
	3: "COMP_STANDBY_STATE_COLD",
	4: "COMP_STANDBY_STATE_PROVIDING_SERVICE",
}

var ComponentStandbyState_value = map[string]int32{
	"COMP_STANDBY_STATE_UNDEFINED":         0,
	"COMP_STANDBY_STATE_UNKNOWN":           1,
	"COMP_STANDBY_STATE_HOT":               2,
	"COMP_STANDBY_STATE_COLD":              3,
	"COMP_STANDBY_STATE_PROVIDING_SERVICE": 4,
}

func (x ComponentStandbyState) String() string {
	return proto.EnumName(ComponentStandbyState_name, int32(x))
}

func (ComponentStandbyState) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_d7c33d745c4ab367, []int{5}
}

type DataValueType int32

const (
	DataValueType_VALUE_TYPE_UNDEFINED   DataValueType = 0
	DataValueType_VALUE_TYPE_OTHER       DataValueType = 1
	DataValueType_VALUE_TYPE_UNKNOWN     DataValueType = 2
	DataValueType_VALUE_TYPE_VOLTS_AC    DataValueType = 3
	DataValueType_VALUE_TYPE_VOLTS_DC    DataValueType = 4
	DataValueType_VALUE_TYPE_AMPERES     DataValueType = 5
	DataValueType_VALUE_TYPE_WATTS       DataValueType = 6
	DataValueType_VALUE_TYPE_HERTZ       DataValueType = 7
	DataValueType_VALUE_TYPE_CELSIUS     DataValueType = 8
	DataValueType_VALUE_TYPE_PERCENT_RH  DataValueType = 9
	DataValueType_VALUE_TYPE_RPM         DataValueType = 10
	DataValueType_VALUE_TYPE_CMM         DataValueType = 11
	DataValueType_VALUE_TYPE_TRUTH_VALUE DataValueType = 12
	DataValueType_VALUE_TYPE_PERCENT     DataValueType = 13
	DataValueType_VALUE_TYPE_METERS      DataValueType = 14
	DataValueType_VALUE_TYPE_BYTES       DataValueType = 15
	DataValueType_VALUE_TYPE_DBM         DataValueType = 16
)

var DataValueType_name = map[int32]string{
	0:  "VALUE_TYPE_UNDEFINED",
	1:  "VALUE_TYPE_OTHER",
	2:  "VALUE_TYPE_UNKNOWN",
	3:  "VALUE_TYPE_VOLTS_AC",
	4:  "VALUE_TYPE_VOLTS_DC",
	5:  "VALUE_TYPE_AMPERES",
	6:  "VALUE_TYPE_WATTS",
	7:  "VALUE_TYPE_HERTZ",
	8:  "VALUE_TYPE_CELSIUS",
	9:  "VALUE_TYPE_PERCENT_RH",
	10: "VALUE_TYPE_RPM",
	11: "VALUE_TYPE_CMM",
	12: "VALUE_TYPE_TRUTH_VALUE",
	13: "VALUE_TYPE_PERCENT",
	14: "VALUE_TYPE_METERS",
	15: "VALUE_TYPE_BYTES",
	16: "VALUE_TYPE_DBM",
}

var DataValueType_value = map[string]int32{
	"VALUE_TYPE_UNDEFINED":   0,
	"VALUE_TYPE_OTHER":       1,
	"VALUE_TYPE_UNKNOWN":     2,
	"VALUE_TYPE_VOLTS_AC":    3,
	"VALUE_TYPE_VOLTS_DC":    4,
	"VALUE_TYPE_AMPERES":     5,
	"VALUE_TYPE_WATTS":       6,
	"VALUE_TYPE_HERTZ":       7,
	"VALUE_TYPE_CELSIUS":     8,
	"VALUE_TYPE_PERCENT_RH":  9,
	"VALUE_TYPE_RPM":         10,
	"VALUE_TYPE_CMM":         11,
	"VALUE_TYPE_TRUTH_VALUE": 12,
	"VALUE_TYPE_PERCENT":     13,
	"VALUE_TYPE_METERS":      14,
	"VALUE_TYPE_BYTES":       15,
	"VALUE_TYPE_DBM":         16,
}

func (x DataValueType) String() string {
	return proto.EnumName(DataValueType_name, int32(x))
}

func (DataValueType) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_d7c33d745c4ab367, []int{6}
}

type ValueScale int32

const (
	ValueScale_VALUE_SCALE_UNDEFINED ValueScale = 0
	ValueScale_VALUE_SCALE_YOCTO     ValueScale = 1
	ValueScale_VALUE_SCALE_ZEPTO     ValueScale = 2
	ValueScale_VALUE_SCALE_ATTO      ValueScale = 3
	ValueScale_VALUE_SCALE_FEMTO     ValueScale = 4
	ValueScale_VALUE_SCALE_PICO      ValueScale = 5
	ValueScale_VALUE_SCALE_NANO      ValueScale = 6
	ValueScale_VALUE_SCALE_MICRO     ValueScale = 7
	ValueScale_VALUE_SCALE_MILLI     ValueScale = 8
	ValueScale_VALUE_SCALE_UNITS     ValueScale = 9
	ValueScale_VALUE_SCALE_KILO      ValueScale = 10
	ValueScale_VALUE_SCALE_MEGA      ValueScale = 11
	ValueScale_VALUE_SCALE_GIGA      ValueScale = 12
	ValueScale_VALUE_SCALE_TERA      ValueScale = 13
	ValueScale_VALUE_SCALE_PETA      ValueScale = 14
	ValueScale_VALUE_SCALE_EXA       ValueScale = 15
	ValueScale_VALUE_SCALE_ZETTA     ValueScale = 16
	ValueScale_VALUE_SCALE_YOTTA     ValueScale = 17
)

var ValueScale_name = map[int32]string{
	0:  "VALUE_SCALE_UNDEFINED",
	1:  "VALUE_SCALE_YOCTO",
	2:  "VALUE_SCALE_ZEPTO",
	3:  "VALUE_SCALE_ATTO",
	4:  "VALUE_SCALE_FEMTO",
	5:  "VALUE_SCALE_PICO",
	6:  "VALUE_SCALE_NANO",
	7:  "VALUE_SCALE_MICRO",
	8:  "VALUE_SCALE_MILLI",
	9:  "VALUE_SCALE_UNITS",
	10: "VALUE_SCALE_KILO",
	11: "VALUE_SCALE_MEGA",
	12: "VALUE_SCALE_GIGA",
	13: "VALUE_SCALE_TERA",
	14: "VALUE_SCALE_PETA",
	15: "VALUE_SCALE_EXA",
	16: "VALUE_SCALE_ZETTA",
	17: "VALUE_SCALE_YOTTA",
}

var ValueScale_value = map[string]int32{
	"VALUE_SCALE_UNDEFINED": 0,
	"VALUE_SCALE_YOCTO":     1,
	"VALUE_SCALE_ZEPTO":     2,
	"VALUE_SCALE_ATTO":      3,
	"VALUE_SCALE_FEMTO":     4,
	"VALUE_SCALE_PICO":      5,
	"VALUE_SCALE_NANO":      6,
	"VALUE_SCALE_MICRO":     7,
	"VALUE_SCALE_MILLI":     8,
	"VALUE_SCALE_UNITS":     9,
	"VALUE_SCALE_KILO":      10,
	"VALUE_SCALE_MEGA":      11,
	"VALUE_SCALE_GIGA":      12,
	"VALUE_SCALE_TERA":      13,
	"VALUE_SCALE_PETA":      14,
	"VALUE_SCALE_EXA":       15,
	"VALUE_SCALE_ZETTA":     16,
	"VALUE_SCALE_YOTTA":     17,
}

func (x ValueScale) String() string {
	return proto.EnumName(ValueScale_name, int32(x))
}

func (ValueScale) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_d7c33d745c4ab367, []int{7}
}

type SensorStatus int32

const (
	SensorStatus_SENSOR_STATUS_UNDEFINED      SensorStatus = 0
	SensorStatus_SENSOR_STATUS_OK             SensorStatus = 1
	SensorStatus_SENSOR_STATUS_UNAVAILABLE    SensorStatus = 2
	SensorStatus_SENSOR_STATUS_NONOPERATIONAL SensorStatus = 3
)

var SensorStatus_name = map[int32]string{
	0: "SENSOR_STATUS_UNDEFINED",
	1: "SENSOR_STATUS_OK",
	2: "SENSOR_STATUS_UNAVAILABLE",
	3: "SENSOR_STATUS_NONOPERATIONAL",
}

var SensorStatus_value = map[string]int32{
	"SENSOR_STATUS_UNDEFINED":      0,
	"SENSOR_STATUS_OK":             1,
	"SENSOR_STATUS_UNAVAILABLE":    2,
	"SENSOR_STATUS_NONOPERATIONAL": 3,
}

func (x SensorStatus) String() string {
	return proto.EnumName(SensorStatus_name, int32(x))
}

func (SensorStatus) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_d7c33d745c4ab367, []int{8}
}

type TransceiverType int32

const (
	TransceiverType_TYPE_UNDEFINED    TransceiverType = 0
	TransceiverType_ETHERNET          TransceiverType = 1
	TransceiverType_GPON              TransceiverType = 2
	TransceiverType_XGPON             TransceiverType = 3
	TransceiverType_XGSPON            TransceiverType = 4
	TransceiverType_CPON              TransceiverType = 5
	TransceiverType_NG_PON2           TransceiverType = 6
	TransceiverType_EPON              TransceiverType = 7
	TransceiverType_COMBO_GPON_XGSPON TransceiverType = 8
	TransceiverType_TYPE_NOT_DETECTED TransceiverType = 255
)

var TransceiverType_name = map[int32]string{
	0:   "TYPE_UNDEFINED",
	1:   "ETHERNET",
	2:   "GPON",
	3:   "XGPON",
	4:   "XGSPON",
	5:   "CPON",
	6:   "NG_PON2",
	7:   "EPON",
	8:   "COMBO_GPON_XGSPON",
	255: "TYPE_NOT_DETECTED",
}

var TransceiverType_value = map[string]int32{
	"TYPE_UNDEFINED":    0,
	"ETHERNET":          1,
	"GPON":              2,
	"XGPON":             3,
	"XGSPON":            4,
	"CPON":              5,
	"NG_PON2":           6,
	"EPON":              7,
	"COMBO_GPON_XGSPON": 8,
	"TYPE_NOT_DETECTED": 255,
}

func (x TransceiverType) String() string {
	return proto.EnumName(TransceiverType_name, int32(x))
}

func (TransceiverType) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_d7c33d745c4ab367, []int{9}
}

type PortComponentAttributes_ConnectorType int32

const (
	PortComponentAttributes_CONNECTOR_TYPE_UNDEFINED PortComponentAttributes_ConnectorType = 0
	PortComponentAttributes_RJ45                     PortComponentAttributes_ConnectorType = 1
	PortComponentAttributes_FIBER_LC                 PortComponentAttributes_ConnectorType = 2
	PortComponentAttributes_FIBER_SC_PC              PortComponentAttributes_ConnectorType = 3
	PortComponentAttributes_FIBER_MPO                PortComponentAttributes_ConnectorType = 4
	PortComponentAttributes_RS232                    PortComponentAttributes_ConnectorType = 5
)

var PortComponentAttributes_ConnectorType_name = map[int32]string{
	0: "CONNECTOR_TYPE_UNDEFINED",
	1: "RJ45",
	2: "FIBER_LC",
	3: "FIBER_SC_PC",
	4: "FIBER_MPO",
	5: "RS232",
}

var PortComponentAttributes_ConnectorType_value = map[string]int32{
	"CONNECTOR_TYPE_UNDEFINED": 0,
	"RJ45":                     1,
	"FIBER_LC":                 2,
	"FIBER_SC_PC":              3,
	"FIBER_MPO":                4,
	"RS232":                    5,
}

func (x PortComponentAttributes_ConnectorType) String() string {
	return proto.EnumName(PortComponentAttributes_ConnectorType_name, int32(x))
}

func (PortComponentAttributes_ConnectorType) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_d7c33d745c4ab367, []int{5, 0}
}

type PortComponentAttributes_Speed int32

const (
	PortComponentAttributes_SPEED_UNDEFINED PortComponentAttributes_Speed = 0
	PortComponentAttributes_DYNAMIC         PortComponentAttributes_Speed = 1
	PortComponentAttributes_GIGABIT_1       PortComponentAttributes_Speed = 2
	PortComponentAttributes_GIGABIT_10      PortComponentAttributes_Speed = 3
	PortComponentAttributes_GIGABIT_25      PortComponentAttributes_Speed = 4
	PortComponentAttributes_GIGABIT_40      PortComponentAttributes_Speed = 5
	PortComponentAttributes_GIGABIT_100     PortComponentAttributes_Speed = 6
	PortComponentAttributes_GIGABIT_400     PortComponentAttributes_Speed = 7
	PortComponentAttributes_MEGABIT_2500    PortComponentAttributes_Speed = 8
	PortComponentAttributes_MEGABIT_1250    PortComponentAttributes_Speed = 9
)

var PortComponentAttributes_Speed_name = map[int32]string{
	0: "SPEED_UNDEFINED",
	1: "DYNAMIC",
	2: "GIGABIT_1",
	3: "GIGABIT_10",
	4: "GIGABIT_25",
	5: "GIGABIT_40",
	6: "GIGABIT_100",
	7: "GIGABIT_400",
	8: "MEGABIT_2500",
	9: "MEGABIT_1250",
}

var PortComponentAttributes_Speed_value = map[string]int32{
	"SPEED_UNDEFINED": 0,
	"DYNAMIC":         1,
	"GIGABIT_1":       2,
	"GIGABIT_10":      3,
	"GIGABIT_25":      4,
	"GIGABIT_40":      5,
	"GIGABIT_100":     6,
	"GIGABIT_400":     7,
	"MEGABIT_2500":    8,
	"MEGABIT_1250":    9,
}

func (x PortComponentAttributes_Speed) String() string {
	return proto.EnumName(PortComponentAttributes_Speed_name, int32(x))
}

func (PortComponentAttributes_Speed) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_d7c33d745c4ab367, []int{5, 1}
}

type PortComponentAttributes_Protocol int32

const (
	PortComponentAttributes_PROTOCOL_UNDEFINED PortComponentAttributes_Protocol = 0
	PortComponentAttributes_ETHERNET           PortComponentAttributes_Protocol = 1
	PortComponentAttributes_GPON               PortComponentAttributes_Protocol = 2
	PortComponentAttributes_XGPON              PortComponentAttributes_Protocol = 3
	PortComponentAttributes_XGSPON             PortComponentAttributes_Protocol = 4
	PortComponentAttributes_GFAST              PortComponentAttributes_Protocol = 5
	PortComponentAttributes_SERIAL             PortComponentAttributes_Protocol = 6
	PortComponentAttributes_EPON               PortComponentAttributes_Protocol = 7
	PortComponentAttributes_BITS               PortComponentAttributes_Protocol = 8
)

var PortComponentAttributes_Protocol_name = map[int32]string{
	0: "PROTOCOL_UNDEFINED",
	1: "ETHERNET",
	2: "GPON",
	3: "XGPON",
	4: "XGSPON",
	5: "GFAST",
	6: "SERIAL",
	7: "EPON",
	8: "BITS",
}

var PortComponentAttributes_Protocol_value = map[string]int32{
	"PROTOCOL_UNDEFINED": 0,
	"ETHERNET":           1,
	"GPON":               2,
	"XGPON":              3,
	"XGSPON":             4,
	"GFAST":              5,
	"SERIAL":             6,
	"EPON":               7,
	"BITS":               8,
}

func (x PortComponentAttributes_Protocol) String() string {
	return proto.EnumName(PortComponentAttributes_Protocol_name, int32(x))
}

func (PortComponentAttributes_Protocol) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_d7c33d745c4ab367, []int{5, 2}
}

type PsuComponentAttributes_SupportedVoltage int32

const (
	PsuComponentAttributes_SUPPORTED_VOLTAGE_UNDEFINED PsuComponentAttributes_SupportedVoltage = 0
	PsuComponentAttributes_V48                         PsuComponentAttributes_SupportedVoltage = 1
	PsuComponentAttributes_V230                        PsuComponentAttributes_SupportedVoltage = 2
	PsuComponentAttributes_V115                        PsuComponentAttributes_SupportedVoltage = 3
)

var PsuComponentAttributes_SupportedVoltage_name = map[int32]string{
	0: "SUPPORTED_VOLTAGE_UNDEFINED",
	1: "V48",
	2: "V230",
	3: "V115",
}

var PsuComponentAttributes_SupportedVoltage_value = map[string]int32{
	"SUPPORTED_VOLTAGE_UNDEFINED": 0,
	"V48":                         1,
	"V230":                        2,
	"V115":                        3,
}

func (x PsuComponentAttributes_SupportedVoltage) String() string {
	return proto.EnumName(PsuComponentAttributes_SupportedVoltage_name, int32(x))
}

func (PsuComponentAttributes_SupportedVoltage) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_d7c33d745c4ab367, []int{10, 0}
}

type TransceiverComponentsAttributes_FormFactor int32

const (
	TransceiverComponentsAttributes_FORM_FACTOR_UNKNOWN TransceiverComponentsAttributes_FormFactor = 0
	TransceiverComponentsAttributes_QSFP                TransceiverComponentsAttributes_FormFactor = 1
	TransceiverComponentsAttributes_QSFP_PLUS           TransceiverComponentsAttributes_FormFactor = 2
	TransceiverComponentsAttributes_QSFP28              TransceiverComponentsAttributes_FormFactor = 3
	TransceiverComponentsAttributes_SFP                 TransceiverComponentsAttributes_FormFactor = 4
	TransceiverComponentsAttributes_SFP_PLUS            TransceiverComponentsAttributes_FormFactor = 5
	TransceiverComponentsAttributes_XFP                 TransceiverComponentsAttributes_FormFactor = 6
	TransceiverComponentsAttributes_CFP4                TransceiverComponentsAttributes_FormFactor = 7
	TransceiverComponentsAttributes_CFP2                TransceiverComponentsAttributes_FormFactor = 8
	TransceiverComponentsAttributes_CPAK                TransceiverComponentsAttributes_FormFactor = 9
	TransceiverComponentsAttributes_X2                  TransceiverComponentsAttributes_FormFactor = 10
	TransceiverComponentsAttributes_OTHER               TransceiverComponentsAttributes_FormFactor = 11
	TransceiverComponentsAttributes_CFP                 TransceiverComponentsAttributes_FormFactor = 12
	TransceiverComponentsAttributes_CFP2_ACO            TransceiverComponentsAttributes_FormFactor = 13
	TransceiverComponentsAttributes_CFP2_DCO            TransceiverComponentsAttributes_FormFactor = 14
)

var TransceiverComponentsAttributes_FormFactor_name = map[int32]string{
	0:  "FORM_FACTOR_UNKNOWN",
	1:  "QSFP",
	2:  "QSFP_PLUS",
	3:  "QSFP28",
	4:  "SFP",
	5:  "SFP_PLUS",
	6:  "XFP",
	7:  "CFP4",
	8:  "CFP2",
	9:  "CPAK",
	10: "X2",
	11: "OTHER",
	12: "CFP",
	13: "CFP2_ACO",
	14: "CFP2_DCO",
}

var TransceiverComponentsAttributes_FormFactor_value = map[string]int32{
	"FORM_FACTOR_UNKNOWN": 0,
	"QSFP":                1,
	"QSFP_PLUS":           2,
	"QSFP28":              3,
	"SFP":                 4,
	"SFP_PLUS":            5,
	"XFP":                 6,
	"CFP4":                7,
	"CFP2":                8,
	"CPAK":                9,
	"X2":                  10,
	"OTHER":               11,
	"CFP":                 12,
	"CFP2_ACO":            13,
	"CFP2_DCO":            14,
}

func (x TransceiverComponentsAttributes_FormFactor) String() string {
	return proto.EnumName(TransceiverComponentsAttributes_FormFactor_name, int32(x))
}

func (TransceiverComponentsAttributes_FormFactor) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_d7c33d745c4ab367, []int{11, 0}
}

type Uuid struct {
	Uuid                 string   `protobuf:"bytes,1,opt,name=uuid,proto3" json:"uuid,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_Uuid proto.InternalMessageInfo

func (m *Uuid) GetUuid() string {
	if m != nil {
		return m.Uuid
	}
	return ""
}

type HardwareID struct {
	Uuid                 *Uuid    `protobuf:"bytes,1,opt,name=uuid,proto3" json:"uuid,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_HardwareID proto.InternalMessageInfo

func (m *HardwareID) GetUuid() *Uuid {
	if m != nil {
		return m.Uuid
	}
	return nil
}

type Uri struct {
	Uri                  string   `protobuf:"bytes,1,opt,name=uri,proto3" json:"uri,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_Uri proto.InternalMessageInfo

func (m *Uri) GetUri() string {
	if m != nil {
		return m.Uri
	}
	return ""
}

type ComponentState struct {
	StateLastChanged     *timestamp.Timestamp  `protobuf:"bytes,1,opt,name=state_last_changed,json=stateLastChanged,proto3" json:"state_last_changed,omitempty"`
	AdminState           ComponentAdminState   `protobuf:"varint,2,opt,name=admin_state,json=adminState,proto3,enum=dmi.ComponentAdminState" json:"admin_state,omitempty"`
	OperState            ComponentOperState    `protobuf:"varint,3,opt,name=oper_state,json=operState,proto3,enum=dmi.ComponentOperState" json:"oper_state,omitempty"`
	UsageState           ComponentUsageState   `protobuf:"varint,4,opt,name=usage_state,json=usageState,proto3,enum=dmi.ComponentUsageState" json:"usage_state,omitempty"`
	AlarmState           ComponentAlarmState   `protobuf:"varint,5,opt,name=alarm_state,json=alarmState,proto3,enum=dmi.ComponentAlarmState" json:"alarm_state,omitempty"`
	StandbyState         ComponentStandbyState `protobuf:"varint,6,opt,name=standby_state,json=standbyState,proto3,enum=dmi.ComponentStandbyState" json:"standby_state,omitempty"`
	XXX_NoUnkeyedLiteral struct{}              `json:"-"`
	XXX_unrecognized     []byte                `json:"-"`
	XXX_sizecache        int32                 `json:"-"`
}

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

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

var xxx_messageInfo_ComponentState proto.InternalMessageInfo

func (m *ComponentState) GetStateLastChanged() *timestamp.Timestamp {
	if m != nil {
		return m.StateLastChanged
	}
	return nil
}

func (m *ComponentState) GetAdminState() ComponentAdminState {
	if m != nil {
		return m.AdminState
	}
	return ComponentAdminState_COMP_ADMIN_STATE_UNDEFINED
}

func (m *ComponentState) GetOperState() ComponentOperState {
	if m != nil {
		return m.OperState
	}
	return ComponentOperState_COMP_OPER_STATE_UNDEFINED
}

func (m *ComponentState) GetUsageState() ComponentUsageState {
	if m != nil {
		return m.UsageState
	}
	return ComponentUsageState_COMP_USAGE_STATE_UNDEFINED
}

func (m *ComponentState) GetAlarmState() ComponentAlarmState {
	if m != nil {
		return m.AlarmState
	}
	return ComponentAlarmState_COMP_ALARM_STATE_UNDEFINED
}

func (m *ComponentState) GetStandbyState() ComponentStandbyState {
	if m != nil {
		return m.StandbyState
	}
	return ComponentStandbyState_COMP_STANDBY_STATE_UNDEFINED
}

type ComponentSensorData struct {
	Value           int32                `protobuf:"varint,1,opt,name=value,proto3" json:"value,omitempty"`
	Type            DataValueType        `protobuf:"varint,2,opt,name=type,proto3,enum=dmi.DataValueType" json:"type,omitempty"`
	Scale           ValueScale           `protobuf:"varint,3,opt,name=scale,proto3,enum=dmi.ValueScale" json:"scale,omitempty"`
	Precision       int32                `protobuf:"varint,4,opt,name=precision,proto3" json:"precision,omitempty"`
	Status          SensorStatus         `protobuf:"varint,5,opt,name=status,proto3,enum=dmi.SensorStatus" json:"status,omitempty"`
	UnitsDisplay    string               `protobuf:"bytes,6,opt,name=units_display,json=unitsDisplay,proto3" json:"units_display,omitempty"`
	Timestamp       *timestamp.Timestamp `protobuf:"bytes,7,opt,name=timestamp,proto3" json:"timestamp,omitempty"`
	ValueUpdateRate uint32               `protobuf:"varint,8,opt,name=value_update_rate,json=valueUpdateRate,proto3" json:"value_update_rate,omitempty"`
	// data_type can be of the string representation of MetricNames or something else as well
	DataType             string   `protobuf:"bytes,9,opt,name=data_type,json=dataType,proto3" json:"data_type,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_ComponentSensorData proto.InternalMessageInfo

func (m *ComponentSensorData) GetValue() int32 {
	if m != nil {
		return m.Value
	}
	return 0
}

func (m *ComponentSensorData) GetType() DataValueType {
	if m != nil {
		return m.Type
	}
	return DataValueType_VALUE_TYPE_UNDEFINED
}

func (m *ComponentSensorData) GetScale() ValueScale {
	if m != nil {
		return m.Scale
	}
	return ValueScale_VALUE_SCALE_UNDEFINED
}

func (m *ComponentSensorData) GetPrecision() int32 {
	if m != nil {
		return m.Precision
	}
	return 0
}

func (m *ComponentSensorData) GetStatus() SensorStatus {
	if m != nil {
		return m.Status
	}
	return SensorStatus_SENSOR_STATUS_UNDEFINED
}

func (m *ComponentSensorData) GetUnitsDisplay() string {
	if m != nil {
		return m.UnitsDisplay
	}
	return ""
}

func (m *ComponentSensorData) GetTimestamp() *timestamp.Timestamp {
	if m != nil {
		return m.Timestamp
	}
	return nil
}

func (m *ComponentSensorData) GetValueUpdateRate() uint32 {
	if m != nil {
		return m.ValueUpdateRate
	}
	return 0
}

func (m *ComponentSensorData) GetDataType() string {
	if m != nil {
		return m.DataType
	}
	return ""
}

type PortComponentAttributes struct {
	ConnectorType PortComponentAttributes_ConnectorType `protobuf:"varint,1,opt,name=connector_type,json=connectorType,proto3,enum=dmi.PortComponentAttributes_ConnectorType" json:"connector_type,omitempty"`
	Speed         PortComponentAttributes_Speed         `protobuf:"varint,2,opt,name=speed,proto3,enum=dmi.PortComponentAttributes_Speed" json:"speed,omitempty"`
	Protocol      PortComponentAttributes_Protocol      `protobuf:"varint,3,opt,name=protocol,proto3,enum=dmi.PortComponentAttributes_Protocol" json:"protocol,omitempty"`
	PhysicalLabel string                                `protobuf:"bytes,4,opt,name=physical_label,json=physicalLabel,proto3" json:"physical_label,omitempty"`
	// The mapping_label can be used to map ports between the DMI interface and other systems like VOLTHA
	// The value of the mapping_label should be exactly the same as generated for the same port by the other
	// system
	MappingLabel         string       `protobuf:"bytes,5,opt,name=mapping_label,json=mappingLabel,proto3" json:"mapping_label,omitempty"`
	PonIdConfig          *PonIdConfig `protobuf:"bytes,6,opt,name=pon_id_config,json=ponIdConfig,proto3" json:"pon_id_config,omitempty"`
	SpeedAutonegotiation bool         `protobuf:"varint,7,opt,name=speed_autonegotiation,json=speedAutonegotiation,proto3" json:"speed_autonegotiation,omitempty"`
	XXX_NoUnkeyedLiteral struct{}     `json:"-"`
	XXX_unrecognized     []byte       `json:"-"`
	XXX_sizecache        int32        `json:"-"`
}

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

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

var xxx_messageInfo_PortComponentAttributes proto.InternalMessageInfo

func (m *PortComponentAttributes) GetConnectorType() PortComponentAttributes_ConnectorType {
	if m != nil {
		return m.ConnectorType
	}
	return PortComponentAttributes_CONNECTOR_TYPE_UNDEFINED
}

func (m *PortComponentAttributes) GetSpeed() PortComponentAttributes_Speed {
	if m != nil {
		return m.Speed
	}
	return PortComponentAttributes_SPEED_UNDEFINED
}

func (m *PortComponentAttributes) GetProtocol() PortComponentAttributes_Protocol {
	if m != nil {
		return m.Protocol
	}
	return PortComponentAttributes_PROTOCOL_UNDEFINED
}

func (m *PortComponentAttributes) GetPhysicalLabel() string {
	if m != nil {
		return m.PhysicalLabel
	}
	return ""
}

func (m *PortComponentAttributes) GetMappingLabel() string {
	if m != nil {
		return m.MappingLabel
	}
	return ""
}

func (m *PortComponentAttributes) GetPonIdConfig() *PonIdConfig {
	if m != nil {
		return m.PonIdConfig
	}
	return nil
}

func (m *PortComponentAttributes) GetSpeedAutonegotiation() bool {
	if m != nil {
		return m.SpeedAutonegotiation
	}
	return false
}

type PortComponentChangeAttributes struct {
	PonIdConfig          *PonIdConfig `protobuf:"bytes,1,opt,name=pon_id_config,json=ponIdConfig,proto3" json:"pon_id_config,omitempty"`
	XXX_NoUnkeyedLiteral struct{}     `json:"-"`
	XXX_unrecognized     []byte       `json:"-"`
	XXX_sizecache        int32        `json:"-"`
}

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

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

var xxx_messageInfo_PortComponentChangeAttributes proto.InternalMessageInfo

func (m *PortComponentChangeAttributes) GetPonIdConfig() *PonIdConfig {
	if m != nil {
		return m.PonIdConfig
	}
	return nil
}

type TransceiverComponentChangeAttributes struct {
	TransType            TransceiverType `protobuf:"varint,1,opt,name=trans_type,json=transType,proto3,enum=dmi.TransceiverType" json:"trans_type,omitempty"`
	XXX_NoUnkeyedLiteral struct{}        `json:"-"`
	XXX_unrecognized     []byte          `json:"-"`
	XXX_sizecache        int32           `json:"-"`
}

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

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

var xxx_messageInfo_TransceiverComponentChangeAttributes proto.InternalMessageInfo

func (m *TransceiverComponentChangeAttributes) GetTransType() TransceiverType {
	if m != nil {
		return m.TransType
	}
	return TransceiverType_TYPE_UNDEFINED
}

type PonIdConfig struct {
	// The pon_id and pon_id_transmit_periodicity attributes are valid only for ports of type GPON, XGPON and XGSPON
	// For GPON pon_id is a 7 byte value
	// For XGS-PON, it's a 32 bit value, should be encoded in the first 4 bytes of pon_id in network byte order
	PonId                    []byte   `protobuf:"bytes,1,opt,name=pon_id,json=ponId,proto3" json:"pon_id,omitempty"`
	PonIdTransmitPeriodicity uint32   `protobuf:"varint,2,opt,name=pon_id_transmit_periodicity,json=ponIdTransmitPeriodicity,proto3" json:"pon_id_transmit_periodicity,omitempty"`
	XXX_NoUnkeyedLiteral     struct{} `json:"-"`
	XXX_unrecognized         []byte   `json:"-"`
	XXX_sizecache            int32    `json:"-"`
}

func (m *PonIdConfig) Reset()         { *m = PonIdConfig{} }
func (m *PonIdConfig) String() string { return proto.CompactTextString(m) }
func (*PonIdConfig) ProtoMessage()    {}
func (*PonIdConfig) Descriptor() ([]byte, []int) {
	return fileDescriptor_d7c33d745c4ab367, []int{8}
}

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

var xxx_messageInfo_PonIdConfig proto.InternalMessageInfo

func (m *PonIdConfig) GetPonId() []byte {
	if m != nil {
		return m.PonId
	}
	return nil
}

func (m *PonIdConfig) GetPonIdTransmitPeriodicity() uint32 {
	if m != nil {
		return m.PonIdTransmitPeriodicity
	}
	return 0
}

type ContainerComponentAttributes struct {
	PhysicalLabel        string   `protobuf:"bytes,1,opt,name=physical_label,json=physicalLabel,proto3" json:"physical_label,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *ContainerComponentAttributes) Reset()         { *m = ContainerComponentAttributes{} }
func (m *ContainerComponentAttributes) String() string { return proto.CompactTextString(m) }
func (*ContainerComponentAttributes) ProtoMessage()    {}
func (*ContainerComponentAttributes) Descriptor() ([]byte, []int) {
	return fileDescriptor_d7c33d745c4ab367, []int{9}
}

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

var xxx_messageInfo_ContainerComponentAttributes proto.InternalMessageInfo

func (m *ContainerComponentAttributes) GetPhysicalLabel() string {
	if m != nil {
		return m.PhysicalLabel
	}
	return ""
}

type PsuComponentAttributes struct {
	SupportedVoltage     PsuComponentAttributes_SupportedVoltage `protobuf:"varint,1,opt,name=supported_voltage,json=supportedVoltage,proto3,enum=dmi.PsuComponentAttributes_SupportedVoltage" json:"supported_voltage,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                                `json:"-"`
	XXX_unrecognized     []byte                                  `json:"-"`
	XXX_sizecache        int32                                   `json:"-"`
}

func (m *PsuComponentAttributes) Reset()         { *m = PsuComponentAttributes{} }
func (m *PsuComponentAttributes) String() string { return proto.CompactTextString(m) }
func (*PsuComponentAttributes) ProtoMessage()    {}
func (*PsuComponentAttributes) Descriptor() ([]byte, []int) {
	return fileDescriptor_d7c33d745c4ab367, []int{10}
}

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

var xxx_messageInfo_PsuComponentAttributes proto.InternalMessageInfo

func (m *PsuComponentAttributes) GetSupportedVoltage() PsuComponentAttributes_SupportedVoltage {
	if m != nil {
		return m.SupportedVoltage
	}
	return PsuComponentAttributes_SUPPORTED_VOLTAGE_UNDEFINED
}

type TransceiverComponentsAttributes struct {
	FormFactor TransceiverComponentsAttributes_FormFactor `protobuf:"varint,1,opt,name=form_factor,json=formFactor,proto3,enum=dmi.TransceiverComponentsAttributes_FormFactor" json:"form_factor,omitempty"`
	TransType  TransceiverType                            `protobuf:"varint,2,opt,name=trans_type,json=transType,proto3,enum=dmi.TransceiverType" json:"trans_type,omitempty"`
	// The maximum reach that can be achieved by this transceiver
	MaxDistance      uint32     `protobuf:"varint,3,opt,name=max_distance,json=maxDistance,proto3" json:"max_distance,omitempty"`
	MaxDistanceScale ValueScale `protobuf:"varint,4,opt,name=max_distance_scale,json=maxDistanceScale,proto3,enum=dmi.ValueScale" json:"max_distance_scale,omitempty"`
	// The receive and transmit wavelengths that the transeiver operates on
	RxWavelength         []uint32   `protobuf:"varint,5,rep,packed,name=rx_wavelength,json=rxWavelength,proto3" json:"rx_wavelength,omitempty"`
	TxWavelength         []uint32   `protobuf:"varint,6,rep,packed,name=tx_wavelength,json=txWavelength,proto3" json:"tx_wavelength,omitempty"`
	WavelengthScale      ValueScale `protobuf:"varint,7,opt,name=wavelength_scale,json=wavelengthScale,proto3,enum=dmi.ValueScale" json:"wavelength_scale,omitempty"`
	XXX_NoUnkeyedLiteral struct{}   `json:"-"`
	XXX_unrecognized     []byte     `json:"-"`
	XXX_sizecache        int32      `json:"-"`
}

func (m *TransceiverComponentsAttributes) Reset()         { *m = TransceiverComponentsAttributes{} }
func (m *TransceiverComponentsAttributes) String() string { return proto.CompactTextString(m) }
func (*TransceiverComponentsAttributes) ProtoMessage()    {}
func (*TransceiverComponentsAttributes) Descriptor() ([]byte, []int) {
	return fileDescriptor_d7c33d745c4ab367, []int{11}
}

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

var xxx_messageInfo_TransceiverComponentsAttributes proto.InternalMessageInfo

func (m *TransceiverComponentsAttributes) GetFormFactor() TransceiverComponentsAttributes_FormFactor {
	if m != nil {
		return m.FormFactor
	}
	return TransceiverComponentsAttributes_FORM_FACTOR_UNKNOWN
}

func (m *TransceiverComponentsAttributes) GetTransType() TransceiverType {
	if m != nil {
		return m.TransType
	}
	return TransceiverType_TYPE_UNDEFINED
}

func (m *TransceiverComponentsAttributes) GetMaxDistance() uint32 {
	if m != nil {
		return m.MaxDistance
	}
	return 0
}

func (m *TransceiverComponentsAttributes) GetMaxDistanceScale() ValueScale {
	if m != nil {
		return m.MaxDistanceScale
	}
	return ValueScale_VALUE_SCALE_UNDEFINED
}

func (m *TransceiverComponentsAttributes) GetRxWavelength() []uint32 {
	if m != nil {
		return m.RxWavelength
	}
	return nil
}

func (m *TransceiverComponentsAttributes) GetTxWavelength() []uint32 {
	if m != nil {
		return m.TxWavelength
	}
	return nil
}

func (m *TransceiverComponentsAttributes) GetWavelengthScale() ValueScale {
	if m != nil {
		return m.WavelengthScale
	}
	return ValueScale_VALUE_SCALE_UNDEFINED
}

type Component struct {
	// The name of a component uniquely identifies a component within the hardware
	Name        string        `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
	Class       ComponentType `protobuf:"varint,2,opt,name=class,proto3,enum=dmi.ComponentType" json:"class,omitempty"`
	Description string        `protobuf:"bytes,3,opt,name=description,proto3" json:"description,omitempty"`
	// The name of the parent of this component, empty string("") in case of the root component
	Parent       string       `protobuf:"bytes,4,opt,name=parent,proto3" json:"parent,omitempty"`
	ParentRelPos int32        `protobuf:"varint,5,opt,name=parent_rel_pos,json=parentRelPos,proto3" json:"parent_rel_pos,omitempty"`
	Children     []*Component `protobuf:"bytes,6,rep,name=children,proto3" json:"children,omitempty"`
	HardwareRev  string       `protobuf:"bytes,7,opt,name=hardware_rev,json=hardwareRev,proto3" json:"hardware_rev,omitempty"`
	FirmwareRev  string       `protobuf:"bytes,8,opt,name=firmware_rev,json=firmwareRev,proto3" json:"firmware_rev,omitempty"`
	SoftwareRev  string       `protobuf:"bytes,9,opt,name=software_rev,json=softwareRev,proto3" json:"software_rev,omitempty"`
	SerialNum    string       `protobuf:"bytes,10,opt,name=serial_num,json=serialNum,proto3" json:"serial_num,omitempty"`
	MfgName      string       `protobuf:"bytes,11,opt,name=mfg_name,json=mfgName,proto3" json:"mfg_name,omitempty"`
	// Apart from the definition of this attribute as defined in RFC 8348, implementations could choose to carry
	// the manufacturer's part number in this attribute.
	ModelName string               `protobuf:"bytes,12,opt,name=model_name,json=modelName,proto3" json:"model_name,omitempty"`
	Alias     string               `protobuf:"bytes,13,opt,name=alias,proto3" json:"alias,omitempty"`
	AssetId   string               `protobuf:"bytes,14,opt,name=asset_id,json=assetId,proto3" json:"asset_id,omitempty"`
	IsFru     bool                 `protobuf:"varint,15,opt,name=is_fru,json=isFru,proto3" json:"is_fru,omitempty"`
	MfgDate   *timestamp.Timestamp `protobuf:"bytes,16,opt,name=mfg_date,json=mfgDate,proto3" json:"mfg_date,omitempty"`
	Uri       *Uri                 `protobuf:"bytes,17,opt,name=uri,proto3" json:"uri,omitempty"`
	// The uuid of the component uniquely identifies the component across the entire system
	Uuid       *Uuid                  `protobuf:"bytes,18,opt,name=uuid,proto3" json:"uuid,omitempty"`
	State      *ComponentState        `protobuf:"bytes,19,opt,name=state,proto3" json:"state,omitempty"`
	SensorData []*ComponentSensorData `protobuf:"bytes,20,rep,name=sensor_data,json=sensorData,proto3" json:"sensor_data,omitempty"`
	// The attribute 'specific' can be populated for components where more details are required by the users of the DMI interface
	//
	// Types that are valid to be assigned to Specific:
	//	*Component_PortAttr
	//	*Component_ContainerAttr
	//	*Component_PsuAttr
	//	*Component_TransceiverAttr
	Specific             isComponent_Specific `protobuf_oneof:"specific"`
	XXX_NoUnkeyedLiteral struct{}             `json:"-"`
	XXX_unrecognized     []byte               `json:"-"`
	XXX_sizecache        int32                `json:"-"`
}

func (m *Component) Reset()         { *m = Component{} }
func (m *Component) String() string { return proto.CompactTextString(m) }
func (*Component) ProtoMessage()    {}
func (*Component) Descriptor() ([]byte, []int) {
	return fileDescriptor_d7c33d745c4ab367, []int{12}
}

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

var xxx_messageInfo_Component proto.InternalMessageInfo

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

func (m *Component) GetClass() ComponentType {
	if m != nil {
		return m.Class
	}
	return ComponentType_COMPONENT_TYPE_UNDEFINED
}

func (m *Component) GetDescription() string {
	if m != nil {
		return m.Description
	}
	return ""
}

func (m *Component) GetParent() string {
	if m != nil {
		return m.Parent
	}
	return ""
}

func (m *Component) GetParentRelPos() int32 {
	if m != nil {
		return m.ParentRelPos
	}
	return 0
}

func (m *Component) GetChildren() []*Component {
	if m != nil {
		return m.Children
	}
	return nil
}

func (m *Component) GetHardwareRev() string {
	if m != nil {
		return m.HardwareRev
	}
	return ""
}

func (m *Component) GetFirmwareRev() string {
	if m != nil {
		return m.FirmwareRev
	}
	return ""
}

func (m *Component) GetSoftwareRev() string {
	if m != nil {
		return m.SoftwareRev
	}
	return ""
}

func (m *Component) GetSerialNum() string {
	if m != nil {
		return m.SerialNum
	}
	return ""
}

func (m *Component) GetMfgName() string {
	if m != nil {
		return m.MfgName
	}
	return ""
}

func (m *Component) GetModelName() string {
	if m != nil {
		return m.ModelName
	}
	return ""
}

func (m *Component) GetAlias() string {
	if m != nil {
		return m.Alias
	}
	return ""
}

func (m *Component) GetAssetId() string {
	if m != nil {
		return m.AssetId
	}
	return ""
}

func (m *Component) GetIsFru() bool {
	if m != nil {
		return m.IsFru
	}
	return false
}

func (m *Component) GetMfgDate() *timestamp.Timestamp {
	if m != nil {
		return m.MfgDate
	}
	return nil
}

func (m *Component) GetUri() *Uri {
	if m != nil {
		return m.Uri
	}
	return nil
}

func (m *Component) GetUuid() *Uuid {
	if m != nil {
		return m.Uuid
	}
	return nil
}

func (m *Component) GetState() *ComponentState {
	if m != nil {
		return m.State
	}
	return nil
}

func (m *Component) GetSensorData() []*ComponentSensorData {
	if m != nil {
		return m.SensorData
	}
	return nil
}

type isComponent_Specific interface {
	isComponent_Specific()
}

type Component_PortAttr struct {
	PortAttr *PortComponentAttributes `protobuf:"bytes,50,opt,name=port_attr,json=portAttr,proto3,oneof"`
}

type Component_ContainerAttr struct {
	ContainerAttr *ContainerComponentAttributes `protobuf:"bytes,51,opt,name=container_attr,json=containerAttr,proto3,oneof"`
}

type Component_PsuAttr struct {
	PsuAttr *PsuComponentAttributes `protobuf:"bytes,52,opt,name=psu_attr,json=psuAttr,proto3,oneof"`
}

type Component_TransceiverAttr struct {
	TransceiverAttr *TransceiverComponentsAttributes `protobuf:"bytes,53,opt,name=transceiver_attr,json=transceiverAttr,proto3,oneof"`
}

func (*Component_PortAttr) isComponent_Specific() {}

func (*Component_ContainerAttr) isComponent_Specific() {}

func (*Component_PsuAttr) isComponent_Specific() {}

func (*Component_TransceiverAttr) isComponent_Specific() {}

func (m *Component) GetSpecific() isComponent_Specific {
	if m != nil {
		return m.Specific
	}
	return nil
}

func (m *Component) GetPortAttr() *PortComponentAttributes {
	if x, ok := m.GetSpecific().(*Component_PortAttr); ok {
		return x.PortAttr
	}
	return nil
}

func (m *Component) GetContainerAttr() *ContainerComponentAttributes {
	if x, ok := m.GetSpecific().(*Component_ContainerAttr); ok {
		return x.ContainerAttr
	}
	return nil
}

func (m *Component) GetPsuAttr() *PsuComponentAttributes {
	if x, ok := m.GetSpecific().(*Component_PsuAttr); ok {
		return x.PsuAttr
	}
	return nil
}

func (m *Component) GetTransceiverAttr() *TransceiverComponentsAttributes {
	if x, ok := m.GetSpecific().(*Component_TransceiverAttr); ok {
		return x.TransceiverAttr
	}
	return nil
}

// XXX_OneofWrappers is for the internal use of the proto package.
func (*Component) XXX_OneofWrappers() []interface{} {
	return []interface{}{
		(*Component_PortAttr)(nil),
		(*Component_ContainerAttr)(nil),
		(*Component_PsuAttr)(nil),
		(*Component_TransceiverAttr)(nil),
	}
}

type Hardware struct {
	LastChange *timestamp.Timestamp `protobuf:"bytes,1,opt,name=last_change,json=lastChange,proto3" json:"last_change,omitempty"`
	// Each HW has one parent/root and all other components are children of this
	// The class of the root component would be set as UNDEFINED
	Root *Component `protobuf:"bytes,2,opt,name=root,proto3" json:"root,omitempty"`
	// TODO: Authentication?
	// Timestamp at which the hardware last booted
	LastBooted           *timestamp.Timestamp `protobuf:"bytes,3,opt,name=last_booted,json=lastBooted,proto3" json:"last_booted,omitempty"`
	XXX_NoUnkeyedLiteral struct{}             `json:"-"`
	XXX_unrecognized     []byte               `json:"-"`
	XXX_sizecache        int32                `json:"-"`
}

func (m *Hardware) Reset()         { *m = Hardware{} }
func (m *Hardware) String() string { return proto.CompactTextString(m) }
func (*Hardware) ProtoMessage()    {}
func (*Hardware) Descriptor() ([]byte, []int) {
	return fileDescriptor_d7c33d745c4ab367, []int{13}
}

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

var xxx_messageInfo_Hardware proto.InternalMessageInfo

func (m *Hardware) GetLastChange() *timestamp.Timestamp {
	if m != nil {
		return m.LastChange
	}
	return nil
}

func (m *Hardware) GetRoot() *Component {
	if m != nil {
		return m.Root
	}
	return nil
}

func (m *Hardware) GetLastBooted() *timestamp.Timestamp {
	if m != nil {
		return m.LastBooted
	}
	return nil
}

// The attributes of a component which are modifiable from the client side
type ModifiableComponent struct {
	// The name has to be unique for each component within the hardware and implementations need to
	// ascertain this when modifying the name
	Name         string              `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
	Class        ComponentType       `protobuf:"varint,2,opt,name=class,proto3,enum=dmi.ComponentType" json:"class,omitempty"`
	Parent       *Component          `protobuf:"bytes,3,opt,name=parent,proto3" json:"parent,omitempty"`
	ParentRelPos int32               `protobuf:"varint,4,opt,name=parent_rel_pos,json=parentRelPos,proto3" json:"parent_rel_pos,omitempty"`
	Alias        string              `protobuf:"bytes,5,opt,name=alias,proto3" json:"alias,omitempty"`
	AssetId      string              `protobuf:"bytes,6,opt,name=asset_id,json=assetId,proto3" json:"asset_id,omitempty"`
	Uri          *Uri                `protobuf:"bytes,7,opt,name=uri,proto3" json:"uri,omitempty"`
	AdminState   ComponentAdminState `protobuf:"varint,8,opt,name=admin_state,json=adminState,proto3,enum=dmi.ComponentAdminState" json:"admin_state,omitempty"`
	// The attribute 'specific' can be populated for specific class of components
	//
	// Types that are valid to be assigned to Specific:
	//	*ModifiableComponent_PortAttr
	//	*ModifiableComponent_TrxAttr
	Specific             isModifiableComponent_Specific `protobuf_oneof:"specific"`
	XXX_NoUnkeyedLiteral struct{}                       `json:"-"`
	XXX_unrecognized     []byte                         `json:"-"`
	XXX_sizecache        int32                          `json:"-"`
}

func (m *ModifiableComponent) Reset()         { *m = ModifiableComponent{} }
func (m *ModifiableComponent) String() string { return proto.CompactTextString(m) }
func (*ModifiableComponent) ProtoMessage()    {}
func (*ModifiableComponent) Descriptor() ([]byte, []int) {
	return fileDescriptor_d7c33d745c4ab367, []int{14}
}

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

var xxx_messageInfo_ModifiableComponent proto.InternalMessageInfo

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

func (m *ModifiableComponent) GetClass() ComponentType {
	if m != nil {
		return m.Class
	}
	return ComponentType_COMPONENT_TYPE_UNDEFINED
}

func (m *ModifiableComponent) GetParent() *Component {
	if m != nil {
		return m.Parent
	}
	return nil
}

func (m *ModifiableComponent) GetParentRelPos() int32 {
	if m != nil {
		return m.ParentRelPos
	}
	return 0
}

func (m *ModifiableComponent) GetAlias() string {
	if m != nil {
		return m.Alias
	}
	return ""
}

func (m *ModifiableComponent) GetAssetId() string {
	if m != nil {
		return m.AssetId
	}
	return ""
}

func (m *ModifiableComponent) GetUri() *Uri {
	if m != nil {
		return m.Uri
	}
	return nil
}

func (m *ModifiableComponent) GetAdminState() ComponentAdminState {
	if m != nil {
		return m.AdminState
	}
	return ComponentAdminState_COMP_ADMIN_STATE_UNDEFINED
}

type isModifiableComponent_Specific interface {
	isModifiableComponent_Specific()
}

type ModifiableComponent_PortAttr struct {
	PortAttr *PortComponentChangeAttributes `protobuf:"bytes,50,opt,name=port_attr,json=portAttr,proto3,oneof"`
}

type ModifiableComponent_TrxAttr struct {
	TrxAttr *TransceiverComponentChangeAttributes `protobuf:"bytes,51,opt,name=trx_attr,json=trxAttr,proto3,oneof"`
}

func (*ModifiableComponent_PortAttr) isModifiableComponent_Specific() {}

func (*ModifiableComponent_TrxAttr) isModifiableComponent_Specific() {}

func (m *ModifiableComponent) GetSpecific() isModifiableComponent_Specific {
	if m != nil {
		return m.Specific
	}
	return nil
}

func (m *ModifiableComponent) GetPortAttr() *PortComponentChangeAttributes {
	if x, ok := m.GetSpecific().(*ModifiableComponent_PortAttr); ok {
		return x.PortAttr
	}
	return nil
}

func (m *ModifiableComponent) GetTrxAttr() *TransceiverComponentChangeAttributes {
	if x, ok := m.GetSpecific().(*ModifiableComponent_TrxAttr); ok {
		return x.TrxAttr
	}
	return nil
}

// XXX_OneofWrappers is for the internal use of the proto package.
func (*ModifiableComponent) XXX_OneofWrappers() []interface{} {
	return []interface{}{
		(*ModifiableComponent_PortAttr)(nil),
		(*ModifiableComponent_TrxAttr)(nil),
	}
}

func init() {
	proto.RegisterEnum("dmi.ComponentType", ComponentType_name, ComponentType_value)
	proto.RegisterEnum("dmi.ComponentAdminState", ComponentAdminState_name, ComponentAdminState_value)
	proto.RegisterEnum("dmi.ComponentOperState", ComponentOperState_name, ComponentOperState_value)
	proto.RegisterEnum("dmi.ComponentUsageState", ComponentUsageState_name, ComponentUsageState_value)
	proto.RegisterEnum("dmi.ComponentAlarmState", ComponentAlarmState_name, ComponentAlarmState_value)
	proto.RegisterEnum("dmi.ComponentStandbyState", ComponentStandbyState_name, ComponentStandbyState_value)
	proto.RegisterEnum("dmi.DataValueType", DataValueType_name, DataValueType_value)
	proto.RegisterEnum("dmi.ValueScale", ValueScale_name, ValueScale_value)
	proto.RegisterEnum("dmi.SensorStatus", SensorStatus_name, SensorStatus_value)
	proto.RegisterEnum("dmi.TransceiverType", TransceiverType_name, TransceiverType_value)
	proto.RegisterEnum("dmi.PortComponentAttributes_ConnectorType", PortComponentAttributes_ConnectorType_name, PortComponentAttributes_ConnectorType_value)
	proto.RegisterEnum("dmi.PortComponentAttributes_Speed", PortComponentAttributes_Speed_name, PortComponentAttributes_Speed_value)
	proto.RegisterEnum("dmi.PortComponentAttributes_Protocol", PortComponentAttributes_Protocol_name, PortComponentAttributes_Protocol_value)
	proto.RegisterEnum("dmi.PsuComponentAttributes_SupportedVoltage", PsuComponentAttributes_SupportedVoltage_name, PsuComponentAttributes_SupportedVoltage_value)
	proto.RegisterEnum("dmi.TransceiverComponentsAttributes_FormFactor", TransceiverComponentsAttributes_FormFactor_name, TransceiverComponentsAttributes_FormFactor_value)
	proto.RegisterType((*Uuid)(nil), "dmi.Uuid")
	proto.RegisterType((*HardwareID)(nil), "dmi.HardwareID")
	proto.RegisterType((*Uri)(nil), "dmi.Uri")
	proto.RegisterType((*ComponentState)(nil), "dmi.ComponentState")
	proto.RegisterType((*ComponentSensorData)(nil), "dmi.ComponentSensorData")
	proto.RegisterType((*PortComponentAttributes)(nil), "dmi.PortComponentAttributes")
	proto.RegisterType((*PortComponentChangeAttributes)(nil), "dmi.PortComponentChangeAttributes")
	proto.RegisterType((*TransceiverComponentChangeAttributes)(nil), "dmi.TransceiverComponentChangeAttributes")
	proto.RegisterType((*PonIdConfig)(nil), "dmi.PonIdConfig")
	proto.RegisterType((*ContainerComponentAttributes)(nil), "dmi.ContainerComponentAttributes")
	proto.RegisterType((*PsuComponentAttributes)(nil), "dmi.PsuComponentAttributes")
	proto.RegisterType((*TransceiverComponentsAttributes)(nil), "dmi.TransceiverComponentsAttributes")
	proto.RegisterType((*Component)(nil), "dmi.Component")
	proto.RegisterType((*Hardware)(nil), "dmi.Hardware")
	proto.RegisterType((*ModifiableComponent)(nil), "dmi.ModifiableComponent")
}

func init() { proto.RegisterFile("dmi/hw.proto", fileDescriptor_d7c33d745c4ab367) }

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