// Code generated by protoc-gen-go. DO NOT EDIT.
// source: voltha_protos/extensions.proto

package extension

import (
	context "context"
	fmt "fmt"
	proto "github.com/golang/protobuf/proto"
	empty "github.com/golang/protobuf/ptypes/empty"
	config "github.com/opencord/voltha-protos/v4/go/ext/config"
	grpc "google.golang.org/grpc"
	codes "google.golang.org/grpc/codes"
	status "google.golang.org/grpc/status"
	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

// AlarmConfig from public import voltha_protos/ext_config.proto
type AlarmConfig = config.AlarmConfig
type AlarmConfig_OnuItuPonAlarmConfig = config.AlarmConfig_OnuItuPonAlarmConfig

// OnuItuPonAlarm from public import voltha_protos/ext_config.proto
type OnuItuPonAlarm = config.OnuItuPonAlarm
type OnuItuPonAlarm_RateThresholdConfig_ = config.OnuItuPonAlarm_RateThresholdConfig_
type OnuItuPonAlarm_RateRangeConfig_ = config.OnuItuPonAlarm_RateRangeConfig_
type OnuItuPonAlarm_ValueThresholdConfig_ = config.OnuItuPonAlarm_ValueThresholdConfig_

// OnuItuPonAlarm_SoakTime from public import voltha_protos/ext_config.proto
type OnuItuPonAlarm_SoakTime = config.OnuItuPonAlarm_SoakTime

// OnuItuPonAlarm_RateThresholdConfig from public import voltha_protos/ext_config.proto
type OnuItuPonAlarm_RateThresholdConfig = config.OnuItuPonAlarm_RateThresholdConfig

// OnuItuPonAlarm_RateRangeConfig from public import voltha_protos/ext_config.proto
type OnuItuPonAlarm_RateRangeConfig = config.OnuItuPonAlarm_RateRangeConfig

// OnuItuPonAlarm_ValueThresholdConfig from public import voltha_protos/ext_config.proto
type OnuItuPonAlarm_ValueThresholdConfig = config.OnuItuPonAlarm_ValueThresholdConfig

// OnuItuPonAlarm_AlarmID from public import voltha_protos/ext_config.proto
type OnuItuPonAlarm_AlarmID = config.OnuItuPonAlarm_AlarmID

var OnuItuPonAlarm_AlarmID_name = config.OnuItuPonAlarm_AlarmID_name
var OnuItuPonAlarm_AlarmID_value = config.OnuItuPonAlarm_AlarmID_value

const OnuItuPonAlarm_RDI_ERRORS = OnuItuPonAlarm_AlarmID(config.OnuItuPonAlarm_RDI_ERRORS)

// OnuItuPonAlarm_AlarmReportingCondition from public import voltha_protos/ext_config.proto
type OnuItuPonAlarm_AlarmReportingCondition = config.OnuItuPonAlarm_AlarmReportingCondition

var OnuItuPonAlarm_AlarmReportingCondition_name = config.OnuItuPonAlarm_AlarmReportingCondition_name
var OnuItuPonAlarm_AlarmReportingCondition_value = config.OnuItuPonAlarm_AlarmReportingCondition_value

const OnuItuPonAlarm_RATE_THRESHOLD = OnuItuPonAlarm_AlarmReportingCondition(config.OnuItuPonAlarm_RATE_THRESHOLD)
const OnuItuPonAlarm_RATE_RANGE = OnuItuPonAlarm_AlarmReportingCondition(config.OnuItuPonAlarm_RATE_RANGE)
const OnuItuPonAlarm_VALUE_THRESHOLD = OnuItuPonAlarm_AlarmReportingCondition(config.OnuItuPonAlarm_VALUE_THRESHOLD)

type GetOnuUniInfoResponse_ConfigurationInd int32

const (
	GetOnuUniInfoResponse_UNKOWN               GetOnuUniInfoResponse_ConfigurationInd = 0
	GetOnuUniInfoResponse_TEN_BASE_T_FDX       GetOnuUniInfoResponse_ConfigurationInd = 1
	GetOnuUniInfoResponse_HUNDRED_BASE_T_FDX   GetOnuUniInfoResponse_ConfigurationInd = 2
	GetOnuUniInfoResponse_GIGABIT_ETHERNET_FDX GetOnuUniInfoResponse_ConfigurationInd = 3
	GetOnuUniInfoResponse_TEN_G_ETHERNET_FDX   GetOnuUniInfoResponse_ConfigurationInd = 4
	GetOnuUniInfoResponse_TEN_BASE_T_HDX       GetOnuUniInfoResponse_ConfigurationInd = 5
	GetOnuUniInfoResponse_HUNDRED_BASE_T_HDX   GetOnuUniInfoResponse_ConfigurationInd = 6
	GetOnuUniInfoResponse_GIGABIT_ETHERNET_HDX GetOnuUniInfoResponse_ConfigurationInd = 7
)

var GetOnuUniInfoResponse_ConfigurationInd_name = map[int32]string{
	0: "UNKOWN",
	1: "TEN_BASE_T_FDX",
	2: "HUNDRED_BASE_T_FDX",
	3: "GIGABIT_ETHERNET_FDX",
	4: "TEN_G_ETHERNET_FDX",
	5: "TEN_BASE_T_HDX",
	6: "HUNDRED_BASE_T_HDX",
	7: "GIGABIT_ETHERNET_HDX",
}

var GetOnuUniInfoResponse_ConfigurationInd_value = map[string]int32{
	"UNKOWN":               0,
	"TEN_BASE_T_FDX":       1,
	"HUNDRED_BASE_T_FDX":   2,
	"GIGABIT_ETHERNET_FDX": 3,
	"TEN_G_ETHERNET_FDX":   4,
	"TEN_BASE_T_HDX":       5,
	"HUNDRED_BASE_T_HDX":   6,
	"GIGABIT_ETHERNET_HDX": 7,
}

func (x GetOnuUniInfoResponse_ConfigurationInd) String() string {
	return proto.EnumName(GetOnuUniInfoResponse_ConfigurationInd_name, int32(x))
}

func (GetOnuUniInfoResponse_ConfigurationInd) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_7ecf6e9799a9202d, []int{3, 0}
}

type GetOnuUniInfoResponse_AdministrativeState int32

const (
	GetOnuUniInfoResponse_ADMSTATE_UNDEFINED GetOnuUniInfoResponse_AdministrativeState = 0
	GetOnuUniInfoResponse_LOCKED             GetOnuUniInfoResponse_AdministrativeState = 1
	GetOnuUniInfoResponse_UNLOCKED           GetOnuUniInfoResponse_AdministrativeState = 2
)

var GetOnuUniInfoResponse_AdministrativeState_name = map[int32]string{
	0: "ADMSTATE_UNDEFINED",
	1: "LOCKED",
	2: "UNLOCKED",
}

var GetOnuUniInfoResponse_AdministrativeState_value = map[string]int32{
	"ADMSTATE_UNDEFINED": 0,
	"LOCKED":             1,
	"UNLOCKED":           2,
}

func (x GetOnuUniInfoResponse_AdministrativeState) String() string {
	return proto.EnumName(GetOnuUniInfoResponse_AdministrativeState_name, int32(x))
}

func (GetOnuUniInfoResponse_AdministrativeState) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_7ecf6e9799a9202d, []int{3, 1}
}

type GetOnuUniInfoResponse_OperationalState int32

const (
	GetOnuUniInfoResponse_OPERSTATE_UNDEFINED GetOnuUniInfoResponse_OperationalState = 0
	GetOnuUniInfoResponse_ENABLED             GetOnuUniInfoResponse_OperationalState = 1
	GetOnuUniInfoResponse_DISABLED            GetOnuUniInfoResponse_OperationalState = 2
)

var GetOnuUniInfoResponse_OperationalState_name = map[int32]string{
	0: "OPERSTATE_UNDEFINED",
	1: "ENABLED",
	2: "DISABLED",
}

var GetOnuUniInfoResponse_OperationalState_value = map[string]int32{
	"OPERSTATE_UNDEFINED": 0,
	"ENABLED":             1,
	"DISABLED":            2,
}

func (x GetOnuUniInfoResponse_OperationalState) String() string {
	return proto.EnumName(GetOnuUniInfoResponse_OperationalState_name, int32(x))
}

func (GetOnuUniInfoResponse_OperationalState) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_7ecf6e9799a9202d, []int{3, 2}
}

type GetOltPortCounters_PortType int32

const (
	GetOltPortCounters_Port_UNKNOWN      GetOltPortCounters_PortType = 0
	GetOltPortCounters_Port_ETHERNET_NNI GetOltPortCounters_PortType = 1
	GetOltPortCounters_Port_PON_OLT      GetOltPortCounters_PortType = 2
)

var GetOltPortCounters_PortType_name = map[int32]string{
	0: "Port_UNKNOWN",
	1: "Port_ETHERNET_NNI",
	2: "Port_PON_OLT",
}

var GetOltPortCounters_PortType_value = map[string]int32{
	"Port_UNKNOWN":      0,
	"Port_ETHERNET_NNI": 1,
	"Port_PON_OLT":      2,
}

func (x GetOltPortCounters_PortType) String() string {
	return proto.EnumName(GetOltPortCounters_PortType_name, int32(x))
}

func (GetOltPortCounters_PortType) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_7ecf6e9799a9202d, []int{4, 0}
}

type GetOnuEthernetBridgePortHistory_Direction int32

const (
	GetOnuEthernetBridgePortHistory_UNDEFINED  GetOnuEthernetBridgePortHistory_Direction = 0
	GetOnuEthernetBridgePortHistory_UPSTREAM   GetOnuEthernetBridgePortHistory_Direction = 1
	GetOnuEthernetBridgePortHistory_DOWNSTREAM GetOnuEthernetBridgePortHistory_Direction = 2
)

var GetOnuEthernetBridgePortHistory_Direction_name = map[int32]string{
	0: "UNDEFINED",
	1: "UPSTREAM",
	2: "DOWNSTREAM",
}

var GetOnuEthernetBridgePortHistory_Direction_value = map[string]int32{
	"UNDEFINED":  0,
	"UPSTREAM":   1,
	"DOWNSTREAM": 2,
}

func (x GetOnuEthernetBridgePortHistory_Direction) String() string {
	return proto.EnumName(GetOnuEthernetBridgePortHistory_Direction_name, int32(x))
}

func (GetOnuEthernetBridgePortHistory_Direction) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_7ecf6e9799a9202d, []int{8, 0}
}

type GetValueResponse_Status int32

const (
	GetValueResponse_STATUS_UNDEFINED GetValueResponse_Status = 0
	GetValueResponse_OK               GetValueResponse_Status = 1
	GetValueResponse_ERROR            GetValueResponse_Status = 2
)

var GetValueResponse_Status_name = map[int32]string{
	0: "STATUS_UNDEFINED",
	1: "OK",
	2: "ERROR",
}

var GetValueResponse_Status_value = map[string]int32{
	"STATUS_UNDEFINED": 0,
	"OK":               1,
	"ERROR":            2,
}

func (x GetValueResponse_Status) String() string {
	return proto.EnumName(GetValueResponse_Status_name, int32(x))
}

func (GetValueResponse_Status) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_7ecf6e9799a9202d, []int{20, 0}
}

type GetValueResponse_ErrorReason int32

const (
	GetValueResponse_REASON_UNDEFINED  GetValueResponse_ErrorReason = 0
	GetValueResponse_UNSUPPORTED       GetValueResponse_ErrorReason = 1
	GetValueResponse_INVALID_DEVICE_ID GetValueResponse_ErrorReason = 2
	GetValueResponse_INVALID_PORT_TYPE GetValueResponse_ErrorReason = 3
	GetValueResponse_TIMEOUT           GetValueResponse_ErrorReason = 4
	GetValueResponse_INVALID_REQ_TYPE  GetValueResponse_ErrorReason = 5
	GetValueResponse_INTERNAL_ERROR    GetValueResponse_ErrorReason = 6
	GetValueResponse_INVALID_DEVICE    GetValueResponse_ErrorReason = 7
)

var GetValueResponse_ErrorReason_name = map[int32]string{
	0: "REASON_UNDEFINED",
	1: "UNSUPPORTED",
	2: "INVALID_DEVICE_ID",
	3: "INVALID_PORT_TYPE",
	4: "TIMEOUT",
	5: "INVALID_REQ_TYPE",
	6: "INTERNAL_ERROR",
	7: "INVALID_DEVICE",
}

var GetValueResponse_ErrorReason_value = map[string]int32{
	"REASON_UNDEFINED":  0,
	"UNSUPPORTED":       1,
	"INVALID_DEVICE_ID": 2,
	"INVALID_PORT_TYPE": 3,
	"TIMEOUT":           4,
	"INVALID_REQ_TYPE":  5,
	"INTERNAL_ERROR":    6,
	"INVALID_DEVICE":    7,
}

func (x GetValueResponse_ErrorReason) String() string {
	return proto.EnumName(GetValueResponse_ErrorReason_name, int32(x))
}

func (GetValueResponse_ErrorReason) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_7ecf6e9799a9202d, []int{20, 1}
}

type SetValueResponse_Status int32

const (
	SetValueResponse_STATUS_UNDEFINED SetValueResponse_Status = 0
	SetValueResponse_OK               SetValueResponse_Status = 1
	SetValueResponse_ERROR            SetValueResponse_Status = 2
)

var SetValueResponse_Status_name = map[int32]string{
	0: "STATUS_UNDEFINED",
	1: "OK",
	2: "ERROR",
}

var SetValueResponse_Status_value = map[string]int32{
	"STATUS_UNDEFINED": 0,
	"OK":               1,
	"ERROR":            2,
}

func (x SetValueResponse_Status) String() string {
	return proto.EnumName(SetValueResponse_Status_name, int32(x))
}

func (SetValueResponse_Status) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_7ecf6e9799a9202d, []int{22, 0}
}

type SetValueResponse_ErrorReason int32

const (
	SetValueResponse_REASON_UNDEFINED SetValueResponse_ErrorReason = 0
	SetValueResponse_UNSUPPORTED      SetValueResponse_ErrorReason = 1
)

var SetValueResponse_ErrorReason_name = map[int32]string{
	0: "REASON_UNDEFINED",
	1: "UNSUPPORTED",
}

var SetValueResponse_ErrorReason_value = map[string]int32{
	"REASON_UNDEFINED": 0,
	"UNSUPPORTED":      1,
}

func (x SetValueResponse_ErrorReason) String() string {
	return proto.EnumName(SetValueResponse_ErrorReason_name, int32(x))
}

func (SetValueResponse_ErrorReason) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_7ecf6e9799a9202d, []int{22, 1}
}

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

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

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

var xxx_messageInfo_GetDistanceRequest proto.InternalMessageInfo

func (m *GetDistanceRequest) GetOnuDeviceId() string {
	if m != nil {
		return m.OnuDeviceId
	}
	return ""
}

type GetDistanceResponse struct {
	Distance             uint32   `protobuf:"varint,1,opt,name=distance,proto3" json:"distance,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_GetDistanceResponse proto.InternalMessageInfo

func (m *GetDistanceResponse) GetDistance() uint32 {
	if m != nil {
		return m.Distance
	}
	return 0
}

type GetOnuUniInfoRequest struct {
	UniIndex             uint32   `protobuf:"varint,1,opt,name=uniIndex,proto3" json:"uniIndex,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_GetOnuUniInfoRequest proto.InternalMessageInfo

func (m *GetOnuUniInfoRequest) GetUniIndex() uint32 {
	if m != nil {
		return m.UniIndex
	}
	return 0
}

type GetOnuUniInfoResponse struct {
	AdmState             GetOnuUniInfoResponse_AdministrativeState `protobuf:"varint,1,opt,name=admState,proto3,enum=extension.GetOnuUniInfoResponse_AdministrativeState" json:"admState,omitempty"`
	OperState            GetOnuUniInfoResponse_OperationalState    `protobuf:"varint,2,opt,name=operState,proto3,enum=extension.GetOnuUniInfoResponse_OperationalState" json:"operState,omitempty"`
	ConfigInd            GetOnuUniInfoResponse_ConfigurationInd    `protobuf:"varint,3,opt,name=configInd,proto3,enum=extension.GetOnuUniInfoResponse_ConfigurationInd" json:"configInd,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                                  `json:"-"`
	XXX_unrecognized     []byte                                    `json:"-"`
	XXX_sizecache        int32                                     `json:"-"`
}

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

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

var xxx_messageInfo_GetOnuUniInfoResponse proto.InternalMessageInfo

func (m *GetOnuUniInfoResponse) GetAdmState() GetOnuUniInfoResponse_AdministrativeState {
	if m != nil {
		return m.AdmState
	}
	return GetOnuUniInfoResponse_ADMSTATE_UNDEFINED
}

func (m *GetOnuUniInfoResponse) GetOperState() GetOnuUniInfoResponse_OperationalState {
	if m != nil {
		return m.OperState
	}
	return GetOnuUniInfoResponse_OPERSTATE_UNDEFINED
}

func (m *GetOnuUniInfoResponse) GetConfigInd() GetOnuUniInfoResponse_ConfigurationInd {
	if m != nil {
		return m.ConfigInd
	}
	return GetOnuUniInfoResponse_UNKOWN
}

type GetOltPortCounters struct {
	PortNo               uint32                      `protobuf:"varint,1,opt,name=portNo,proto3" json:"portNo,omitempty"`
	PortType             GetOltPortCounters_PortType `protobuf:"varint,2,opt,name=portType,proto3,enum=extension.GetOltPortCounters_PortType" json:"portType,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                    `json:"-"`
	XXX_unrecognized     []byte                      `json:"-"`
	XXX_sizecache        int32                       `json:"-"`
}

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

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

var xxx_messageInfo_GetOltPortCounters proto.InternalMessageInfo

func (m *GetOltPortCounters) GetPortNo() uint32 {
	if m != nil {
		return m.PortNo
	}
	return 0
}

func (m *GetOltPortCounters) GetPortType() GetOltPortCounters_PortType {
	if m != nil {
		return m.PortType
	}
	return GetOltPortCounters_Port_UNKNOWN
}

type GetOltPortCountersResponse struct {
	TxBytes              uint64   `protobuf:"varint,1,opt,name=txBytes,proto3" json:"txBytes,omitempty"`
	RxBytes              uint64   `protobuf:"varint,2,opt,name=rxBytes,proto3" json:"rxBytes,omitempty"`
	TxPackets            uint64   `protobuf:"varint,3,opt,name=txPackets,proto3" json:"txPackets,omitempty"`
	RxPackets            uint64   `protobuf:"varint,4,opt,name=rxPackets,proto3" json:"rxPackets,omitempty"`
	TxErrorPackets       uint64   `protobuf:"varint,5,opt,name=txErrorPackets,proto3" json:"txErrorPackets,omitempty"`
	RxErrorPackets       uint64   `protobuf:"varint,6,opt,name=rxErrorPackets,proto3" json:"rxErrorPackets,omitempty"`
	TxBcastPackets       uint64   `protobuf:"varint,7,opt,name=txBcastPackets,proto3" json:"txBcastPackets,omitempty"`
	RxBcastPackets       uint64   `protobuf:"varint,8,opt,name=rxBcastPackets,proto3" json:"rxBcastPackets,omitempty"`
	TxUcastPackets       uint64   `protobuf:"varint,9,opt,name=txUcastPackets,proto3" json:"txUcastPackets,omitempty"`
	RxUcastPackets       uint64   `protobuf:"varint,10,opt,name=rxUcastPackets,proto3" json:"rxUcastPackets,omitempty"`
	TxMcastPackets       uint64   `protobuf:"varint,11,opt,name=txMcastPackets,proto3" json:"txMcastPackets,omitempty"`
	RxMcastPackets       uint64   `protobuf:"varint,12,opt,name=rxMcastPackets,proto3" json:"rxMcastPackets,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_GetOltPortCountersResponse proto.InternalMessageInfo

func (m *GetOltPortCountersResponse) GetTxBytes() uint64 {
	if m != nil {
		return m.TxBytes
	}
	return 0
}

func (m *GetOltPortCountersResponse) GetRxBytes() uint64 {
	if m != nil {
		return m.RxBytes
	}
	return 0
}

func (m *GetOltPortCountersResponse) GetTxPackets() uint64 {
	if m != nil {
		return m.TxPackets
	}
	return 0
}

func (m *GetOltPortCountersResponse) GetRxPackets() uint64 {
	if m != nil {
		return m.RxPackets
	}
	return 0
}

func (m *GetOltPortCountersResponse) GetTxErrorPackets() uint64 {
	if m != nil {
		return m.TxErrorPackets
	}
	return 0
}

func (m *GetOltPortCountersResponse) GetRxErrorPackets() uint64 {
	if m != nil {
		return m.RxErrorPackets
	}
	return 0
}

func (m *GetOltPortCountersResponse) GetTxBcastPackets() uint64 {
	if m != nil {
		return m.TxBcastPackets
	}
	return 0
}

func (m *GetOltPortCountersResponse) GetRxBcastPackets() uint64 {
	if m != nil {
		return m.RxBcastPackets
	}
	return 0
}

func (m *GetOltPortCountersResponse) GetTxUcastPackets() uint64 {
	if m != nil {
		return m.TxUcastPackets
	}
	return 0
}

func (m *GetOltPortCountersResponse) GetRxUcastPackets() uint64 {
	if m != nil {
		return m.RxUcastPackets
	}
	return 0
}

func (m *GetOltPortCountersResponse) GetTxMcastPackets() uint64 {
	if m != nil {
		return m.TxMcastPackets
	}
	return 0
}

func (m *GetOltPortCountersResponse) GetRxMcastPackets() uint64 {
	if m != nil {
		return m.RxMcastPackets
	}
	return 0
}

type GetOnuPonOpticalInfo struct {
	Empty                *empty.Empty `protobuf:"bytes,1,opt,name=empty,proto3" json:"empty,omitempty"`
	XXX_NoUnkeyedLiteral struct{}     `json:"-"`
	XXX_unrecognized     []byte       `json:"-"`
	XXX_sizecache        int32        `json:"-"`
}

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

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

var xxx_messageInfo_GetOnuPonOpticalInfo proto.InternalMessageInfo

func (m *GetOnuPonOpticalInfo) GetEmpty() *empty.Empty {
	if m != nil {
		return m.Empty
	}
	return nil
}

// These values correspond to the Optical Line Supervision Test results
// described in section A3.39.5 of ITU-T G.988 (11/2017) specification.
type GetOnuPonOpticalInfoResponse struct {
	PowerFeedVoltage       float32  `protobuf:"fixed32,1,opt,name=powerFeedVoltage,proto3" json:"powerFeedVoltage,omitempty"`
	ReceivedOpticalPower   float32  `protobuf:"fixed32,2,opt,name=receivedOpticalPower,proto3" json:"receivedOpticalPower,omitempty"`
	MeanOpticalLaunchPower float32  `protobuf:"fixed32,3,opt,name=meanOpticalLaunchPower,proto3" json:"meanOpticalLaunchPower,omitempty"`
	LaserBiasCurrent       float32  `protobuf:"fixed32,4,opt,name=laserBiasCurrent,proto3" json:"laserBiasCurrent,omitempty"`
	Temperature            float32  `protobuf:"fixed32,5,opt,name=temperature,proto3" json:"temperature,omitempty"`
	XXX_NoUnkeyedLiteral   struct{} `json:"-"`
	XXX_unrecognized       []byte   `json:"-"`
	XXX_sizecache          int32    `json:"-"`
}

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

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

var xxx_messageInfo_GetOnuPonOpticalInfoResponse proto.InternalMessageInfo

func (m *GetOnuPonOpticalInfoResponse) GetPowerFeedVoltage() float32 {
	if m != nil {
		return m.PowerFeedVoltage
	}
	return 0
}

func (m *GetOnuPonOpticalInfoResponse) GetReceivedOpticalPower() float32 {
	if m != nil {
		return m.ReceivedOpticalPower
	}
	return 0
}

func (m *GetOnuPonOpticalInfoResponse) GetMeanOpticalLaunchPower() float32 {
	if m != nil {
		return m.MeanOpticalLaunchPower
	}
	return 0
}

func (m *GetOnuPonOpticalInfoResponse) GetLaserBiasCurrent() float32 {
	if m != nil {
		return m.LaserBiasCurrent
	}
	return 0
}

func (m *GetOnuPonOpticalInfoResponse) GetTemperature() float32 {
	if m != nil {
		return m.Temperature
	}
	return 0
}

type GetOnuEthernetBridgePortHistory struct {
	Direction            GetOnuEthernetBridgePortHistory_Direction `protobuf:"varint,1,opt,name=direction,proto3,enum=extension.GetOnuEthernetBridgePortHistory_Direction" json:"direction,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                                  `json:"-"`
	XXX_unrecognized     []byte                                    `json:"-"`
	XXX_sizecache        int32                                     `json:"-"`
}

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

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

var xxx_messageInfo_GetOnuEthernetBridgePortHistory proto.InternalMessageInfo

func (m *GetOnuEthernetBridgePortHistory) GetDirection() GetOnuEthernetBridgePortHistory_Direction {
	if m != nil {
		return m.Direction
	}
	return GetOnuEthernetBridgePortHistory_UNDEFINED
}

type GetOnuEthernetBridgePortHistoryResponse struct {
	DropEvents              uint32   `protobuf:"varint,1,opt,name=dropEvents,proto3" json:"dropEvents,omitempty"`
	Octets                  uint32   `protobuf:"varint,2,opt,name=octets,proto3" json:"octets,omitempty"`
	Packets                 uint32   `protobuf:"varint,3,opt,name=packets,proto3" json:"packets,omitempty"`
	BroadcastPackets        uint32   `protobuf:"varint,4,opt,name=broadcastPackets,proto3" json:"broadcastPackets,omitempty"`
	MulticastPackets        uint32   `protobuf:"varint,5,opt,name=multicastPackets,proto3" json:"multicastPackets,omitempty"`
	CrcErroredPackets       uint32   `protobuf:"varint,6,opt,name=crcErroredPackets,proto3" json:"crcErroredPackets,omitempty"`
	UndersizePackets        uint32   `protobuf:"varint,7,opt,name=undersizePackets,proto3" json:"undersizePackets,omitempty"`
	OversizePackets         uint32   `protobuf:"varint,8,opt,name=oversizePackets,proto3" json:"oversizePackets,omitempty"`
	Packets64Octets         uint32   `protobuf:"varint,9,opt,name=packets64octets,proto3" json:"packets64octets,omitempty"`
	Packets65To127Octets    uint32   `protobuf:"varint,10,opt,name=packets65To127octets,proto3" json:"packets65To127octets,omitempty"`
	Packets128To255Octets   uint32   `protobuf:"varint,11,opt,name=packets128To255Octets,proto3" json:"packets128To255Octets,omitempty"`
	Packets256To511Octets   uint32   `protobuf:"varint,12,opt,name=packets256To511octets,proto3" json:"packets256To511octets,omitempty"`
	Packets512To1023Octets  uint32   `protobuf:"varint,13,opt,name=packets512To1023octets,proto3" json:"packets512To1023octets,omitempty"`
	Packets1024To1518Octets uint32   `protobuf:"varint,14,opt,name=packets1024To1518octets,proto3" json:"packets1024To1518octets,omitempty"`
	XXX_NoUnkeyedLiteral    struct{} `json:"-"`
	XXX_unrecognized        []byte   `json:"-"`
	XXX_sizecache           int32    `json:"-"`
}

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

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

var xxx_messageInfo_GetOnuEthernetBridgePortHistoryResponse proto.InternalMessageInfo

func (m *GetOnuEthernetBridgePortHistoryResponse) GetDropEvents() uint32 {
	if m != nil {
		return m.DropEvents
	}
	return 0
}

func (m *GetOnuEthernetBridgePortHistoryResponse) GetOctets() uint32 {
	if m != nil {
		return m.Octets
	}
	return 0
}

func (m *GetOnuEthernetBridgePortHistoryResponse) GetPackets() uint32 {
	if m != nil {
		return m.Packets
	}
	return 0
}

func (m *GetOnuEthernetBridgePortHistoryResponse) GetBroadcastPackets() uint32 {
	if m != nil {
		return m.BroadcastPackets
	}
	return 0
}

func (m *GetOnuEthernetBridgePortHistoryResponse) GetMulticastPackets() uint32 {
	if m != nil {
		return m.MulticastPackets
	}
	return 0
}

func (m *GetOnuEthernetBridgePortHistoryResponse) GetCrcErroredPackets() uint32 {
	if m != nil {
		return m.CrcErroredPackets
	}
	return 0
}

func (m *GetOnuEthernetBridgePortHistoryResponse) GetUndersizePackets() uint32 {
	if m != nil {
		return m.UndersizePackets
	}
	return 0
}

func (m *GetOnuEthernetBridgePortHistoryResponse) GetOversizePackets() uint32 {
	if m != nil {
		return m.OversizePackets
	}
	return 0
}

func (m *GetOnuEthernetBridgePortHistoryResponse) GetPackets64Octets() uint32 {
	if m != nil {
		return m.Packets64Octets
	}
	return 0
}

func (m *GetOnuEthernetBridgePortHistoryResponse) GetPackets65To127Octets() uint32 {
	if m != nil {
		return m.Packets65To127Octets
	}
	return 0
}

func (m *GetOnuEthernetBridgePortHistoryResponse) GetPackets128To255Octets() uint32 {
	if m != nil {
		return m.Packets128To255Octets
	}
	return 0
}

func (m *GetOnuEthernetBridgePortHistoryResponse) GetPackets256To511Octets() uint32 {
	if m != nil {
		return m.Packets256To511Octets
	}
	return 0
}

func (m *GetOnuEthernetBridgePortHistoryResponse) GetPackets512To1023Octets() uint32 {
	if m != nil {
		return m.Packets512To1023Octets
	}
	return 0
}

func (m *GetOnuEthernetBridgePortHistoryResponse) GetPackets1024To1518Octets() uint32 {
	if m != nil {
		return m.Packets1024To1518Octets
	}
	return 0
}

type GetOnuFecHistory struct {
	Empty                *empty.Empty `protobuf:"bytes,1,opt,name=empty,proto3" json:"empty,omitempty"`
	XXX_NoUnkeyedLiteral struct{}     `json:"-"`
	XXX_unrecognized     []byte       `json:"-"`
	XXX_sizecache        int32        `json:"-"`
}

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

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

var xxx_messageInfo_GetOnuFecHistory proto.InternalMessageInfo

func (m *GetOnuFecHistory) GetEmpty() *empty.Empty {
	if m != nil {
		return m.Empty
	}
	return nil
}

type GetOnuFecHistoryResponse struct {
	CorrectedBytes         uint32   `protobuf:"varint,1,opt,name=correctedBytes,proto3" json:"correctedBytes,omitempty"`
	CorrectedCodeWords     uint32   `protobuf:"varint,2,opt,name=correctedCodeWords,proto3" json:"correctedCodeWords,omitempty"`
	FecSeconds             uint32   `protobuf:"varint,3,opt,name=fecSeconds,proto3" json:"fecSeconds,omitempty"`
	TotalCodeWords         uint32   `protobuf:"varint,4,opt,name=totalCodeWords,proto3" json:"totalCodeWords,omitempty"`
	UncorrectableCodeWords uint32   `protobuf:"varint,5,opt,name=uncorrectableCodeWords,proto3" json:"uncorrectableCodeWords,omitempty"`
	XXX_NoUnkeyedLiteral   struct{} `json:"-"`
	XXX_unrecognized       []byte   `json:"-"`
	XXX_sizecache          int32    `json:"-"`
}

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

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

var xxx_messageInfo_GetOnuFecHistoryResponse proto.InternalMessageInfo

func (m *GetOnuFecHistoryResponse) GetCorrectedBytes() uint32 {
	if m != nil {
		return m.CorrectedBytes
	}
	return 0
}

func (m *GetOnuFecHistoryResponse) GetCorrectedCodeWords() uint32 {
	if m != nil {
		return m.CorrectedCodeWords
	}
	return 0
}

func (m *GetOnuFecHistoryResponse) GetFecSeconds() uint32 {
	if m != nil {
		return m.FecSeconds
	}
	return 0
}

func (m *GetOnuFecHistoryResponse) GetTotalCodeWords() uint32 {
	if m != nil {
		return m.TotalCodeWords
	}
	return 0
}

func (m *GetOnuFecHistoryResponse) GetUncorrectableCodeWords() uint32 {
	if m != nil {
		return m.UncorrectableCodeWords
	}
	return 0
}

type GetOnuCountersRequest struct {
	IntfId               uint32   `protobuf:"fixed32,1,opt,name=intf_id,json=intfId,proto3" json:"intf_id,omitempty"`
	OnuId                uint32   `protobuf:"fixed32,2,opt,name=onu_id,json=onuId,proto3" json:"onu_id,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_GetOnuCountersRequest proto.InternalMessageInfo

func (m *GetOnuCountersRequest) GetIntfId() uint32 {
	if m != nil {
		return m.IntfId
	}
	return 0
}

func (m *GetOnuCountersRequest) GetOnuId() uint32 {
	if m != nil {
		return m.OnuId
	}
	return 0
}

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

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

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

var xxx_messageInfo_GetOmciEthernetFrameExtendedPmRequest proto.InternalMessageInfo

func (m *GetOmciEthernetFrameExtendedPmRequest) GetOnuDeviceId() string {
	if m != nil {
		return m.OnuDeviceId
	}
	return ""
}

type GetRxPowerRequest struct {
	IntfId               uint32   `protobuf:"fixed32,1,opt,name=intf_id,json=intfId,proto3" json:"intf_id,omitempty"`
	OnuId                uint32   `protobuf:"fixed32,2,opt,name=onu_id,json=onuId,proto3" json:"onu_id,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_GetRxPowerRequest proto.InternalMessageInfo

func (m *GetRxPowerRequest) GetIntfId() uint32 {
	if m != nil {
		return m.IntfId
	}
	return 0
}

func (m *GetRxPowerRequest) GetOnuId() uint32 {
	if m != nil {
		return m.OnuId
	}
	return 0
}

type GetOnuCountersResponse struct {
	// Types that are valid to be assigned to IsIntfId:
	//	*GetOnuCountersResponse_IntfId
	IsIntfId isGetOnuCountersResponse_IsIntfId `protobuf_oneof:"is_intf_id"`
	// Types that are valid to be assigned to IsOnuId:
	//	*GetOnuCountersResponse_OnuId
	IsOnuId isGetOnuCountersResponse_IsOnuId `protobuf_oneof:"is_onu_id"`
	// Types that are valid to be assigned to IsPositiveDrift:
	//	*GetOnuCountersResponse_PositiveDrift
	IsPositiveDrift isGetOnuCountersResponse_IsPositiveDrift `protobuf_oneof:"is_positive_drift"`
	// Types that are valid to be assigned to IsNegativeDrift:
	//	*GetOnuCountersResponse_NegativeDrift
	IsNegativeDrift isGetOnuCountersResponse_IsNegativeDrift `protobuf_oneof:"is_negative_drift"`
	// Types that are valid to be assigned to IsDelimiterMissDetection:
	//	*GetOnuCountersResponse_DelimiterMissDetection
	IsDelimiterMissDetection isGetOnuCountersResponse_IsDelimiterMissDetection `protobuf_oneof:"is_delimiter_miss_detection"`
	// Types that are valid to be assigned to IsBipErrors:
	//	*GetOnuCountersResponse_BipErrors
	IsBipErrors isGetOnuCountersResponse_IsBipErrors `protobuf_oneof:"is_bip_errors"`
	// Types that are valid to be assigned to IsBipUnits:
	//	*GetOnuCountersResponse_BipUnits
	IsBipUnits isGetOnuCountersResponse_IsBipUnits `protobuf_oneof:"is_bip_units"`
	// Types that are valid to be assigned to IsFecCorrectedSymbols:
	//	*GetOnuCountersResponse_FecCorrectedSymbols
	IsFecCorrectedSymbols isGetOnuCountersResponse_IsFecCorrectedSymbols `protobuf_oneof:"is_fec_corrected_symbols"`
	// Types that are valid to be assigned to IsFecCodewordsCorrected:
	//	*GetOnuCountersResponse_FecCodewordsCorrected
	IsFecCodewordsCorrected isGetOnuCountersResponse_IsFecCodewordsCorrected `protobuf_oneof:"is_fec_codewords_corrected"`
	// Types that are valid to be assigned to IsFecCodewordsUncorrectable:
	//	*GetOnuCountersResponse_FecCodewordsUncorrectable
	IsFecCodewordsUncorrectable isGetOnuCountersResponse_IsFecCodewordsUncorrectable `protobuf_oneof:"is_fec_codewords_uncorrectable"`
	// Types that are valid to be assigned to IsFecCodewords:
	//	*GetOnuCountersResponse_FecCodewords
	IsFecCodewords isGetOnuCountersResponse_IsFecCodewords `protobuf_oneof:"is_fec_codewords"`
	// Types that are valid to be assigned to IsFecCorrectedUnits:
	//	*GetOnuCountersResponse_FecCorrectedUnits
	IsFecCorrectedUnits isGetOnuCountersResponse_IsFecCorrectedUnits `protobuf_oneof:"is_fec_corrected_units"`
	// Types that are valid to be assigned to IsXgemKeyErrors:
	//	*GetOnuCountersResponse_XgemKeyErrors
	IsXgemKeyErrors isGetOnuCountersResponse_IsXgemKeyErrors `protobuf_oneof:"is_xgem_key_errors"`
	// Types that are valid to be assigned to IsXgemLoss:
	//	*GetOnuCountersResponse_XgemLoss
	IsXgemLoss isGetOnuCountersResponse_IsXgemLoss `protobuf_oneof:"is_xgem_loss"`
	// Types that are valid to be assigned to IsRxPloamsError:
	//	*GetOnuCountersResponse_RxPloamsError
	IsRxPloamsError isGetOnuCountersResponse_IsRxPloamsError `protobuf_oneof:"is_rx_ploams_error"`
	// Types that are valid to be assigned to IsRxPloamsNonIdle:
	//	*GetOnuCountersResponse_RxPloamsNonIdle
	IsRxPloamsNonIdle isGetOnuCountersResponse_IsRxPloamsNonIdle `protobuf_oneof:"is_rx_ploams_non_idle"`
	// Types that are valid to be assigned to IsRxOmci:
	//	*GetOnuCountersResponse_RxOmci
	IsRxOmci isGetOnuCountersResponse_IsRxOmci `protobuf_oneof:"is_rx_omci"`
	// Types that are valid to be assigned to IsTxOmci:
	//	*GetOnuCountersResponse_TxOmci
	IsTxOmci isGetOnuCountersResponse_IsTxOmci `protobuf_oneof:"is_tx_omci"`
	// Types that are valid to be assigned to IsRxOmciPacketsCrcError:
	//	*GetOnuCountersResponse_RxOmciPacketsCrcError
	IsRxOmciPacketsCrcError isGetOnuCountersResponse_IsRxOmciPacketsCrcError `protobuf_oneof:"is_rx_omci_packets_crc_error"`
	// Types that are valid to be assigned to IsRxBytes:
	//	*GetOnuCountersResponse_RxBytes
	IsRxBytes isGetOnuCountersResponse_IsRxBytes `protobuf_oneof:"is_rx_bytes"`
	// Types that are valid to be assigned to IsRxPackets:
	//	*GetOnuCountersResponse_RxPackets
	IsRxPackets isGetOnuCountersResponse_IsRxPackets `protobuf_oneof:"is_rx_packets"`
	// Types that are valid to be assigned to IsTxBytes:
	//	*GetOnuCountersResponse_TxBytes
	IsTxBytes isGetOnuCountersResponse_IsTxBytes `protobuf_oneof:"is_tx_bytes"`
	// Types that are valid to be assigned to IsTxPackets:
	//	*GetOnuCountersResponse_TxPackets
	IsTxPackets isGetOnuCountersResponse_IsTxPackets `protobuf_oneof:"is_tx_packets"`
	// Types that are valid to be assigned to IsBerReported:
	//	*GetOnuCountersResponse_BerReported
	IsBerReported isGetOnuCountersResponse_IsBerReported `protobuf_oneof:"is_ber_reported"`
	// Types that are valid to be assigned to IsLcdgErrors:
	//	*GetOnuCountersResponse_LcdgErrors
	IsLcdgErrors isGetOnuCountersResponse_IsLcdgErrors `protobuf_oneof:"is_lcdg_errors"`
	// Types that are valid to be assigned to IsRdiErrors:
	//	*GetOnuCountersResponse_RdiErrors
	IsRdiErrors isGetOnuCountersResponse_IsRdiErrors `protobuf_oneof:"is_rdi_errors"`
	// Types that are valid to be assigned to IsTimestamp:
	//	*GetOnuCountersResponse_Timestamp
	IsTimestamp          isGetOnuCountersResponse_IsTimestamp `protobuf_oneof:"is_timestamp"`
	XXX_NoUnkeyedLiteral struct{}                             `json:"-"`
	XXX_unrecognized     []byte                               `json:"-"`
	XXX_sizecache        int32                                `json:"-"`
}

func (m *GetOnuCountersResponse) Reset()         { *m = GetOnuCountersResponse{} }
func (m *GetOnuCountersResponse) String() string { return proto.CompactTextString(m) }
func (*GetOnuCountersResponse) ProtoMessage()    {}
func (*GetOnuCountersResponse) Descriptor() ([]byte, []int) {
	return fileDescriptor_7ecf6e9799a9202d, []int{15}
}

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

var xxx_messageInfo_GetOnuCountersResponse proto.InternalMessageInfo

type isGetOnuCountersResponse_IsIntfId interface {
	isGetOnuCountersResponse_IsIntfId()
}

type GetOnuCountersResponse_IntfId struct {
	IntfId uint32 `protobuf:"fixed32,1,opt,name=intf_id,json=intfId,proto3,oneof"`
}

func (*GetOnuCountersResponse_IntfId) isGetOnuCountersResponse_IsIntfId() {}

func (m *GetOnuCountersResponse) GetIsIntfId() isGetOnuCountersResponse_IsIntfId {
	if m != nil {
		return m.IsIntfId
	}
	return nil
}

func (m *GetOnuCountersResponse) GetIntfId() uint32 {
	if x, ok := m.GetIsIntfId().(*GetOnuCountersResponse_IntfId); ok {
		return x.IntfId
	}
	return 0
}

type isGetOnuCountersResponse_IsOnuId interface {
	isGetOnuCountersResponse_IsOnuId()
}

type GetOnuCountersResponse_OnuId struct {
	OnuId uint32 `protobuf:"fixed32,2,opt,name=onu_id,json=onuId,proto3,oneof"`
}

func (*GetOnuCountersResponse_OnuId) isGetOnuCountersResponse_IsOnuId() {}

func (m *GetOnuCountersResponse) GetIsOnuId() isGetOnuCountersResponse_IsOnuId {
	if m != nil {
		return m.IsOnuId
	}
	return nil
}

func (m *GetOnuCountersResponse) GetOnuId() uint32 {
	if x, ok := m.GetIsOnuId().(*GetOnuCountersResponse_OnuId); ok {
		return x.OnuId
	}
	return 0
}

type isGetOnuCountersResponse_IsPositiveDrift interface {
	isGetOnuCountersResponse_IsPositiveDrift()
}

type GetOnuCountersResponse_PositiveDrift struct {
	PositiveDrift uint64 `protobuf:"fixed64,3,opt,name=positive_drift,json=positiveDrift,proto3,oneof"`
}

func (*GetOnuCountersResponse_PositiveDrift) isGetOnuCountersResponse_IsPositiveDrift() {}

func (m *GetOnuCountersResponse) GetIsPositiveDrift() isGetOnuCountersResponse_IsPositiveDrift {
	if m != nil {
		return m.IsPositiveDrift
	}
	return nil
}

func (m *GetOnuCountersResponse) GetPositiveDrift() uint64 {
	if x, ok := m.GetIsPositiveDrift().(*GetOnuCountersResponse_PositiveDrift); ok {
		return x.PositiveDrift
	}
	return 0
}

type isGetOnuCountersResponse_IsNegativeDrift interface {
	isGetOnuCountersResponse_IsNegativeDrift()
}

type GetOnuCountersResponse_NegativeDrift struct {
	NegativeDrift uint64 `protobuf:"fixed64,4,opt,name=negative_drift,json=negativeDrift,proto3,oneof"`
}

func (*GetOnuCountersResponse_NegativeDrift) isGetOnuCountersResponse_IsNegativeDrift() {}

func (m *GetOnuCountersResponse) GetIsNegativeDrift() isGetOnuCountersResponse_IsNegativeDrift {
	if m != nil {
		return m.IsNegativeDrift
	}
	return nil
}

func (m *GetOnuCountersResponse) GetNegativeDrift() uint64 {
	if x, ok := m.GetIsNegativeDrift().(*GetOnuCountersResponse_NegativeDrift); ok {
		return x.NegativeDrift
	}
	return 0
}

type isGetOnuCountersResponse_IsDelimiterMissDetection interface {
	isGetOnuCountersResponse_IsDelimiterMissDetection()
}

type GetOnuCountersResponse_DelimiterMissDetection struct {
	DelimiterMissDetection uint64 `protobuf:"fixed64,5,opt,name=delimiter_miss_detection,json=delimiterMissDetection,proto3,oneof"`
}

func (*GetOnuCountersResponse_DelimiterMissDetection) isGetOnuCountersResponse_IsDelimiterMissDetection() {
}

func (m *GetOnuCountersResponse) GetIsDelimiterMissDetection() isGetOnuCountersResponse_IsDelimiterMissDetection {
	if m != nil {
		return m.IsDelimiterMissDetection
	}
	return nil
}

func (m *GetOnuCountersResponse) GetDelimiterMissDetection() uint64 {
	if x, ok := m.GetIsDelimiterMissDetection().(*GetOnuCountersResponse_DelimiterMissDetection); ok {
		return x.DelimiterMissDetection
	}
	return 0
}

type isGetOnuCountersResponse_IsBipErrors interface {
	isGetOnuCountersResponse_IsBipErrors()
}

type GetOnuCountersResponse_BipErrors struct {
	BipErrors uint64 `protobuf:"fixed64,6,opt,name=bip_errors,json=bipErrors,proto3,oneof"`
}

func (*GetOnuCountersResponse_BipErrors) isGetOnuCountersResponse_IsBipErrors() {}

func (m *GetOnuCountersResponse) GetIsBipErrors() isGetOnuCountersResponse_IsBipErrors {
	if m != nil {
		return m.IsBipErrors
	}
	return nil
}

func (m *GetOnuCountersResponse) GetBipErrors() uint64 {
	if x, ok := m.GetIsBipErrors().(*GetOnuCountersResponse_BipErrors); ok {
		return x.BipErrors
	}
	return 0
}

type isGetOnuCountersResponse_IsBipUnits interface {
	isGetOnuCountersResponse_IsBipUnits()
}

type GetOnuCountersResponse_BipUnits struct {
	BipUnits uint64 `protobuf:"fixed64,7,opt,name=bip_units,json=bipUnits,proto3,oneof"`
}

func (*GetOnuCountersResponse_BipUnits) isGetOnuCountersResponse_IsBipUnits() {}

func (m *GetOnuCountersResponse) GetIsBipUnits() isGetOnuCountersResponse_IsBipUnits {
	if m != nil {
		return m.IsBipUnits
	}
	return nil
}

func (m *GetOnuCountersResponse) GetBipUnits() uint64 {
	if x, ok := m.GetIsBipUnits().(*GetOnuCountersResponse_BipUnits); ok {
		return x.BipUnits
	}
	return 0
}

type isGetOnuCountersResponse_IsFecCorrectedSymbols interface {
	isGetOnuCountersResponse_IsFecCorrectedSymbols()
}

type GetOnuCountersResponse_FecCorrectedSymbols struct {
	FecCorrectedSymbols uint64 `protobuf:"fixed64,8,opt,name=fec_corrected_symbols,json=fecCorrectedSymbols,proto3,oneof"`
}

func (*GetOnuCountersResponse_FecCorrectedSymbols) isGetOnuCountersResponse_IsFecCorrectedSymbols() {}

func (m *GetOnuCountersResponse) GetIsFecCorrectedSymbols() isGetOnuCountersResponse_IsFecCorrectedSymbols {
	if m != nil {
		return m.IsFecCorrectedSymbols
	}
	return nil
}

func (m *GetOnuCountersResponse) GetFecCorrectedSymbols() uint64 {
	if x, ok := m.GetIsFecCorrectedSymbols().(*GetOnuCountersResponse_FecCorrectedSymbols); ok {
		return x.FecCorrectedSymbols
	}
	return 0
}

type isGetOnuCountersResponse_IsFecCodewordsCorrected interface {
	isGetOnuCountersResponse_IsFecCodewordsCorrected()
}

type GetOnuCountersResponse_FecCodewordsCorrected struct {
	FecCodewordsCorrected uint64 `protobuf:"fixed64,9,opt,name=fec_codewords_corrected,json=fecCodewordsCorrected,proto3,oneof"`
}

func (*GetOnuCountersResponse_FecCodewordsCorrected) isGetOnuCountersResponse_IsFecCodewordsCorrected() {
}

func (m *GetOnuCountersResponse) GetIsFecCodewordsCorrected() isGetOnuCountersResponse_IsFecCodewordsCorrected {
	if m != nil {
		return m.IsFecCodewordsCorrected
	}
	return nil
}

func (m *GetOnuCountersResponse) GetFecCodewordsCorrected() uint64 {
	if x, ok := m.GetIsFecCodewordsCorrected().(*GetOnuCountersResponse_FecCodewordsCorrected); ok {
		return x.FecCodewordsCorrected
	}
	return 0
}

type isGetOnuCountersResponse_IsFecCodewordsUncorrectable interface {
	isGetOnuCountersResponse_IsFecCodewordsUncorrectable()
}

type GetOnuCountersResponse_FecCodewordsUncorrectable struct {
	FecCodewordsUncorrectable uint64 `protobuf:"fixed64,10,opt,name=fec_codewords_uncorrectable,json=fecCodewordsUncorrectable,proto3,oneof"`
}

func (*GetOnuCountersResponse_FecCodewordsUncorrectable) isGetOnuCountersResponse_IsFecCodewordsUncorrectable() {
}

func (m *GetOnuCountersResponse) GetIsFecCodewordsUncorrectable() isGetOnuCountersResponse_IsFecCodewordsUncorrectable {
	if m != nil {
		return m.IsFecCodewordsUncorrectable
	}
	return nil
}

func (m *GetOnuCountersResponse) GetFecCodewordsUncorrectable() uint64 {
	if x, ok := m.GetIsFecCodewordsUncorrectable().(*GetOnuCountersResponse_FecCodewordsUncorrectable); ok {
		return x.FecCodewordsUncorrectable
	}
	return 0
}

type isGetOnuCountersResponse_IsFecCodewords interface {
	isGetOnuCountersResponse_IsFecCodewords()
}

type GetOnuCountersResponse_FecCodewords struct {
	FecCodewords uint64 `protobuf:"fixed64,11,opt,name=fec_codewords,json=fecCodewords,proto3,oneof"`
}

func (*GetOnuCountersResponse_FecCodewords) isGetOnuCountersResponse_IsFecCodewords() {}

func (m *GetOnuCountersResponse) GetIsFecCodewords() isGetOnuCountersResponse_IsFecCodewords {
	if m != nil {
		return m.IsFecCodewords
	}
	return nil
}

func (m *GetOnuCountersResponse) GetFecCodewords() uint64 {
	if x, ok := m.GetIsFecCodewords().(*GetOnuCountersResponse_FecCodewords); ok {
		return x.FecCodewords
	}
	return 0
}

type isGetOnuCountersResponse_IsFecCorrectedUnits interface {
	isGetOnuCountersResponse_IsFecCorrectedUnits()
}

type GetOnuCountersResponse_FecCorrectedUnits struct {
	FecCorrectedUnits uint64 `protobuf:"fixed64,12,opt,name=fec_corrected_units,json=fecCorrectedUnits,proto3,oneof"`
}

func (*GetOnuCountersResponse_FecCorrectedUnits) isGetOnuCountersResponse_IsFecCorrectedUnits() {}

func (m *GetOnuCountersResponse) GetIsFecCorrectedUnits() isGetOnuCountersResponse_IsFecCorrectedUnits {
	if m != nil {
		return m.IsFecCorrectedUnits
	}
	return nil
}

func (m *GetOnuCountersResponse) GetFecCorrectedUnits() uint64 {
	if x, ok := m.GetIsFecCorrectedUnits().(*GetOnuCountersResponse_FecCorrectedUnits); ok {
		return x.FecCorrectedUnits
	}
	return 0
}

type isGetOnuCountersResponse_IsXgemKeyErrors interface {
	isGetOnuCountersResponse_IsXgemKeyErrors()
}

type GetOnuCountersResponse_XgemKeyErrors struct {
	XgemKeyErrors uint64 `protobuf:"fixed64,13,opt,name=xgem_key_errors,json=xgemKeyErrors,proto3,oneof"`
}

func (*GetOnuCountersResponse_XgemKeyErrors) isGetOnuCountersResponse_IsXgemKeyErrors() {}

func (m *GetOnuCountersResponse) GetIsXgemKeyErrors() isGetOnuCountersResponse_IsXgemKeyErrors {
	if m != nil {
		return m.IsXgemKeyErrors
	}
	return nil
}

func (m *GetOnuCountersResponse) GetXgemKeyErrors() uint64 {
	if x, ok := m.GetIsXgemKeyErrors().(*GetOnuCountersResponse_XgemKeyErrors); ok {
		return x.XgemKeyErrors
	}
	return 0
}

type isGetOnuCountersResponse_IsXgemLoss interface {
	isGetOnuCountersResponse_IsXgemLoss()
}

type GetOnuCountersResponse_XgemLoss struct {
	XgemLoss uint64 `protobuf:"fixed64,14,opt,name=xgem_loss,json=xgemLoss,proto3,oneof"`
}

func (*GetOnuCountersResponse_XgemLoss) isGetOnuCountersResponse_IsXgemLoss() {}

func (m *GetOnuCountersResponse) GetIsXgemLoss() isGetOnuCountersResponse_IsXgemLoss {
	if m != nil {
		return m.IsXgemLoss
	}
	return nil
}

func (m *GetOnuCountersResponse) GetXgemLoss() uint64 {
	if x, ok := m.GetIsXgemLoss().(*GetOnuCountersResponse_XgemLoss); ok {
		return x.XgemLoss
	}
	return 0
}

type isGetOnuCountersResponse_IsRxPloamsError interface {
	isGetOnuCountersResponse_IsRxPloamsError()
}

type GetOnuCountersResponse_RxPloamsError struct {
	RxPloamsError uint64 `protobuf:"fixed64,15,opt,name=rx_ploams_error,json=rxPloamsError,proto3,oneof"`
}

func (*GetOnuCountersResponse_RxPloamsError) isGetOnuCountersResponse_IsRxPloamsError() {}

func (m *GetOnuCountersResponse) GetIsRxPloamsError() isGetOnuCountersResponse_IsRxPloamsError {
	if m != nil {
		return m.IsRxPloamsError
	}
	return nil
}

func (m *GetOnuCountersResponse) GetRxPloamsError() uint64 {
	if x, ok := m.GetIsRxPloamsError().(*GetOnuCountersResponse_RxPloamsError); ok {
		return x.RxPloamsError
	}
	return 0
}

type isGetOnuCountersResponse_IsRxPloamsNonIdle interface {
	isGetOnuCountersResponse_IsRxPloamsNonIdle()
}

type GetOnuCountersResponse_RxPloamsNonIdle struct {
	RxPloamsNonIdle uint64 `protobuf:"fixed64,16,opt,name=rx_ploams_non_idle,json=rxPloamsNonIdle,proto3,oneof"`
}

func (*GetOnuCountersResponse_RxPloamsNonIdle) isGetOnuCountersResponse_IsRxPloamsNonIdle() {}

func (m *GetOnuCountersResponse) GetIsRxPloamsNonIdle() isGetOnuCountersResponse_IsRxPloamsNonIdle {
	if m != nil {
		return m.IsRxPloamsNonIdle
	}
	return nil
}

func (m *GetOnuCountersResponse) GetRxPloamsNonIdle() uint64 {
	if x, ok := m.GetIsRxPloamsNonIdle().(*GetOnuCountersResponse_RxPloamsNonIdle); ok {
		return x.RxPloamsNonIdle
	}
	return 0
}

type isGetOnuCountersResponse_IsRxOmci interface {
	isGetOnuCountersResponse_IsRxOmci()
}

type GetOnuCountersResponse_RxOmci struct {
	RxOmci uint64 `protobuf:"fixed64,17,opt,name=rx_omci,json=rxOmci,proto3,oneof"`
}

func (*GetOnuCountersResponse_RxOmci) isGetOnuCountersResponse_IsRxOmci() {}

func (m *GetOnuCountersResponse) GetIsRxOmci() isGetOnuCountersResponse_IsRxOmci {
	if m != nil {
		return m.IsRxOmci
	}
	return nil
}

func (m *GetOnuCountersResponse) GetRxOmci() uint64 {
	if x, ok := m.GetIsRxOmci().(*GetOnuCountersResponse_RxOmci); ok {
		return x.RxOmci
	}
	return 0
}

type isGetOnuCountersResponse_IsTxOmci interface {
	isGetOnuCountersResponse_IsTxOmci()
}

type GetOnuCountersResponse_TxOmci struct {
	TxOmci uint64 `protobuf:"fixed64,18,opt,name=tx_omci,json=txOmci,proto3,oneof"`
}

func (*GetOnuCountersResponse_TxOmci) isGetOnuCountersResponse_IsTxOmci() {}

func (m *GetOnuCountersResponse) GetIsTxOmci() isGetOnuCountersResponse_IsTxOmci {
	if m != nil {
		return m.IsTxOmci
	}
	return nil
}

func (m *GetOnuCountersResponse) GetTxOmci() uint64 {
	if x, ok := m.GetIsTxOmci().(*GetOnuCountersResponse_TxOmci); ok {
		return x.TxOmci
	}
	return 0
}

type isGetOnuCountersResponse_IsRxOmciPacketsCrcError interface {
	isGetOnuCountersResponse_IsRxOmciPacketsCrcError()
}

type GetOnuCountersResponse_RxOmciPacketsCrcError struct {
	RxOmciPacketsCrcError uint64 `protobuf:"fixed64,19,opt,name=rx_omci_packets_crc_error,json=rxOmciPacketsCrcError,proto3,oneof"`
}

func (*GetOnuCountersResponse_RxOmciPacketsCrcError) isGetOnuCountersResponse_IsRxOmciPacketsCrcError() {
}

func (m *GetOnuCountersResponse) GetIsRxOmciPacketsCrcError() isGetOnuCountersResponse_IsRxOmciPacketsCrcError {
	if m != nil {
		return m.IsRxOmciPacketsCrcError
	}
	return nil
}

func (m *GetOnuCountersResponse) GetRxOmciPacketsCrcError() uint64 {
	if x, ok := m.GetIsRxOmciPacketsCrcError().(*GetOnuCountersResponse_RxOmciPacketsCrcError); ok {
		return x.RxOmciPacketsCrcError
	}
	return 0
}

type isGetOnuCountersResponse_IsRxBytes interface {
	isGetOnuCountersResponse_IsRxBytes()
}

type GetOnuCountersResponse_RxBytes struct {
	RxBytes uint64 `protobuf:"fixed64,20,opt,name=rx_bytes,json=rxBytes,proto3,oneof"`
}

func (*GetOnuCountersResponse_RxBytes) isGetOnuCountersResponse_IsRxBytes() {}

func (m *GetOnuCountersResponse) GetIsRxBytes() isGetOnuCountersResponse_IsRxBytes {
	if m != nil {
		return m.IsRxBytes
	}
	return nil
}

func (m *GetOnuCountersResponse) GetRxBytes() uint64 {
	if x, ok := m.GetIsRxBytes().(*GetOnuCountersResponse_RxBytes); ok {
		return x.RxBytes
	}
	return 0
}

type isGetOnuCountersResponse_IsRxPackets interface {
	isGetOnuCountersResponse_IsRxPackets()
}

type GetOnuCountersResponse_RxPackets struct {
	RxPackets uint64 `protobuf:"fixed64,21,opt,name=rx_packets,json=rxPackets,proto3,oneof"`
}

func (*GetOnuCountersResponse_RxPackets) isGetOnuCountersResponse_IsRxPackets() {}

func (m *GetOnuCountersResponse) GetIsRxPackets() isGetOnuCountersResponse_IsRxPackets {
	if m != nil {
		return m.IsRxPackets
	}
	return nil
}

func (m *GetOnuCountersResponse) GetRxPackets() uint64 {
	if x, ok := m.GetIsRxPackets().(*GetOnuCountersResponse_RxPackets); ok {
		return x.RxPackets
	}
	return 0
}

type isGetOnuCountersResponse_IsTxBytes interface {
	isGetOnuCountersResponse_IsTxBytes()
}

type GetOnuCountersResponse_TxBytes struct {
	TxBytes uint64 `protobuf:"fixed64,22,opt,name=tx_bytes,json=txBytes,proto3,oneof"`
}

func (*GetOnuCountersResponse_TxBytes) isGetOnuCountersResponse_IsTxBytes() {}

func (m *GetOnuCountersResponse) GetIsTxBytes() isGetOnuCountersResponse_IsTxBytes {
	if m != nil {
		return m.IsTxBytes
	}
	return nil
}

func (m *GetOnuCountersResponse) GetTxBytes() uint64 {
	if x, ok := m.GetIsTxBytes().(*GetOnuCountersResponse_TxBytes); ok {
		return x.TxBytes
	}
	return 0
}

type isGetOnuCountersResponse_IsTxPackets interface {
	isGetOnuCountersResponse_IsTxPackets()
}

type GetOnuCountersResponse_TxPackets struct {
	TxPackets uint64 `protobuf:"fixed64,23,opt,name=tx_packets,json=txPackets,proto3,oneof"`
}

func (*GetOnuCountersResponse_TxPackets) isGetOnuCountersResponse_IsTxPackets() {}

func (m *GetOnuCountersResponse) GetIsTxPackets() isGetOnuCountersResponse_IsTxPackets {
	if m != nil {
		return m.IsTxPackets
	}
	return nil
}

func (m *GetOnuCountersResponse) GetTxPackets() uint64 {
	if x, ok := m.GetIsTxPackets().(*GetOnuCountersResponse_TxPackets); ok {
		return x.TxPackets
	}
	return 0
}

type isGetOnuCountersResponse_IsBerReported interface {
	isGetOnuCountersResponse_IsBerReported()
}

type GetOnuCountersResponse_BerReported struct {
	BerReported uint64 `protobuf:"fixed64,24,opt,name=ber_reported,json=berReported,proto3,oneof"`
}

func (*GetOnuCountersResponse_BerReported) isGetOnuCountersResponse_IsBerReported() {}

func (m *GetOnuCountersResponse) GetIsBerReported() isGetOnuCountersResponse_IsBerReported {
	if m != nil {
		return m.IsBerReported
	}
	return nil
}

func (m *GetOnuCountersResponse) GetBerReported() uint64 {
	if x, ok := m.GetIsBerReported().(*GetOnuCountersResponse_BerReported); ok {
		return x.BerReported
	}
	return 0
}

type isGetOnuCountersResponse_IsLcdgErrors interface {
	isGetOnuCountersResponse_IsLcdgErrors()
}

type GetOnuCountersResponse_LcdgErrors struct {
	LcdgErrors uint64 `protobuf:"fixed64,25,opt,name=lcdg_errors,json=lcdgErrors,proto3,oneof"`
}

func (*GetOnuCountersResponse_LcdgErrors) isGetOnuCountersResponse_IsLcdgErrors() {}

func (m *GetOnuCountersResponse) GetIsLcdgErrors() isGetOnuCountersResponse_IsLcdgErrors {
	if m != nil {
		return m.IsLcdgErrors
	}
	return nil
}

func (m *GetOnuCountersResponse) GetLcdgErrors() uint64 {
	if x, ok := m.GetIsLcdgErrors().(*GetOnuCountersResponse_LcdgErrors); ok {
		return x.LcdgErrors
	}
	return 0
}

type isGetOnuCountersResponse_IsRdiErrors interface {
	isGetOnuCountersResponse_IsRdiErrors()
}

type GetOnuCountersResponse_RdiErrors struct {
	RdiErrors uint64 `protobuf:"fixed64,26,opt,name=rdi_errors,json=rdiErrors,proto3,oneof"`
}

func (*GetOnuCountersResponse_RdiErrors) isGetOnuCountersResponse_IsRdiErrors() {}

func (m *GetOnuCountersResponse) GetIsRdiErrors() isGetOnuCountersResponse_IsRdiErrors {
	if m != nil {
		return m.IsRdiErrors
	}
	return nil
}

func (m *GetOnuCountersResponse) GetRdiErrors() uint64 {
	if x, ok := m.GetIsRdiErrors().(*GetOnuCountersResponse_RdiErrors); ok {
		return x.RdiErrors
	}
	return 0
}

type isGetOnuCountersResponse_IsTimestamp interface {
	isGetOnuCountersResponse_IsTimestamp()
}

type GetOnuCountersResponse_Timestamp struct {
	Timestamp uint32 `protobuf:"fixed32,27,opt,name=timestamp,proto3,oneof"`
}

func (*GetOnuCountersResponse_Timestamp) isGetOnuCountersResponse_IsTimestamp() {}

func (m *GetOnuCountersResponse) GetIsTimestamp() isGetOnuCountersResponse_IsTimestamp {
	if m != nil {
		return m.IsTimestamp
	}
	return nil
}

func (m *GetOnuCountersResponse) GetTimestamp() uint32 {
	if x, ok := m.GetIsTimestamp().(*GetOnuCountersResponse_Timestamp); ok {
		return x.Timestamp
	}
	return 0
}

// XXX_OneofWrappers is for the internal use of the proto package.
func (*GetOnuCountersResponse) XXX_OneofWrappers() []interface{} {
	return []interface{}{
		(*GetOnuCountersResponse_IntfId)(nil),
		(*GetOnuCountersResponse_OnuId)(nil),
		(*GetOnuCountersResponse_PositiveDrift)(nil),
		(*GetOnuCountersResponse_NegativeDrift)(nil),
		(*GetOnuCountersResponse_DelimiterMissDetection)(nil),
		(*GetOnuCountersResponse_BipErrors)(nil),
		(*GetOnuCountersResponse_BipUnits)(nil),
		(*GetOnuCountersResponse_FecCorrectedSymbols)(nil),
		(*GetOnuCountersResponse_FecCodewordsCorrected)(nil),
		(*GetOnuCountersResponse_FecCodewordsUncorrectable)(nil),
		(*GetOnuCountersResponse_FecCodewords)(nil),
		(*GetOnuCountersResponse_FecCorrectedUnits)(nil),
		(*GetOnuCountersResponse_XgemKeyErrors)(nil),
		(*GetOnuCountersResponse_XgemLoss)(nil),
		(*GetOnuCountersResponse_RxPloamsError)(nil),
		(*GetOnuCountersResponse_RxPloamsNonIdle)(nil),
		(*GetOnuCountersResponse_RxOmci)(nil),
		(*GetOnuCountersResponse_TxOmci)(nil),
		(*GetOnuCountersResponse_RxOmciPacketsCrcError)(nil),
		(*GetOnuCountersResponse_RxBytes)(nil),
		(*GetOnuCountersResponse_RxPackets)(nil),
		(*GetOnuCountersResponse_TxBytes)(nil),
		(*GetOnuCountersResponse_TxPackets)(nil),
		(*GetOnuCountersResponse_BerReported)(nil),
		(*GetOnuCountersResponse_LcdgErrors)(nil),
		(*GetOnuCountersResponse_RdiErrors)(nil),
		(*GetOnuCountersResponse_Timestamp)(nil),
	}
}

type OmciEthernetFrameExtendedPm struct {
	DropEvents               uint64   `protobuf:"fixed64,1,opt,name=drop_events,json=dropEvents,proto3" json:"drop_events,omitempty"`
	Octets                   uint64   `protobuf:"fixed64,2,opt,name=octets,proto3" json:"octets,omitempty"`
	Frames                   uint64   `protobuf:"fixed64,3,opt,name=frames,proto3" json:"frames,omitempty"`
	BroadcastFrames          uint64   `protobuf:"fixed64,4,opt,name=broadcast_frames,json=broadcastFrames,proto3" json:"broadcast_frames,omitempty"`
	MulticastFrames          uint64   `protobuf:"fixed64,5,opt,name=multicast_frames,json=multicastFrames,proto3" json:"multicast_frames,omitempty"`
	CrcErroredFrames         uint64   `protobuf:"fixed64,6,opt,name=crc_errored_frames,json=crcErroredFrames,proto3" json:"crc_errored_frames,omitempty"`
	UndersizeFrames          uint64   `protobuf:"fixed64,7,opt,name=undersize_frames,json=undersizeFrames,proto3" json:"undersize_frames,omitempty"`
	OversizeFrames           uint64   `protobuf:"fixed64,8,opt,name=oversize_frames,json=oversizeFrames,proto3" json:"oversize_frames,omitempty"`
	Frames_64Octets          uint64   `protobuf:"fixed64,9,opt,name=frames_64_octets,json=frames64Octets,proto3" json:"frames_64_octets,omitempty"`
	Frames_65To_127Octets    uint64   `protobuf:"fixed64,10,opt,name=frames_65_to_127_octets,json=frames65To127Octets,proto3" json:"frames_65_to_127_octets,omitempty"`
	Frames_128To_255Octets   uint64   `protobuf:"fixed64,11,opt,name=frames_128_to_255_octets,json=frames128To255Octets,proto3" json:"frames_128_to_255_octets,omitempty"`
	Frames_256To_511Octets   uint64   `protobuf:"fixed64,12,opt,name=frames_256_to_511_octets,json=frames256To511Octets,proto3" json:"frames_256_to_511_octets,omitempty"`
	Frames_512To_1023Octets  uint64   `protobuf:"fixed64,13,opt,name=frames_512_to_1023_octets,json=frames512To1023Octets,proto3" json:"frames_512_to_1023_octets,omitempty"`
	Frames_1024To_1518Octets uint64   `protobuf:"fixed64,14,opt,name=frames_1024_to_1518_octets,json=frames1024To1518Octets,proto3" json:"frames_1024_to_1518_octets,omitempty"`
	XXX_NoUnkeyedLiteral     struct{} `json:"-"`
	XXX_unrecognized         []byte   `json:"-"`
	XXX_sizecache            int32    `json:"-"`
}

func (m *OmciEthernetFrameExtendedPm) Reset()         { *m = OmciEthernetFrameExtendedPm{} }
func (m *OmciEthernetFrameExtendedPm) String() string { return proto.CompactTextString(m) }
func (*OmciEthernetFrameExtendedPm) ProtoMessage()    {}
func (*OmciEthernetFrameExtendedPm) Descriptor() ([]byte, []int) {
	return fileDescriptor_7ecf6e9799a9202d, []int{16}
}

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

var xxx_messageInfo_OmciEthernetFrameExtendedPm proto.InternalMessageInfo

func (m *OmciEthernetFrameExtendedPm) GetDropEvents() uint64 {
	if m != nil {
		return m.DropEvents
	}
	return 0
}

func (m *OmciEthernetFrameExtendedPm) GetOctets() uint64 {
	if m != nil {
		return m.Octets
	}
	return 0
}

func (m *OmciEthernetFrameExtendedPm) GetFrames() uint64 {
	if m != nil {
		return m.Frames
	}
	return 0
}

func (m *OmciEthernetFrameExtendedPm) GetBroadcastFrames() uint64 {
	if m != nil {
		return m.BroadcastFrames
	}
	return 0
}

func (m *OmciEthernetFrameExtendedPm) GetMulticastFrames() uint64 {
	if m != nil {
		return m.MulticastFrames
	}
	return 0
}

func (m *OmciEthernetFrameExtendedPm) GetCrcErroredFrames() uint64 {
	if m != nil {
		return m.CrcErroredFrames
	}
	return 0
}

func (m *OmciEthernetFrameExtendedPm) GetUndersizeFrames() uint64 {
	if m != nil {
		return m.UndersizeFrames
	}
	return 0
}

func (m *OmciEthernetFrameExtendedPm) GetOversizeFrames() uint64 {
	if m != nil {
		return m.OversizeFrames
	}
	return 0
}

func (m *OmciEthernetFrameExtendedPm) GetFrames_64Octets() uint64 {
	if m != nil {
		return m.Frames_64Octets
	}
	return 0
}

func (m *OmciEthernetFrameExtendedPm) GetFrames_65To_127Octets() uint64 {
	if m != nil {
		return m.Frames_65To_127Octets
	}
	return 0
}

func (m *OmciEthernetFrameExtendedPm) GetFrames_128To_255Octets() uint64 {
	if m != nil {
		return m.Frames_128To_255Octets
	}
	return 0
}

func (m *OmciEthernetFrameExtendedPm) GetFrames_256To_511Octets() uint64 {
	if m != nil {
		return m.Frames_256To_511Octets
	}
	return 0
}

func (m *OmciEthernetFrameExtendedPm) GetFrames_512To_1023Octets() uint64 {
	if m != nil {
		return m.Frames_512To_1023Octets
	}
	return 0
}

func (m *OmciEthernetFrameExtendedPm) GetFrames_1024To_1518Octets() uint64 {
	if m != nil {
		return m.Frames_1024To_1518Octets
	}
	return 0
}

type GetOmciEthernetFrameExtendedPmResponse struct {
	Upstream             *OmciEthernetFrameExtendedPm `protobuf:"bytes,1,opt,name=upstream,proto3" json:"upstream,omitempty"`
	Downstream           *OmciEthernetFrameExtendedPm `protobuf:"bytes,2,opt,name=downstream,proto3" json:"downstream,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                     `json:"-"`
	XXX_unrecognized     []byte                       `json:"-"`
	XXX_sizecache        int32                        `json:"-"`
}

func (m *GetOmciEthernetFrameExtendedPmResponse) Reset() {
	*m = GetOmciEthernetFrameExtendedPmResponse{}
}
func (m *GetOmciEthernetFrameExtendedPmResponse) String() string { return proto.CompactTextString(m) }
func (*GetOmciEthernetFrameExtendedPmResponse) ProtoMessage()    {}
func (*GetOmciEthernetFrameExtendedPmResponse) Descriptor() ([]byte, []int) {
	return fileDescriptor_7ecf6e9799a9202d, []int{17}
}

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

var xxx_messageInfo_GetOmciEthernetFrameExtendedPmResponse proto.InternalMessageInfo

func (m *GetOmciEthernetFrameExtendedPmResponse) GetUpstream() *OmciEthernetFrameExtendedPm {
	if m != nil {
		return m.Upstream
	}
	return nil
}

func (m *GetOmciEthernetFrameExtendedPmResponse) GetDownstream() *OmciEthernetFrameExtendedPm {
	if m != nil {
		return m.Downstream
	}
	return nil
}

type GetRxPowerResponse struct {
	IntfId               uint32   `protobuf:"fixed32,1,opt,name=intf_id,json=intfId,proto3" json:"intf_id,omitempty"`
	OnuId                uint32   `protobuf:"fixed32,2,opt,name=onu_id,json=onuId,proto3" json:"onu_id,omitempty"`
	Status               string   `protobuf:"bytes,3,opt,name=status,proto3" json:"status,omitempty"`
	FailReason           string   `protobuf:"bytes,4,opt,name=fail_reason,json=failReason,proto3" json:"fail_reason,omitempty"`
	RxPower              float64  `protobuf:"fixed64,5,opt,name=rx_power,json=rxPower,proto3" json:"rx_power,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *GetRxPowerResponse) Reset()         { *m = GetRxPowerResponse{} }
func (m *GetRxPowerResponse) String() string { return proto.CompactTextString(m) }
func (*GetRxPowerResponse) ProtoMessage()    {}
func (*GetRxPowerResponse) Descriptor() ([]byte, []int) {
	return fileDescriptor_7ecf6e9799a9202d, []int{18}
}

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

var xxx_messageInfo_GetRxPowerResponse proto.InternalMessageInfo

func (m *GetRxPowerResponse) GetIntfId() uint32 {
	if m != nil {
		return m.IntfId
	}
	return 0
}

func (m *GetRxPowerResponse) GetOnuId() uint32 {
	if m != nil {
		return m.OnuId
	}
	return 0
}

func (m *GetRxPowerResponse) GetStatus() string {
	if m != nil {
		return m.Status
	}
	return ""
}

func (m *GetRxPowerResponse) GetFailReason() string {
	if m != nil {
		return m.FailReason
	}
	return ""
}

func (m *GetRxPowerResponse) GetRxPower() float64 {
	if m != nil {
		return m.RxPower
	}
	return 0
}

type GetValueRequest struct {
	// Types that are valid to be assigned to Request:
	//	*GetValueRequest_Distance
	//	*GetValueRequest_UniInfo
	//	*GetValueRequest_OltPortInfo
	//	*GetValueRequest_OnuOpticalInfo
	//	*GetValueRequest_EthBridgePort
	//	*GetValueRequest_FecHistory
	//	*GetValueRequest_OnuPonInfo
	//	*GetValueRequest_OnuInfo
	//	*GetValueRequest_RxPower
	Request              isGetValueRequest_Request `protobuf_oneof:"request"`
	XXX_NoUnkeyedLiteral struct{}                  `json:"-"`
	XXX_unrecognized     []byte                    `json:"-"`
	XXX_sizecache        int32                     `json:"-"`
}

func (m *GetValueRequest) Reset()         { *m = GetValueRequest{} }
func (m *GetValueRequest) String() string { return proto.CompactTextString(m) }
func (*GetValueRequest) ProtoMessage()    {}
func (*GetValueRequest) Descriptor() ([]byte, []int) {
	return fileDescriptor_7ecf6e9799a9202d, []int{19}
}

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

var xxx_messageInfo_GetValueRequest proto.InternalMessageInfo

type isGetValueRequest_Request interface {
	isGetValueRequest_Request()
}

type GetValueRequest_Distance struct {
	Distance *GetDistanceRequest `protobuf:"bytes,1,opt,name=distance,proto3,oneof"`
}

type GetValueRequest_UniInfo struct {
	UniInfo *GetOnuUniInfoRequest `protobuf:"bytes,2,opt,name=uniInfo,proto3,oneof"`
}

type GetValueRequest_OltPortInfo struct {
	OltPortInfo *GetOltPortCounters `protobuf:"bytes,3,opt,name=oltPortInfo,proto3,oneof"`
}

type GetValueRequest_OnuOpticalInfo struct {
	OnuOpticalInfo *GetOnuPonOpticalInfo `protobuf:"bytes,4,opt,name=onuOpticalInfo,proto3,oneof"`
}

type GetValueRequest_EthBridgePort struct {
	EthBridgePort *GetOnuEthernetBridgePortHistory `protobuf:"bytes,5,opt,name=ethBridgePort,proto3,oneof"`
}

type GetValueRequest_FecHistory struct {
	FecHistory *GetOnuFecHistory `protobuf:"bytes,6,opt,name=fecHistory,proto3,oneof"`
}

type GetValueRequest_OnuPonInfo struct {
	OnuPonInfo *GetOnuCountersRequest `protobuf:"bytes,7,opt,name=onuPonInfo,proto3,oneof"`
}

type GetValueRequest_OnuInfo struct {
	OnuInfo *GetOmciEthernetFrameExtendedPmRequest `protobuf:"bytes,8,opt,name=onuInfo,proto3,oneof"`
}

type GetValueRequest_RxPower struct {
	RxPower *GetRxPowerRequest `protobuf:"bytes,9,opt,name=rxPower,proto3,oneof"`
}

func (*GetValueRequest_Distance) isGetValueRequest_Request() {}

func (*GetValueRequest_UniInfo) isGetValueRequest_Request() {}

func (*GetValueRequest_OltPortInfo) isGetValueRequest_Request() {}

func (*GetValueRequest_OnuOpticalInfo) isGetValueRequest_Request() {}

func (*GetValueRequest_EthBridgePort) isGetValueRequest_Request() {}

func (*GetValueRequest_FecHistory) isGetValueRequest_Request() {}

func (*GetValueRequest_OnuPonInfo) isGetValueRequest_Request() {}

func (*GetValueRequest_OnuInfo) isGetValueRequest_Request() {}

func (*GetValueRequest_RxPower) isGetValueRequest_Request() {}

func (m *GetValueRequest) GetRequest() isGetValueRequest_Request {
	if m != nil {
		return m.Request
	}
	return nil
}

func (m *GetValueRequest) GetDistance() *GetDistanceRequest {
	if x, ok := m.GetRequest().(*GetValueRequest_Distance); ok {
		return x.Distance
	}
	return nil
}

func (m *GetValueRequest) GetUniInfo() *GetOnuUniInfoRequest {
	if x, ok := m.GetRequest().(*GetValueRequest_UniInfo); ok {
		return x.UniInfo
	}
	return nil
}

func (m *GetValueRequest) GetOltPortInfo() *GetOltPortCounters {
	if x, ok := m.GetRequest().(*GetValueRequest_OltPortInfo); ok {
		return x.OltPortInfo
	}
	return nil
}

func (m *GetValueRequest) GetOnuOpticalInfo() *GetOnuPonOpticalInfo {
	if x, ok := m.GetRequest().(*GetValueRequest_OnuOpticalInfo); ok {
		return x.OnuOpticalInfo
	}
	return nil
}

func (m *GetValueRequest) GetEthBridgePort() *GetOnuEthernetBridgePortHistory {
	if x, ok := m.GetRequest().(*GetValueRequest_EthBridgePort); ok {
		return x.EthBridgePort
	}
	return nil
}

func (m *GetValueRequest) GetFecHistory() *GetOnuFecHistory {
	if x, ok := m.GetRequest().(*GetValueRequest_FecHistory); ok {
		return x.FecHistory
	}
	return nil
}

func (m *GetValueRequest) GetOnuPonInfo() *GetOnuCountersRequest {
	if x, ok := m.GetRequest().(*GetValueRequest_OnuPonInfo); ok {
		return x.OnuPonInfo
	}
	return nil
}

func (m *GetValueRequest) GetOnuInfo() *GetOmciEthernetFrameExtendedPmRequest {
	if x, ok := m.GetRequest().(*GetValueRequest_OnuInfo); ok {
		return x.OnuInfo
	}
	return nil
}

func (m *GetValueRequest) GetRxPower() *GetRxPowerRequest {
	if x, ok := m.GetRequest().(*GetValueRequest_RxPower); ok {
		return x.RxPower
	}
	return nil
}

// XXX_OneofWrappers is for the internal use of the proto package.
func (*GetValueRequest) XXX_OneofWrappers() []interface{} {
	return []interface{}{
		(*GetValueRequest_Distance)(nil),
		(*GetValueRequest_UniInfo)(nil),
		(*GetValueRequest_OltPortInfo)(nil),
		(*GetValueRequest_OnuOpticalInfo)(nil),
		(*GetValueRequest_EthBridgePort)(nil),
		(*GetValueRequest_FecHistory)(nil),
		(*GetValueRequest_OnuPonInfo)(nil),
		(*GetValueRequest_OnuInfo)(nil),
		(*GetValueRequest_RxPower)(nil),
	}
}

type GetValueResponse struct {
	Status    GetValueResponse_Status      `protobuf:"varint,1,opt,name=status,proto3,enum=extension.GetValueResponse_Status" json:"status,omitempty"`
	ErrReason GetValueResponse_ErrorReason `protobuf:"varint,2,opt,name=errReason,proto3,enum=extension.GetValueResponse_ErrorReason" json:"errReason,omitempty"`
	// Types that are valid to be assigned to Response:
	//	*GetValueResponse_Distance
	//	*GetValueResponse_UniInfo
	//	*GetValueResponse_PortCoutners
	//	*GetValueResponse_OnuOpticalInfo
	//	*GetValueResponse_EthBridgePortInfo
	//	*GetValueResponse_FecHistory
	//	*GetValueResponse_OnuPonCounters
	//	*GetValueResponse_OnuCounters
	//	*GetValueResponse_RxPower
	Response             isGetValueResponse_Response `protobuf_oneof:"response"`
	XXX_NoUnkeyedLiteral struct{}                    `json:"-"`
	XXX_unrecognized     []byte                      `json:"-"`
	XXX_sizecache        int32                       `json:"-"`
}

func (m *GetValueResponse) Reset()         { *m = GetValueResponse{} }
func (m *GetValueResponse) String() string { return proto.CompactTextString(m) }
func (*GetValueResponse) ProtoMessage()    {}
func (*GetValueResponse) Descriptor() ([]byte, []int) {
	return fileDescriptor_7ecf6e9799a9202d, []int{20}
}

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

var xxx_messageInfo_GetValueResponse proto.InternalMessageInfo

func (m *GetValueResponse) GetStatus() GetValueResponse_Status {
	if m != nil {
		return m.Status
	}
	return GetValueResponse_STATUS_UNDEFINED
}

func (m *GetValueResponse) GetErrReason() GetValueResponse_ErrorReason {
	if m != nil {
		return m.ErrReason
	}
	return GetValueResponse_REASON_UNDEFINED
}

type isGetValueResponse_Response interface {
	isGetValueResponse_Response()
}

type GetValueResponse_Distance struct {
	Distance *GetDistanceResponse `protobuf:"bytes,3,opt,name=distance,proto3,oneof"`
}

type GetValueResponse_UniInfo struct {
	UniInfo *GetOnuUniInfoResponse `protobuf:"bytes,4,opt,name=uniInfo,proto3,oneof"`
}

type GetValueResponse_PortCoutners struct {
	PortCoutners *GetOltPortCountersResponse `protobuf:"bytes,5,opt,name=portCoutners,proto3,oneof"`
}

type GetValueResponse_OnuOpticalInfo struct {
	OnuOpticalInfo *GetOnuPonOpticalInfoResponse `protobuf:"bytes,6,opt,name=onuOpticalInfo,proto3,oneof"`
}

type GetValueResponse_EthBridgePortInfo struct {
	EthBridgePortInfo *GetOnuEthernetBridgePortHistoryResponse `protobuf:"bytes,7,opt,name=ethBridgePortInfo,proto3,oneof"`
}

type GetValueResponse_FecHistory struct {
	FecHistory *GetOnuFecHistoryResponse `protobuf:"bytes,8,opt,name=fecHistory,proto3,oneof"`
}

type GetValueResponse_OnuPonCounters struct {
	OnuPonCounters *GetOnuCountersResponse `protobuf:"bytes,9,opt,name=onuPonCounters,proto3,oneof"`
}

type GetValueResponse_OnuCounters struct {
	OnuCounters *GetOmciEthernetFrameExtendedPmResponse `protobuf:"bytes,10,opt,name=onuCounters,proto3,oneof"`
}

type GetValueResponse_RxPower struct {
	RxPower *GetRxPowerResponse `protobuf:"bytes,11,opt,name=rxPower,proto3,oneof"`
}

func (*GetValueResponse_Distance) isGetValueResponse_Response() {}

func (*GetValueResponse_UniInfo) isGetValueResponse_Response() {}

func (*GetValueResponse_PortCoutners) isGetValueResponse_Response() {}

func (*GetValueResponse_OnuOpticalInfo) isGetValueResponse_Response() {}

func (*GetValueResponse_EthBridgePortInfo) isGetValueResponse_Response() {}

func (*GetValueResponse_FecHistory) isGetValueResponse_Response() {}

func (*GetValueResponse_OnuPonCounters) isGetValueResponse_Response() {}

func (*GetValueResponse_OnuCounters) isGetValueResponse_Response() {}

func (*GetValueResponse_RxPower) isGetValueResponse_Response() {}

func (m *GetValueResponse) GetResponse() isGetValueResponse_Response {
	if m != nil {
		return m.Response
	}
	return nil
}

func (m *GetValueResponse) GetDistance() *GetDistanceResponse {
	if x, ok := m.GetResponse().(*GetValueResponse_Distance); ok {
		return x.Distance
	}
	return nil
}

func (m *GetValueResponse) GetUniInfo() *GetOnuUniInfoResponse {
	if x, ok := m.GetResponse().(*GetValueResponse_UniInfo); ok {
		return x.UniInfo
	}
	return nil
}

func (m *GetValueResponse) GetPortCoutners() *GetOltPortCountersResponse {
	if x, ok := m.GetResponse().(*GetValueResponse_PortCoutners); ok {
		return x.PortCoutners
	}
	return nil
}

func (m *GetValueResponse) GetOnuOpticalInfo() *GetOnuPonOpticalInfoResponse {
	if x, ok := m.GetResponse().(*GetValueResponse_OnuOpticalInfo); ok {
		return x.OnuOpticalInfo
	}
	return nil
}

func (m *GetValueResponse) GetEthBridgePortInfo() *GetOnuEthernetBridgePortHistoryResponse {
	if x, ok := m.GetResponse().(*GetValueResponse_EthBridgePortInfo); ok {
		return x.EthBridgePortInfo
	}
	return nil
}

func (m *GetValueResponse) GetFecHistory() *GetOnuFecHistoryResponse {
	if x, ok := m.GetResponse().(*GetValueResponse_FecHistory); ok {
		return x.FecHistory
	}
	return nil
}

func (m *GetValueResponse) GetOnuPonCounters() *GetOnuCountersResponse {
	if x, ok := m.GetResponse().(*GetValueResponse_OnuPonCounters); ok {
		return x.OnuPonCounters
	}
	return nil
}

func (m *GetValueResponse) GetOnuCounters() *GetOmciEthernetFrameExtendedPmResponse {
	if x, ok := m.GetResponse().(*GetValueResponse_OnuCounters); ok {
		return x.OnuCounters
	}
	return nil
}

func (m *GetValueResponse) GetRxPower() *GetRxPowerResponse {
	if x, ok := m.GetResponse().(*GetValueResponse_RxPower); ok {
		return x.RxPower
	}
	return nil
}

// XXX_OneofWrappers is for the internal use of the proto package.
func (*GetValueResponse) XXX_OneofWrappers() []interface{} {
	return []interface{}{
		(*GetValueResponse_Distance)(nil),
		(*GetValueResponse_UniInfo)(nil),
		(*GetValueResponse_PortCoutners)(nil),
		(*GetValueResponse_OnuOpticalInfo)(nil),
		(*GetValueResponse_EthBridgePortInfo)(nil),
		(*GetValueResponse_FecHistory)(nil),
		(*GetValueResponse_OnuPonCounters)(nil),
		(*GetValueResponse_OnuCounters)(nil),
		(*GetValueResponse_RxPower)(nil),
	}
}

type SetValueRequest struct {
	// Types that are valid to be assigned to Request:
	//	*SetValueRequest_AlarmConfig
	Request              isSetValueRequest_Request `protobuf_oneof:"request"`
	XXX_NoUnkeyedLiteral struct{}                  `json:"-"`
	XXX_unrecognized     []byte                    `json:"-"`
	XXX_sizecache        int32                     `json:"-"`
}

func (m *SetValueRequest) Reset()         { *m = SetValueRequest{} }
func (m *SetValueRequest) String() string { return proto.CompactTextString(m) }
func (*SetValueRequest) ProtoMessage()    {}
func (*SetValueRequest) Descriptor() ([]byte, []int) {
	return fileDescriptor_7ecf6e9799a9202d, []int{21}
}

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

var xxx_messageInfo_SetValueRequest proto.InternalMessageInfo

type isSetValueRequest_Request interface {
	isSetValueRequest_Request()
}

type SetValueRequest_AlarmConfig struct {
	AlarmConfig *config.AlarmConfig `protobuf:"bytes,1,opt,name=alarm_config,json=alarmConfig,proto3,oneof"`
}

func (*SetValueRequest_AlarmConfig) isSetValueRequest_Request() {}

func (m *SetValueRequest) GetRequest() isSetValueRequest_Request {
	if m != nil {
		return m.Request
	}
	return nil
}

func (m *SetValueRequest) GetAlarmConfig() *config.AlarmConfig {
	if x, ok := m.GetRequest().(*SetValueRequest_AlarmConfig); ok {
		return x.AlarmConfig
	}
	return nil
}

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

type SetValueResponse struct {
	Status               SetValueResponse_Status      `protobuf:"varint,1,opt,name=status,proto3,enum=extension.SetValueResponse_Status" json:"status,omitempty"`
	ErrReason            SetValueResponse_ErrorReason `protobuf:"varint,2,opt,name=errReason,proto3,enum=extension.SetValueResponse_ErrorReason" json:"errReason,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                     `json:"-"`
	XXX_unrecognized     []byte                       `json:"-"`
	XXX_sizecache        int32                        `json:"-"`
}

func (m *SetValueResponse) Reset()         { *m = SetValueResponse{} }
func (m *SetValueResponse) String() string { return proto.CompactTextString(m) }
func (*SetValueResponse) ProtoMessage()    {}
func (*SetValueResponse) Descriptor() ([]byte, []int) {
	return fileDescriptor_7ecf6e9799a9202d, []int{22}
}

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

var xxx_messageInfo_SetValueResponse proto.InternalMessageInfo

func (m *SetValueResponse) GetStatus() SetValueResponse_Status {
	if m != nil {
		return m.Status
	}
	return SetValueResponse_STATUS_UNDEFINED
}

func (m *SetValueResponse) GetErrReason() SetValueResponse_ErrorReason {
	if m != nil {
		return m.ErrReason
	}
	return SetValueResponse_REASON_UNDEFINED
}

type SingleGetValueRequest struct {
	TargetId             string           `protobuf:"bytes,1,opt,name=targetId,proto3" json:"targetId,omitempty"`
	Request              *GetValueRequest `protobuf:"bytes,2,opt,name=request,proto3" json:"request,omitempty"`
	XXX_NoUnkeyedLiteral struct{}         `json:"-"`
	XXX_unrecognized     []byte           `json:"-"`
	XXX_sizecache        int32            `json:"-"`
}

func (m *SingleGetValueRequest) Reset()         { *m = SingleGetValueRequest{} }
func (m *SingleGetValueRequest) String() string { return proto.CompactTextString(m) }
func (*SingleGetValueRequest) ProtoMessage()    {}
func (*SingleGetValueRequest) Descriptor() ([]byte, []int) {
	return fileDescriptor_7ecf6e9799a9202d, []int{23}
}

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

var xxx_messageInfo_SingleGetValueRequest proto.InternalMessageInfo

func (m *SingleGetValueRequest) GetTargetId() string {
	if m != nil {
		return m.TargetId
	}
	return ""
}

func (m *SingleGetValueRequest) GetRequest() *GetValueRequest {
	if m != nil {
		return m.Request
	}
	return nil
}

type SingleGetValueResponse struct {
	Response             *GetValueResponse `protobuf:"bytes,1,opt,name=response,proto3" json:"response,omitempty"`
	XXX_NoUnkeyedLiteral struct{}          `json:"-"`
	XXX_unrecognized     []byte            `json:"-"`
	XXX_sizecache        int32             `json:"-"`
}

func (m *SingleGetValueResponse) Reset()         { *m = SingleGetValueResponse{} }
func (m *SingleGetValueResponse) String() string { return proto.CompactTextString(m) }
func (*SingleGetValueResponse) ProtoMessage()    {}
func (*SingleGetValueResponse) Descriptor() ([]byte, []int) {
	return fileDescriptor_7ecf6e9799a9202d, []int{24}
}

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

var xxx_messageInfo_SingleGetValueResponse proto.InternalMessageInfo

func (m *SingleGetValueResponse) GetResponse() *GetValueResponse {
	if m != nil {
		return m.Response
	}
	return nil
}

type SingleSetValueRequest struct {
	TargetId             string           `protobuf:"bytes,1,opt,name=targetId,proto3" json:"targetId,omitempty"`
	Request              *SetValueRequest `protobuf:"bytes,2,opt,name=request,proto3" json:"request,omitempty"`
	XXX_NoUnkeyedLiteral struct{}         `json:"-"`
	XXX_unrecognized     []byte           `json:"-"`
	XXX_sizecache        int32            `json:"-"`
}

func (m *SingleSetValueRequest) Reset()         { *m = SingleSetValueRequest{} }
func (m *SingleSetValueRequest) String() string { return proto.CompactTextString(m) }
func (*SingleSetValueRequest) ProtoMessage()    {}
func (*SingleSetValueRequest) Descriptor() ([]byte, []int) {
	return fileDescriptor_7ecf6e9799a9202d, []int{25}
}

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

var xxx_messageInfo_SingleSetValueRequest proto.InternalMessageInfo

func (m *SingleSetValueRequest) GetTargetId() string {
	if m != nil {
		return m.TargetId
	}
	return ""
}

func (m *SingleSetValueRequest) GetRequest() *SetValueRequest {
	if m != nil {
		return m.Request
	}
	return nil
}

type SingleSetValueResponse struct {
	Response             *SetValueResponse `protobuf:"bytes,1,opt,name=response,proto3" json:"response,omitempty"`
	XXX_NoUnkeyedLiteral struct{}          `json:"-"`
	XXX_unrecognized     []byte            `json:"-"`
	XXX_sizecache        int32             `json:"-"`
}

func (m *SingleSetValueResponse) Reset()         { *m = SingleSetValueResponse{} }
func (m *SingleSetValueResponse) String() string { return proto.CompactTextString(m) }
func (*SingleSetValueResponse) ProtoMessage()    {}
func (*SingleSetValueResponse) Descriptor() ([]byte, []int) {
	return fileDescriptor_7ecf6e9799a9202d, []int{26}
}

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

var xxx_messageInfo_SingleSetValueResponse proto.InternalMessageInfo

func (m *SingleSetValueResponse) GetResponse() *SetValueResponse {
	if m != nil {
		return m.Response
	}
	return nil
}

func init() {
	proto.RegisterEnum("extension.GetOnuUniInfoResponse_ConfigurationInd", GetOnuUniInfoResponse_ConfigurationInd_name, GetOnuUniInfoResponse_ConfigurationInd_value)
	proto.RegisterEnum("extension.GetOnuUniInfoResponse_AdministrativeState", GetOnuUniInfoResponse_AdministrativeState_name, GetOnuUniInfoResponse_AdministrativeState_value)
	proto.RegisterEnum("extension.GetOnuUniInfoResponse_OperationalState", GetOnuUniInfoResponse_OperationalState_name, GetOnuUniInfoResponse_OperationalState_value)
	proto.RegisterEnum("extension.GetOltPortCounters_PortType", GetOltPortCounters_PortType_name, GetOltPortCounters_PortType_value)
	proto.RegisterEnum("extension.GetOnuEthernetBridgePortHistory_Direction", GetOnuEthernetBridgePortHistory_Direction_name, GetOnuEthernetBridgePortHistory_Direction_value)
	proto.RegisterEnum("extension.GetValueResponse_Status", GetValueResponse_Status_name, GetValueResponse_Status_value)
	proto.RegisterEnum("extension.GetValueResponse_ErrorReason", GetValueResponse_ErrorReason_name, GetValueResponse_ErrorReason_value)
	proto.RegisterEnum("extension.SetValueResponse_Status", SetValueResponse_Status_name, SetValueResponse_Status_value)
	proto.RegisterEnum("extension.SetValueResponse_ErrorReason", SetValueResponse_ErrorReason_name, SetValueResponse_ErrorReason_value)
	proto.RegisterType((*GetDistanceRequest)(nil), "extension.GetDistanceRequest")
	proto.RegisterType((*GetDistanceResponse)(nil), "extension.GetDistanceResponse")
	proto.RegisterType((*GetOnuUniInfoRequest)(nil), "extension.GetOnuUniInfoRequest")
	proto.RegisterType((*GetOnuUniInfoResponse)(nil), "extension.GetOnuUniInfoResponse")
	proto.RegisterType((*GetOltPortCounters)(nil), "extension.GetOltPortCounters")
	proto.RegisterType((*GetOltPortCountersResponse)(nil), "extension.GetOltPortCountersResponse")
	proto.RegisterType((*GetOnuPonOpticalInfo)(nil), "extension.GetOnuPonOpticalInfo")
	proto.RegisterType((*GetOnuPonOpticalInfoResponse)(nil), "extension.GetOnuPonOpticalInfoResponse")
	proto.RegisterType((*GetOnuEthernetBridgePortHistory)(nil), "extension.GetOnuEthernetBridgePortHistory")
	proto.RegisterType((*GetOnuEthernetBridgePortHistoryResponse)(nil), "extension.GetOnuEthernetBridgePortHistoryResponse")
	proto.RegisterType((*GetOnuFecHistory)(nil), "extension.GetOnuFecHistory")
	proto.RegisterType((*GetOnuFecHistoryResponse)(nil), "extension.GetOnuFecHistoryResponse")
	proto.RegisterType((*GetOnuCountersRequest)(nil), "extension.GetOnuCountersRequest")
	proto.RegisterType((*GetOmciEthernetFrameExtendedPmRequest)(nil), "extension.GetOmciEthernetFrameExtendedPmRequest")
	proto.RegisterType((*GetRxPowerRequest)(nil), "extension.GetRxPowerRequest")
	proto.RegisterType((*GetOnuCountersResponse)(nil), "extension.GetOnuCountersResponse")
	proto.RegisterType((*OmciEthernetFrameExtendedPm)(nil), "extension.OmciEthernetFrameExtendedPm")
	proto.RegisterType((*GetOmciEthernetFrameExtendedPmResponse)(nil), "extension.GetOmciEthernetFrameExtendedPmResponse")
	proto.RegisterType((*GetRxPowerResponse)(nil), "extension.GetRxPowerResponse")
	proto.RegisterType((*GetValueRequest)(nil), "extension.GetValueRequest")
	proto.RegisterType((*GetValueResponse)(nil), "extension.GetValueResponse")
	proto.RegisterType((*SetValueRequest)(nil), "extension.SetValueRequest")
	proto.RegisterType((*SetValueResponse)(nil), "extension.SetValueResponse")
	proto.RegisterType((*SingleGetValueRequest)(nil), "extension.SingleGetValueRequest")
	proto.RegisterType((*SingleGetValueResponse)(nil), "extension.SingleGetValueResponse")
	proto.RegisterType((*SingleSetValueRequest)(nil), "extension.SingleSetValueRequest")
	proto.RegisterType((*SingleSetValueResponse)(nil), "extension.SingleSetValueResponse")
}

func init() { proto.RegisterFile("voltha_protos/extensions.proto", fileDescriptor_7ecf6e9799a9202d) }

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

// Reference imports to suppress errors if they are not otherwise used.
var _ context.Context
var _ grpc.ClientConn

// This is a compile-time assertion to ensure that this generated file
// is compatible with the grpc package it is being compiled against.
const _ = grpc.SupportPackageIsVersion4

// ExtensionClient is the client API for Extension service.
//
// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream.
type ExtensionClient interface {
	// Get a single attribute
	GetExtValue(ctx context.Context, in *SingleGetValueRequest, opts ...grpc.CallOption) (*SingleGetValueResponse, error)
	// Set a single attribute
	SetExtValue(ctx context.Context, in *SingleSetValueRequest, opts ...grpc.CallOption) (*SingleSetValueResponse, error)
}

type extensionClient struct {
	cc *grpc.ClientConn
}

func NewExtensionClient(cc *grpc.ClientConn) ExtensionClient {
	return &extensionClient{cc}
}

func (c *extensionClient) GetExtValue(ctx context.Context, in *SingleGetValueRequest, opts ...grpc.CallOption) (*SingleGetValueResponse, error) {
	out := new(SingleGetValueResponse)
	err := c.cc.Invoke(ctx, "/extension.Extension/GetExtValue", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *extensionClient) SetExtValue(ctx context.Context, in *SingleSetValueRequest, opts ...grpc.CallOption) (*SingleSetValueResponse, error) {
	out := new(SingleSetValueResponse)
	err := c.cc.Invoke(ctx, "/extension.Extension/SetExtValue", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

// ExtensionServer is the server API for Extension service.
type ExtensionServer interface {
	// Get a single attribute
	GetExtValue(context.Context, *SingleGetValueRequest) (*SingleGetValueResponse, error)
	// Set a single attribute
	SetExtValue(context.Context, *SingleSetValueRequest) (*SingleSetValueResponse, error)
}

// UnimplementedExtensionServer can be embedded to have forward compatible implementations.
type UnimplementedExtensionServer struct {
}

func (*UnimplementedExtensionServer) GetExtValue(ctx context.Context, req *SingleGetValueRequest) (*SingleGetValueResponse, error) {
	return nil, status.Errorf(codes.Unimplemented, "method GetExtValue not implemented")
}
func (*UnimplementedExtensionServer) SetExtValue(ctx context.Context, req *SingleSetValueRequest) (*SingleSetValueResponse, error) {
	return nil, status.Errorf(codes.Unimplemented, "method SetExtValue not implemented")
}

func RegisterExtensionServer(s *grpc.Server, srv ExtensionServer) {
	s.RegisterService(&_Extension_serviceDesc, srv)
}

func _Extension_GetExtValue_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(SingleGetValueRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(ExtensionServer).GetExtValue(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/extension.Extension/GetExtValue",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(ExtensionServer).GetExtValue(ctx, req.(*SingleGetValueRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _Extension_SetExtValue_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(SingleSetValueRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(ExtensionServer).SetExtValue(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/extension.Extension/SetExtValue",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(ExtensionServer).SetExtValue(ctx, req.(*SingleSetValueRequest))
	}
	return interceptor(ctx, in, info, handler)
}

var _Extension_serviceDesc = grpc.ServiceDesc{
	ServiceName: "extension.Extension",
	HandlerType: (*ExtensionServer)(nil),
	Methods: []grpc.MethodDesc{
		{
			MethodName: "GetExtValue",
			Handler:    _Extension_GetExtValue_Handler,
		},
		{
			MethodName: "SetExtValue",
			Handler:    _Extension_SetExtValue_Handler,
		},
	},
	Streams:  []grpc.StreamDesc{},
	Metadata: "voltha_protos/extensions.proto",
}
