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

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

import proto "github.com/golang/protobuf/proto"
import fmt "fmt"
import 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.ProtoPackageIsVersion2 // please upgrade the proto package

// A restriction used to determine if the request context's
// geo should be matched.
type GeoTargetingRestrictionEnum_GeoTargetingRestriction int32

const (
	// Not specified.
	GeoTargetingRestrictionEnum_UNSPECIFIED GeoTargetingRestrictionEnum_GeoTargetingRestriction = 0
	// Used for return value only. Represents value unknown in this version.
	GeoTargetingRestrictionEnum_UNKNOWN GeoTargetingRestrictionEnum_GeoTargetingRestriction = 1
	// Indicates that request context should match the physical location of
	// the user.
	GeoTargetingRestrictionEnum_LOCATION_OF_PRESENCE GeoTargetingRestrictionEnum_GeoTargetingRestriction = 2
)

var GeoTargetingRestrictionEnum_GeoTargetingRestriction_name = map[int32]string{
	0: "UNSPECIFIED",
	1: "UNKNOWN",
	2: "LOCATION_OF_PRESENCE",
}
var GeoTargetingRestrictionEnum_GeoTargetingRestriction_value = map[string]int32{
	"UNSPECIFIED":          0,
	"UNKNOWN":              1,
	"LOCATION_OF_PRESENCE": 2,
}

func (x GeoTargetingRestrictionEnum_GeoTargetingRestriction) String() string {
	return proto.EnumName(GeoTargetingRestrictionEnum_GeoTargetingRestriction_name, int32(x))
}
func (GeoTargetingRestrictionEnum_GeoTargetingRestriction) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_geo_targeting_restriction_f1a4d0dcbbcc21ed, []int{0, 0}
}

// Message describing feed item geo targeting restriction.
type GeoTargetingRestrictionEnum struct {
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

var xxx_messageInfo_GeoTargetingRestrictionEnum proto.InternalMessageInfo

func init() {
	proto.RegisterType((*GeoTargetingRestrictionEnum)(nil), "google.ads.googleads.v0.enums.GeoTargetingRestrictionEnum")
	proto.RegisterEnum("google.ads.googleads.v0.enums.GeoTargetingRestrictionEnum_GeoTargetingRestriction", GeoTargetingRestrictionEnum_GeoTargetingRestriction_name, GeoTargetingRestrictionEnum_GeoTargetingRestriction_value)
}

func init() {
	proto.RegisterFile("google/ads/googleads/v0/enums/geo_targeting_restriction.proto", fileDescriptor_geo_targeting_restriction_f1a4d0dcbbcc21ed)
}

var fileDescriptor_geo_targeting_restriction_f1a4d0dcbbcc21ed = []byte{
	// 276 bytes of a gzipped FileDescriptorProto
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0xb2, 0x4d, 0xcf, 0xcf, 0x4f,
	0xcf, 0x49, 0xd5, 0x4f, 0x4c, 0x29, 0xd6, 0x87, 0x30, 0x41, 0xac, 0x32, 0x03, 0xfd, 0xd4, 0xbc,
	0xd2, 0xdc, 0x62, 0xfd, 0xf4, 0xd4, 0xfc, 0xf8, 0x92, 0xc4, 0xa2, 0xf4, 0xd4, 0x92, 0xcc, 0xbc,
	0xf4, 0xf8, 0xa2, 0xd4, 0xe2, 0x92, 0xa2, 0xcc, 0xe4, 0x92, 0xcc, 0xfc, 0x3c, 0xbd, 0x82, 0xa2,
	0xfc, 0x92, 0x7c, 0x21, 0x59, 0x88, 0x1e, 0xbd, 0xc4, 0x94, 0x62, 0x3d, 0xb8, 0x76, 0xbd, 0x32,
	0x03, 0x3d, 0xb0, 0x76, 0xa5, 0x02, 0x2e, 0x69, 0xf7, 0xd4, 0xfc, 0x10, 0x98, 0x01, 0x41, 0x08,
	0xfd, 0xae, 0x79, 0xa5, 0xb9, 0x4a, 0x81, 0x5c, 0xe2, 0x38, 0xa4, 0x85, 0xf8, 0xb9, 0xb8, 0x43,
	0xfd, 0x82, 0x03, 0x5c, 0x9d, 0x3d, 0xdd, 0x3c, 0x5d, 0x5d, 0x04, 0x18, 0x84, 0xb8, 0xb9, 0xd8,
	0x43, 0xfd, 0xbc, 0xfd, 0xfc, 0xc3, 0xfd, 0x04, 0x18, 0x85, 0x24, 0xb8, 0x44, 0x7c, 0xfc, 0x9d,
	0x1d, 0x43, 0x3c, 0xfd, 0xfd, 0xe2, 0xfd, 0xdd, 0xe2, 0x03, 0x82, 0x5c, 0x83, 0x5d, 0xfd, 0x9c,
	0x5d, 0x05, 0x98, 0x9c, 0xce, 0x32, 0x72, 0x29, 0x26, 0xe7, 0xe7, 0xea, 0xe1, 0x75, 0x97, 0x93,
	0x0c, 0x0e, 0x6b, 0x03, 0x40, 0x9e, 0x0a, 0x60, 0x8c, 0x72, 0x82, 0x6a, 0x4f, 0xcf, 0xcf, 0x49,
	0xcc, 0x4b, 0xd7, 0xcb, 0x2f, 0x4a, 0xd7, 0x4f, 0x4f, 0xcd, 0x03, 0x7b, 0x19, 0x16, 0x4a, 0x05,
	0x99, 0xc5, 0x38, 0x02, 0xcd, 0x1a, 0x4c, 0x2e, 0x62, 0x62, 0x76, 0x77, 0x74, 0x5c, 0xc5, 0x24,
	0xeb, 0x0e, 0x31, 0xca, 0x31, 0xa5, 0x58, 0x0f, 0xc2, 0x04, 0xb1, 0xc2, 0x0c, 0xf4, 0x40, 0x21,
	0x50, 0x7c, 0x0a, 0x26, 0x1f, 0xe3, 0x98, 0x52, 0x1c, 0x03, 0x97, 0x8f, 0x09, 0x33, 0x88, 0x01,
	0xcb, 0x27, 0xb1, 0x81, 0x2d, 0x35, 0x06, 0x04, 0x00, 0x00, 0xff, 0xff, 0xd8, 0xda, 0x14, 0x81,
	0xa8, 0x01, 0x00, 0x00,
}
