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

package voip_system_profile

import (
	fmt "fmt"
	proto "github.com/golang/protobuf/proto"
	_ "google.golang.org/genproto/googleapis/api/annotations"
	math "math"
)

// Reference imports to suppress errors if they are not otherwise used.
var _ = proto.Marshal
var _ = fmt.Errorf
var _ = math.Inf

// This is a compile-time assertion to ensure that this generated file
// is compatible with the proto package it is being compiled against.
// A compilation error at this line likely means your copy of the
// proto package needs to be updated.
const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package

type VoipSystemProfileRequest struct {
	Key                  string             `protobuf:"bytes,1,opt,name=key,proto3" json:"key,omitempty"`
	VoipSystemProfile    *VoipSystemProfile `protobuf:"bytes,2,opt,name=voipSystemProfile,proto3" json:"voipSystemProfile,omitempty"`
	XXX_NoUnkeyedLiteral struct{}           `json:"-"`
	XXX_unrecognized     []byte             `json:"-"`
	XXX_sizecache        int32              `json:"-"`
}

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

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

var xxx_messageInfo_VoipSystemProfileRequest proto.InternalMessageInfo

func (m *VoipSystemProfileRequest) GetKey() string {
	if m != nil {
		return m.Key
	}
	return ""
}

func (m *VoipSystemProfileRequest) GetVoipSystemProfile() *VoipSystemProfile {
	if m != nil {
		return m.VoipSystemProfile
	}
	return nil
}

// A system wide profile for voip service that can be stored into voltha KV anytime.
// Designed based on G988-2017 (also designed flexible to be able to be modified later on)
type VoipSystemProfile struct {
	SipConfig            *SipConfig  `protobuf:"bytes,1,opt,name=sipConfig,proto3" json:"sipConfig,omitempty"`
	VoipConfig           *VoipConfig `protobuf:"bytes,2,opt,name=voipConfig,proto3" json:"voipConfig,omitempty"`
	XXX_NoUnkeyedLiteral struct{}    `json:"-"`
	XXX_unrecognized     []byte      `json:"-"`
	XXX_sizecache        int32       `json:"-"`
}

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

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

var xxx_messageInfo_VoipSystemProfile proto.InternalMessageInfo

func (m *VoipSystemProfile) GetSipConfig() *SipConfig {
	if m != nil {
		return m.SipConfig
	}
	return nil
}

func (m *VoipSystemProfile) GetVoipConfig() *VoipConfig {
	if m != nil {
		return m.VoipConfig
	}
	return nil
}

// Common voip fields are grouped here
type VoipConfig struct {
	IpHostConfig         *IpHostConfig        `protobuf:"bytes,1,opt,name=ipHostConfig,proto3" json:"ipHostConfig,omitempty"`
	TcpUdpConfig         *TcpUdpConfig        `protobuf:"bytes,2,opt,name=tcpUdpConfig,proto3" json:"tcpUdpConfig,omitempty"`
	VoipVoiceCtp         *VoipVoiceCtp        `protobuf:"bytes,3,opt,name=voipVoiceCtp,proto3" json:"voipVoiceCtp,omitempty"`
	VoipMediaProfile     *VoipMediaProfile    `protobuf:"bytes,4,opt,name=voipMediaProfile,proto3" json:"voipMediaProfile,omitempty"`
	VoiceServiceProfile  *VoiceServiceProfile `protobuf:"bytes,5,opt,name=voiceServiceProfile,proto3" json:"voiceServiceProfile,omitempty"`
	RtpProfile           *RtpProfile          `protobuf:"bytes,6,opt,name=rtpProfile,proto3" json:"rtpProfile,omitempty"`
	PptpPotsUni          *PptpPotsUni         `protobuf:"bytes,7,opt,name=pptpPotsUni,proto3" json:"pptpPotsUni,omitempty"`
	XXX_NoUnkeyedLiteral struct{}             `json:"-"`
	XXX_unrecognized     []byte               `json:"-"`
	XXX_sizecache        int32                `json:"-"`
}

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

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

var xxx_messageInfo_VoipConfig proto.InternalMessageInfo

func (m *VoipConfig) GetIpHostConfig() *IpHostConfig {
	if m != nil {
		return m.IpHostConfig
	}
	return nil
}

func (m *VoipConfig) GetTcpUdpConfig() *TcpUdpConfig {
	if m != nil {
		return m.TcpUdpConfig
	}
	return nil
}

func (m *VoipConfig) GetVoipVoiceCtp() *VoipVoiceCtp {
	if m != nil {
		return m.VoipVoiceCtp
	}
	return nil
}

func (m *VoipConfig) GetVoipMediaProfile() *VoipMediaProfile {
	if m != nil {
		return m.VoipMediaProfile
	}
	return nil
}

func (m *VoipConfig) GetVoiceServiceProfile() *VoiceServiceProfile {
	if m != nil {
		return m.VoiceServiceProfile
	}
	return nil
}

func (m *VoipConfig) GetRtpProfile() *RtpProfile {
	if m != nil {
		return m.RtpProfile
	}
	return nil
}

func (m *VoipConfig) GetPptpPotsUni() *PptpPotsUni {
	if m != nil {
		return m.PptpPotsUni
	}
	return nil
}

type IpHostConfig struct {
	IpOptions            uint32   `protobuf:"varint,1,opt,name=ipOptions,proto3" json:"ipOptions,omitempty"`
	OnuIdentifier        string   `protobuf:"bytes,2,opt,name=onuIdentifier,proto3" json:"onuIdentifier,omitempty"`
	IpAddress            string   `protobuf:"bytes,3,opt,name=ipAddress,proto3" json:"ipAddress,omitempty"`
	Mask                 string   `protobuf:"bytes,4,opt,name=mask,proto3" json:"mask,omitempty"`
	Gateway              string   `protobuf:"bytes,5,opt,name=gateway,proto3" json:"gateway,omitempty"`
	PrimaryDns           string   `protobuf:"bytes,6,opt,name=primaryDns,proto3" json:"primaryDns,omitempty"`
	SecondaryDns         string   `protobuf:"bytes,7,opt,name=secondaryDns,proto3" json:"secondaryDns,omitempty"`
	RelayAgentOptions    string   `protobuf:"bytes,8,opt,name=relayAgentOptions,proto3" json:"relayAgentOptions,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_IpHostConfig proto.InternalMessageInfo

func (m *IpHostConfig) GetIpOptions() uint32 {
	if m != nil {
		return m.IpOptions
	}
	return 0
}

func (m *IpHostConfig) GetOnuIdentifier() string {
	if m != nil {
		return m.OnuIdentifier
	}
	return ""
}

func (m *IpHostConfig) GetIpAddress() string {
	if m != nil {
		return m.IpAddress
	}
	return ""
}

func (m *IpHostConfig) GetMask() string {
	if m != nil {
		return m.Mask
	}
	return ""
}

func (m *IpHostConfig) GetGateway() string {
	if m != nil {
		return m.Gateway
	}
	return ""
}

func (m *IpHostConfig) GetPrimaryDns() string {
	if m != nil {
		return m.PrimaryDns
	}
	return ""
}

func (m *IpHostConfig) GetSecondaryDns() string {
	if m != nil {
		return m.SecondaryDns
	}
	return ""
}

func (m *IpHostConfig) GetRelayAgentOptions() string {
	if m != nil {
		return m.RelayAgentOptions
	}
	return ""
}

type TcpUdpConfig struct {
	Protocol             uint32   `protobuf:"varint,1,opt,name=protocol,proto3" json:"protocol,omitempty"`
	TosField             string   `protobuf:"bytes,2,opt,name=tosField,proto3" json:"tosField,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_TcpUdpConfig proto.InternalMessageInfo

func (m *TcpUdpConfig) GetProtocol() uint32 {
	if m != nil {
		return m.Protocol
	}
	return 0
}

func (m *TcpUdpConfig) GetTosField() string {
	if m != nil {
		return m.TosField
	}
	return ""
}

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

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

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

var xxx_messageInfo_VoipVoiceCtp proto.InternalMessageInfo

func (m *VoipVoiceCtp) GetSignallingCode() uint32 {
	if m != nil {
		return m.SignallingCode
	}
	return 0
}

type VoipMediaProfile struct {
	FaxMode                uint32   `protobuf:"varint,1,opt,name=faxMode,proto3" json:"faxMode,omitempty"`
	CodecSelection1        uint32   `protobuf:"varint,2,opt,name=codecSelection1,proto3" json:"codecSelection1,omitempty"`
	PacketPeriodSelection1 uint32   `protobuf:"varint,3,opt,name=packetPeriodSelection1,proto3" json:"packetPeriodSelection1,omitempty"`
	SilenceSuppression1    uint32   `protobuf:"varint,4,opt,name=silenceSuppression1,proto3" json:"silenceSuppression1,omitempty"`
	CodecSelection2        uint32   `protobuf:"varint,5,opt,name=codecSelection2,proto3" json:"codecSelection2,omitempty"`
	PacketPeriodSelection2 uint32   `protobuf:"varint,6,opt,name=packetPeriodSelection2,proto3" json:"packetPeriodSelection2,omitempty"`
	SilenceSuppression2    uint32   `protobuf:"varint,7,opt,name=silenceSuppression2,proto3" json:"silenceSuppression2,omitempty"`
	CodecSelection3        uint32   `protobuf:"varint,8,opt,name=codecSelection3,proto3" json:"codecSelection3,omitempty"`
	PacketPeriodSelection3 uint32   `protobuf:"varint,9,opt,name=packetPeriodSelection3,proto3" json:"packetPeriodSelection3,omitempty"`
	SilenceSuppression3    uint32   `protobuf:"varint,10,opt,name=silenceSuppression3,proto3" json:"silenceSuppression3,omitempty"`
	CodecSelection4        uint32   `protobuf:"varint,11,opt,name=codecSelection4,proto3" json:"codecSelection4,omitempty"`
	PacketPeriodSelection4 uint32   `protobuf:"varint,12,opt,name=packetPeriodSelection4,proto3" json:"packetPeriodSelection4,omitempty"`
	SilenceSuppression4    uint32   `protobuf:"varint,13,opt,name=silenceSuppression4,proto3" json:"silenceSuppression4,omitempty"`
	OobDtmf                uint32   `protobuf:"varint,14,opt,name=oobDtmf,proto3" json:"oobDtmf,omitempty"`
	XXX_NoUnkeyedLiteral   struct{} `json:"-"`
	XXX_unrecognized       []byte   `json:"-"`
	XXX_sizecache          int32    `json:"-"`
}

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

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

var xxx_messageInfo_VoipMediaProfile proto.InternalMessageInfo

func (m *VoipMediaProfile) GetFaxMode() uint32 {
	if m != nil {
		return m.FaxMode
	}
	return 0
}

func (m *VoipMediaProfile) GetCodecSelection1() uint32 {
	if m != nil {
		return m.CodecSelection1
	}
	return 0
}

func (m *VoipMediaProfile) GetPacketPeriodSelection1() uint32 {
	if m != nil {
		return m.PacketPeriodSelection1
	}
	return 0
}

func (m *VoipMediaProfile) GetSilenceSuppression1() uint32 {
	if m != nil {
		return m.SilenceSuppression1
	}
	return 0
}

func (m *VoipMediaProfile) GetCodecSelection2() uint32 {
	if m != nil {
		return m.CodecSelection2
	}
	return 0
}

func (m *VoipMediaProfile) GetPacketPeriodSelection2() uint32 {
	if m != nil {
		return m.PacketPeriodSelection2
	}
	return 0
}

func (m *VoipMediaProfile) GetSilenceSuppression2() uint32 {
	if m != nil {
		return m.SilenceSuppression2
	}
	return 0
}

func (m *VoipMediaProfile) GetCodecSelection3() uint32 {
	if m != nil {
		return m.CodecSelection3
	}
	return 0
}

func (m *VoipMediaProfile) GetPacketPeriodSelection3() uint32 {
	if m != nil {
		return m.PacketPeriodSelection3
	}
	return 0
}

func (m *VoipMediaProfile) GetSilenceSuppression3() uint32 {
	if m != nil {
		return m.SilenceSuppression3
	}
	return 0
}

func (m *VoipMediaProfile) GetCodecSelection4() uint32 {
	if m != nil {
		return m.CodecSelection4
	}
	return 0
}

func (m *VoipMediaProfile) GetPacketPeriodSelection4() uint32 {
	if m != nil {
		return m.PacketPeriodSelection4
	}
	return 0
}

func (m *VoipMediaProfile) GetSilenceSuppression4() uint32 {
	if m != nil {
		return m.SilenceSuppression4
	}
	return 0
}

func (m *VoipMediaProfile) GetOobDtmf() uint32 {
	if m != nil {
		return m.OobDtmf
	}
	return 0
}

type VoiceServiceProfile struct {
	AnnouncementType     uint32   `protobuf:"varint,1,opt,name=announcementType,proto3" json:"announcementType,omitempty"`
	JitterTarget         uint32   `protobuf:"varint,2,opt,name=jitterTarget,proto3" json:"jitterTarget,omitempty"`
	JitterBufferMax      uint32   `protobuf:"varint,3,opt,name=jitterBufferMax,proto3" json:"jitterBufferMax,omitempty"`
	EchoCancelInd        bool     `protobuf:"varint,4,opt,name=echoCancelInd,proto3" json:"echoCancelInd,omitempty"`
	PstnProtocolVariant  uint32   `protobuf:"varint,5,opt,name=pstnProtocolVariant,proto3" json:"pstnProtocolVariant,omitempty"`
	DtmfDigitLevels      uint32   `protobuf:"varint,6,opt,name=dtmfDigitLevels,proto3" json:"dtmfDigitLevels,omitempty"`
	DtmfDigitDuration    uint32   `protobuf:"varint,7,opt,name=dtmfDigitDuration,proto3" json:"dtmfDigitDuration,omitempty"`
	HookFlashMinimumTime uint32   `protobuf:"varint,8,opt,name=hookFlashMinimumTime,proto3" json:"hookFlashMinimumTime,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_VoiceServiceProfile proto.InternalMessageInfo

func (m *VoiceServiceProfile) GetAnnouncementType() uint32 {
	if m != nil {
		return m.AnnouncementType
	}
	return 0
}

func (m *VoiceServiceProfile) GetJitterTarget() uint32 {
	if m != nil {
		return m.JitterTarget
	}
	return 0
}

func (m *VoiceServiceProfile) GetJitterBufferMax() uint32 {
	if m != nil {
		return m.JitterBufferMax
	}
	return 0
}

func (m *VoiceServiceProfile) GetEchoCancelInd() bool {
	if m != nil {
		return m.EchoCancelInd
	}
	return false
}

func (m *VoiceServiceProfile) GetPstnProtocolVariant() uint32 {
	if m != nil {
		return m.PstnProtocolVariant
	}
	return 0
}

func (m *VoiceServiceProfile) GetDtmfDigitLevels() uint32 {
	if m != nil {
		return m.DtmfDigitLevels
	}
	return 0
}

func (m *VoiceServiceProfile) GetDtmfDigitDuration() uint32 {
	if m != nil {
		return m.DtmfDigitDuration
	}
	return 0
}

func (m *VoiceServiceProfile) GetHookFlashMinimumTime() uint32 {
	if m != nil {
		return m.HookFlashMinimumTime
	}
	return 0
}

type RtpProfile struct {
	LocalPortMin         uint32   `protobuf:"varint,1,opt,name=localPortMin,proto3" json:"localPortMin,omitempty"`
	LocalPortMax         uint32   `protobuf:"varint,2,opt,name=localPortMax,proto3" json:"localPortMax,omitempty"`
	DscpMark             string   `protobuf:"bytes,3,opt,name=dscpMark,proto3" json:"dscpMark,omitempty"`
	PiggyBackEvents      uint32   `protobuf:"varint,4,opt,name=piggyBackEvents,proto3" json:"piggyBackEvents,omitempty"`
	ToneEvents           uint32   `protobuf:"varint,5,opt,name=toneEvents,proto3" json:"toneEvents,omitempty"`
	DtmfEvents           uint32   `protobuf:"varint,6,opt,name=dtmfEvents,proto3" json:"dtmfEvents,omitempty"`
	CasEvents            uint32   `protobuf:"varint,7,opt,name=casEvents,proto3" json:"casEvents,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_RtpProfile proto.InternalMessageInfo

func (m *RtpProfile) GetLocalPortMin() uint32 {
	if m != nil {
		return m.LocalPortMin
	}
	return 0
}

func (m *RtpProfile) GetLocalPortMax() uint32 {
	if m != nil {
		return m.LocalPortMax
	}
	return 0
}

func (m *RtpProfile) GetDscpMark() string {
	if m != nil {
		return m.DscpMark
	}
	return ""
}

func (m *RtpProfile) GetPiggyBackEvents() uint32 {
	if m != nil {
		return m.PiggyBackEvents
	}
	return 0
}

func (m *RtpProfile) GetToneEvents() uint32 {
	if m != nil {
		return m.ToneEvents
	}
	return 0
}

func (m *RtpProfile) GetDtmfEvents() uint32 {
	if m != nil {
		return m.DtmfEvents
	}
	return 0
}

func (m *RtpProfile) GetCasEvents() uint32 {
	if m != nil {
		return m.CasEvents
	}
	return 0
}

type PptpPotsUni struct {
	Arc                  string   `protobuf:"bytes,1,opt,name=arc,proto3" json:"arc,omitempty"`
	ArcInterval          string   `protobuf:"bytes,2,opt,name=arcInterval,proto3" json:"arcInterval,omitempty"`
	Impedance            uint32   `protobuf:"varint,3,opt,name=impedance,proto3" json:"impedance,omitempty"`
	TransmissionPath     uint32   `protobuf:"varint,4,opt,name=transmissionPath,proto3" json:"transmissionPath,omitempty"`
	RxGain               int32    `protobuf:"zigzag32,5,opt,name=rxGain,proto3" json:"rxGain,omitempty"`
	TxGain               int32    `protobuf:"zigzag32,6,opt,name=txGain,proto3" json:"txGain,omitempty"`
	PotsHoldOverTime     uint32   `protobuf:"varint,7,opt,name=potsHoldOverTime,proto3" json:"potsHoldOverTime,omitempty"`
	NominalFeedVoltage   uint32   `protobuf:"varint,8,opt,name=nominalFeedVoltage,proto3" json:"nominalFeedVoltage,omitempty"`
	LossOfSoftSwitch     uint32   `protobuf:"varint,9,opt,name=lossOfSoftSwitch,proto3" json:"lossOfSoftSwitch,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_PptpPotsUni proto.InternalMessageInfo

func (m *PptpPotsUni) GetArc() string {
	if m != nil {
		return m.Arc
	}
	return ""
}

func (m *PptpPotsUni) GetArcInterval() string {
	if m != nil {
		return m.ArcInterval
	}
	return ""
}

func (m *PptpPotsUni) GetImpedance() uint32 {
	if m != nil {
		return m.Impedance
	}
	return 0
}

func (m *PptpPotsUni) GetTransmissionPath() uint32 {
	if m != nil {
		return m.TransmissionPath
	}
	return 0
}

func (m *PptpPotsUni) GetRxGain() int32 {
	if m != nil {
		return m.RxGain
	}
	return 0
}

func (m *PptpPotsUni) GetTxGain() int32 {
	if m != nil {
		return m.TxGain
	}
	return 0
}

func (m *PptpPotsUni) GetPotsHoldOverTime() uint32 {
	if m != nil {
		return m.PotsHoldOverTime
	}
	return 0
}

func (m *PptpPotsUni) GetNominalFeedVoltage() uint32 {
	if m != nil {
		return m.NominalFeedVoltage
	}
	return 0
}

func (m *PptpPotsUni) GetLossOfSoftSwitch() uint32 {
	if m != nil {
		return m.LossOfSoftSwitch
	}
	return 0
}

// Sip specific fields are grouped here
type SipConfig struct {
	SipUserData                   *SipUserData                   `protobuf:"bytes,1,opt,name=sipUserData,proto3" json:"sipUserData,omitempty"`
	SipAgentConfig                *SipAgentConfig                `protobuf:"bytes,2,opt,name=sipAgentConfig,proto3" json:"sipAgentConfig,omitempty"`
	NetworkDialPlan               *NetworkDialPlan               `protobuf:"bytes,3,opt,name=networkDialPlan,proto3" json:"networkDialPlan,omitempty"`
	VoipFeatureAccessCodes        *VoipFeatureAccessCodes        `protobuf:"bytes,4,opt,name=voipFeatureAccessCodes,proto3" json:"voipFeatureAccessCodes,omitempty"`
	VoipApplicationServiceProfile *VoipApplicationServiceProfile `protobuf:"bytes,5,opt,name=voipApplicationServiceProfile,proto3" json:"voipApplicationServiceProfile,omitempty"`
	XXX_NoUnkeyedLiteral          struct{}                       `json:"-"`
	XXX_unrecognized              []byte                         `json:"-"`
	XXX_sizecache                 int32                          `json:"-"`
}

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

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

var xxx_messageInfo_SipConfig proto.InternalMessageInfo

func (m *SipConfig) GetSipUserData() *SipUserData {
	if m != nil {
		return m.SipUserData
	}
	return nil
}

func (m *SipConfig) GetSipAgentConfig() *SipAgentConfig {
	if m != nil {
		return m.SipAgentConfig
	}
	return nil
}

func (m *SipConfig) GetNetworkDialPlan() *NetworkDialPlan {
	if m != nil {
		return m.NetworkDialPlan
	}
	return nil
}

func (m *SipConfig) GetVoipFeatureAccessCodes() *VoipFeatureAccessCodes {
	if m != nil {
		return m.VoipFeatureAccessCodes
	}
	return nil
}

func (m *SipConfig) GetVoipApplicationServiceProfile() *VoipApplicationServiceProfile {
	if m != nil {
		return m.VoipApplicationServiceProfile
	}
	return nil
}

type SipUserData struct {
	UserPartAor                         string               `protobuf:"bytes,1,opt,name=userPartAor,proto3" json:"userPartAor,omitempty"`
	UsernameAndPassword                 *UsernameAndPassword `protobuf:"bytes,2,opt,name=usernameAndPassword,proto3" json:"usernameAndPassword,omitempty"`
	VoicemailServerSipUri               string               `protobuf:"bytes,3,opt,name=voicemailServerSipUri,proto3" json:"voicemailServerSipUri,omitempty"`
	VoicemailSubscriptionExpirationTime int32                `protobuf:"varint,4,opt,name=voicemailSubscriptionExpirationTime,proto3" json:"voicemailSubscriptionExpirationTime,omitempty"`
	ReleaseTimer                        int32                `protobuf:"varint,5,opt,name=releaseTimer,proto3" json:"releaseTimer,omitempty"`
	RohTimer                            int32                `protobuf:"varint,6,opt,name=rohTimer,proto3" json:"rohTimer,omitempty"`
	XXX_NoUnkeyedLiteral                struct{}             `json:"-"`
	XXX_unrecognized                    []byte               `json:"-"`
	XXX_sizecache                       int32                `json:"-"`
}

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

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

var xxx_messageInfo_SipUserData proto.InternalMessageInfo

func (m *SipUserData) GetUserPartAor() string {
	if m != nil {
		return m.UserPartAor
	}
	return ""
}

func (m *SipUserData) GetUsernameAndPassword() *UsernameAndPassword {
	if m != nil {
		return m.UsernameAndPassword
	}
	return nil
}

func (m *SipUserData) GetVoicemailServerSipUri() string {
	if m != nil {
		return m.VoicemailServerSipUri
	}
	return ""
}

func (m *SipUserData) GetVoicemailSubscriptionExpirationTime() int32 {
	if m != nil {
		return m.VoicemailSubscriptionExpirationTime
	}
	return 0
}

func (m *SipUserData) GetReleaseTimer() int32 {
	if m != nil {
		return m.ReleaseTimer
	}
	return 0
}

func (m *SipUserData) GetRohTimer() int32 {
	if m != nil {
		return m.RohTimer
	}
	return 0
}

type SipAgentConfig struct {
	OutboundProxyAddress     string            `protobuf:"bytes,1,opt,name=outboundProxyAddress,proto3" json:"outboundProxyAddress,omitempty"`
	PrimarySipDns            string            `protobuf:"bytes,2,opt,name=primarySipDns,proto3" json:"primarySipDns,omitempty"`
	SecondarySipDns          string            `protobuf:"bytes,3,opt,name=secondarySipDns,proto3" json:"secondarySipDns,omitempty"`
	SipRegExpTime            int32             `protobuf:"varint,4,opt,name=sipRegExpTime,proto3" json:"sipRegExpTime,omitempty"`
	SipReregHeadStartTime    int32             `protobuf:"varint,5,opt,name=sipReregHeadStartTime,proto3" json:"sipReregHeadStartTime,omitempty"`
	SipRegistrar             string            `protobuf:"bytes,6,opt,name=SipRegistrar,proto3" json:"SipRegistrar,omitempty"`
	SoftSwitch               string            `protobuf:"bytes,7,opt,name=softSwitch,proto3" json:"softSwitch,omitempty"`
	SipResponseTable         *SipResponseTable `protobuf:"bytes,8,opt,name=sipResponseTable,proto3" json:"sipResponseTable,omitempty"`
	SipOptionTransmitControl bool              `protobuf:"varint,9,opt,name=sipOptionTransmitControl,proto3" json:"sipOptionTransmitControl,omitempty"`
	SipUriFormat             string            `protobuf:"bytes,10,opt,name=sipUriFormat,proto3" json:"sipUriFormat,omitempty"`
	RedundantSipAgentPointer string            `protobuf:"bytes,11,opt,name=redundantSipAgentPointer,proto3" json:"redundantSipAgentPointer,omitempty"`
	XXX_NoUnkeyedLiteral     struct{}          `json:"-"`
	XXX_unrecognized         []byte            `json:"-"`
	XXX_sizecache            int32             `json:"-"`
}

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

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

var xxx_messageInfo_SipAgentConfig proto.InternalMessageInfo

func (m *SipAgentConfig) GetOutboundProxyAddress() string {
	if m != nil {
		return m.OutboundProxyAddress
	}
	return ""
}

func (m *SipAgentConfig) GetPrimarySipDns() string {
	if m != nil {
		return m.PrimarySipDns
	}
	return ""
}

func (m *SipAgentConfig) GetSecondarySipDns() string {
	if m != nil {
		return m.SecondarySipDns
	}
	return ""
}

func (m *SipAgentConfig) GetSipRegExpTime() int32 {
	if m != nil {
		return m.SipRegExpTime
	}
	return 0
}

func (m *SipAgentConfig) GetSipReregHeadStartTime() int32 {
	if m != nil {
		return m.SipReregHeadStartTime
	}
	return 0
}

func (m *SipAgentConfig) GetSipRegistrar() string {
	if m != nil {
		return m.SipRegistrar
	}
	return ""
}

func (m *SipAgentConfig) GetSoftSwitch() string {
	if m != nil {
		return m.SoftSwitch
	}
	return ""
}

func (m *SipAgentConfig) GetSipResponseTable() *SipResponseTable {
	if m != nil {
		return m.SipResponseTable
	}
	return nil
}

func (m *SipAgentConfig) GetSipOptionTransmitControl() bool {
	if m != nil {
		return m.SipOptionTransmitControl
	}
	return false
}

func (m *SipAgentConfig) GetSipUriFormat() string {
	if m != nil {
		return m.SipUriFormat
	}
	return ""
}

func (m *SipAgentConfig) GetRedundantSipAgentPointer() string {
	if m != nil {
		return m.RedundantSipAgentPointer
	}
	return ""
}

type NetworkDialPlan struct {
	CriticalDialTimeout  uint32         `protobuf:"varint,1,opt,name=criticalDialTimeout,proto3" json:"criticalDialTimeout,omitempty"`
	PartialDialTimeout   uint32         `protobuf:"varint,2,opt,name=partialDialTimeout,proto3" json:"partialDialTimeout,omitempty"`
	DialPlanFormat       uint32         `protobuf:"varint,3,opt,name=dialPlanFormat,proto3" json:"dialPlanFormat,omitempty"`
	DialPlanTable        *DialPlanTable `protobuf:"bytes,4,opt,name=dialPlanTable,proto3" json:"dialPlanTable,omitempty"`
	XXX_NoUnkeyedLiteral struct{}       `json:"-"`
	XXX_unrecognized     []byte         `json:"-"`
	XXX_sizecache        int32          `json:"-"`
}

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

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

var xxx_messageInfo_NetworkDialPlan proto.InternalMessageInfo

func (m *NetworkDialPlan) GetCriticalDialTimeout() uint32 {
	if m != nil {
		return m.CriticalDialTimeout
	}
	return 0
}

func (m *NetworkDialPlan) GetPartialDialTimeout() uint32 {
	if m != nil {
		return m.PartialDialTimeout
	}
	return 0
}

func (m *NetworkDialPlan) GetDialPlanFormat() uint32 {
	if m != nil {
		return m.DialPlanFormat
	}
	return 0
}

func (m *NetworkDialPlan) GetDialPlanTable() *DialPlanTable {
	if m != nil {
		return m.DialPlanTable
	}
	return nil
}

type UsernameAndPassword struct {
	ValidationScheme     int32    `protobuf:"varint,1,opt,name=validationScheme,proto3" json:"validationScheme,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_UsernameAndPassword proto.InternalMessageInfo

func (m *UsernameAndPassword) GetValidationScheme() int32 {
	if m != nil {
		return m.ValidationScheme
	}
	return 0
}

type SipResponseTable struct {
	SipResponseCode      string   `protobuf:"bytes,1,opt,name=sipResponseCode,proto3" json:"sipResponseCode,omitempty"`
	Tone                 string   `protobuf:"bytes,2,opt,name=tone,proto3" json:"tone,omitempty"`
	TextMessage          string   `protobuf:"bytes,3,opt,name=textMessage,proto3" json:"textMessage,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_SipResponseTable proto.InternalMessageInfo

func (m *SipResponseTable) GetSipResponseCode() string {
	if m != nil {
		return m.SipResponseCode
	}
	return ""
}

func (m *SipResponseTable) GetTone() string {
	if m != nil {
		return m.Tone
	}
	return ""
}

func (m *SipResponseTable) GetTextMessage() string {
	if m != nil {
		return m.TextMessage
	}
	return ""
}

type DialPlanTable struct {
	DialPlanId           uint32   `protobuf:"varint,1,opt,name=dialPlanId,proto3" json:"dialPlanId,omitempty"`
	Action               uint32   `protobuf:"varint,2,opt,name=action,proto3" json:"action,omitempty"`
	DialPlanToken        string   `protobuf:"bytes,3,opt,name=dialPlanToken,proto3" json:"dialPlanToken,omitempty"`
	DialPlanTableMaxSize uint32   `protobuf:"varint,4,opt,name=dialPlanTableMaxSize,proto3" json:"dialPlanTableMaxSize,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_DialPlanTable proto.InternalMessageInfo

func (m *DialPlanTable) GetDialPlanId() uint32 {
	if m != nil {
		return m.DialPlanId
	}
	return 0
}

func (m *DialPlanTable) GetAction() uint32 {
	if m != nil {
		return m.Action
	}
	return 0
}

func (m *DialPlanTable) GetDialPlanToken() string {
	if m != nil {
		return m.DialPlanToken
	}
	return ""
}

func (m *DialPlanTable) GetDialPlanTableMaxSize() uint32 {
	if m != nil {
		return m.DialPlanTableMaxSize
	}
	return 0
}

type VoipFeatureAccessCodes struct {
	CancelCallWaiting        string   `protobuf:"bytes,1,opt,name=cancelCallWaiting,proto3" json:"cancelCallWaiting,omitempty"`
	CallHold                 string   `protobuf:"bytes,2,opt,name=callHold,proto3" json:"callHold,omitempty"`
	CallPark                 string   `protobuf:"bytes,3,opt,name=callPark,proto3" json:"callPark,omitempty"`
	CallerIdActivate         string   `protobuf:"bytes,4,opt,name=callerIdActivate,proto3" json:"callerIdActivate,omitempty"`
	CallerIdDeactivate       string   `protobuf:"bytes,5,opt,name=callerIdDeactivate,proto3" json:"callerIdDeactivate,omitempty"`
	DoNotDisturbActivation   string   `protobuf:"bytes,6,opt,name=doNotDisturbActivation,proto3" json:"doNotDisturbActivation,omitempty"`
	DoNotDisturbDeactivation string   `protobuf:"bytes,7,opt,name=doNotDisturbDeactivation,proto3" json:"doNotDisturbDeactivation,omitempty"`
	DoNotDisturbPinChange    string   `protobuf:"bytes,8,opt,name=doNotDisturbPinChange,proto3" json:"doNotDisturbPinChange,omitempty"`
	EmergencyServiceNumber   string   `protobuf:"bytes,9,opt,name=emergencyServiceNumber,proto3" json:"emergencyServiceNumber,omitempty"`
	IntercomService          string   `protobuf:"bytes,10,opt,name=intercomService,proto3" json:"intercomService,omitempty"`
	UnattendedCallTransfer   string   `protobuf:"bytes,11,opt,name=unattendedCallTransfer,proto3" json:"unattendedCallTransfer,omitempty"`
	AttendedCallTransfer     string   `protobuf:"bytes,12,opt,name=attendedCallTransfer,proto3" json:"attendedCallTransfer,omitempty"`
	XXX_NoUnkeyedLiteral     struct{} `json:"-"`
	XXX_unrecognized         []byte   `json:"-"`
	XXX_sizecache            int32    `json:"-"`
}

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

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

var xxx_messageInfo_VoipFeatureAccessCodes proto.InternalMessageInfo

func (m *VoipFeatureAccessCodes) GetCancelCallWaiting() string {
	if m != nil {
		return m.CancelCallWaiting
	}
	return ""
}

func (m *VoipFeatureAccessCodes) GetCallHold() string {
	if m != nil {
		return m.CallHold
	}
	return ""
}

func (m *VoipFeatureAccessCodes) GetCallPark() string {
	if m != nil {
		return m.CallPark
	}
	return ""
}

func (m *VoipFeatureAccessCodes) GetCallerIdActivate() string {
	if m != nil {
		return m.CallerIdActivate
	}
	return ""
}

func (m *VoipFeatureAccessCodes) GetCallerIdDeactivate() string {
	if m != nil {
		return m.CallerIdDeactivate
	}
	return ""
}

func (m *VoipFeatureAccessCodes) GetDoNotDisturbActivation() string {
	if m != nil {
		return m.DoNotDisturbActivation
	}
	return ""
}

func (m *VoipFeatureAccessCodes) GetDoNotDisturbDeactivation() string {
	if m != nil {
		return m.DoNotDisturbDeactivation
	}
	return ""
}

func (m *VoipFeatureAccessCodes) GetDoNotDisturbPinChange() string {
	if m != nil {
		return m.DoNotDisturbPinChange
	}
	return ""
}

func (m *VoipFeatureAccessCodes) GetEmergencyServiceNumber() string {
	if m != nil {
		return m.EmergencyServiceNumber
	}
	return ""
}

func (m *VoipFeatureAccessCodes) GetIntercomService() string {
	if m != nil {
		return m.IntercomService
	}
	return ""
}

func (m *VoipFeatureAccessCodes) GetUnattendedCallTransfer() string {
	if m != nil {
		return m.UnattendedCallTransfer
	}
	return ""
}

func (m *VoipFeatureAccessCodes) GetAttendedCallTransfer() string {
	if m != nil {
		return m.AttendedCallTransfer
	}
	return ""
}

type VoipApplicationServiceProfile struct {
	CidFeatures                    uint32   `protobuf:"varint,1,opt,name=cidFeatures,proto3" json:"cidFeatures,omitempty"`
	CallWaitingFeatures            uint32   `protobuf:"varint,2,opt,name=callWaitingFeatures,proto3" json:"callWaitingFeatures,omitempty"`
	CallProgressOrTransferFeatures uint32   `protobuf:"varint,3,opt,name=callProgressOrTransferFeatures,proto3" json:"callProgressOrTransferFeatures,omitempty"`
	CallPresentationFeatures       uint32   `protobuf:"varint,4,opt,name=callPresentationFeatures,proto3" json:"callPresentationFeatures,omitempty"`
	DirectConnectFeature           uint32   `protobuf:"varint,5,opt,name=directConnectFeature,proto3" json:"directConnectFeature,omitempty"`
	DirectConnectUriPointer        string   `protobuf:"bytes,6,opt,name=directConnectUriPointer,proto3" json:"directConnectUriPointer,omitempty"`
	BridgedLineAgentUriPointer     string   `protobuf:"bytes,7,opt,name=bridgedLineAgentUriPointer,proto3" json:"bridgedLineAgentUriPointer,omitempty"`
	ConferenceFactoryUriPointer    string   `protobuf:"bytes,8,opt,name=conferenceFactoryUriPointer,proto3" json:"conferenceFactoryUriPointer,omitempty"`
	DialToneDelayTimer             uint32   `protobuf:"varint,9,opt,name=dialToneDelayTimer,proto3" json:"dialToneDelayTimer,omitempty"`
	XXX_NoUnkeyedLiteral           struct{} `json:"-"`
	XXX_unrecognized               []byte   `json:"-"`
	XXX_sizecache                  int32    `json:"-"`
}

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

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

var xxx_messageInfo_VoipApplicationServiceProfile proto.InternalMessageInfo

func (m *VoipApplicationServiceProfile) GetCidFeatures() uint32 {
	if m != nil {
		return m.CidFeatures
	}
	return 0
}

func (m *VoipApplicationServiceProfile) GetCallWaitingFeatures() uint32 {
	if m != nil {
		return m.CallWaitingFeatures
	}
	return 0
}

func (m *VoipApplicationServiceProfile) GetCallProgressOrTransferFeatures() uint32 {
	if m != nil {
		return m.CallProgressOrTransferFeatures
	}
	return 0
}

func (m *VoipApplicationServiceProfile) GetCallPresentationFeatures() uint32 {
	if m != nil {
		return m.CallPresentationFeatures
	}
	return 0
}

func (m *VoipApplicationServiceProfile) GetDirectConnectFeature() uint32 {
	if m != nil {
		return m.DirectConnectFeature
	}
	return 0
}

func (m *VoipApplicationServiceProfile) GetDirectConnectUriPointer() string {
	if m != nil {
		return m.DirectConnectUriPointer
	}
	return ""
}

func (m *VoipApplicationServiceProfile) GetBridgedLineAgentUriPointer() string {
	if m != nil {
		return m.BridgedLineAgentUriPointer
	}
	return ""
}

func (m *VoipApplicationServiceProfile) GetConferenceFactoryUriPointer() string {
	if m != nil {
		return m.ConferenceFactoryUriPointer
	}
	return ""
}

func (m *VoipApplicationServiceProfile) GetDialToneDelayTimer() uint32 {
	if m != nil {
		return m.DialToneDelayTimer
	}
	return 0
}

func init() {
	proto.RegisterType((*VoipSystemProfileRequest)(nil), "voip_system_profile.VoipSystemProfileRequest")
	proto.RegisterType((*VoipSystemProfile)(nil), "voip_system_profile.VoipSystemProfile")
	proto.RegisterType((*VoipConfig)(nil), "voip_system_profile.VoipConfig")
	proto.RegisterType((*IpHostConfig)(nil), "voip_system_profile.IpHostConfig")
	proto.RegisterType((*TcpUdpConfig)(nil), "voip_system_profile.TcpUdpConfig")
	proto.RegisterType((*VoipVoiceCtp)(nil), "voip_system_profile.VoipVoiceCtp")
	proto.RegisterType((*VoipMediaProfile)(nil), "voip_system_profile.VoipMediaProfile")
	proto.RegisterType((*VoiceServiceProfile)(nil), "voip_system_profile.VoiceServiceProfile")
	proto.RegisterType((*RtpProfile)(nil), "voip_system_profile.RtpProfile")
	proto.RegisterType((*PptpPotsUni)(nil), "voip_system_profile.PptpPotsUni")
	proto.RegisterType((*SipConfig)(nil), "voip_system_profile.SipConfig")
	proto.RegisterType((*SipUserData)(nil), "voip_system_profile.SipUserData")
	proto.RegisterType((*SipAgentConfig)(nil), "voip_system_profile.SipAgentConfig")
	proto.RegisterType((*NetworkDialPlan)(nil), "voip_system_profile.NetworkDialPlan")
	proto.RegisterType((*UsernameAndPassword)(nil), "voip_system_profile.UsernameAndPassword")
	proto.RegisterType((*SipResponseTable)(nil), "voip_system_profile.SipResponseTable")
	proto.RegisterType((*DialPlanTable)(nil), "voip_system_profile.DialPlanTable")
	proto.RegisterType((*VoipFeatureAccessCodes)(nil), "voip_system_profile.VoipFeatureAccessCodes")
	proto.RegisterType((*VoipApplicationServiceProfile)(nil), "voip_system_profile.VoipApplicationServiceProfile")
}

func init() {
	proto.RegisterFile("voltha_protos/voip_system_profile.proto", fileDescriptor_02a00a136081bca5)
}

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