// Code generated by protoc-gen-go. DO NOT EDIT.
// source: google/ads/googleads/v0/resources/account_budget_proposal.proto

package resources // import "google.golang.org/genproto/googleapis/ads/googleads/v0/resources"

import proto "github.com/golang/protobuf/proto"
import fmt "fmt"
import math "math"
import wrappers "github.com/golang/protobuf/ptypes/wrappers"
import enums "google.golang.org/genproto/googleapis/ads/googleads/v0/enums"

// 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.ProtoPackageIsVersion2 // please upgrade the proto package

// An account-level budget proposal.
//
// All fields prefixed with 'proposed' may not necessarily be applied directly.
// For example, proposed spending limits may be adjusted before their
// application.  This is true if the 'proposed' field has an 'approved'
// counterpart, e.g. spending limits.
//
// Please note that the proposal type (proposal_type) changes which fields are
// required and which must remain empty.
type AccountBudgetProposal struct {
	// The resource name of the proposal.
	// AccountBudgetProposal resource names have the form:
	//
	//
	// `customers/{customer_id}/accountBudgetProposals/{account_budget_proposal_id}`
	ResourceName string `protobuf:"bytes,1,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"`
	// The ID of the proposal.
	Id *wrappers.Int64Value `protobuf:"bytes,14,opt,name=id,proto3" json:"id,omitempty"`
	// The resource name of the billing setup associated with this proposal.
	BillingSetup *wrappers.StringValue `protobuf:"bytes,2,opt,name=billing_setup,json=billingSetup,proto3" json:"billing_setup,omitempty"`
	// The resource name of the account-level budget associated with this
	// proposal.
	AccountBudget *wrappers.StringValue `protobuf:"bytes,3,opt,name=account_budget,json=accountBudget,proto3" json:"account_budget,omitempty"`
	// The type of this proposal, e.g. END to end the budget associated with this
	// proposal.
	ProposalType enums.AccountBudgetProposalTypeEnum_AccountBudgetProposalType `protobuf:"varint,4,opt,name=proposal_type,json=proposalType,proto3,enum=google.ads.googleads.v0.enums.AccountBudgetProposalTypeEnum_AccountBudgetProposalType" json:"proposal_type,omitempty"`
	// The status of this proposal.
	// When a new proposal is created, the status defaults to PENDING.
	Status enums.AccountBudgetProposalStatusEnum_AccountBudgetProposalStatus `protobuf:"varint,15,opt,name=status,proto3,enum=google.ads.googleads.v0.enums.AccountBudgetProposalStatusEnum_AccountBudgetProposalStatus" json:"status,omitempty"`
	// The name to assign to the account-level budget.
	ProposedName *wrappers.StringValue `protobuf:"bytes,5,opt,name=proposed_name,json=proposedName,proto3" json:"proposed_name,omitempty"`
	// The approved start date time in yyyy-mm-dd hh:mm:ss format.
	ApprovedStartDateTime *wrappers.StringValue `protobuf:"bytes,20,opt,name=approved_start_date_time,json=approvedStartDateTime,proto3" json:"approved_start_date_time,omitempty"`
	// A purchase order number is a value that enables the user to help them
	// reference this budget in their monthly invoices.
	ProposedPurchaseOrderNumber *wrappers.StringValue `protobuf:"bytes,12,opt,name=proposed_purchase_order_number,json=proposedPurchaseOrderNumber,proto3" json:"proposed_purchase_order_number,omitempty"`
	// Notes associated with this budget.
	ProposedNotes *wrappers.StringValue `protobuf:"bytes,13,opt,name=proposed_notes,json=proposedNotes,proto3" json:"proposed_notes,omitempty"`
	// The date time when this account-level budget proposal was created, which is
	// not the same as its approval date time, if applicable.
	CreationDateTime *wrappers.StringValue `protobuf:"bytes,16,opt,name=creation_date_time,json=creationDateTime,proto3" json:"creation_date_time,omitempty"`
	// The date time when this account-level budget was approved, if applicable.
	ApprovalDateTime *wrappers.StringValue `protobuf:"bytes,17,opt,name=approval_date_time,json=approvalDateTime,proto3" json:"approval_date_time,omitempty"`
	// The proposed start date time of the account-level budget, which cannot be
	// in the past.
	//
	// Types that are valid to be assigned to ProposedStartTime:
	//	*AccountBudgetProposal_ProposedStartDateTime
	//	*AccountBudgetProposal_ProposedStartTimeType
	ProposedStartTime isAccountBudgetProposal_ProposedStartTime `protobuf_oneof:"proposed_start_time"`
	// The proposed end date time of the account-level budget, which cannot be in
	// the past.
	//
	// Types that are valid to be assigned to ProposedEndTime:
	//	*AccountBudgetProposal_ProposedEndDateTime
	//	*AccountBudgetProposal_ProposedEndTimeType
	ProposedEndTime isAccountBudgetProposal_ProposedEndTime `protobuf_oneof:"proposed_end_time"`
	// The approved end date time of the account-level budget.
	//
	// Types that are valid to be assigned to ApprovedEndTime:
	//	*AccountBudgetProposal_ApprovedEndDateTime
	//	*AccountBudgetProposal_ApprovedEndTimeType
	ApprovedEndTime isAccountBudgetProposal_ApprovedEndTime `protobuf_oneof:"approved_end_time"`
	// The proposed spending limit.
	//
	// Types that are valid to be assigned to ProposedSpendingLimit:
	//	*AccountBudgetProposal_ProposedSpendingLimitMicros
	//	*AccountBudgetProposal_ProposedSpendingLimitType
	ProposedSpendingLimit isAccountBudgetProposal_ProposedSpendingLimit `protobuf_oneof:"proposed_spending_limit"`
	// The approved spending limit.
	//
	// Types that are valid to be assigned to ApprovedSpendingLimit:
	//	*AccountBudgetProposal_ApprovedSpendingLimitMicros
	//	*AccountBudgetProposal_ApprovedSpendingLimitType
	ApprovedSpendingLimit isAccountBudgetProposal_ApprovedSpendingLimit `protobuf_oneof:"approved_spending_limit"`
	XXX_NoUnkeyedLiteral  struct{}                                      `json:"-"`
	XXX_unrecognized      []byte                                        `json:"-"`
	XXX_sizecache         int32                                         `json:"-"`
}

func (m *AccountBudgetProposal) Reset()         { *m = AccountBudgetProposal{} }
func (m *AccountBudgetProposal) String() string { return proto.CompactTextString(m) }
func (*AccountBudgetProposal) ProtoMessage()    {}
func (*AccountBudgetProposal) Descriptor() ([]byte, []int) {
	return fileDescriptor_account_budget_proposal_0a40c45df7b8d2e1, []int{0}
}
func (m *AccountBudgetProposal) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_AccountBudgetProposal.Unmarshal(m, b)
}
func (m *AccountBudgetProposal) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_AccountBudgetProposal.Marshal(b, m, deterministic)
}
func (dst *AccountBudgetProposal) XXX_Merge(src proto.Message) {
	xxx_messageInfo_AccountBudgetProposal.Merge(dst, src)
}
func (m *AccountBudgetProposal) XXX_Size() int {
	return xxx_messageInfo_AccountBudgetProposal.Size(m)
}
func (m *AccountBudgetProposal) XXX_DiscardUnknown() {
	xxx_messageInfo_AccountBudgetProposal.DiscardUnknown(m)
}

var xxx_messageInfo_AccountBudgetProposal proto.InternalMessageInfo

func (m *AccountBudgetProposal) GetResourceName() string {
	if m != nil {
		return m.ResourceName
	}
	return ""
}

func (m *AccountBudgetProposal) GetId() *wrappers.Int64Value {
	if m != nil {
		return m.Id
	}
	return nil
}

func (m *AccountBudgetProposal) GetBillingSetup() *wrappers.StringValue {
	if m != nil {
		return m.BillingSetup
	}
	return nil
}

func (m *AccountBudgetProposal) GetAccountBudget() *wrappers.StringValue {
	if m != nil {
		return m.AccountBudget
	}
	return nil
}

func (m *AccountBudgetProposal) GetProposalType() enums.AccountBudgetProposalTypeEnum_AccountBudgetProposalType {
	if m != nil {
		return m.ProposalType
	}
	return enums.AccountBudgetProposalTypeEnum_UNSPECIFIED
}

func (m *AccountBudgetProposal) GetStatus() enums.AccountBudgetProposalStatusEnum_AccountBudgetProposalStatus {
	if m != nil {
		return m.Status
	}
	return enums.AccountBudgetProposalStatusEnum_UNSPECIFIED
}

func (m *AccountBudgetProposal) GetProposedName() *wrappers.StringValue {
	if m != nil {
		return m.ProposedName
	}
	return nil
}

func (m *AccountBudgetProposal) GetApprovedStartDateTime() *wrappers.StringValue {
	if m != nil {
		return m.ApprovedStartDateTime
	}
	return nil
}

func (m *AccountBudgetProposal) GetProposedPurchaseOrderNumber() *wrappers.StringValue {
	if m != nil {
		return m.ProposedPurchaseOrderNumber
	}
	return nil
}

func (m *AccountBudgetProposal) GetProposedNotes() *wrappers.StringValue {
	if m != nil {
		return m.ProposedNotes
	}
	return nil
}

func (m *AccountBudgetProposal) GetCreationDateTime() *wrappers.StringValue {
	if m != nil {
		return m.CreationDateTime
	}
	return nil
}

func (m *AccountBudgetProposal) GetApprovalDateTime() *wrappers.StringValue {
	if m != nil {
		return m.ApprovalDateTime
	}
	return nil
}

type isAccountBudgetProposal_ProposedStartTime interface {
	isAccountBudgetProposal_ProposedStartTime()
}

type AccountBudgetProposal_ProposedStartDateTime struct {
	ProposedStartDateTime *wrappers.StringValue `protobuf:"bytes,18,opt,name=proposed_start_date_time,json=proposedStartDateTime,proto3,oneof"`
}

type AccountBudgetProposal_ProposedStartTimeType struct {
	ProposedStartTimeType enums.TimeTypeEnum_TimeType `protobuf:"varint,7,opt,name=proposed_start_time_type,json=proposedStartTimeType,proto3,enum=google.ads.googleads.v0.enums.TimeTypeEnum_TimeType,oneof"`
}

func (*AccountBudgetProposal_ProposedStartDateTime) isAccountBudgetProposal_ProposedStartTime() {}

func (*AccountBudgetProposal_ProposedStartTimeType) isAccountBudgetProposal_ProposedStartTime() {}

func (m *AccountBudgetProposal) GetProposedStartTime() isAccountBudgetProposal_ProposedStartTime {
	if m != nil {
		return m.ProposedStartTime
	}
	return nil
}

func (m *AccountBudgetProposal) GetProposedStartDateTime() *wrappers.StringValue {
	if x, ok := m.GetProposedStartTime().(*AccountBudgetProposal_ProposedStartDateTime); ok {
		return x.ProposedStartDateTime
	}
	return nil
}

func (m *AccountBudgetProposal) GetProposedStartTimeType() enums.TimeTypeEnum_TimeType {
	if x, ok := m.GetProposedStartTime().(*AccountBudgetProposal_ProposedStartTimeType); ok {
		return x.ProposedStartTimeType
	}
	return enums.TimeTypeEnum_UNSPECIFIED
}

type isAccountBudgetProposal_ProposedEndTime interface {
	isAccountBudgetProposal_ProposedEndTime()
}

type AccountBudgetProposal_ProposedEndDateTime struct {
	ProposedEndDateTime *wrappers.StringValue `protobuf:"bytes,19,opt,name=proposed_end_date_time,json=proposedEndDateTime,proto3,oneof"`
}

type AccountBudgetProposal_ProposedEndTimeType struct {
	ProposedEndTimeType enums.TimeTypeEnum_TimeType `protobuf:"varint,9,opt,name=proposed_end_time_type,json=proposedEndTimeType,proto3,enum=google.ads.googleads.v0.enums.TimeTypeEnum_TimeType,oneof"`
}

func (*AccountBudgetProposal_ProposedEndDateTime) isAccountBudgetProposal_ProposedEndTime() {}

func (*AccountBudgetProposal_ProposedEndTimeType) isAccountBudgetProposal_ProposedEndTime() {}

func (m *AccountBudgetProposal) GetProposedEndTime() isAccountBudgetProposal_ProposedEndTime {
	if m != nil {
		return m.ProposedEndTime
	}
	return nil
}

func (m *AccountBudgetProposal) GetProposedEndDateTime() *wrappers.StringValue {
	if x, ok := m.GetProposedEndTime().(*AccountBudgetProposal_ProposedEndDateTime); ok {
		return x.ProposedEndDateTime
	}
	return nil
}

func (m *AccountBudgetProposal) GetProposedEndTimeType() enums.TimeTypeEnum_TimeType {
	if x, ok := m.GetProposedEndTime().(*AccountBudgetProposal_ProposedEndTimeType); ok {
		return x.ProposedEndTimeType
	}
	return enums.TimeTypeEnum_UNSPECIFIED
}

type isAccountBudgetProposal_ApprovedEndTime interface {
	isAccountBudgetProposal_ApprovedEndTime()
}

type AccountBudgetProposal_ApprovedEndDateTime struct {
	ApprovedEndDateTime *wrappers.StringValue `protobuf:"bytes,21,opt,name=approved_end_date_time,json=approvedEndDateTime,proto3,oneof"`
}

type AccountBudgetProposal_ApprovedEndTimeType struct {
	ApprovedEndTimeType enums.TimeTypeEnum_TimeType `protobuf:"varint,22,opt,name=approved_end_time_type,json=approvedEndTimeType,proto3,enum=google.ads.googleads.v0.enums.TimeTypeEnum_TimeType,oneof"`
}

func (*AccountBudgetProposal_ApprovedEndDateTime) isAccountBudgetProposal_ApprovedEndTime() {}

func (*AccountBudgetProposal_ApprovedEndTimeType) isAccountBudgetProposal_ApprovedEndTime() {}

func (m *AccountBudgetProposal) GetApprovedEndTime() isAccountBudgetProposal_ApprovedEndTime {
	if m != nil {
		return m.ApprovedEndTime
	}
	return nil
}

func (m *AccountBudgetProposal) GetApprovedEndDateTime() *wrappers.StringValue {
	if x, ok := m.GetApprovedEndTime().(*AccountBudgetProposal_ApprovedEndDateTime); ok {
		return x.ApprovedEndDateTime
	}
	return nil
}

func (m *AccountBudgetProposal) GetApprovedEndTimeType() enums.TimeTypeEnum_TimeType {
	if x, ok := m.GetApprovedEndTime().(*AccountBudgetProposal_ApprovedEndTimeType); ok {
		return x.ApprovedEndTimeType
	}
	return enums.TimeTypeEnum_UNSPECIFIED
}

type isAccountBudgetProposal_ProposedSpendingLimit interface {
	isAccountBudgetProposal_ProposedSpendingLimit()
}

type AccountBudgetProposal_ProposedSpendingLimitMicros struct {
	ProposedSpendingLimitMicros *wrappers.Int64Value `protobuf:"bytes,10,opt,name=proposed_spending_limit_micros,json=proposedSpendingLimitMicros,proto3,oneof"`
}

type AccountBudgetProposal_ProposedSpendingLimitType struct {
	ProposedSpendingLimitType enums.SpendingLimitTypeEnum_SpendingLimitType `protobuf:"varint,11,opt,name=proposed_spending_limit_type,json=proposedSpendingLimitType,proto3,enum=google.ads.googleads.v0.enums.SpendingLimitTypeEnum_SpendingLimitType,oneof"`
}

func (*AccountBudgetProposal_ProposedSpendingLimitMicros) isAccountBudgetProposal_ProposedSpendingLimit() {
}

func (*AccountBudgetProposal_ProposedSpendingLimitType) isAccountBudgetProposal_ProposedSpendingLimit() {
}

func (m *AccountBudgetProposal) GetProposedSpendingLimit() isAccountBudgetProposal_ProposedSpendingLimit {
	if m != nil {
		return m.ProposedSpendingLimit
	}
	return nil
}

func (m *AccountBudgetProposal) GetProposedSpendingLimitMicros() *wrappers.Int64Value {
	if x, ok := m.GetProposedSpendingLimit().(*AccountBudgetProposal_ProposedSpendingLimitMicros); ok {
		return x.ProposedSpendingLimitMicros
	}
	return nil
}

func (m *AccountBudgetProposal) GetProposedSpendingLimitType() enums.SpendingLimitTypeEnum_SpendingLimitType {
	if x, ok := m.GetProposedSpendingLimit().(*AccountBudgetProposal_ProposedSpendingLimitType); ok {
		return x.ProposedSpendingLimitType
	}
	return enums.SpendingLimitTypeEnum_UNSPECIFIED
}

type isAccountBudgetProposal_ApprovedSpendingLimit interface {
	isAccountBudgetProposal_ApprovedSpendingLimit()
}

type AccountBudgetProposal_ApprovedSpendingLimitMicros struct {
	ApprovedSpendingLimitMicros *wrappers.Int64Value `protobuf:"bytes,23,opt,name=approved_spending_limit_micros,json=approvedSpendingLimitMicros,proto3,oneof"`
}

type AccountBudgetProposal_ApprovedSpendingLimitType struct {
	ApprovedSpendingLimitType enums.SpendingLimitTypeEnum_SpendingLimitType `protobuf:"varint,24,opt,name=approved_spending_limit_type,json=approvedSpendingLimitType,proto3,enum=google.ads.googleads.v0.enums.SpendingLimitTypeEnum_SpendingLimitType,oneof"`
}

func (*AccountBudgetProposal_ApprovedSpendingLimitMicros) isAccountBudgetProposal_ApprovedSpendingLimit() {
}

func (*AccountBudgetProposal_ApprovedSpendingLimitType) isAccountBudgetProposal_ApprovedSpendingLimit() {
}

func (m *AccountBudgetProposal) GetApprovedSpendingLimit() isAccountBudgetProposal_ApprovedSpendingLimit {
	if m != nil {
		return m.ApprovedSpendingLimit
	}
	return nil
}

func (m *AccountBudgetProposal) GetApprovedSpendingLimitMicros() *wrappers.Int64Value {
	if x, ok := m.GetApprovedSpendingLimit().(*AccountBudgetProposal_ApprovedSpendingLimitMicros); ok {
		return x.ApprovedSpendingLimitMicros
	}
	return nil
}

func (m *AccountBudgetProposal) GetApprovedSpendingLimitType() enums.SpendingLimitTypeEnum_SpendingLimitType {
	if x, ok := m.GetApprovedSpendingLimit().(*AccountBudgetProposal_ApprovedSpendingLimitType); ok {
		return x.ApprovedSpendingLimitType
	}
	return enums.SpendingLimitTypeEnum_UNSPECIFIED
}

// XXX_OneofFuncs is for the internal use of the proto package.
func (*AccountBudgetProposal) XXX_OneofFuncs() (func(msg proto.Message, b *proto.Buffer) error, func(msg proto.Message, tag, wire int, b *proto.Buffer) (bool, error), func(msg proto.Message) (n int), []interface{}) {
	return _AccountBudgetProposal_OneofMarshaler, _AccountBudgetProposal_OneofUnmarshaler, _AccountBudgetProposal_OneofSizer, []interface{}{
		(*AccountBudgetProposal_ProposedStartDateTime)(nil),
		(*AccountBudgetProposal_ProposedStartTimeType)(nil),
		(*AccountBudgetProposal_ProposedEndDateTime)(nil),
		(*AccountBudgetProposal_ProposedEndTimeType)(nil),
		(*AccountBudgetProposal_ApprovedEndDateTime)(nil),
		(*AccountBudgetProposal_ApprovedEndTimeType)(nil),
		(*AccountBudgetProposal_ProposedSpendingLimitMicros)(nil),
		(*AccountBudgetProposal_ProposedSpendingLimitType)(nil),
		(*AccountBudgetProposal_ApprovedSpendingLimitMicros)(nil),
		(*AccountBudgetProposal_ApprovedSpendingLimitType)(nil),
	}
}

func _AccountBudgetProposal_OneofMarshaler(msg proto.Message, b *proto.Buffer) error {
	m := msg.(*AccountBudgetProposal)
	// proposed_start_time
	switch x := m.ProposedStartTime.(type) {
	case *AccountBudgetProposal_ProposedStartDateTime:
		b.EncodeVarint(18<<3 | proto.WireBytes)
		if err := b.EncodeMessage(x.ProposedStartDateTime); err != nil {
			return err
		}
	case *AccountBudgetProposal_ProposedStartTimeType:
		b.EncodeVarint(7<<3 | proto.WireVarint)
		b.EncodeVarint(uint64(x.ProposedStartTimeType))
	case nil:
	default:
		return fmt.Errorf("AccountBudgetProposal.ProposedStartTime has unexpected type %T", x)
	}
	// proposed_end_time
	switch x := m.ProposedEndTime.(type) {
	case *AccountBudgetProposal_ProposedEndDateTime:
		b.EncodeVarint(19<<3 | proto.WireBytes)
		if err := b.EncodeMessage(x.ProposedEndDateTime); err != nil {
			return err
		}
	case *AccountBudgetProposal_ProposedEndTimeType:
		b.EncodeVarint(9<<3 | proto.WireVarint)
		b.EncodeVarint(uint64(x.ProposedEndTimeType))
	case nil:
	default:
		return fmt.Errorf("AccountBudgetProposal.ProposedEndTime has unexpected type %T", x)
	}
	// approved_end_time
	switch x := m.ApprovedEndTime.(type) {
	case *AccountBudgetProposal_ApprovedEndDateTime:
		b.EncodeVarint(21<<3 | proto.WireBytes)
		if err := b.EncodeMessage(x.ApprovedEndDateTime); err != nil {
			return err
		}
	case *AccountBudgetProposal_ApprovedEndTimeType:
		b.EncodeVarint(22<<3 | proto.WireVarint)
		b.EncodeVarint(uint64(x.ApprovedEndTimeType))
	case nil:
	default:
		return fmt.Errorf("AccountBudgetProposal.ApprovedEndTime has unexpected type %T", x)
	}
	// proposed_spending_limit
	switch x := m.ProposedSpendingLimit.(type) {
	case *AccountBudgetProposal_ProposedSpendingLimitMicros:
		b.EncodeVarint(10<<3 | proto.WireBytes)
		if err := b.EncodeMessage(x.ProposedSpendingLimitMicros); err != nil {
			return err
		}
	case *AccountBudgetProposal_ProposedSpendingLimitType:
		b.EncodeVarint(11<<3 | proto.WireVarint)
		b.EncodeVarint(uint64(x.ProposedSpendingLimitType))
	case nil:
	default:
		return fmt.Errorf("AccountBudgetProposal.ProposedSpendingLimit has unexpected type %T", x)
	}
	// approved_spending_limit
	switch x := m.ApprovedSpendingLimit.(type) {
	case *AccountBudgetProposal_ApprovedSpendingLimitMicros:
		b.EncodeVarint(23<<3 | proto.WireBytes)
		if err := b.EncodeMessage(x.ApprovedSpendingLimitMicros); err != nil {
			return err
		}
	case *AccountBudgetProposal_ApprovedSpendingLimitType:
		b.EncodeVarint(24<<3 | proto.WireVarint)
		b.EncodeVarint(uint64(x.ApprovedSpendingLimitType))
	case nil:
	default:
		return fmt.Errorf("AccountBudgetProposal.ApprovedSpendingLimit has unexpected type %T", x)
	}
	return nil
}

func _AccountBudgetProposal_OneofUnmarshaler(msg proto.Message, tag, wire int, b *proto.Buffer) (bool, error) {
	m := msg.(*AccountBudgetProposal)
	switch tag {
	case 18: // proposed_start_time.proposed_start_date_time
		if wire != proto.WireBytes {
			return true, proto.ErrInternalBadWireType
		}
		msg := new(wrappers.StringValue)
		err := b.DecodeMessage(msg)
		m.ProposedStartTime = &AccountBudgetProposal_ProposedStartDateTime{msg}
		return true, err
	case 7: // proposed_start_time.proposed_start_time_type
		if wire != proto.WireVarint {
			return true, proto.ErrInternalBadWireType
		}
		x, err := b.DecodeVarint()
		m.ProposedStartTime = &AccountBudgetProposal_ProposedStartTimeType{enums.TimeTypeEnum_TimeType(x)}
		return true, err
	case 19: // proposed_end_time.proposed_end_date_time
		if wire != proto.WireBytes {
			return true, proto.ErrInternalBadWireType
		}
		msg := new(wrappers.StringValue)
		err := b.DecodeMessage(msg)
		m.ProposedEndTime = &AccountBudgetProposal_ProposedEndDateTime{msg}
		return true, err
	case 9: // proposed_end_time.proposed_end_time_type
		if wire != proto.WireVarint {
			return true, proto.ErrInternalBadWireType
		}
		x, err := b.DecodeVarint()
		m.ProposedEndTime = &AccountBudgetProposal_ProposedEndTimeType{enums.TimeTypeEnum_TimeType(x)}
		return true, err
	case 21: // approved_end_time.approved_end_date_time
		if wire != proto.WireBytes {
			return true, proto.ErrInternalBadWireType
		}
		msg := new(wrappers.StringValue)
		err := b.DecodeMessage(msg)
		m.ApprovedEndTime = &AccountBudgetProposal_ApprovedEndDateTime{msg}
		return true, err
	case 22: // approved_end_time.approved_end_time_type
		if wire != proto.WireVarint {
			return true, proto.ErrInternalBadWireType
		}
		x, err := b.DecodeVarint()
		m.ApprovedEndTime = &AccountBudgetProposal_ApprovedEndTimeType{enums.TimeTypeEnum_TimeType(x)}
		return true, err
	case 10: // proposed_spending_limit.proposed_spending_limit_micros
		if wire != proto.WireBytes {
			return true, proto.ErrInternalBadWireType
		}
		msg := new(wrappers.Int64Value)
		err := b.DecodeMessage(msg)
		m.ProposedSpendingLimit = &AccountBudgetProposal_ProposedSpendingLimitMicros{msg}
		return true, err
	case 11: // proposed_spending_limit.proposed_spending_limit_type
		if wire != proto.WireVarint {
			return true, proto.ErrInternalBadWireType
		}
		x, err := b.DecodeVarint()
		m.ProposedSpendingLimit = &AccountBudgetProposal_ProposedSpendingLimitType{enums.SpendingLimitTypeEnum_SpendingLimitType(x)}
		return true, err
	case 23: // approved_spending_limit.approved_spending_limit_micros
		if wire != proto.WireBytes {
			return true, proto.ErrInternalBadWireType
		}
		msg := new(wrappers.Int64Value)
		err := b.DecodeMessage(msg)
		m.ApprovedSpendingLimit = &AccountBudgetProposal_ApprovedSpendingLimitMicros{msg}
		return true, err
	case 24: // approved_spending_limit.approved_spending_limit_type
		if wire != proto.WireVarint {
			return true, proto.ErrInternalBadWireType
		}
		x, err := b.DecodeVarint()
		m.ApprovedSpendingLimit = &AccountBudgetProposal_ApprovedSpendingLimitType{enums.SpendingLimitTypeEnum_SpendingLimitType(x)}
		return true, err
	default:
		return false, nil
	}
}

func _AccountBudgetProposal_OneofSizer(msg proto.Message) (n int) {
	m := msg.(*AccountBudgetProposal)
	// proposed_start_time
	switch x := m.ProposedStartTime.(type) {
	case *AccountBudgetProposal_ProposedStartDateTime:
		s := proto.Size(x.ProposedStartDateTime)
		n += 2 // tag and wire
		n += proto.SizeVarint(uint64(s))
		n += s
	case *AccountBudgetProposal_ProposedStartTimeType:
		n += 1 // tag and wire
		n += proto.SizeVarint(uint64(x.ProposedStartTimeType))
	case nil:
	default:
		panic(fmt.Sprintf("proto: unexpected type %T in oneof", x))
	}
	// proposed_end_time
	switch x := m.ProposedEndTime.(type) {
	case *AccountBudgetProposal_ProposedEndDateTime:
		s := proto.Size(x.ProposedEndDateTime)
		n += 2 // tag and wire
		n += proto.SizeVarint(uint64(s))
		n += s
	case *AccountBudgetProposal_ProposedEndTimeType:
		n += 1 // tag and wire
		n += proto.SizeVarint(uint64(x.ProposedEndTimeType))
	case nil:
	default:
		panic(fmt.Sprintf("proto: unexpected type %T in oneof", x))
	}
	// approved_end_time
	switch x := m.ApprovedEndTime.(type) {
	case *AccountBudgetProposal_ApprovedEndDateTime:
		s := proto.Size(x.ApprovedEndDateTime)
		n += 2 // tag and wire
		n += proto.SizeVarint(uint64(s))
		n += s
	case *AccountBudgetProposal_ApprovedEndTimeType:
		n += 2 // tag and wire
		n += proto.SizeVarint(uint64(x.ApprovedEndTimeType))
	case nil:
	default:
		panic(fmt.Sprintf("proto: unexpected type %T in oneof", x))
	}
	// proposed_spending_limit
	switch x := m.ProposedSpendingLimit.(type) {
	case *AccountBudgetProposal_ProposedSpendingLimitMicros:
		s := proto.Size(x.ProposedSpendingLimitMicros)
		n += 1 // tag and wire
		n += proto.SizeVarint(uint64(s))
		n += s
	case *AccountBudgetProposal_ProposedSpendingLimitType:
		n += 1 // tag and wire
		n += proto.SizeVarint(uint64(x.ProposedSpendingLimitType))
	case nil:
	default:
		panic(fmt.Sprintf("proto: unexpected type %T in oneof", x))
	}
	// approved_spending_limit
	switch x := m.ApprovedSpendingLimit.(type) {
	case *AccountBudgetProposal_ApprovedSpendingLimitMicros:
		s := proto.Size(x.ApprovedSpendingLimitMicros)
		n += 2 // tag and wire
		n += proto.SizeVarint(uint64(s))
		n += s
	case *AccountBudgetProposal_ApprovedSpendingLimitType:
		n += 2 // tag and wire
		n += proto.SizeVarint(uint64(x.ApprovedSpendingLimitType))
	case nil:
	default:
		panic(fmt.Sprintf("proto: unexpected type %T in oneof", x))
	}
	return n
}

func init() {
	proto.RegisterType((*AccountBudgetProposal)(nil), "google.ads.googleads.v0.resources.AccountBudgetProposal")
}

func init() {
	proto.RegisterFile("google/ads/googleads/v0/resources/account_budget_proposal.proto", fileDescriptor_account_budget_proposal_0a40c45df7b8d2e1)
}

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