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

package resources

import (
	fmt "fmt"
	math "math"

	proto "github.com/golang/protobuf/proto"
	wrappers "github.com/golang/protobuf/ptypes/wrappers"
	_ "google.golang.org/genproto/googleapis/api/annotations"
)

// 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

// A user location view.
//
// User Location View includes all metrics aggregated at the country level,
// one row per country. It reports metrics at the actual physical location of
// the user by targeted or not targeted location. If other segment fields are
// used, you may get more than one row per country.
type UserLocationView struct {
	// The resource name of the user location view.
	// UserLocation view resource names have the form:
	//
	// `customers/{customer_id}/userLocationViews/{country_criterion_id}~{targeting_location}`
	ResourceName string `protobuf:"bytes,1,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"`
	// Criterion Id for the country.
	CountryCriterionId *wrappers.Int64Value `protobuf:"bytes,2,opt,name=country_criterion_id,json=countryCriterionId,proto3" json:"country_criterion_id,omitempty"`
	// Indicates whether location was targeted or not.
	TargetingLocation    *wrappers.BoolValue `protobuf:"bytes,3,opt,name=targeting_location,json=targetingLocation,proto3" json:"targeting_location,omitempty"`
	XXX_NoUnkeyedLiteral struct{}            `json:"-"`
	XXX_unrecognized     []byte              `json:"-"`
	XXX_sizecache        int32               `json:"-"`
}

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

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

var xxx_messageInfo_UserLocationView proto.InternalMessageInfo

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

func (m *UserLocationView) GetCountryCriterionId() *wrappers.Int64Value {
	if m != nil {
		return m.CountryCriterionId
	}
	return nil
}

func (m *UserLocationView) GetTargetingLocation() *wrappers.BoolValue {
	if m != nil {
		return m.TargetingLocation
	}
	return nil
}

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

func init() {
	proto.RegisterFile("google/ads/googleads/v3/resources/user_location_view.proto", fileDescriptor_010a04e760a368f3)
}

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