<|start_filename|>vendor/github.com/goph/emperror/wrap.go<|end_filename|>
package emperror

import (
	"fmt"
	"io"
	"runtime"

	"github.com/pkg/errors"
)

func callers() []uintptr {
	const depth = 32
	var pcs [depth]uintptr

	n := runtime.Callers(3, pcs[:])

	return pcs[0:n]
}

type wrappedError struct {
	err   error
	stack []uintptr
}

func (e *wrappedError) Error() string {
	return e.err.Error()
}

func (e *wrappedError) Cause() error {
	return e.err
}

func (e *wrappedError) StackTrace() errors.StackTrace {
	f := make([]errors.Frame, len(e.stack))

	for i := 0; i < len(f); i++ {
		f[i] = errors.Frame((e.stack)[i])
	}

	return f
}

func (e *wrappedError) Format(s fmt.State, verb rune) {
	switch verb {
	case 'v':
		if s.Flag('+') {
			_, _ = fmt.Fprintf(s, "%+v", e.Cause())

			for _, pc := range e.stack {
				f := errors.Frame(pc)
				_, _ = fmt.Fprintf(s, "\n%+v", f)
			}

			return
		}

		fallthrough

	case 's':
		_, _ = io.WriteString(s, e.Error())

	case 'q':
		_, _ = fmt.Fprintf(s, "%q", e.Error())
	}
}

// Wrap returns an error annotating err with a stack trace
// at the point Wrap is called (if there is none attached to the error yet), and the supplied message.
// If err is nil, Wrap returns nil.
//
// Note: do not use this method when passing errors between goroutines.
func Wrap(err error, message string) error {
	if err == nil {
		return nil
	}

	_, ok := getStackTracer(err)

	err = errors.WithMessage(err, message)

	// There is no stack trace in the error, so attach it here
	if !ok {
		err = &wrappedError{
			err:   err,
			stack: callers(),
		}
	}

	return err
}

// Wrapf returns an error annotating err with a stack trace
// at the point Wrapf is call (if there is none attached to the error yet), and the format specifier.
// If err is nil, Wrapf returns nil.
//
// Note: do not use this method when passing errors between goroutines.
func Wrapf(err error, format string, args ...interface{}) error {
	if err == nil {
		return nil
	}

	_, ok := getStackTracer(err)

	err = errors.WithMessage(err, fmt.Sprintf(format, args...))

	// There is no stack trace in the error, so attach it here
	if !ok {
		err = &wrappedError{
			err:   err,
			stack: callers(),
		}
	}

	return err
}


<|start_filename|>vendor/google.golang.org/genproto/googleapis/cloud/recaptchaenterprise/v1beta1/recaptchaenterprise.pb.go<|end_filename|>
// Code generated by protoc-gen-go. DO NOT EDIT.
// source: google/cloud/recaptchaenterprise/v1beta1/recaptchaenterprise.proto

package recaptchaenterprise // import "google.golang.org/genproto/googleapis/cloud/recaptchaenterprise/v1beta1"

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

import (
	context "golang.org/x/net/context"
	grpc "google.golang.org/grpc"
)

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

// Enum that reprensents the types of annotations.
type AnnotateAssessmentRequest_Annotation int32

const (
	// Default unspecified type.
	AnnotateAssessmentRequest_ANNOTATION_UNSPECIFIED AnnotateAssessmentRequest_Annotation = 0
	// Provides information that the event turned out to be legitimate.
	AnnotateAssessmentRequest_LEGITIMATE AnnotateAssessmentRequest_Annotation = 1
	// Provides information that the event turned out to be fraudulent.
	AnnotateAssessmentRequest_FRAUDULENT AnnotateAssessmentRequest_Annotation = 2
)

var AnnotateAssessmentRequest_Annotation_name = map[int32]string{
	0: "ANNOTATION_UNSPECIFIED",
	1: "LEGITIMATE",
	2: "FRAUDULENT",
}
var AnnotateAssessmentRequest_Annotation_value = map[string]int32{
	"ANNOTATION_UNSPECIFIED": 0,
	"LEGITIMATE":             1,
	"FRAUDULENT":             2,
}

func (x AnnotateAssessmentRequest_Annotation) String() string {
	return proto.EnumName(AnnotateAssessmentRequest_Annotation_name, int32(x))
}
func (AnnotateAssessmentRequest_Annotation) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_recaptchaenterprise_af31e2b8ababeaad, []int{1, 0}
}

// LINT.IfChange(classification_reason)
// Reasons contributing to the risk analysis verdict.
type Assessment_ClassificationReason int32

const (
	// Default unspecified type.
	Assessment_CLASSIFICATION_REASON_UNSPECIFIED Assessment_ClassificationReason = 0
	// The event appeared to be automated.
	Assessment_AUTOMATION Assessment_ClassificationReason = 1
	// The event was not made from the proper context on the real site.
	Assessment_UNEXPECTED_ENVIRONMENT Assessment_ClassificationReason = 2
	// Browsing behavior leading up to the event was generated was out of the
	// ordinary.
	Assessment_UNEXPECTED_USAGE_PATTERNS Assessment_ClassificationReason = 4
	// Too little traffic has been received from this site thus far to generate
	// quality risk analysis.
	Assessment_PROVISIONAL_RISK_ANALYSIS Assessment_ClassificationReason = 5
)

var Assessment_ClassificationReason_name = map[int32]string{
	0: "CLASSIFICATION_REASON_UNSPECIFIED",
	1: "AUTOMATION",
	2: "UNEXPECTED_ENVIRONMENT",
	4: "UNEXPECTED_USAGE_PATTERNS",
	5: "PROVISIONAL_RISK_ANALYSIS",
}
var Assessment_ClassificationReason_value = map[string]int32{
	"CLASSIFICATION_REASON_UNSPECIFIED": 0,
	"AUTOMATION":                        1,
	"UNEXPECTED_ENVIRONMENT":            2,
	"UNEXPECTED_USAGE_PATTERNS":         4,
	"PROVISIONAL_RISK_ANALYSIS":         5,
}

func (x Assessment_ClassificationReason) String() string {
	return proto.EnumName(Assessment_ClassificationReason_name, int32(x))
}
func (Assessment_ClassificationReason) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_recaptchaenterprise_af31e2b8ababeaad, []int{3, 0}
}

// Enum that represents the types of invalid token reasons.
type TokenProperties_InvalidReason int32

const (
	// Default unspecified type.
	TokenProperties_INVALID_REASON_UNSPECIFIED TokenProperties_InvalidReason = 0
	// If the failure reason was not accounted for.
	TokenProperties_UNKNOWN_INVALID_REASON TokenProperties_InvalidReason = 1
	// The provided user verification token was malformed.
	TokenProperties_MALFORMED TokenProperties_InvalidReason = 2
	// The user verification token had expired.
	TokenProperties_EXPIRED TokenProperties_InvalidReason = 3
	// The user verification had already been seen.
	TokenProperties_DUPE TokenProperties_InvalidReason = 4
	// The user verification token did not match the provided site secret.
	// This may be a configuration error (e.g. development keys used in
	// production) or end users trying to use verification tokens from other
	// sites.
	TokenProperties_SITE_MISMATCH TokenProperties_InvalidReason = 5
	// The user verification token was not present.  It is a required input.
	TokenProperties_MISSING TokenProperties_InvalidReason = 6
)

var TokenProperties_InvalidReason_name = map[int32]string{
	0: "INVALID_REASON_UNSPECIFIED",
	1: "UNKNOWN_INVALID_REASON",
	2: "MALFORMED",
	3: "EXPIRED",
	4: "DUPE",
	5: "SITE_MISMATCH",
	6: "MISSING",
}
var TokenProperties_InvalidReason_value = map[string]int32{
	"INVALID_REASON_UNSPECIFIED": 0,
	"UNKNOWN_INVALID_REASON":     1,
	"MALFORMED":                  2,
	"EXPIRED":                    3,
	"DUPE":                       4,
	"SITE_MISMATCH":              5,
	"MISSING":                    6,
}

func (x TokenProperties_InvalidReason) String() string {
	return proto.EnumName(TokenProperties_InvalidReason_name, int32(x))
}
func (TokenProperties_InvalidReason) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_recaptchaenterprise_af31e2b8ababeaad, []int{5, 0}
}

// The create assessment request message.
type CreateAssessmentRequest struct {
	// Required. The name of the project in which the assessment will be created,
	// in the format "projects/{project_number}".
	Parent string `protobuf:"bytes,1,opt,name=parent,proto3" json:"parent,omitempty"`
	// The asessment details.
	Assessment           *Assessment `protobuf:"bytes,2,opt,name=assessment,proto3" json:"assessment,omitempty"`
	XXX_NoUnkeyedLiteral struct{}    `json:"-"`
	XXX_unrecognized     []byte      `json:"-"`
	XXX_sizecache        int32       `json:"-"`
}

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

var xxx_messageInfo_CreateAssessmentRequest proto.InternalMessageInfo

func (m *CreateAssessmentRequest) GetParent() string {
	if m != nil {
		return m.Parent
	}
	return ""
}

func (m *CreateAssessmentRequest) GetAssessment() *Assessment {
	if m != nil {
		return m.Assessment
	}
	return nil
}

// The request message to annotate an Assessment.
type AnnotateAssessmentRequest struct {
	// Required. The resource name of the Assessment, in the format
	// "projects/{project_number}/assessments/{assessment_id}".
	Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
	// The annotation that will be assigned to the Event.
	Annotation           AnnotateAssessmentRequest_Annotation `protobuf:"varint,2,opt,name=annotation,proto3,enum=google.cloud.recaptchaenterprise.v1beta1.AnnotateAssessmentRequest_Annotation" json:"annotation,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                             `json:"-"`
	XXX_unrecognized     []byte                               `json:"-"`
	XXX_sizecache        int32                                `json:"-"`
}

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

var xxx_messageInfo_AnnotateAssessmentRequest proto.InternalMessageInfo

func (m *AnnotateAssessmentRequest) GetName() string {
	if m != nil {
		return m.Name
	}
	return ""
}

func (m *AnnotateAssessmentRequest) GetAnnotation() AnnotateAssessmentRequest_Annotation {
	if m != nil {
		return m.Annotation
	}
	return AnnotateAssessmentRequest_ANNOTATION_UNSPECIFIED
}

// Empty response for AnnotateAssessment.
type AnnotateAssessmentResponse struct {
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

var xxx_messageInfo_AnnotateAssessmentResponse proto.InternalMessageInfo

// A recaptcha assessment resource.
type Assessment struct {
	// Output only. The resource name for the Assessment in the format
	// "projects/{project_number}/assessments/{assessment_id}".
	Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
	// The event being assessed.
	Event *Event `protobuf:"bytes,2,opt,name=event,proto3" json:"event,omitempty"`
	// Output only. Legitimate event confidence estimate from 0.0 to 1.0
	// (1.0 means legitimate).
	Confidence float32 `protobuf:"fixed32,3,opt,name=confidence,proto3" json:"confidence,omitempty"`
	// Output only. Properties of the provided event token.
	TokenProperties *TokenProperties `protobuf:"bytes,4,opt,name=token_properties,json=tokenProperties,proto3" json:"token_properties,omitempty"`
	// Output only. Reasons contributing to the risk analysis verdict.
	Reasons              []Assessment_ClassificationReason `protobuf:"varint,5,rep,packed,name=reasons,proto3,enum=google.cloud.recaptchaenterprise.v1beta1.Assessment_ClassificationReason" json:"reasons,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                          `json:"-"`
	XXX_unrecognized     []byte                            `json:"-"`
	XXX_sizecache        int32                             `json:"-"`
}

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

var xxx_messageInfo_Assessment proto.InternalMessageInfo

func (m *Assessment) GetName() string {
	if m != nil {
		return m.Name
	}
	return ""
}

func (m *Assessment) GetEvent() *Event {
	if m != nil {
		return m.Event
	}
	return nil
}

func (m *Assessment) GetConfidence() float32 {
	if m != nil {
		return m.Confidence
	}
	return 0
}

func (m *Assessment) GetTokenProperties() *TokenProperties {
	if m != nil {
		return m.TokenProperties
	}
	return nil
}

func (m *Assessment) GetReasons() []Assessment_ClassificationReason {
	if m != nil {
		return m.Reasons
	}
	return nil
}

type Event struct {
	// The user response token provided by the reCAPTCHA client-side integration
	// on your site.
	Token string `protobuf:"bytes,1,opt,name=token,proto3" json:"token,omitempty"`
	// The site key that was used to invoke reCAPTCHA on your site and generate
	// the token.
	SiteKey              string   `protobuf:"bytes,2,opt,name=site_key,json=siteKey,proto3" json:"site_key,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

var xxx_messageInfo_Event proto.InternalMessageInfo

func (m *Event) GetToken() string {
	if m != nil {
		return m.Token
	}
	return ""
}

func (m *Event) GetSiteKey() string {
	if m != nil {
		return m.SiteKey
	}
	return ""
}

type TokenProperties struct {
	// Output only. Whether the provided user response token is valid.
	Valid bool `protobuf:"varint,1,opt,name=valid,proto3" json:"valid,omitempty"`
	// Output only. Reason associated with the response when valid = false.
	InvalidReason TokenProperties_InvalidReason `protobuf:"varint,2,opt,name=invalid_reason,json=invalidReason,proto3,enum=google.cloud.recaptchaenterprise.v1beta1.TokenProperties_InvalidReason" json:"invalid_reason,omitempty"`
	// Output only. The timestamp corresponding to the generation of the token.
	CreateTime *timestamp.Timestamp `protobuf:"bytes,3,opt,name=create_time,json=createTime,proto3" json:"create_time,omitempty"`
	// Output only. The hostname of the page on which the token was generated.
	Hostname string `protobuf:"bytes,4,opt,name=hostname,proto3" json:"hostname,omitempty"`
	// Output only. Action name provided at token generation.
	Action               string   `protobuf:"bytes,5,opt,name=action,proto3" json:"action,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

var xxx_messageInfo_TokenProperties proto.InternalMessageInfo

func (m *TokenProperties) GetValid() bool {
	if m != nil {
		return m.Valid
	}
	return false
}

func (m *TokenProperties) GetInvalidReason() TokenProperties_InvalidReason {
	if m != nil {
		return m.InvalidReason
	}
	return TokenProperties_INVALID_REASON_UNSPECIFIED
}

func (m *TokenProperties) GetCreateTime() *timestamp.Timestamp {
	if m != nil {
		return m.CreateTime
	}
	return nil
}

func (m *TokenProperties) GetHostname() string {
	if m != nil {
		return m.Hostname
	}
	return ""
}

func (m *TokenProperties) GetAction() string {
	if m != nil {
		return m.Action
	}
	return ""
}

func init() {
	proto.RegisterType((*CreateAssessmentRequest)(nil), "google.cloud.recaptchaenterprise.v1beta1.CreateAssessmentRequest")
	proto.RegisterType((*AnnotateAssessmentRequest)(nil), "google.cloud.recaptchaenterprise.v1beta1.AnnotateAssessmentRequest")
	proto.RegisterType((*AnnotateAssessmentResponse)(nil), "google.cloud.recaptchaenterprise.v1beta1.AnnotateAssessmentResponse")
	proto.RegisterType((*Assessment)(nil), "google.cloud.recaptchaenterprise.v1beta1.Assessment")
	proto.RegisterType((*Event)(nil), "google.cloud.recaptchaenterprise.v1beta1.Event")
	proto.RegisterType((*TokenProperties)(nil), "google.cloud.recaptchaenterprise.v1beta1.TokenProperties")
	proto.RegisterEnum("google.cloud.recaptchaenterprise.v1beta1.AnnotateAssessmentRequest_Annotation", AnnotateAssessmentRequest_Annotation_name, AnnotateAssessmentRequest_Annotation_value)
	proto.RegisterEnum("google.cloud.recaptchaenterprise.v1beta1.Assessment_ClassificationReason", Assessment_ClassificationReason_name, Assessment_ClassificationReason_value)
	proto.RegisterEnum("google.cloud.recaptchaenterprise.v1beta1.TokenProperties_InvalidReason", TokenProperties_InvalidReason_name, TokenProperties_InvalidReason_value)
}

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

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

// RecaptchaEnterpriseServiceV1Beta1Client is the client API for RecaptchaEnterpriseServiceV1Beta1 service.
//
// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream.
type RecaptchaEnterpriseServiceV1Beta1Client interface {
	// Creates an Assessment of the likelihood an event is legitimate.
	CreateAssessment(ctx context.Context, in *CreateAssessmentRequest, opts ...grpc.CallOption) (*Assessment, error)
	// Annotates a previously created Assessment to provide additional information
	// on whether the event turned out to be authentic or fradulent.
	AnnotateAssessment(ctx context.Context, in *AnnotateAssessmentRequest, opts ...grpc.CallOption) (*AnnotateAssessmentResponse, error)
}

type recaptchaEnterpriseServiceV1Beta1Client struct {
	cc *grpc.ClientConn
}

func NewRecaptchaEnterpriseServiceV1Beta1Client(cc *grpc.ClientConn) RecaptchaEnterpriseServiceV1Beta1Client {
	return &recaptchaEnterpriseServiceV1Beta1Client{cc}
}

func (c *recaptchaEnterpriseServiceV1Beta1Client) CreateAssessment(ctx context.Context, in *CreateAssessmentRequest, opts ...grpc.CallOption) (*Assessment, error) {
	out := new(Assessment)
	err := c.cc.Invoke(ctx, "/google.cloud.recaptchaenterprise.v1beta1.RecaptchaEnterpriseServiceV1Beta1/CreateAssessment", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *recaptchaEnterpriseServiceV1Beta1Client) AnnotateAssessment(ctx context.Context, in *AnnotateAssessmentRequest, opts ...grpc.CallOption) (*AnnotateAssessmentResponse, error) {
	out := new(AnnotateAssessmentResponse)
	err := c.cc.Invoke(ctx, "/google.cloud.recaptchaenterprise.v1beta1.RecaptchaEnterpriseServiceV1Beta1/AnnotateAssessment", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

// RecaptchaEnterpriseServiceV1Beta1Server is the server API for RecaptchaEnterpriseServiceV1Beta1 service.
type RecaptchaEnterpriseServiceV1Beta1Server interface {
	// Creates an Assessment of the likelihood an event is legitimate.
	CreateAssessment(context.Context, *CreateAssessmentRequest) (*Assessment, error)
	// Annotates a previously created Assessment to provide additional information
	// on whether the event turned out to be authentic or fradulent.
	AnnotateAssessment(context.Context, *AnnotateAssessmentRequest) (*AnnotateAssessmentResponse, error)
}

func RegisterRecaptchaEnterpriseServiceV1Beta1Server(s *grpc.Server, srv RecaptchaEnterpriseServiceV1Beta1Server) {
	s.RegisterService(&_RecaptchaEnterpriseServiceV1Beta1_serviceDesc, srv)
}

func _RecaptchaEnterpriseServiceV1Beta1_CreateAssessment_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(CreateAssessmentRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(RecaptchaEnterpriseServiceV1Beta1Server).CreateAssessment(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/google.cloud.recaptchaenterprise.v1beta1.RecaptchaEnterpriseServiceV1Beta1/CreateAssessment",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(RecaptchaEnterpriseServiceV1Beta1Server).CreateAssessment(ctx, req.(*CreateAssessmentRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _RecaptchaEnterpriseServiceV1Beta1_AnnotateAssessment_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(AnnotateAssessmentRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(RecaptchaEnterpriseServiceV1Beta1Server).AnnotateAssessment(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/google.cloud.recaptchaenterprise.v1beta1.RecaptchaEnterpriseServiceV1Beta1/AnnotateAssessment",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(RecaptchaEnterpriseServiceV1Beta1Server).AnnotateAssessment(ctx, req.(*AnnotateAssessmentRequest))
	}
	return interceptor(ctx, in, info, handler)
}

var _RecaptchaEnterpriseServiceV1Beta1_serviceDesc = grpc.ServiceDesc{
	ServiceName: "google.cloud.recaptchaenterprise.v1beta1.RecaptchaEnterpriseServiceV1Beta1",
	HandlerType: (*RecaptchaEnterpriseServiceV1Beta1Server)(nil),
	Methods: []grpc.MethodDesc{
		{
			MethodName: "CreateAssessment",
			Handler:    _RecaptchaEnterpriseServiceV1Beta1_CreateAssessment_Handler,
		},
		{
			MethodName: "AnnotateAssessment",
			Handler:    _RecaptchaEnterpriseServiceV1Beta1_AnnotateAssessment_Handler,
		},
	},
	Streams:  []grpc.StreamDesc{},
	Metadata: "google/cloud/recaptchaenterprise/v1beta1/recaptchaenterprise.proto",
}

func init() {
	proto.RegisterFile("google/cloud/recaptchaenterprise/v1beta1/recaptchaenterprise.proto", fileDescriptor_recaptchaenterprise_af31e2b8ababeaad)
}

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


<|start_filename|>vendor/github.com/goph/emperror/handler_context.go<|end_filename|>
package emperror

// The implementation bellow is heavily influenced by go-kit's log context.

// HandlerWith returns a new error handler with keyvals context appended to it.
// If the wrapped error handler is already a contextual error handler created by HandlerWith or HandlerWithPrefix
// keyvals is appended to the existing context, but a new error handler is returned.
//
// The created handler will prepend it's own context to the handled errors.
func HandlerWith(handler Handler, keyvals ...interface{}) Handler {
	if len(keyvals) == 0 {
		return handler
	}

	kvs, handler := extractHandlerContext(handler)

	kvs = append(kvs, keyvals...)

	if len(kvs)%2 != 0 {
		kvs = append(kvs, nil)
	}

	// Limiting the capacity of the stored keyvals ensures that a new
	// backing array is created if the slice must grow in HandlerWith.
	// Using the extra capacity without copying risks a data race.
	return newContextualHandler(handler, kvs[:len(kvs):len(kvs)])
}

// HandlerWithPrefix returns a new error handler with keyvals context prepended to it.
// If the wrapped error handler is already a contextual error handler created by HandlerWith or HandlerWithPrefix
// keyvals is prepended to the existing context, but a new error handler is returned.
//
// The created handler will prepend it's own context to the handled errors.
func HandlerWithPrefix(handler Handler, keyvals ...interface{}) Handler {
	if len(keyvals) == 0 {
		return handler
	}

	prevkvs, handler := extractHandlerContext(handler)

	n := len(prevkvs) + len(keyvals)
	if len(keyvals)%2 != 0 {
		n++
	}

	kvs := make([]interface{}, 0, n)
	kvs = append(kvs, keyvals...)

	if len(kvs)%2 != 0 {
		kvs = append(kvs, nil)
	}

	kvs = append(kvs, prevkvs...)

	return newContextualHandler(handler, kvs)
}

// extractHandlerContext extracts the context and optionally the wrapped handler when it's the same container.
func extractHandlerContext(handler Handler) ([]interface{}, Handler) {
	var kvs []interface{}

	if c, ok := handler.(*contextualHandler); ok {
		handler = c.handler
		kvs = c.keyvals
	}

	return kvs, handler
}

// contextualHandler is a Handler implementation returned by HandlerWith or HandlerWithPrefix.
//
// It wraps an error handler and a holds keyvals as the context.
type contextualHandler struct {
	handler Handler
	keyvals []interface{}
}

// newContextualHandler creates a new *contextualHandler or a struct which is contextual and holds a stack trace.
func newContextualHandler(handler Handler, kvs []interface{}) Handler {
	chandler := &contextualHandler{
		handler: handler,
		keyvals: kvs,
	}

	return chandler
}

// Handle prepends the handler's context to the error's (if any) and delegates the call to the underlying handler.
func (h *contextualHandler) Handle(err error) {
	err = With(err, h.keyvals...)

	h.handler.Handle(err)
}


<|start_filename|>vendor/github.com/goph/emperror/handler/rollbarhandler/error.go<|end_filename|>
package rollbarhandler

import (
	"fmt"
	"runtime"
	"strconv"
	"strings"

	"github.com/pkg/errors"
	"github.com/rollbar/rollbar-go"
)

type stackTracer interface {
	Error() string
	StackTrace() errors.StackTrace
}

type causeStacker struct {
	err stackTracer
}

func newCauseStacker(err stackTracer) *causeStacker {
	return &causeStacker{
		err: err,
	}
}

func (e *causeStacker) Error() string {
	return e.err.Error()
}

func (e *causeStacker) Cause() error {
	if c, ok := e.err.(interface{ Cause() error }); ok {
		return c.Cause()
	}

	return nil
}

func (e *causeStacker) Stack() rollbar.Stack {
	stackTrace := e.err.StackTrace()
	stack := make(rollbar.Stack, len(stackTrace))

	for i, frame := range stackTrace {
		line, _ := strconv.Atoi(fmt.Sprintf("%d", frame))

		stack[i] = rollbar.Frame{
			Filename: shortenFilePath(strings.SplitN(fmt.Sprintf("%+s", frame), "\n\t", 2)[1]), // nolint: govet
			Method:   fmt.Sprintf("%n", frame),                                                 // nolint: govet
			Line:     line,
		}
	}

	return stack
}

// copied from rollbar

// nolint: gochecknoglobals
var (
	knownFilePathPatterns = []string{
		"github.com/",
		"code.google.com/",
		"bitbucket.org/",
		"launchpad.net/",
	}
)

func shortenFilePath(s string) string {
	// added to the original function
	s = strings.TrimPrefix(s, runtime.GOROOT())

	idx := strings.Index(s, "/src/pkg/")
	if idx != -1 {
		return s[idx+5:]
	}
	for _, pattern := range knownFilePathPatterns {
		idx = strings.Index(s, pattern)
		if idx != -1 {
			return s[idx:]
		}
	}
	return s
}


<|start_filename|>vendor/github.com/goph/emperror/stack.go<|end_filename|>
package emperror

import (
	"fmt"
	"io"

	"github.com/pkg/errors"
)

type stackTracer interface {
	StackTrace() errors.StackTrace
}

// StackTrace returns the stack trace from an error (if any).
func StackTrace(err error) (errors.StackTrace, bool) {
	st, ok := getStackTracer(err)
	if ok {
		return st.StackTrace(), true
	}

	return nil, false
}

// getStackTracer returns the stack trace from an error (if any).
func getStackTracer(err error) (stackTracer, bool) {
	var st stackTracer

	ForEachCause(err, func(err error) bool {
		if s, ok := err.(stackTracer); ok {
			st = s

			return false
		}

		return true
	})

	return st, st != nil
}

type withStack struct {
	err error
	st  stackTracer
}

func (w *withStack) Error() string {
	return w.err.Error()
}

func (w *withStack) Cause() error {
	return w.err
}

func (w *withStack) StackTrace() errors.StackTrace {
	return w.st.StackTrace()
}

// Format implements the fmt.Formatter interface.
func (w *withStack) Format(s fmt.State, verb rune) {
	switch verb {
	case 'v':
		if s.Flag('+') {
			_, _ = fmt.Fprintf(s, "%+v", w.Cause())
			return
		}
		fallthrough

	case 's':
		_, _ = io.WriteString(s, w.Error())

	case 'q':
		_, _ = fmt.Fprintf(s, "%q", w.Error())
	}
}

// ExposeStackTrace exposes the stack trace (if any) in the outer error.
func ExposeStackTrace(err error) error {
	if err == nil {
		return err
	}

	st, ok := getStackTracer(err)
	if !ok {
		return err
	}

	return &withStack{
		err: err,
		st:  st,
	}
}


<|start_filename|>vendor/github.com/goph/emperror/utils.go<|end_filename|>
package emperror

// HandleRecover recovers from a panic and handles the error.
//
// 		defer emperror.HandleRecover(errorHandler)
func HandleRecover(handler Handler) {
	err := Recover(recover())
	if err != nil {
		handler.Handle(err)
	}
}

// Handle handles an error whenever it occurs.
func Handle(handler Handler, err error) {
	if err != nil {
		handler.Handle(err)
	}
}


<|start_filename|>vendor/google.golang.org/genproto/googleapis/cloud/talent/v4beta1/profile.pb.go<|end_filename|>
// Code generated by protoc-gen-go. DO NOT EDIT.
// source: google/cloud/talent/v4beta1/profile.proto

package talent // import "google.golang.org/genproto/googleapis/cloud/talent/v4beta1"

import proto "github.com/golang/protobuf/proto"
import fmt "fmt"
import math "math"
import _ "github.com/golang/protobuf/ptypes/duration"
import timestamp "github.com/golang/protobuf/ptypes/timestamp"
import wrappers "github.com/golang/protobuf/ptypes/wrappers"
import _ "google.golang.org/genproto/googleapis/api/annotations"
import date "google.golang.org/genproto/googleapis/type/date"
import postaladdress "google.golang.org/genproto/googleapis/type/postaladdress"
import _ "google.golang.org/genproto/protobuf/field_mask"

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

// Enum that represents the type of the telephone.
type Phone_PhoneType int32

const (
	// Default value.
	Phone_PHONE_TYPE_UNSPECIFIED Phone_PhoneType = 0
	// A landline.
	Phone_LANDLINE Phone_PhoneType = 1
	// A mobile.
	Phone_MOBILE Phone_PhoneType = 2
	// A fax.
	Phone_FAX Phone_PhoneType = 3
	// A pager.
	Phone_PAGER Phone_PhoneType = 4
	// A TTY (test telephone) or TDD (telecommunication device for the deaf).
	Phone_TTY_OR_TDD Phone_PhoneType = 5
	// A voicemail.
	Phone_VOICEMAIL Phone_PhoneType = 6
	// A virtual telephone number is a number that can be routed to another
	// number and managed by the user via Web, SMS, IVR, etc.  It is associated
	// with a particular person, and may be routed to either a MOBILE or
	// LANDLINE number. The phone usage (see ContactInfoUsage above) should be
	// set to PERSONAL for these phone types. Some more information can be
	// found here: http://en.wikipedia.org/wiki/Personal_Numbers
	Phone_VIRTUAL Phone_PhoneType = 7
	// Voice over IP numbers. This includes TSoIP (Telephony Service over IP).
	Phone_VOIP Phone_PhoneType = 8
	// In some regions (e.g. the USA), it is impossible to distinguish between
	// fixed-line and mobile numbers by looking at the phone number itself.
	Phone_MOBILE_OR_LANDLINE Phone_PhoneType = 9
)

var Phone_PhoneType_name = map[int32]string{
	0: "PHONE_TYPE_UNSPECIFIED",
	1: "LANDLINE",
	2: "MOBILE",
	3: "FAX",
	4: "PAGER",
	5: "TTY_OR_TDD",
	6: "VOICEMAIL",
	7: "VIRTUAL",
	8: "VOIP",
	9: "MOBILE_OR_LANDLINE",
}
var Phone_PhoneType_value = map[string]int32{
	"PHONE_TYPE_UNSPECIFIED": 0,
	"LANDLINE":               1,
	"MOBILE":                 2,
	"FAX":                    3,
	"PAGER":                  4,
	"TTY_OR_TDD":             5,
	"VOICEMAIL":              6,
	"VIRTUAL":                7,
	"VOIP":                   8,
	"MOBILE_OR_LANDLINE":     9,
}

func (x Phone_PhoneType) String() string {
	return proto.EnumName(Phone_PhoneType_name, int32(x))
}
func (Phone_PhoneType) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_profile_e7f0ff6ef67f503e, []int{4, 0}
}

// A resource that represents the profile for a job candidate (also referred to
// as a "single-source profile"). A profile belongs to a
// [Company][google.cloud.talent.v4beta1.Company], which is the
// company/organization that owns the profile.
type Profile struct {
	// Required during profile update.
	//
	// Resource name assigned to a profile by the API.
	//
	// The format is
	// "projects/{project_id}/tenants/{tenant_id}/profiles/{profile_id}",
	// for example, "projects/api-test-project/tenants/foo/profiles/bar".
	Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
	// Optional.
	//
	// Profile's id in client system if available.
	//
	// The maximum number of bytes allowed is 100.
	ExternalId string `protobuf:"bytes,2,opt,name=external_id,json=externalId,proto3" json:"external_id,omitempty"`
	// Optional.
	//
	// The source description indicating where the profile is acquired.
	//
	// For example, if a candidate profile is acquired from a resume, the user can
	// input "resume" here to indicate the source.
	//
	// The maximum number of bytes allowed is 100.
	Source string `protobuf:"bytes,3,opt,name=source,proto3" json:"source,omitempty"`
	// Optional.
	//
	// The URI set by clients that links to this profile's client-side copy.
	//
	// The maximum number of bytes allowed is 4000.
	Uri string `protobuf:"bytes,4,opt,name=uri,proto3" json:"uri,omitempty"`
	// Optional.
	//
	// The cluster id of the profile to associate with other profile(s) for the
	// same candidate.
	//
	// A random UUID is assigned if
	// [group_id][google.cloud.talent.v4beta1.Profile.group_id] isn't provided. To
	// ensure global uniqueness, customized
	// [group_id][google.cloud.talent.v4beta1.Profile.group_id] isn't supported.
	// If [group_id][google.cloud.talent.v4beta1.Profile.group_id] is set, there
	// must be at least one other profile with the same system generated
	// [group_id][google.cloud.talent.v4beta1.Profile.group_id], otherwise an
	// error is thrown.
	//
	// This is used to link multiple profiles to the same candidate. For example,
	// a client has a candidate with two profiles, where one was created recently
	// and the other one was created 5 years ago. These two profiles may be very
	// different. The clients can create the first profile and get a generated
	// [group_id][google.cloud.talent.v4beta1.Profile.group_id], and assign it
	// when the second profile is created, indicating these two profiles are
	// referring to the same candidate.
	GroupId string `protobuf:"bytes,5,opt,name=group_id,json=groupId,proto3" json:"group_id,omitempty"`
	// Optional.
	//
	// Indicates the hirable status of the candidate.
	IsHirable *wrappers.BoolValue `protobuf:"bytes,6,opt,name=is_hirable,json=isHirable,proto3" json:"is_hirable,omitempty"`
	// Optional.
	//
	// The timestamp when the profile was first created at this source.
	CreateTime *timestamp.Timestamp `protobuf:"bytes,7,opt,name=create_time,json=createTime,proto3" json:"create_time,omitempty"`
	// Optional.
	//
	// The timestamp when the profile was last updated at this source.
	UpdateTime *timestamp.Timestamp `protobuf:"bytes,8,opt,name=update_time,json=updateTime,proto3" json:"update_time,omitempty"`
	// Optional.
	//
	// The profile contents in HR-XML format.
	// See http://schemas.liquid-technologies.com/hr-xml/2007-04-15/ for more
	// information about Human Resources XML.
	//
	// Users can create a profile with only
	// [resume_hrxml][google.cloud.talent.v4beta1.Profile.resume_hrxml] field. For
	// example, the API parses the
	// [resume_hrxml][google.cloud.talent.v4beta1.Profile.resume_hrxml] and
	// creates a profile with all structured fields populated, for example.
	// [EmploymentRecord][google.cloud.talent.v4beta1.EmploymentRecord],
	// [EducationRecord][google.cloud.talent.v4beta1.EducationRecord], etc. An
	// error is thrown if the
	// [resume_hrxml][google.cloud.talent.v4beta1.Profile.resume_hrxml] can't be
	// parsed.
	//
	// If the [resume_hrxml][google.cloud.talent.v4beta1.Profile.resume_hrxml] is
	// provided during profile creation or update, any other structured data
	// provided in the profile is ignored. The API populates these fields by
	// parsing the HR-XML.
	ResumeHrxml string `protobuf:"bytes,10,opt,name=resume_hrxml,json=resumeHrxml,proto3" json:"resume_hrxml,omitempty"`
	// Optional.
	//
	// The names of the candidate this profile references.
	//
	// Currently only one person name is supported.
	PersonNames []*PersonName `protobuf:"bytes,11,rep,name=person_names,json=personNames,proto3" json:"person_names,omitempty"`
	// Optional.
	//
	// The candidate's postal addresses.
	Addresses []*Address `protobuf:"bytes,12,rep,name=addresses,proto3" json:"addresses,omitempty"`
	// Optional.
	//
	// The candidate's email addresses.
	EmailAddresses []*Email `protobuf:"bytes,13,rep,name=email_addresses,json=emailAddresses,proto3" json:"email_addresses,omitempty"`
	// Optional.
	//
	// The candidate's phone number(s).
	PhoneNumbers []*Phone `protobuf:"bytes,14,rep,name=phone_numbers,json=phoneNumbers,proto3" json:"phone_numbers,omitempty"`
	// Optional.
	//
	// The candidate's personal URIs.
	PersonalUris []*PersonalUri `protobuf:"bytes,15,rep,name=personal_uris,json=personalUris,proto3" json:"personal_uris,omitempty"`
	// Optional.
	//
	// Available contact information besides
	// [addresses][google.cloud.talent.v4beta1.Profile.addresses],
	// [email_addresses][google.cloud.talent.v4beta1.Profile.email_addresses],
	// [phone_numbers][google.cloud.talent.v4beta1.Profile.phone_numbers] and
	// [personal_uris][google.cloud.talent.v4beta1.Profile.personal_uris]. For
	// example, Hang-out, Skype.
	AdditionalContactInfo []*AdditionalContactInfo `protobuf:"bytes,16,rep,name=additional_contact_info,json=additionalContactInfo,proto3" json:"additional_contact_info,omitempty"`
	// Optional.
	//
	// The employment history records of the candidate. It's highly recommended
	// to input this information as accurately as possible to help improve search
	// quality. Here are some recommendations:
	//
	// * Specify the start and end dates of the employment records.
	// * List different employment types separately, no matter how minor the
	// change is.
	// For example, only job title is changed from "software engineer" to "senior
	// software engineer".
	// * Provide
	// [EmploymentRecord.is_current][google.cloud.talent.v4beta1.EmploymentRecord.is_current]
	// for the current employment if possible. If not, it's inferred from user
	// inputs.
	EmploymentRecords []*EmploymentRecord `protobuf:"bytes,17,rep,name=employment_records,json=employmentRecords,proto3" json:"employment_records,omitempty"`
	// Optional.
	//
	// The education history record of the candidate. It's highly recommended to
	// input this information as accurately as possible to help improve search
	// quality. Here are some recommendations:
	//
	// * Specify the start and end dates of the education records.
	// * List each education type separately, no matter how minor the change is.
	// For example, the profile contains the education experience from the same
	// school but different degrees.
	// * Provide
	// [EducationRecord.is_current][google.cloud.talent.v4beta1.EducationRecord.is_current]
	// for the current education if possible. If not, it's inferred from user
	// inputs.
	EducationRecords []*EducationRecord `protobuf:"bytes,18,rep,name=education_records,json=educationRecords,proto3" json:"education_records,omitempty"`
	// Optional.
	//
	// The skill set of the candidate. It's highly recommended to provide as
	// much information as possible to help improve the search quality.
	Skills []*Skill `protobuf:"bytes,19,rep,name=skills,proto3" json:"skills,omitempty"`
	// Optional.
	//
	// The individual or collaborative activities which the candidate has
	// participated in, for example, open-source projects, class assignments that
	// aren't listed in
	// [employment_records][google.cloud.talent.v4beta1.Profile.employment_records].
	Activities []*Activity `protobuf:"bytes,20,rep,name=activities,proto3" json:"activities,omitempty"`
	// Optional.
	//
	// The publications published by the candidate.
	Publications []*Publication `protobuf:"bytes,21,rep,name=publications,proto3" json:"publications,omitempty"`
	// Optional.
	//
	// The patents acquired by the candidate.
	Patents []*Patent `protobuf:"bytes,22,rep,name=patents,proto3" json:"patents,omitempty"`
	// Optional.
	//
	// The certifications acquired by the candidate.
	Certifications []*Certification `protobuf:"bytes,23,rep,name=certifications,proto3" json:"certifications,omitempty"`
	// Output only. The resource names of the candidate's applications.
	Applications []string `protobuf:"bytes,47,rep,name=applications,proto3" json:"applications,omitempty"`
	// Output only. The resource names of the candidate's assignments.
	Assignments []string `protobuf:"bytes,48,rep,name=assignments,proto3" json:"assignments,omitempty"`
	// Optional.
	//
	// A map of fields to hold both filterable and non-filterable custom profile
	// attributes that aren't covered by the provided structured fields. See
	// [CustomAttribute][google.cloud.talent.v4beta1.CustomAttribute] for more
	// details.
	//
	// At most 100 filterable and at most 100 unfilterable keys are supported. If
	// limit is exceeded, an error is thrown. Custom attributes are `unfilterable`
	// by default. These are filterable when the `filterable` flag is set to
	// `true`.
	//
	// Numeric custom attributes: each key can only map to one numeric value,
	// otherwise an error is thrown. Client can also filter on numeric custom
	// attributes using '>', '<' or '=' operators.
	//
	// String custom attributes: each key can map up to 50 string values. For
	// filterable string value, each value has a byte size of no more than 256B.
	// For unfilterable string values, the maximum byte size of a single key is
	// 64B. An error is thrown for any request exceeding the limit.
	// The maximum total byte size is 10KB.
	CustomAttributes map[string]*CustomAttribute `protobuf:"bytes,26,rep,name=custom_attributes,json=customAttributes,proto3" json:"custom_attributes,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"`
	// Output only. Indicates if the profile is fully processed and searchable.
	Processed bool `protobuf:"varint,27,opt,name=processed,proto3" json:"processed,omitempty"`
	// Output only. Keyword snippet shows how the search result is related to a
	// search query.
	KeywordSnippet       string   `protobuf:"bytes,28,opt,name=keyword_snippet,json=keywordSnippet,proto3" json:"keyword_snippet,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

var xxx_messageInfo_Profile proto.InternalMessageInfo

func (m *Profile) GetName() string {
	if m != nil {
		return m.Name
	}
	return ""
}

func (m *Profile) GetExternalId() string {
	if m != nil {
		return m.ExternalId
	}
	return ""
}

func (m *Profile) GetSource() string {
	if m != nil {
		return m.Source
	}
	return ""
}

func (m *Profile) GetUri() string {
	if m != nil {
		return m.Uri
	}
	return ""
}

func (m *Profile) GetGroupId() string {
	if m != nil {
		return m.GroupId
	}
	return ""
}

func (m *Profile) GetIsHirable() *wrappers.BoolValue {
	if m != nil {
		return m.IsHirable
	}
	return nil
}

func (m *Profile) GetCreateTime() *timestamp.Timestamp {
	if m != nil {
		return m.CreateTime
	}
	return nil
}

func (m *Profile) GetUpdateTime() *timestamp.Timestamp {
	if m != nil {
		return m.UpdateTime
	}
	return nil
}

func (m *Profile) GetResumeHrxml() string {
	if m != nil {
		return m.ResumeHrxml
	}
	return ""
}

func (m *Profile) GetPersonNames() []*PersonName {
	if m != nil {
		return m.PersonNames
	}
	return nil
}

func (m *Profile) GetAddresses() []*Address {
	if m != nil {
		return m.Addresses
	}
	return nil
}

func (m *Profile) GetEmailAddresses() []*Email {
	if m != nil {
		return m.EmailAddresses
	}
	return nil
}

func (m *Profile) GetPhoneNumbers() []*Phone {
	if m != nil {
		return m.PhoneNumbers
	}
	return nil
}

func (m *Profile) GetPersonalUris() []*PersonalUri {
	if m != nil {
		return m.PersonalUris
	}
	return nil
}

func (m *Profile) GetAdditionalContactInfo() []*AdditionalContactInfo {
	if m != nil {
		return m.AdditionalContactInfo
	}
	return nil
}

func (m *Profile) GetEmploymentRecords() []*EmploymentRecord {
	if m != nil {
		return m.EmploymentRecords
	}
	return nil
}

func (m *Profile) GetEducationRecords() []*EducationRecord {
	if m != nil {
		return m.EducationRecords
	}
	return nil
}

func (m *Profile) GetSkills() []*Skill {
	if m != nil {
		return m.Skills
	}
	return nil
}

func (m *Profile) GetActivities() []*Activity {
	if m != nil {
		return m.Activities
	}
	return nil
}

func (m *Profile) GetPublications() []*Publication {
	if m != nil {
		return m.Publications
	}
	return nil
}

func (m *Profile) GetPatents() []*Patent {
	if m != nil {
		return m.Patents
	}
	return nil
}

func (m *Profile) GetCertifications() []*Certification {
	if m != nil {
		return m.Certifications
	}
	return nil
}

func (m *Profile) GetApplications() []string {
	if m != nil {
		return m.Applications
	}
	return nil
}

func (m *Profile) GetAssignments() []string {
	if m != nil {
		return m.Assignments
	}
	return nil
}

func (m *Profile) GetCustomAttributes() map[string]*CustomAttribute {
	if m != nil {
		return m.CustomAttributes
	}
	return nil
}

func (m *Profile) GetProcessed() bool {
	if m != nil {
		return m.Processed
	}
	return false
}

func (m *Profile) GetKeywordSnippet() string {
	if m != nil {
		return m.KeywordSnippet
	}
	return ""
}

// Resource that represents the name of a person.
type PersonName struct {
	// The name of a person. It can be one of [formatted_name][] or
	// [structured_name][].
	//
	// Types that are valid to be assigned to PersonName:
	//	*PersonName_FormattedName
	//	*PersonName_StructuredName
	PersonName isPersonName_PersonName `protobuf_oneof:"person_name"`
	// Optional.
	//
	// Preferred name for the person.
	PreferredName        string   `protobuf:"bytes,3,opt,name=preferred_name,json=preferredName,proto3" json:"preferred_name,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

var xxx_messageInfo_PersonName proto.InternalMessageInfo

type isPersonName_PersonName interface {
	isPersonName_PersonName()
}

type PersonName_FormattedName struct {
	FormattedName string `protobuf:"bytes,1,opt,name=formatted_name,json=formattedName,proto3,oneof"`
}

type PersonName_StructuredName struct {
	StructuredName *PersonName_PersonStructuredName `protobuf:"bytes,2,opt,name=structured_name,json=structuredName,proto3,oneof"`
}

func (*PersonName_FormattedName) isPersonName_PersonName() {}

func (*PersonName_StructuredName) isPersonName_PersonName() {}

func (m *PersonName) GetPersonName() isPersonName_PersonName {
	if m != nil {
		return m.PersonName
	}
	return nil
}

func (m *PersonName) GetFormattedName() string {
	if x, ok := m.GetPersonName().(*PersonName_FormattedName); ok {
		return x.FormattedName
	}
	return ""
}

func (m *PersonName) GetStructuredName() *PersonName_PersonStructuredName {
	if x, ok := m.GetPersonName().(*PersonName_StructuredName); ok {
		return x.StructuredName
	}
	return nil
}

func (m *PersonName) GetPreferredName() string {
	if m != nil {
		return m.PreferredName
	}
	return ""
}

// XXX_OneofFuncs is for the internal use of the proto package.
func (*PersonName) 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 _PersonName_OneofMarshaler, _PersonName_OneofUnmarshaler, _PersonName_OneofSizer, []interface{}{
		(*PersonName_FormattedName)(nil),
		(*PersonName_StructuredName)(nil),
	}
}

func _PersonName_OneofMarshaler(msg proto.Message, b *proto.Buffer) error {
	m := msg.(*PersonName)
	// person_name
	switch x := m.PersonName.(type) {
	case *PersonName_FormattedName:
		b.EncodeVarint(1<<3 | proto.WireBytes)
		b.EncodeStringBytes(x.FormattedName)
	case *PersonName_StructuredName:
		b.EncodeVarint(2<<3 | proto.WireBytes)
		if err := b.EncodeMessage(x.StructuredName); err != nil {
			return err
		}
	case nil:
	default:
		return fmt.Errorf("PersonName.PersonName has unexpected type %T", x)
	}
	return nil
}

func _PersonName_OneofUnmarshaler(msg proto.Message, tag, wire int, b *proto.Buffer) (bool, error) {
	m := msg.(*PersonName)
	switch tag {
	case 1: // person_name.formatted_name
		if wire != proto.WireBytes {
			return true, proto.ErrInternalBadWireType
		}
		x, err := b.DecodeStringBytes()
		m.PersonName = &PersonName_FormattedName{x}
		return true, err
	case 2: // person_name.structured_name
		if wire != proto.WireBytes {
			return true, proto.ErrInternalBadWireType
		}
		msg := new(PersonName_PersonStructuredName)
		err := b.DecodeMessage(msg)
		m.PersonName = &PersonName_StructuredName{msg}
		return true, err
	default:
		return false, nil
	}
}

func _PersonName_OneofSizer(msg proto.Message) (n int) {
	m := msg.(*PersonName)
	// person_name
	switch x := m.PersonName.(type) {
	case *PersonName_FormattedName:
		n += 1 // tag and wire
		n += proto.SizeVarint(uint64(len(x.FormattedName)))
		n += len(x.FormattedName)
	case *PersonName_StructuredName:
		s := proto.Size(x.StructuredName)
		n += 1 // tag and wire
		n += proto.SizeVarint(uint64(s))
		n += s
	case nil:
	default:
		panic(fmt.Sprintf("proto: unexpected type %T in oneof", x))
	}
	return n
}

// Resource that represents a person's structured name.
type PersonName_PersonStructuredName struct {
	// Optional.
	//
	// Given/first name.
	//
	// It's derived from
	// [formatted_name][google.cloud.talent.v4beta1.PersonName.formatted_name]
	// if not provided.
	//
	// Number of characters allowed is 100.
	GivenName string `protobuf:"bytes,1,opt,name=given_name,json=givenName,proto3" json:"given_name,omitempty"`
	// Optional.
	//
	// Middle initial.
	//
	// It's derived from
	// [formatted_name][google.cloud.talent.v4beta1.PersonName.formatted_name]
	// if not provided.
	//
	// Number of characters allowed is 20.
	MiddleInitial string `protobuf:"bytes,2,opt,name=middle_initial,json=middleInitial,proto3" json:"middle_initial,omitempty"`
	// Optional.
	//
	// Family/last name.
	//
	// It's derived from
	// [formatted_name][google.cloud.talent.v4beta1.PersonName.formatted_name]
	// if not provided.
	//
	// Number of characters allowed is 100.
	FamilyName string `protobuf:"bytes,3,opt,name=family_name,json=familyName,proto3" json:"family_name,omitempty"`
	// Optional.
	//
	// Suffixes.
	//
	// Number of characters allowed is 20.
	Suffixes []string `protobuf:"bytes,4,rep,name=suffixes,proto3" json:"suffixes,omitempty"`
	// Optional.
	//
	// Prefixes.
	//
	// Number of characters allowed is 20.
	Prefixes             []string `protobuf:"bytes,5,rep,name=prefixes,proto3" json:"prefixes,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

var xxx_messageInfo_PersonName_PersonStructuredName proto.InternalMessageInfo

func (m *PersonName_PersonStructuredName) GetGivenName() string {
	if m != nil {
		return m.GivenName
	}
	return ""
}

func (m *PersonName_PersonStructuredName) GetMiddleInitial() string {
	if m != nil {
		return m.MiddleInitial
	}
	return ""
}

func (m *PersonName_PersonStructuredName) GetFamilyName() string {
	if m != nil {
		return m.FamilyName
	}
	return ""
}

func (m *PersonName_PersonStructuredName) GetSuffixes() []string {
	if m != nil {
		return m.Suffixes
	}
	return nil
}

func (m *PersonName_PersonStructuredName) GetPrefixes() []string {
	if m != nil {
		return m.Prefixes
	}
	return nil
}

// Resource that represents a address.
type Address struct {
	// Optional.
	//
	// The usage of the address. For example, SCHOOL, WORK, PERSONAL.
	Usage ContactInfoUsage `protobuf:"varint,1,opt,name=usage,proto3,enum=google.cloud.talent.v4beta1.ContactInfoUsage" json:"usage,omitempty"`
	// The address of a person. It can be one of [unstructured_address][] or
	// [structured_address][].
	//
	// Types that are valid to be assigned to Address:
	//	*Address_UnstructuredAddress
	//	*Address_StructuredAddress
	Address isAddress_Address `protobuf_oneof:"address"`
	// Optional.
	//
	// Indicates if it's the person's current address.
	Current              *wrappers.BoolValue `protobuf:"bytes,4,opt,name=current,proto3" json:"current,omitempty"`
	XXX_NoUnkeyedLiteral struct{}            `json:"-"`
	XXX_unrecognized     []byte              `json:"-"`
	XXX_sizecache        int32               `json:"-"`
}

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

var xxx_messageInfo_Address proto.InternalMessageInfo

func (m *Address) GetUsage() ContactInfoUsage {
	if m != nil {
		return m.Usage
	}
	return ContactInfoUsage_CONTACT_INFO_USAGE_UNSPECIFIED
}

type isAddress_Address interface {
	isAddress_Address()
}

type Address_UnstructuredAddress struct {
	UnstructuredAddress string `protobuf:"bytes,2,opt,name=unstructured_address,json=unstructuredAddress,proto3,oneof"`
}

type Address_StructuredAddress struct {
	StructuredAddress *postaladdress.PostalAddress `protobuf:"bytes,3,opt,name=structured_address,json=structuredAddress,proto3,oneof"`
}

func (*Address_UnstructuredAddress) isAddress_Address() {}

func (*Address_StructuredAddress) isAddress_Address() {}

func (m *Address) GetAddress() isAddress_Address {
	if m != nil {
		return m.Address
	}
	return nil
}

func (m *Address) GetUnstructuredAddress() string {
	if x, ok := m.GetAddress().(*Address_UnstructuredAddress); ok {
		return x.UnstructuredAddress
	}
	return ""
}

func (m *Address) GetStructuredAddress() *postaladdress.PostalAddress {
	if x, ok := m.GetAddress().(*Address_StructuredAddress); ok {
		return x.StructuredAddress
	}
	return nil
}

func (m *Address) GetCurrent() *wrappers.BoolValue {
	if m != nil {
		return m.Current
	}
	return nil
}

// XXX_OneofFuncs is for the internal use of the proto package.
func (*Address) 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 _Address_OneofMarshaler, _Address_OneofUnmarshaler, _Address_OneofSizer, []interface{}{
		(*Address_UnstructuredAddress)(nil),
		(*Address_StructuredAddress)(nil),
	}
}

func _Address_OneofMarshaler(msg proto.Message, b *proto.Buffer) error {
	m := msg.(*Address)
	// address
	switch x := m.Address.(type) {
	case *Address_UnstructuredAddress:
		b.EncodeVarint(2<<3 | proto.WireBytes)
		b.EncodeStringBytes(x.UnstructuredAddress)
	case *Address_StructuredAddress:
		b.EncodeVarint(3<<3 | proto.WireBytes)
		if err := b.EncodeMessage(x.StructuredAddress); err != nil {
			return err
		}
	case nil:
	default:
		return fmt.Errorf("Address.Address has unexpected type %T", x)
	}
	return nil
}

func _Address_OneofUnmarshaler(msg proto.Message, tag, wire int, b *proto.Buffer) (bool, error) {
	m := msg.(*Address)
	switch tag {
	case 2: // address.unstructured_address
		if wire != proto.WireBytes {
			return true, proto.ErrInternalBadWireType
		}
		x, err := b.DecodeStringBytes()
		m.Address = &Address_UnstructuredAddress{x}
		return true, err
	case 3: // address.structured_address
		if wire != proto.WireBytes {
			return true, proto.ErrInternalBadWireType
		}
		msg := new(postaladdress.PostalAddress)
		err := b.DecodeMessage(msg)
		m.Address = &Address_StructuredAddress{msg}
		return true, err
	default:
		return false, nil
	}
}

func _Address_OneofSizer(msg proto.Message) (n int) {
	m := msg.(*Address)
	// address
	switch x := m.Address.(type) {
	case *Address_UnstructuredAddress:
		n += 1 // tag and wire
		n += proto.SizeVarint(uint64(len(x.UnstructuredAddress)))
		n += len(x.UnstructuredAddress)
	case *Address_StructuredAddress:
		s := proto.Size(x.StructuredAddress)
		n += 1 // tag and wire
		n += proto.SizeVarint(uint64(s))
		n += s
	case nil:
	default:
		panic(fmt.Sprintf("proto: unexpected type %T in oneof", x))
	}
	return n
}

// Resource that represents a person's email address.
type Email struct {
	// Optional.
	//
	// The usage of the email address. For example, SCHOOL, WORK, PERSONAL.
	Usage ContactInfoUsage `protobuf:"varint,1,opt,name=usage,proto3,enum=google.cloud.talent.v4beta1.ContactInfoUsage" json:"usage,omitempty"`
	// Optional.
	//
	// Email address.
	//
	// Number of characters allowed is 4,000.
	EmailAddress         string   `protobuf:"bytes,2,opt,name=email_address,json=emailAddress,proto3" json:"email_address,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

var xxx_messageInfo_Email proto.InternalMessageInfo

func (m *Email) GetUsage() ContactInfoUsage {
	if m != nil {
		return m.Usage
	}
	return ContactInfoUsage_CONTACT_INFO_USAGE_UNSPECIFIED
}

func (m *Email) GetEmailAddress() string {
	if m != nil {
		return m.EmailAddress
	}
	return ""
}

// Resource that represents a person's telephone number.
type Phone struct {
	// Optional.
	//
	// The usage of the phone. For example, SCHOOL, WORK, PERSONAL.
	Usage ContactInfoUsage `protobuf:"varint,1,opt,name=usage,proto3,enum=google.cloud.talent.v4beta1.ContactInfoUsage" json:"usage,omitempty"`
	// Optional.
	//
	// The phone type. For example, LANDLINE, MOBILE, FAX.
	Type Phone_PhoneType `protobuf:"varint,2,opt,name=type,proto3,enum=google.cloud.talent.v4beta1.Phone_PhoneType" json:"type,omitempty"`
	// Optional.
	//
	// Phone number.
	//
	// Any phone formats are supported and only exact matches are performed on
	// searches. For example, if a phone number in profile is provided in the
	// format of "(xxx)xxx-xxxx", in profile searches the same phone format
	// has to be provided.
	//
	// Number of characters allowed is 20.
	Number string `protobuf:"bytes,3,opt,name=number,proto3" json:"number,omitempty"`
	// Optional.
	//
	// When this number is available. Any descriptive string is expected.
	//
	// Number of characters allowed is 100.
	WhenAvailable        string   `protobuf:"bytes,4,opt,name=when_available,json=whenAvailable,proto3" json:"when_available,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

var xxx_messageInfo_Phone proto.InternalMessageInfo

func (m *Phone) GetUsage() ContactInfoUsage {
	if m != nil {
		return m.Usage
	}
	return ContactInfoUsage_CONTACT_INFO_USAGE_UNSPECIFIED
}

func (m *Phone) GetType() Phone_PhoneType {
	if m != nil {
		return m.Type
	}
	return Phone_PHONE_TYPE_UNSPECIFIED
}

func (m *Phone) GetNumber() string {
	if m != nil {
		return m.Number
	}
	return ""
}

func (m *Phone) GetWhenAvailable() string {
	if m != nil {
		return m.WhenAvailable
	}
	return ""
}

// Resource that represents a valid URI for a personal use.
type PersonalUri struct {
	// Optional.
	//
	// The personal URI.
	//
	// Number of characters allowed is 4,000.
	Uri                  string   `protobuf:"bytes,1,opt,name=uri,proto3" json:"uri,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

var xxx_messageInfo_PersonalUri proto.InternalMessageInfo

func (m *PersonalUri) GetUri() string {
	if m != nil {
		return m.Uri
	}
	return ""
}

// Resource that represents contact information other than phone, email,
// URI and addresses.
type AdditionalContactInfo struct {
	// Optional.
	//
	// The usage of this contact method. For example, SCHOOL, WORK, PERSONAL.
	Usage ContactInfoUsage `protobuf:"varint,1,opt,name=usage,proto3,enum=google.cloud.talent.v4beta1.ContactInfoUsage" json:"usage,omitempty"`
	// Optional.
	//
	// The name of the contact method.
	//
	// For example, "hangout", "skype".
	//
	// Number of characters allowed is 100.
	Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"`
	// Optional.
	//
	// The contact id.
	//
	// Number of characters allowed is 100.
	ContactId            string   `protobuf:"bytes,3,opt,name=contact_id,json=contactId,proto3" json:"contact_id,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

var xxx_messageInfo_AdditionalContactInfo proto.InternalMessageInfo

func (m *AdditionalContactInfo) GetUsage() ContactInfoUsage {
	if m != nil {
		return m.Usage
	}
	return ContactInfoUsage_CONTACT_INFO_USAGE_UNSPECIFIED
}

func (m *AdditionalContactInfo) GetName() string {
	if m != nil {
		return m.Name
	}
	return ""
}

func (m *AdditionalContactInfo) GetContactId() string {
	if m != nil {
		return m.ContactId
	}
	return ""
}

// Resource that represents an employment record of a candidate.
type EmploymentRecord struct {
	// Optional.
	//
	// Start date of the employment.
	//
	// It can be a partial date (only year, or only year and month), but must be
	// valid. Otherwise an error is thrown.
	//
	// Examples:
	// {"year": 2017, "month": 2, "day": 28} is valid.
	// {"year": 2020, "month": 1, "date": 31} is valid.
	// {"year": 2018, "month": 12} is valid (partial date).
	// {"year": 2018} is valid (partial date).
	// {"year": 2015, "day": 21} is not valid (month is missing but day is
	// presented).
	// {"year": 2018, "month": 13} is not valid (invalid month).
	// {"year": 2017, "month": 1, "day": 32} is not valid (invalid day).
	StartDate *date.Date `protobuf:"bytes,1,opt,name=start_date,json=startDate,proto3" json:"start_date,omitempty"`
	// Optional.
	//
	// End date of the employment.
	EndDate *date.Date `protobuf:"bytes,2,opt,name=end_date,json=endDate,proto3" json:"end_date,omitempty"`
	// Optional.
	//
	// The name of the employer company/organization.
	//
	// For example, "Google", "Alphabet", etc.
	//
	// Number of characters allowed is 100.
	EmployerName string `protobuf:"bytes,3,opt,name=employer_name,json=employerName,proto3" json:"employer_name,omitempty"`
	// Optional.
	//
	// The division name of the employment.
	//
	// For example, division, department, client, etc.
	//
	// Number of characters allowed is 100.
	DivisionName string `protobuf:"bytes,4,opt,name=division_name,json=divisionName,proto3" json:"division_name,omitempty"`
	// Optional.
	//
	// The physical address of the employer.
	Address *Address `protobuf:"bytes,5,opt,name=address,proto3" json:"address,omitempty"`
	// Optional.
	//
	// The job title of the employment.
	//
	// For example, "Software Engineer", "Data Scientist", etc.
	//
	// Number of characters allowed is 100.
	JobTitle string `protobuf:"bytes,6,opt,name=job_title,json=jobTitle,proto3" json:"job_title,omitempty"`
	// Optional.
	//
	// The description of job content.
	//
	// Number of characters allowed is 100,000.
	JobDescription string `protobuf:"bytes,7,opt,name=job_description,json=jobDescription,proto3" json:"job_description,omitempty"`
	// Optional.
	//
	// If it is a supervisor position.
	IsSupervisor *wrappers.BoolValue `protobuf:"bytes,8,opt,name=is_supervisor,json=isSupervisor,proto3" json:"is_supervisor,omitempty"`
	// Optional.
	//
	// If this employment is self-employed.
	IsSelfEmployed *wrappers.BoolValue `protobuf:"bytes,9,opt,name=is_self_employed,json=isSelfEmployed,proto3" json:"is_self_employed,omitempty"`
	// Optional.
	//
	// If this employment is current.
	IsCurrent *wrappers.BoolValue `protobuf:"bytes,10,opt,name=is_current,json=isCurrent,proto3" json:"is_current,omitempty"`
	// Output only. The job title snippet shows how the
	// [job_title][google.cloud.talent.v4beta1.EmploymentRecord.job_title] is
	// related to a search query. It's empty if the
	// [job_title][google.cloud.talent.v4beta1.EmploymentRecord.job_title] isn't
	// related to the search query.
	JobTitleSnippet string `protobuf:"bytes,11,opt,name=job_title_snippet,json=jobTitleSnippet,proto3" json:"job_title_snippet,omitempty"`
	// Output only. The job description snippet shows how the
	// [job_description][google.cloud.talent.v4beta1.EmploymentRecord.job_description]
	// is related to a search query. It's empty if the
	// [job_description][google.cloud.talent.v4beta1.EmploymentRecord.job_description]
	// isn't related to the search query.
	JobDescriptionSnippet string `protobuf:"bytes,12,opt,name=job_description_snippet,json=jobDescriptionSnippet,proto3" json:"job_description_snippet,omitempty"`
	// Output only. The employer name snippet shows how the
	// [employer_name][google.cloud.talent.v4beta1.EmploymentRecord.employer_name]
	// is related to a search query. It's empty if the
	// [employer_name][google.cloud.talent.v4beta1.EmploymentRecord.employer_name]
	// isn't related to the search query.
	EmployerNameSnippet  string   `protobuf:"bytes,13,opt,name=employer_name_snippet,json=employerNameSnippet,proto3" json:"employer_name_snippet,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

var xxx_messageInfo_EmploymentRecord proto.InternalMessageInfo

func (m *EmploymentRecord) GetStartDate() *date.Date {
	if m != nil {
		return m.StartDate
	}
	return nil
}

func (m *EmploymentRecord) GetEndDate() *date.Date {
	if m != nil {
		return m.EndDate
	}
	return nil
}

func (m *EmploymentRecord) GetEmployerName() string {
	if m != nil {
		return m.EmployerName
	}
	return ""
}

func (m *EmploymentRecord) GetDivisionName() string {
	if m != nil {
		return m.DivisionName
	}
	return ""
}

func (m *EmploymentRecord) GetAddress() *Address {
	if m != nil {
		return m.Address
	}
	return nil
}

func (m *EmploymentRecord) GetJobTitle() string {
	if m != nil {
		return m.JobTitle
	}
	return ""
}

func (m *EmploymentRecord) GetJobDescription() string {
	if m != nil {
		return m.JobDescription
	}
	return ""
}

func (m *EmploymentRecord) GetIsSupervisor() *wrappers.BoolValue {
	if m != nil {
		return m.IsSupervisor
	}
	return nil
}

func (m *EmploymentRecord) GetIsSelfEmployed() *wrappers.BoolValue {
	if m != nil {
		return m.IsSelfEmployed
	}
	return nil
}

func (m *EmploymentRecord) GetIsCurrent() *wrappers.BoolValue {
	if m != nil {
		return m.IsCurrent
	}
	return nil
}

func (m *EmploymentRecord) GetJobTitleSnippet() string {
	if m != nil {
		return m.JobTitleSnippet
	}
	return ""
}

func (m *EmploymentRecord) GetJobDescriptionSnippet() string {
	if m != nil {
		return m.JobDescriptionSnippet
	}
	return ""
}

func (m *EmploymentRecord) GetEmployerNameSnippet() string {
	if m != nil {
		return m.EmployerNameSnippet
	}
	return ""
}

// Resource that represents an education record of a candidate.
type EducationRecord struct {
	// Optional.
	//
	// The start date of the education.
	StartDate *date.Date `protobuf:"bytes,1,opt,name=start_date,json=startDate,proto3" json:"start_date,omitempty"`
	// Optional.
	//
	// The end date of the education.
	EndDate *date.Date `protobuf:"bytes,2,opt,name=end_date,json=endDate,proto3" json:"end_date,omitempty"`
	// Optional.
	//
	// The expected graduation date if currently pursuing a degree.
	ExpectedGraduationDate *date.Date `protobuf:"bytes,3,opt,name=expected_graduation_date,json=expectedGraduationDate,proto3" json:"expected_graduation_date,omitempty"`
	// Optional.
	//
	// The name of the school or institution.
	//
	// For example, "Stanford University", "UC Berkeley", etc.
	//
	// Number of characters allowed is 100.
	SchoolName string `protobuf:"bytes,4,opt,name=school_name,json=schoolName,proto3" json:"school_name,omitempty"`
	// Optional.
	//
	// The physical address of the education institution.
	Address *Address `protobuf:"bytes,5,opt,name=address,proto3" json:"address,omitempty"`
	// The degree information. It can be one of [degree_description][] or
	// [structured_degree][].
	//
	// Types that are valid to be assigned to Degree:
	//	*EducationRecord_DegreeDescription
	//	*EducationRecord_StructuredDegree
	Degree isEducationRecord_Degree `protobuf_oneof:"degree"`
	// Optional.
	//
	// The description of the education.
	//
	// Number of characters allowed is 100,000.
	Description string `protobuf:"bytes,8,opt,name=description,proto3" json:"description,omitempty"`
	// Optional.
	//
	// If this education is current.
	IsCurrent *wrappers.BoolValue `protobuf:"bytes,9,opt,name=is_current,json=isCurrent,proto3" json:"is_current,omitempty"`
	// Output only. The school name snippet shows how the
	// [school_name][google.cloud.talent.v4beta1.EducationRecord.school_name] is
	// related to a search query in search result. It's empty if the
	// [school_name][google.cloud.talent.v4beta1.EducationRecord.school_name]
	// isn't related to the search query.
	SchoolNameSnippet string `protobuf:"bytes,10,opt,name=school_name_snippet,json=schoolNameSnippet,proto3" json:"school_name_snippet,omitempty"`
	// Output only. The job description snippet shows how the
	// [degree][google.cloud.talent.v4beta1.degree] is related to a search query
	// in search result. It's empty if the
	// [degree][google.cloud.talent.v4beta1.degree] isn't related to the search
	// query.
	DegreeSnippet        string   `protobuf:"bytes,11,opt,name=degree_snippet,json=degreeSnippet,proto3" json:"degree_snippet,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

var xxx_messageInfo_EducationRecord proto.InternalMessageInfo

func (m *EducationRecord) GetStartDate() *date.Date {
	if m != nil {
		return m.StartDate
	}
	return nil
}

func (m *EducationRecord) GetEndDate() *date.Date {
	if m != nil {
		return m.EndDate
	}
	return nil
}

func (m *EducationRecord) GetExpectedGraduationDate() *date.Date {
	if m != nil {
		return m.ExpectedGraduationDate
	}
	return nil
}

func (m *EducationRecord) GetSchoolName() string {
	if m != nil {
		return m.SchoolName
	}
	return ""
}

func (m *EducationRecord) GetAddress() *Address {
	if m != nil {
		return m.Address
	}
	return nil
}

type isEducationRecord_Degree interface {
	isEducationRecord_Degree()
}

type EducationRecord_DegreeDescription struct {
	DegreeDescription string `protobuf:"bytes,6,opt,name=degree_description,json=degreeDescription,proto3,oneof"`
}

type EducationRecord_StructuredDegree struct {
	StructuredDegree *Degree `protobuf:"bytes,7,opt,name=structured_degree,json=structuredDegree,proto3,oneof"`
}

func (*EducationRecord_DegreeDescription) isEducationRecord_Degree() {}

func (*EducationRecord_StructuredDegree) isEducationRecord_Degree() {}

func (m *EducationRecord) GetDegree() isEducationRecord_Degree {
	if m != nil {
		return m.Degree
	}
	return nil
}

func (m *EducationRecord) GetDegreeDescription() string {
	if x, ok := m.GetDegree().(*EducationRecord_DegreeDescription); ok {
		return x.DegreeDescription
	}
	return ""
}

func (m *EducationRecord) GetStructuredDegree() *Degree {
	if x, ok := m.GetDegree().(*EducationRecord_StructuredDegree); ok {
		return x.StructuredDegree
	}
	return nil
}

func (m *EducationRecord) GetDescription() string {
	if m != nil {
		return m.Description
	}
	return ""
}

func (m *EducationRecord) GetIsCurrent() *wrappers.BoolValue {
	if m != nil {
		return m.IsCurrent
	}
	return nil
}

func (m *EducationRecord) GetSchoolNameSnippet() string {
	if m != nil {
		return m.SchoolNameSnippet
	}
	return ""
}

func (m *EducationRecord) GetDegreeSnippet() string {
	if m != nil {
		return m.DegreeSnippet
	}
	return ""
}

// XXX_OneofFuncs is for the internal use of the proto package.
func (*EducationRecord) 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 _EducationRecord_OneofMarshaler, _EducationRecord_OneofUnmarshaler, _EducationRecord_OneofSizer, []interface{}{
		(*EducationRecord_DegreeDescription)(nil),
		(*EducationRecord_StructuredDegree)(nil),
	}
}

func _EducationRecord_OneofMarshaler(msg proto.Message, b *proto.Buffer) error {
	m := msg.(*EducationRecord)
	// degree
	switch x := m.Degree.(type) {
	case *EducationRecord_DegreeDescription:
		b.EncodeVarint(6<<3 | proto.WireBytes)
		b.EncodeStringBytes(x.DegreeDescription)
	case *EducationRecord_StructuredDegree:
		b.EncodeVarint(7<<3 | proto.WireBytes)
		if err := b.EncodeMessage(x.StructuredDegree); err != nil {
			return err
		}
	case nil:
	default:
		return fmt.Errorf("EducationRecord.Degree has unexpected type %T", x)
	}
	return nil
}

func _EducationRecord_OneofUnmarshaler(msg proto.Message, tag, wire int, b *proto.Buffer) (bool, error) {
	m := msg.(*EducationRecord)
	switch tag {
	case 6: // degree.degree_description
		if wire != proto.WireBytes {
			return true, proto.ErrInternalBadWireType
		}
		x, err := b.DecodeStringBytes()
		m.Degree = &EducationRecord_DegreeDescription{x}
		return true, err
	case 7: // degree.structured_degree
		if wire != proto.WireBytes {
			return true, proto.ErrInternalBadWireType
		}
		msg := new(Degree)
		err := b.DecodeMessage(msg)
		m.Degree = &EducationRecord_StructuredDegree{msg}
		return true, err
	default:
		return false, nil
	}
}

func _EducationRecord_OneofSizer(msg proto.Message) (n int) {
	m := msg.(*EducationRecord)
	// degree
	switch x := m.Degree.(type) {
	case *EducationRecord_DegreeDescription:
		n += 1 // tag and wire
		n += proto.SizeVarint(uint64(len(x.DegreeDescription)))
		n += len(x.DegreeDescription)
	case *EducationRecord_StructuredDegree:
		s := proto.Size(x.StructuredDegree)
		n += 1 // tag and wire
		n += proto.SizeVarint(uint64(s))
		n += s
	case nil:
	default:
		panic(fmt.Sprintf("proto: unexpected type %T in oneof", x))
	}
	return n
}

// Resource that represents a degree pursuing or acquired by a candidate.
type Degree struct {
	// Optional.
	//
	// ISCED degree type.
	DegreeType DegreeType `protobuf:"varint,1,opt,name=degree_type,json=degreeType,proto3,enum=google.cloud.talent.v4beta1.DegreeType" json:"degree_type,omitempty"`
	// Optional.
	//
	// Full Degree name.
	//
	// For example, "B.S.", "Master of Arts", etc.
	//
	// Number of characters allowed is 100.
	DegreeName string `protobuf:"bytes,2,opt,name=degree_name,json=degreeName,proto3" json:"degree_name,omitempty"`
	// Optional.
	//
	// Fields of study for the degree.
	//
	// For example, "Computer science", "engineering".
	//
	// Number of characters allowed is 100.
	FieldsOfStudy        []string `protobuf:"bytes,3,rep,name=fields_of_study,json=fieldsOfStudy,proto3" json:"fields_of_study,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

var xxx_messageInfo_Degree proto.InternalMessageInfo

func (m *Degree) GetDegreeType() DegreeType {
	if m != nil {
		return m.DegreeType
	}
	return DegreeType_DEGREE_TYPE_UNSPECIFIED
}

func (m *Degree) GetDegreeName() string {
	if m != nil {
		return m.DegreeName
	}
	return ""
}

func (m *Degree) GetFieldsOfStudy() []string {
	if m != nil {
		return m.FieldsOfStudy
	}
	return nil
}

// Resource that represents an individual or collaborative activity participated
// in by a candidate, for example, an open-source project, a class assignment,
// etc.
type Activity struct {
	// Optional.
	//
	// Activity display name.
	//
	// Number of characters allowed is 100.
	DisplayName string `protobuf:"bytes,1,opt,name=display_name,json=displayName,proto3" json:"display_name,omitempty"`
	// Optional.
	//
	// Activity description.
	//
	// Number of characters allowed is 100,000.
	Description string `protobuf:"bytes,2,opt,name=description,proto3" json:"description,omitempty"`
	// Optional.
	//
	// Activity URI.
	//
	// Number of characters allowed is 4,000.
	Uri string `protobuf:"bytes,3,opt,name=uri,proto3" json:"uri,omitempty"`
	// Optional.
	//
	// The first creation date of the activity.
	CreateDate *date.Date `protobuf:"bytes,4,opt,name=create_date,json=createDate,proto3" json:"create_date,omitempty"`
	// Optional.
	//
	// The last update date of the activity.
	UpdateDate *date.Date `protobuf:"bytes,5,opt,name=update_date,json=updateDate,proto3" json:"update_date,omitempty"`
	// Optional.
	//
	// A list of team members involved in this activity.
	//
	// Number of characters allowed is 100.
	TeamMembers []string `protobuf:"bytes,6,rep,name=team_members,json=teamMembers,proto3" json:"team_members,omitempty"`
	// Optional.
	//
	// A list of skills used in this activity.
	SkillsUsed []*Skill `protobuf:"bytes,7,rep,name=skills_used,json=skillsUsed,proto3" json:"skills_used,omitempty"`
	// Output only. Activity name snippet shows how the
	// [display_name][google.cloud.talent.v4beta1.Activity.display_name] is
	// related to a search query. It's empty if the
	// [display_name][google.cloud.talent.v4beta1.Activity.display_name] isn't
	// related to the search query.
	ActivityNameSnippet string `protobuf:"bytes,8,opt,name=activity_name_snippet,json=activityNameSnippet,proto3" json:"activity_name_snippet,omitempty"`
	// Output only. Activity description snippet shows how the
	// [description][google.cloud.talent.v4beta1.Activity.description] is related
	// to a search query. It's empty if the
	// [description][google.cloud.talent.v4beta1.Activity.description] isn't
	// related to the search query.
	ActivityDescriptionSnippet string `protobuf:"bytes,9,opt,name=activity_description_snippet,json=activityDescriptionSnippet,proto3" json:"activity_description_snippet,omitempty"`
	// Output only. Skill used snippet shows how the corresponding
	// [skills_used][google.cloud.talent.v4beta1.Activity.skills_used] are related
	// to a search query. It's empty if the corresponding
	// [skills_used][google.cloud.talent.v4beta1.Activity.skills_used] are not
	// related to the search query.
	SkillsUsedSnippet    []string `protobuf:"bytes,10,rep,name=skills_used_snippet,json=skillsUsedSnippet,proto3" json:"skills_used_snippet,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

var xxx_messageInfo_Activity proto.InternalMessageInfo

func (m *Activity) GetDisplayName() string {
	if m != nil {
		return m.DisplayName
	}
	return ""
}

func (m *Activity) GetDescription() string {
	if m != nil {
		return m.Description
	}
	return ""
}

func (m *Activity) GetUri() string {
	if m != nil {
		return m.Uri
	}
	return ""
}

func (m *Activity) GetCreateDate() *date.Date {
	if m != nil {
		return m.CreateDate
	}
	return nil
}

func (m *Activity) GetUpdateDate() *date.Date {
	if m != nil {
		return m.UpdateDate
	}
	return nil
}

func (m *Activity) GetTeamMembers() []string {
	if m != nil {
		return m.TeamMembers
	}
	return nil
}

func (m *Activity) GetSkillsUsed() []*Skill {
	if m != nil {
		return m.SkillsUsed
	}
	return nil
}

func (m *Activity) GetActivityNameSnippet() string {
	if m != nil {
		return m.ActivityNameSnippet
	}
	return ""
}

func (m *Activity) GetActivityDescriptionSnippet() string {
	if m != nil {
		return m.ActivityDescriptionSnippet
	}
	return ""
}

func (m *Activity) GetSkillsUsedSnippet() []string {
	if m != nil {
		return m.SkillsUsedSnippet
	}
	return nil
}

// Resource that represents a publication resource of a candidate.
type Publication struct {
	// Optional.
	//
	// A list of author names.
	//
	// Number of characters allowed is 100.
	Authors []string `protobuf:"bytes,1,rep,name=authors,proto3" json:"authors,omitempty"`
	// Optional.
	//
	// The title of the publication.
	//
	// Number of characters allowed is 100.
	Title string `protobuf:"bytes,2,opt,name=title,proto3" json:"title,omitempty"`
	// Optional.
	//
	// The description of the publication.
	//
	// Number of characters allowed is 100,000.
	Description string `protobuf:"bytes,3,opt,name=description,proto3" json:"description,omitempty"`
	// Optional.
	//
	// The journal name of the publication.
	//
	// Number of characters allowed is 100.
	Journal string `protobuf:"bytes,4,opt,name=journal,proto3" json:"journal,omitempty"`
	// Optional.
	//
	// Volume number.
	//
	// Number of characters allowed is 100.
	Volume string `protobuf:"bytes,5,opt,name=volume,proto3" json:"volume,omitempty"`
	// Optional.
	//
	// The publisher of the journal.
	//
	// Number of characters allowed is 100.
	Publisher string `protobuf:"bytes,6,opt,name=publisher,proto3" json:"publisher,omitempty"`
	// Optional.
	//
	// The publication date.
	PublicationDate *date.Date `protobuf:"bytes,7,opt,name=publication_date,json=publicationDate,proto3" json:"publication_date,omitempty"`
	// Optional.
	//
	// The publication type.
	//
	// Number of characters allowed is 100.
	PublicationType string `protobuf:"bytes,8,opt,name=publication_type,json=publicationType,proto3" json:"publication_type,omitempty"`
	// Optional.
	//
	// ISBN number.
	//
	// Number of characters allowed is 100.
	Isbn                 string   `protobuf:"bytes,9,opt,name=isbn,proto3" json:"isbn,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

var xxx_messageInfo_Publication proto.InternalMessageInfo

func (m *Publication) GetAuthors() []string {
	if m != nil {
		return m.Authors
	}
	return nil
}

func (m *Publication) GetTitle() string {
	if m != nil {
		return m.Title
	}
	return ""
}

func (m *Publication) GetDescription() string {
	if m != nil {
		return m.Description
	}
	return ""
}

func (m *Publication) GetJournal() string {
	if m != nil {
		return m.Journal
	}
	return ""
}

func (m *Publication) GetVolume() string {
	if m != nil {
		return m.Volume
	}
	return ""
}

func (m *Publication) GetPublisher() string {
	if m != nil {
		return m.Publisher
	}
	return ""
}

func (m *Publication) GetPublicationDate() *date.Date {
	if m != nil {
		return m.PublicationDate
	}
	return nil
}

func (m *Publication) GetPublicationType() string {
	if m != nil {
		return m.PublicationType
	}
	return ""
}

func (m *Publication) GetIsbn() string {
	if m != nil {
		return m.Isbn
	}
	return ""
}

// Resource that represents the patent acquired by a candidate.
type Patent struct {
	// Optional.
	//
	// Name of the patent.
	//
	// Number of characters allowed is 100.
	DisplayName string `protobuf:"bytes,1,opt,name=display_name,json=displayName,proto3" json:"display_name,omitempty"`
	// Optional.
	//
	// A list of inventors' names.
	//
	// Number of characters allowed for each is 100.
	Inventors []string `protobuf:"bytes,2,rep,name=inventors,proto3" json:"inventors,omitempty"`
	// Optional.
	//
	// The status of the patent.
	//
	// Number of characters allowed is 100.
	PatentStatus string `protobuf:"bytes,3,opt,name=patent_status,json=patentStatus,proto3" json:"patent_status,omitempty"`
	// Optional.
	//
	// The date the last time the status of the patent was checked.
	PatentStatusDate *date.Date `protobuf:"bytes,4,opt,name=patent_status_date,json=patentStatusDate,proto3" json:"patent_status_date,omitempty"`
	// Optional.
	//
	// The date that the patent was filed.
	PatentFilingDate *date.Date `protobuf:"bytes,5,opt,name=patent_filing_date,json=patentFilingDate,proto3" json:"patent_filing_date,omitempty"`
	// Optional.
	//
	// The name of the patent office.
	//
	// Number of characters allowed is 100.
	PatentOffice string `protobuf:"bytes,6,opt,name=patent_office,json=patentOffice,proto3" json:"patent_office,omitempty"`
	// Optional.
	//
	// The number of the patent.
	//
	// Number of characters allowed is 100.
	PatentNumber string `protobuf:"bytes,7,opt,name=patent_number,json=patentNumber,proto3" json:"patent_number,omitempty"`
	// Optional.
	//
	// The description of the patent.
	//
	// Number of characters allowed is 100,000.
	PatentDescription string `protobuf:"bytes,8,opt,name=patent_description,json=patentDescription,proto3" json:"patent_description,omitempty"`
	// Optional.
	//
	// The skills used in this patent.
	SkillsUsed           []*Skill `protobuf:"bytes,9,rep,name=skills_used,json=skillsUsed,proto3" json:"skills_used,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

var xxx_messageInfo_Patent proto.InternalMessageInfo

func (m *Patent) GetDisplayName() string {
	if m != nil {
		return m.DisplayName
	}
	return ""
}

func (m *Patent) GetInventors() []string {
	if m != nil {
		return m.Inventors
	}
	return nil
}

func (m *Patent) GetPatentStatus() string {
	if m != nil {
		return m.PatentStatus
	}
	return ""
}

func (m *Patent) GetPatentStatusDate() *date.Date {
	if m != nil {
		return m.PatentStatusDate
	}
	return nil
}

func (m *Patent) GetPatentFilingDate() *date.Date {
	if m != nil {
		return m.PatentFilingDate
	}
	return nil
}

func (m *Patent) GetPatentOffice() string {
	if m != nil {
		return m.PatentOffice
	}
	return ""
}

func (m *Patent) GetPatentNumber() string {
	if m != nil {
		return m.PatentNumber
	}
	return ""
}

func (m *Patent) GetPatentDescription() string {
	if m != nil {
		return m.PatentDescription
	}
	return ""
}

func (m *Patent) GetSkillsUsed() []*Skill {
	if m != nil {
		return m.SkillsUsed
	}
	return nil
}

func init() {
	proto.RegisterType((*Profile)(nil), "google.cloud.talent.v4beta1.Profile")
	proto.RegisterMapType((map[string]*CustomAttribute)(nil), "google.cloud.talent.v4beta1.Profile.CustomAttributesEntry")
	proto.RegisterType((*PersonName)(nil), "google.cloud.talent.v4beta1.PersonName")
	proto.RegisterType((*PersonName_PersonStructuredName)(nil), "google.cloud.talent.v4beta1.PersonName.PersonStructuredName")
	proto.RegisterType((*Address)(nil), "google.cloud.talent.v4beta1.Address")
	proto.RegisterType((*Email)(nil), "google.cloud.talent.v4beta1.Email")
	proto.RegisterType((*Phone)(nil), "google.cloud.talent.v4beta1.Phone")
	proto.RegisterType((*PersonalUri)(nil), "google.cloud.talent.v4beta1.PersonalUri")
	proto.RegisterType((*AdditionalContactInfo)(nil), "google.cloud.talent.v4beta1.AdditionalContactInfo")
	proto.RegisterType((*EmploymentRecord)(nil), "google.cloud.talent.v4beta1.EmploymentRecord")
	proto.RegisterType((*EducationRecord)(nil), "google.cloud.talent.v4beta1.EducationRecord")
	proto.RegisterType((*Degree)(nil), "google.cloud.talent.v4beta1.Degree")
	proto.RegisterType((*Activity)(nil), "google.cloud.talent.v4beta1.Activity")
	proto.RegisterType((*Publication)(nil), "google.cloud.talent.v4beta1.Publication")
	proto.RegisterType((*Patent)(nil), "google.cloud.talent.v4beta1.Patent")
	proto.RegisterEnum("google.cloud.talent.v4beta1.Phone_PhoneType", Phone_PhoneType_name, Phone_PhoneType_value)
}

func init() {
	proto.RegisterFile("google/cloud/talent/v4beta1/profile.proto", fileDescriptor_profile_e7f0ff6ef67f503e)
}

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


<|start_filename|>vendor/github.com/goph/emperror/panic.go<|end_filename|>
package emperror

// Panic panics if the passed error is not nil.
// If the error does not contain any stack trace, the function attaches one, starting from the frame of the
// "Panic" function call.
//
// This function is useful with HandleRecover when panic is used as a flow control tool to stop the application.
func Panic(err error) {
	if err != nil {
		if _, ok := StackTrace(err); !ok {
			err = &wrappedError{
				err:   err,
				stack: callers(),
			}
		}

		panic(err)
	}
}


<|start_filename|>vendor/google.golang.org/genproto/googleapis/cloud/talent/v4beta1/application.pb.go<|end_filename|>
// Code generated by protoc-gen-go. DO NOT EDIT.
// source: google/cloud/talent/v4beta1/application.proto

package talent // import "google.golang.org/genproto/googleapis/cloud/talent/v4beta1"

import proto "github.com/golang/protobuf/proto"
import fmt "fmt"
import math "math"
import timestamp "github.com/golang/protobuf/ptypes/timestamp"
import wrappers "github.com/golang/protobuf/ptypes/wrappers"
import _ "google.golang.org/genproto/googleapis/api/annotations"
import date "google.golang.org/genproto/googleapis/type/date"

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

// Enum that represents the application status.
type Application_ApplicationState int32

const (
	// Default value.
	Application_APPLICATION_STATE_UNSPECIFIED Application_ApplicationState = 0
	// The current stage is in progress or pending, for example, interviews in
	// progress.
	Application_IN_PROGRESS Application_ApplicationState = 1
	// The current stage was terminated by a candidate decision.
	Application_CANDIDATE_WITHDREW Application_ApplicationState = 2
	// The current stage was terminated by an employer or agency decision.
	Application_EMPLOYER_WITHDREW Application_ApplicationState = 3
	// The current stage is successfully completed, but the next stage (if
	// applicable) has not begun.
	Application_COMPLETED Application_ApplicationState = 4
	// The current stage was closed without an exception, or terminated for
	// reasons unrealated to the candidate.
	Application_CLOSED Application_ApplicationState = 5
)

var Application_ApplicationState_name = map[int32]string{
	0: "APPLICATION_STATE_UNSPECIFIED",
	1: "IN_PROGRESS",
	2: "CANDIDATE_WITHDREW",
	3: "EMPLOYER_WITHDREW",
	4: "COMPLETED",
	5: "CLOSED",
}
var Application_ApplicationState_value = map[string]int32{
	"APPLICATION_STATE_UNSPECIFIED": 0,
	"IN_PROGRESS":                   1,
	"CANDIDATE_WITHDREW":            2,
	"EMPLOYER_WITHDREW":             3,
	"COMPLETED":                     4,
	"CLOSED":                        5,
}

func (x Application_ApplicationState) String() string {
	return proto.EnumName(Application_ApplicationState_name, int32(x))
}
func (Application_ApplicationState) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_application_d5cfb2f503a39d5b, []int{0, 0}
}

// The stage of the application.
type Application_ApplicationStage int32

const (
	// Default value.
	Application_APPLICATION_STAGE_UNSPECIFIED Application_ApplicationStage = 0
	// Candidate has applied or a recruiter put candidate into consideration but
	// candidate is not yet screened / no decision has been made to move or not
	// move the candidate to the next stage.
	Application_NEW Application_ApplicationStage = 1
	// A recruiter decided to screen the candidate for this role.
	Application_SCREEN Application_ApplicationStage = 2
	// Candidate is being / was sent to the customer / hiring manager for
	// detailed review.
	Application_HIRING_MANAGER_REVIEW Application_ApplicationStage = 3
	// Candidate was approved by the client / hiring manager and is being / was
	// interviewed for the role.
	Application_INTERVIEW Application_ApplicationStage = 4
	// Candidate will be / has been given an offer of employment.
	Application_OFFER_EXTENDED Application_ApplicationStage = 5
	// Candidate has accepted their offer of employment.
	Application_OFFER_ACCEPTED Application_ApplicationStage = 6
	// Candidate has begun (or completed) their employment or assignment with
	// the employer.
	Application_STARTED Application_ApplicationStage = 7
)

var Application_ApplicationStage_name = map[int32]string{
	0: "APPLICATION_STAGE_UNSPECIFIED",
	1: "NEW",
	2: "SCREEN",
	3: "HIRING_MANAGER_REVIEW",
	4: "INTERVIEW",
	5: "OFFER_EXTENDED",
	6: "OFFER_ACCEPTED",
	7: "STARTED",
}
var Application_ApplicationStage_value = map[string]int32{
	"APPLICATION_STAGE_UNSPECIFIED": 0,
	"NEW":                           1,
	"SCREEN":                        2,
	"HIRING_MANAGER_REVIEW":         3,
	"INTERVIEW":                     4,
	"OFFER_EXTENDED":                5,
	"OFFER_ACCEPTED":                6,
	"STARTED":                       7,
}

func (x Application_ApplicationStage) String() string {
	return proto.EnumName(Application_ApplicationStage_name, int32(x))
}
func (Application_ApplicationStage) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_application_d5cfb2f503a39d5b, []int{0, 1}
}

// Resource that represents a job application record of a candidate.
type Application struct {
	// Required during application update.
	//
	// Resource name assigned to an application by the API.
	//
	// The format is
	// "projects/{project_id}/tenants/{tenant_id}/profiles/{profile_id}/applications/{application_id}",
	// for example,
	// "projects/api-test-project/tenants/foo/profiles/bar/applications/baz".
	Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
	// Required.
	//
	// Client side application identifier, used to uniquely identify the
	// recruiter.
	//
	// The maximum number of allowed characters is 255.
	ExternalId string `protobuf:"bytes,31,opt,name=external_id,json=externalId,proto3" json:"external_id,omitempty"`
	// Required.
	//
	// Resource name of the candidate of this application.
	//
	// The format is
	// "projects/{project_id}/tenants/{tenant_id}/profiles/{profile_id}",
	// for example, "projects/api-test-project/tenants/foo/profiles/bar".
	Profile string `protobuf:"bytes,2,opt,name=profile,proto3" json:"profile,omitempty"`
	// One of either a job or a company is required.
	//
	// Resource name of the job which the candidate applied for.
	//
	// The format is
	// "projects/{project_id}/jobs/{job_id}",
	// for example, "projects/api-test-project/jobs/bar".
	Job string `protobuf:"bytes,4,opt,name=job,proto3" json:"job,omitempty"`
	// One of either a job or a company is required.
	//
	// Resource name of the company which the candidate applied for.
	//
	// The format is
	// "projects/{project_id}/companies/{company_id}",
	// for example, "projects/api-test-project/companies/foo".
	Company string `protobuf:"bytes,5,opt,name=company,proto3" json:"company,omitempty"`
	// Optional.
	//
	// The application date.
	ApplicationDate *date.Date `protobuf:"bytes,7,opt,name=application_date,json=applicationDate,proto3" json:"application_date,omitempty"`
	// Required.
	//
	// What is the most recent stage of the application (that is, new, screen,
	// send cv, hired, finished work)?  This field is intentionally not
	// comprehensive of every possible status, but instead, represents statuses
	// that would be used to indicate to the ML models good / bad matches.
	Stage Application_ApplicationStage `protobuf:"varint,11,opt,name=stage,proto3,enum=google.cloud.talent.v4beta1.Application_ApplicationStage" json:"stage,omitempty"`
	// Optional.
	//
	// The application state.
	State Application_ApplicationState `protobuf:"varint,13,opt,name=state,proto3,enum=google.cloud.talent.v4beta1.Application_ApplicationState" json:"state,omitempty"`
	// Optional.
	//
	// All interviews (screen, onsite, etc) conducted as part of this application
	// (includes details such as user conducting the interview, timestamp,
	// feedback, etc).
	Interviews []*Interview `protobuf:"bytes,16,rep,name=interviews,proto3" json:"interviews,omitempty"`
	// Optional.
	//
	// If the candidate is referred by a employee.
	Referral *wrappers.BoolValue `protobuf:"bytes,18,opt,name=referral,proto3" json:"referral,omitempty"`
	// Required.
	//
	// Reflects the time that the application was created.
	CreateTime *timestamp.Timestamp `protobuf:"bytes,19,opt,name=create_time,json=createTime,proto3" json:"create_time,omitempty"`
	// Optional.
	//
	// The last update timestamp.
	UpdateTime *timestamp.Timestamp `protobuf:"bytes,20,opt,name=update_time,json=updateTime,proto3" json:"update_time,omitempty"`
	// Optional.
	//
	// Free text reason behind the recruitement outcome (for example, reason for
	// withdraw / reject, reason for an unsuccessful finish, and so on).
	//
	// Number of characters allowed is 100.
	OutcomeNotes string `protobuf:"bytes,21,opt,name=outcome_notes,json=outcomeNotes,proto3" json:"outcome_notes,omitempty"`
	// Optional.
	//
	// Outcome positiveness shows how positive the outcome is.
	Outcome Outcome `protobuf:"varint,22,opt,name=outcome,proto3,enum=google.cloud.talent.v4beta1.Outcome" json:"outcome,omitempty"`
	// Output only. Indicates whether this job application is a match to
	// application related filters. This value is only applicable in profile
	// search response.
	IsMatch *wrappers.BoolValue `protobuf:"bytes,28,opt,name=is_match,json=isMatch,proto3" json:"is_match,omitempty"`
	// Output only. Job title snippet shows how the job title is related to a
	// search query. It's empty if the job title isn't related to the search
	// query.
	JobTitleSnippet      string   `protobuf:"bytes,29,opt,name=job_title_snippet,json=jobTitleSnippet,proto3" json:"job_title_snippet,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

var xxx_messageInfo_Application proto.InternalMessageInfo

func (m *Application) GetName() string {
	if m != nil {
		return m.Name
	}
	return ""
}

func (m *Application) GetExternalId() string {
	if m != nil {
		return m.ExternalId
	}
	return ""
}

func (m *Application) GetProfile() string {
	if m != nil {
		return m.Profile
	}
	return ""
}

func (m *Application) GetJob() string {
	if m != nil {
		return m.Job
	}
	return ""
}

func (m *Application) GetCompany() string {
	if m != nil {
		return m.Company
	}
	return ""
}

func (m *Application) GetApplicationDate() *date.Date {
	if m != nil {
		return m.ApplicationDate
	}
	return nil
}

func (m *Application) GetStage() Application_ApplicationStage {
	if m != nil {
		return m.Stage
	}
	return Application_APPLICATION_STAGE_UNSPECIFIED
}

func (m *Application) GetState() Application_ApplicationState {
	if m != nil {
		return m.State
	}
	return Application_APPLICATION_STATE_UNSPECIFIED
}

func (m *Application) GetInterviews() []*Interview {
	if m != nil {
		return m.Interviews
	}
	return nil
}

func (m *Application) GetReferral() *wrappers.BoolValue {
	if m != nil {
		return m.Referral
	}
	return nil
}

func (m *Application) GetCreateTime() *timestamp.Timestamp {
	if m != nil {
		return m.CreateTime
	}
	return nil
}

func (m *Application) GetUpdateTime() *timestamp.Timestamp {
	if m != nil {
		return m.UpdateTime
	}
	return nil
}

func (m *Application) GetOutcomeNotes() string {
	if m != nil {
		return m.OutcomeNotes
	}
	return ""
}

func (m *Application) GetOutcome() Outcome {
	if m != nil {
		return m.Outcome
	}
	return Outcome_OUTCOME_UNSPECIFIED
}

func (m *Application) GetIsMatch() *wrappers.BoolValue {
	if m != nil {
		return m.IsMatch
	}
	return nil
}

func (m *Application) GetJobTitleSnippet() string {
	if m != nil {
		return m.JobTitleSnippet
	}
	return ""
}

func init() {
	proto.RegisterType((*Application)(nil), "google.cloud.talent.v4beta1.Application")
	proto.RegisterEnum("google.cloud.talent.v4beta1.Application_ApplicationState", Application_ApplicationState_name, Application_ApplicationState_value)
	proto.RegisterEnum("google.cloud.talent.v4beta1.Application_ApplicationStage", Application_ApplicationStage_name, Application_ApplicationStage_value)
}

func init() {
	proto.RegisterFile("google/cloud/talent/v4beta1/application.proto", fileDescriptor_application_d5cfb2f503a39d5b)
}

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


<|start_filename|>vendor/google.golang.org/genproto/googleapis/cloud/talent/v4beta1/job.pb.go<|end_filename|>
// Code generated by protoc-gen-go. DO NOT EDIT.
// source: google/cloud/talent/v4beta1/job.proto

package talent // import "google.golang.org/genproto/googleapis/cloud/talent/v4beta1"

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

// A Job resource represents a job posting (also referred to as a "job listing"
// or "job requisition"). A job belongs to a
// [Company][google.cloud.talent.v4beta1.Company], which is the hiring entity
// responsible for the job.
type Job struct {
	// Required during job update.
	//
	// The resource name for the job. This is generated by the service when a
	// job is created.
	//
	// The format is
	// "projects/{project_id}/tenants/{tenant_id}/jobs/{job_id}", for
	// example, "projects/api-test-project/tenants/foo/jobs/1234".
	//
	// Tenant id is optional and the default tenant is used if unspecified, for
	// example, "projects/api-test-project/jobs/1234".
	//
	// Use of this field in job queries and API calls is preferred over the use of
	// [requisition_id][google.cloud.talent.v4beta1.Job.requisition_id] since this
	// value is unique.
	Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
	// Required.
	//
	// The resource name of the company listing the job.
	//
	// The format is
	// "projects/{project_id}/tenants/{tenant_id}/companies/{company_id}", for
	// example, "projects/api-test-project/tenants/foo/companies/bar".
	//
	// Tenant id is optional and the default tenant is used if unspecified, for
	// example, "projects/api-test-project/companies/bar".
	Company string `protobuf:"bytes,2,opt,name=company,proto3" json:"company,omitempty"`
	// Required.
	//
	// The requisition ID, also referred to as the posting ID, is assigned by the
	// client to identify a job. This field is intended to be used by clients
	// for client identification and tracking of postings. A job isn't allowed
	// to be created if there is another job with the same
	// [company][google.cloud.talent.v4beta1.Job.name],
	// [language_code][google.cloud.talent.v4beta1.Job.language_code] and
	// [requisition_id][google.cloud.talent.v4beta1.Job.requisition_id].
	//
	// The maximum number of allowed characters is 255.
	RequisitionId string `protobuf:"bytes,3,opt,name=requisition_id,json=requisitionId,proto3" json:"requisition_id,omitempty"`
	// Required.
	//
	// The title of the job, such as "Software Engineer"
	//
	// The maximum number of allowed characters is 500.
	Title string `protobuf:"bytes,4,opt,name=title,proto3" json:"title,omitempty"`
	// Required.
	//
	// The description of the job, which typically includes a multi-paragraph
	// description of the company and related information. Separate fields are
	// provided on the job object for
	// [responsibilities][google.cloud.talent.v4beta1.Job.responsibilities],
	// [qualifications][google.cloud.talent.v4beta1.Job.qualifications], and other
	// job characteristics. Use of these separate job fields is recommended.
	//
	// This field accepts and sanitizes HTML input, and also accepts
	// bold, italic, ordered list, and unordered list markup tags.
	//
	// The maximum number of allowed characters is 100,000.
	Description string `protobuf:"bytes,5,opt,name=description,proto3" json:"description,omitempty"`
	// Optional but strongly recommended for the best service experience.
	//
	// Location(s) where the employer is looking to hire for this job posting.
	//
	// Specifying the full street address(es) of the hiring location enables
	// better API results, especially job searches by commute time.
	//
	// At most 50 locations are allowed for best search performance. If a job has
	// more locations, it is suggested to split it into multiple jobs with unique
	// [requisition_id][google.cloud.talent.v4beta1.Job.requisition_id]s (e.g.
	// 'ReqA' becomes 'ReqA-1', 'ReqA-2', etc.) as multiple jobs with the same
	// [company][google.cloud.talent.v4beta1.Job.name][], [language_code][] and
	// [requisition_id][google.cloud.talent.v4beta1.Job.requisition_id] are not
	// allowed. If the original
	// [requisition_id][google.cloud.talent.v4beta1.Job.requisition_id] must be
	// preserved, a custom field should be used for storage. It is also suggested
	// to group the locations that close to each other in the same job for better
	// search experience.
	//
	// The maximum number of allowed characters is 500.
	Addresses []string `protobuf:"bytes,6,rep,name=addresses,proto3" json:"addresses,omitempty"`
	// Required. At least one field within
	// [ApplicationInfo][google.cloud.talent.v4beta1.Job.ApplicationInfo] must be
	// specified.
	//
	// Job application information.
	ApplicationInfo *Job_ApplicationInfo `protobuf:"bytes,7,opt,name=application_info,json=applicationInfo,proto3" json:"application_info,omitempty"`
	// Optional.
	//
	// The benefits included with the job.
	JobBenefits []JobBenefit `protobuf:"varint,8,rep,packed,name=job_benefits,json=jobBenefits,proto3,enum=google.cloud.talent.v4beta1.JobBenefit" json:"job_benefits,omitempty"`
	// Optional.
	//
	// Job compensation information (a.k.a. "pay rate") i.e., the compensation
	// that will paid to the employee.
	CompensationInfo *CompensationInfo `protobuf:"bytes,9,opt,name=compensation_info,json=compensationInfo,proto3" json:"compensation_info,omitempty"`
	// Optional.
	//
	// A map of fields to hold both filterable and non-filterable custom job
	// attributes that are not covered by the provided structured fields.
	//
	// The keys of the map are strings up to 64 bytes and must match the
	// pattern: [a-zA-Z][a-zA-Z0-9_]*. For example, key0LikeThis or
	// KEY_1_LIKE_THIS.
	//
	// At most 100 filterable and at most 100 unfilterable keys are supported.
	// For filterable `string_values`, across all keys at most 200 values are
	// allowed, with each string no more than 255 characters. For unfilterable
	// `string_values`, the maximum total size of `string_values` across all keys
	// is 50KB.
	CustomAttributes map[string]*CustomAttribute `protobuf:"bytes,10,rep,name=custom_attributes,json=customAttributes,proto3" json:"custom_attributes,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"`
	// Optional.
	//
	// The desired education degrees for the job, such as Bachelors, Masters.
	DegreeTypes []DegreeType `protobuf:"varint,11,rep,packed,name=degree_types,json=degreeTypes,proto3,enum=google.cloud.talent.v4beta1.DegreeType" json:"degree_types,omitempty"`
	// Optional.
	//
	// The department or functional area within the company with the open
	// position.
	//
	// The maximum number of allowed characters is 255.
	Department string `protobuf:"bytes,12,opt,name=department,proto3" json:"department,omitempty"`
	// Optional.
	//
	// The employment type(s) of a job, for example,
	// [full time][google.cloud.talent.v4beta1.EmploymentType.FULL_TIME] or
	// [part time][google.cloud.talent.v4beta1.EmploymentType.PART_TIME].
	EmploymentTypes []EmploymentType `protobuf:"varint,13,rep,packed,name=employment_types,json=employmentTypes,proto3,enum=google.cloud.talent.v4beta1.EmploymentType" json:"employment_types,omitempty"`
	// Optional.
	//
	// A description of bonus, commission, and other compensation
	// incentives associated with the job not including salary or pay.
	//
	// The maximum number of allowed characters is 10,000.
	Incentives string `protobuf:"bytes,14,opt,name=incentives,proto3" json:"incentives,omitempty"`
	// Optional.
	//
	// The language of the posting. This field is distinct from
	// any requirements for fluency that are associated with the job.
	//
	// Language codes must be in BCP-47 format, such as "en-US" or "sr-Latn".
	// For more information, see
	// [Tags for Identifying Languages](https://tools.ietf.org/html/bcp47){:
	// class="external" target="_blank" }.
	//
	// If this field is unspecified and
	// [Job.description][google.cloud.talent.v4beta1.Job.description] is present,
	// detected language code based on
	// [Job.description][google.cloud.talent.v4beta1.Job.description] is assigned,
	// otherwise defaults to 'en_US'.
	LanguageCode string `protobuf:"bytes,15,opt,name=language_code,json=languageCode,proto3" json:"language_code,omitempty"`
	// Optional.
	//
	// The experience level associated with the job, such as "Entry Level".
	JobLevel JobLevel `protobuf:"varint,16,opt,name=job_level,json=jobLevel,proto3,enum=google.cloud.talent.v4beta1.JobLevel" json:"job_level,omitempty"`
	// Optional.
	//
	// A promotion value of the job, as determined by the client.
	// The value determines the sort order of the jobs returned when searching for
	// jobs using the featured jobs search call, with higher promotional values
	// being returned first and ties being resolved by relevance sort. Only the
	// jobs with a promotionValue >0 are returned in a FEATURED_JOB_SEARCH.
	//
	// Default value is 0, and negative values are treated as 0.
	PromotionValue int32 `protobuf:"varint,17,opt,name=promotion_value,json=promotionValue,proto3" json:"promotion_value,omitempty"`
	// Optional.
	//
	// A description of the qualifications required to perform the
	// job. The use of this field is recommended
	// as an alternative to using the more general
	// [description][google.cloud.talent.v4beta1.Job.description] field.
	//
	// This field accepts and sanitizes HTML input, and also accepts
	// bold, italic, ordered list, and unordered list markup tags.
	//
	// The maximum number of allowed characters is 10,000.
	Qualifications string `protobuf:"bytes,18,opt,name=qualifications,proto3" json:"qualifications,omitempty"`
	// Optional.
	//
	// A description of job responsibilities. The use of this field is
	// recommended as an alternative to using the more general
	// [description][google.cloud.talent.v4beta1.Job.description] field.
	//
	// This field accepts and sanitizes HTML input, and also accepts
	// bold, italic, ordered list, and unordered list markup tags.
	//
	// The maximum number of allowed characters is 10,000.
	Responsibilities string `protobuf:"bytes,19,opt,name=responsibilities,proto3" json:"responsibilities,omitempty"`
	// Optional.
	//
	// The job [PostingRegion][google.cloud.talent.v4beta1.PostingRegion] (for
	// example, state, country) throughout which the job is available. If this
	// field is set, a
	// [LocationFilter][google.cloud.talent.v4beta1.LocationFilter] in a search
	// query within the job region finds this job posting if an exact location
	// match isn't specified. If this field is set to
	// [PostingRegion.NATION][google.cloud.talent.v4beta1.PostingRegion.NATION] or
	// [PostingRegion.ADMINISTRATIVE_AREA][google.cloud.talent.v4beta1.PostingRegion.ADMINISTRATIVE_AREA],
	// setting job [Job.addresses][google.cloud.talent.v4beta1.Job.addresses] to
	// the same location level as this field is strongly recommended.
	PostingRegion PostingRegion `protobuf:"varint,20,opt,name=posting_region,json=postingRegion,proto3,enum=google.cloud.talent.v4beta1.PostingRegion" json:"posting_region,omitempty"`
	// Optional.
	//
	// The visibility of the job.
	//
	// Defaults to
	// [Visibility.ACCOUNT_ONLY][google.cloud.talent.v4beta1.Visibility.ACCOUNT_ONLY]
	// if not specified.
	Visibility Visibility `protobuf:"varint,21,opt,name=visibility,proto3,enum=google.cloud.talent.v4beta1.Visibility" json:"visibility,omitempty"`
	// Optional.
	//
	// The start timestamp of the job in UTC time zone. Typically this field
	// is used for contracting engagements. Invalid timestamps are ignored.
	JobStartTime *timestamp.Timestamp `protobuf:"bytes,22,opt,name=job_start_time,json=jobStartTime,proto3" json:"job_start_time,omitempty"`
	// Optional.
	//
	// The end timestamp of the job. Typically this field is used for contracting
	// engagements. Invalid timestamps are ignored.
	JobEndTime *timestamp.Timestamp `protobuf:"bytes,23,opt,name=job_end_time,json=jobEndTime,proto3" json:"job_end_time,omitempty"`
	// Optional.
	//
	// The timestamp this job posting was most recently published. The default
	// value is the time the request arrives at the server. Invalid timestamps are
	// ignored.
	PostingPublishTime *timestamp.Timestamp `protobuf:"bytes,24,opt,name=posting_publish_time,json=postingPublishTime,proto3" json:"posting_publish_time,omitempty"`
	// Optional but strongly recommended for the best service
	// experience.
	//
	// The expiration timestamp of the job. After this timestamp, the
	// job is marked as expired, and it no longer appears in search results. The
	// expired job can't be deleted or listed by the [DeleteJob][] and
	// [ListJobs][] APIs, but it can be retrieved with the [GetJob][] API or
	// updated with the [UpdateJob][] API. An expired job can be updated and
	// opened again by using a future expiration timestamp. Updating an expired
	// job fails if there is another existing open job with same
	// [company][google.cloud.talent.v4beta1.Job.name][], [language_code][] and
	// [requisition_id][google.cloud.talent.v4beta1.Job.requisition_id].
	//
	// The expired jobs are retained in our system for 90 days. However, the
	// overall expired job count cannot exceed 3 times the maximum of open jobs
	// count over the past week, otherwise jobs with earlier expire time are
	// cleaned first. Expired jobs are no longer accessible after they are cleaned
	// out.
	//
	// Invalid timestamps are ignored, and treated as expire time not provided.
	//
	// Timestamp before the instant request is made is considered valid, the job
	// will be treated as expired immediately.
	//
	// If this value isn't provided at the time of job creation or is invalid,
	// the job posting expires after 30 days from the job's creation time. For
	// example, if the job was created on 2017/01/01 13:00AM UTC with an
	// unspecified expiration date, the job expires after 2017/01/31 13:00AM UTC.
	//
	// If this value isn't provided on job update, it depends on the field masks
	// set by
	// [UpdateJobRequest.update_mask][google.cloud.talent.v4beta1.UpdateJobRequest.update_mask].
	// If the field masks include [expiry_time][], or the masks are empty meaning
	// that every field is updated, the job posting expires after 30 days from the
	// job's last update time. Otherwise the expiration date isn't updated.
	PostingExpireTime *timestamp.Timestamp `protobuf:"bytes,25,opt,name=posting_expire_time,json=postingExpireTime,proto3" json:"posting_expire_time,omitempty"`
	// Output only. The timestamp when this job posting was created.
	PostingCreateTime *timestamp.Timestamp `protobuf:"bytes,26,opt,name=posting_create_time,json=postingCreateTime,proto3" json:"posting_create_time,omitempty"`
	// Output only. The timestamp when this job posting was last updated.
	PostingUpdateTime *timestamp.Timestamp `protobuf:"bytes,27,opt,name=posting_update_time,json=postingUpdateTime,proto3" json:"posting_update_time,omitempty"`
	// Output only. Display name of the company listing the job.
	CompanyDisplayName string `protobuf:"bytes,28,opt,name=company_display_name,json=companyDisplayName,proto3" json:"company_display_name,omitempty"`
	// Output only. Derived details about the job posting.
	DerivedInfo *Job_DerivedInfo `protobuf:"bytes,29,opt,name=derived_info,json=derivedInfo,proto3" json:"derived_info,omitempty"`
	// Optional.
	//
	// Options for job processing.
	ProcessingOptions    *Job_ProcessingOptions `protobuf:"bytes,30,opt,name=processing_options,json=processingOptions,proto3" json:"processing_options,omitempty"`
	XXX_NoUnkeyedLiteral struct{}               `json:"-"`
	XXX_unrecognized     []byte                 `json:"-"`
	XXX_sizecache        int32                  `json:"-"`
}

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

var xxx_messageInfo_Job proto.InternalMessageInfo

func (m *Job) GetName() string {
	if m != nil {
		return m.Name
	}
	return ""
}

func (m *Job) GetCompany() string {
	if m != nil {
		return m.Company
	}
	return ""
}

func (m *Job) GetRequisitionId() string {
	if m != nil {
		return m.RequisitionId
	}
	return ""
}

func (m *Job) GetTitle() string {
	if m != nil {
		return m.Title
	}
	return ""
}

func (m *Job) GetDescription() string {
	if m != nil {
		return m.Description
	}
	return ""
}

func (m *Job) GetAddresses() []string {
	if m != nil {
		return m.Addresses
	}
	return nil
}

func (m *Job) GetApplicationInfo() *Job_ApplicationInfo {
	if m != nil {
		return m.ApplicationInfo
	}
	return nil
}

func (m *Job) GetJobBenefits() []JobBenefit {
	if m != nil {
		return m.JobBenefits
	}
	return nil
}

func (m *Job) GetCompensationInfo() *CompensationInfo {
	if m != nil {
		return m.CompensationInfo
	}
	return nil
}

func (m *Job) GetCustomAttributes() map[string]*CustomAttribute {
	if m != nil {
		return m.CustomAttributes
	}
	return nil
}

func (m *Job) GetDegreeTypes() []DegreeType {
	if m != nil {
		return m.DegreeTypes
	}
	return nil
}

func (m *Job) GetDepartment() string {
	if m != nil {
		return m.Department
	}
	return ""
}

func (m *Job) GetEmploymentTypes() []EmploymentType {
	if m != nil {
		return m.EmploymentTypes
	}
	return nil
}

func (m *Job) GetIncentives() string {
	if m != nil {
		return m.Incentives
	}
	return ""
}

func (m *Job) GetLanguageCode() string {
	if m != nil {
		return m.LanguageCode
	}
	return ""
}

func (m *Job) GetJobLevel() JobLevel {
	if m != nil {
		return m.JobLevel
	}
	return JobLevel_JOB_LEVEL_UNSPECIFIED
}

func (m *Job) GetPromotionValue() int32 {
	if m != nil {
		return m.PromotionValue
	}
	return 0
}

func (m *Job) GetQualifications() string {
	if m != nil {
		return m.Qualifications
	}
	return ""
}

func (m *Job) GetResponsibilities() string {
	if m != nil {
		return m.Responsibilities
	}
	return ""
}

func (m *Job) GetPostingRegion() PostingRegion {
	if m != nil {
		return m.PostingRegion
	}
	return PostingRegion_POSTING_REGION_UNSPECIFIED
}

func (m *Job) GetVisibility() Visibility {
	if m != nil {
		return m.Visibility
	}
	return Visibility_VISIBILITY_UNSPECIFIED
}

func (m *Job) GetJobStartTime() *timestamp.Timestamp {
	if m != nil {
		return m.JobStartTime
	}
	return nil
}

func (m *Job) GetJobEndTime() *timestamp.Timestamp {
	if m != nil {
		return m.JobEndTime
	}
	return nil
}

func (m *Job) GetPostingPublishTime() *timestamp.Timestamp {
	if m != nil {
		return m.PostingPublishTime
	}
	return nil
}

func (m *Job) GetPostingExpireTime() *timestamp.Timestamp {
	if m != nil {
		return m.PostingExpireTime
	}
	return nil
}

func (m *Job) GetPostingCreateTime() *timestamp.Timestamp {
	if m != nil {
		return m.PostingCreateTime
	}
	return nil
}

func (m *Job) GetPostingUpdateTime() *timestamp.Timestamp {
	if m != nil {
		return m.PostingUpdateTime
	}
	return nil
}

func (m *Job) GetCompanyDisplayName() string {
	if m != nil {
		return m.CompanyDisplayName
	}
	return ""
}

func (m *Job) GetDerivedInfo() *Job_DerivedInfo {
	if m != nil {
		return m.DerivedInfo
	}
	return nil
}

func (m *Job) GetProcessingOptions() *Job_ProcessingOptions {
	if m != nil {
		return m.ProcessingOptions
	}
	return nil
}

// Application related details of a job posting.
type Job_ApplicationInfo struct {
	// Optional but at least one of
	// [uris][google.cloud.talent.v4beta1.Job.ApplicationInfo.uris],
	// [emails][google.cloud.talent.v4beta1.Job.ApplicationInfo.emails] or
	// [instruction][google.cloud.talent.v4beta1.Job.ApplicationInfo.instruction]
	// must be specified.
	//
	// Use this field to specify email address(es) to which resumes or
	// applications can be sent.
	//
	// The maximum number of allowed characters for each entry is 255.
	Emails []string `protobuf:"bytes,1,rep,name=emails,proto3" json:"emails,omitempty"`
	// Optional but at least one of
	// [uris][google.cloud.talent.v4beta1.Job.ApplicationInfo.uris],
	// [emails][google.cloud.talent.v4beta1.Job.ApplicationInfo.emails] or
	// [instruction][google.cloud.talent.v4beta1.Job.ApplicationInfo.instruction]
	// must be specified.
	//
	// Use this field to provide instructions, such as "Mail your application
	// to ...", that a candidate can follow to apply for the job.
	//
	// This field accepts and sanitizes HTML input, and also accepts
	// bold, italic, ordered list, and unordered list markup tags.
	//
	// The maximum number of allowed characters is 3,000.
	Instruction string `protobuf:"bytes,2,opt,name=instruction,proto3" json:"instruction,omitempty"`
	// Optional but at least one of
	// [uris][google.cloud.talent.v4beta1.Job.ApplicationInfo.uris],
	// [emails][google.cloud.talent.v4beta1.Job.ApplicationInfo.emails] or
	// [instruction][google.cloud.talent.v4beta1.Job.ApplicationInfo.instruction]
	// must be specified.
	//
	// Use this URI field to direct an applicant to a website, for example to
	// link to an online application form.
	//
	// The maximum number of allowed characters for each entry is 2,000.
	Uris                 []string `protobuf:"bytes,3,rep,name=uris,proto3" json:"uris,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

var xxx_messageInfo_Job_ApplicationInfo proto.InternalMessageInfo

func (m *Job_ApplicationInfo) GetEmails() []string {
	if m != nil {
		return m.Emails
	}
	return nil
}

func (m *Job_ApplicationInfo) GetInstruction() string {
	if m != nil {
		return m.Instruction
	}
	return ""
}

func (m *Job_ApplicationInfo) GetUris() []string {
	if m != nil {
		return m.Uris
	}
	return nil
}

// Output only.
//
// Derived details about the job posting.
type Job_DerivedInfo struct {
	// Structured locations of the job, resolved from
	// [Job.addresses][google.cloud.talent.v4beta1.Job.addresses].
	//
	// [locations][google.cloud.talent.v4beta1.Job.DerivedInfo.locations] are
	// exactly matched to
	// [Job.addresses][google.cloud.talent.v4beta1.Job.addresses] in the same
	// order.
	Locations []*Location `protobuf:"bytes,1,rep,name=locations,proto3" json:"locations,omitempty"`
	// Job categories derived from
	// [Job.title][google.cloud.talent.v4beta1.Job.title] and
	// [Job.description][google.cloud.talent.v4beta1.Job.description].
	JobCategories        []JobCategory `protobuf:"varint,3,rep,packed,name=job_categories,json=jobCategories,proto3,enum=google.cloud.talent.v4beta1.JobCategory" json:"job_categories,omitempty"`
	XXX_NoUnkeyedLiteral struct{}      `json:"-"`
	XXX_unrecognized     []byte        `json:"-"`
	XXX_sizecache        int32         `json:"-"`
}

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

var xxx_messageInfo_Job_DerivedInfo proto.InternalMessageInfo

func (m *Job_DerivedInfo) GetLocations() []*Location {
	if m != nil {
		return m.Locations
	}
	return nil
}

func (m *Job_DerivedInfo) GetJobCategories() []JobCategory {
	if m != nil {
		return m.JobCategories
	}
	return nil
}

// Input only.
//
// Options for job processing.
type Job_ProcessingOptions struct {
	// Optional.
	//
	// If set to `true`, the service does not attempt to resolve a
	// more precise address for the job.
	DisableStreetAddressResolution bool `protobuf:"varint,1,opt,name=disable_street_address_resolution,json=disableStreetAddressResolution,proto3" json:"disable_street_address_resolution,omitempty"`
	// Optional.
	//
	// Option for job HTML content sanitization. Applied fields are:
	//
	// * description
	// * applicationInfo.instruction
	// * incentives
	// * qualifications
	// * responsibilities
	//
	// HTML tags in these fields may be stripped if sanitiazation isn't
	// disabled.
	//
	// Defaults to
	// [HtmlSanitization.SIMPLE_FORMATTING_ONLY][google.cloud.talent.v4beta1.HtmlSanitization.SIMPLE_FORMATTING_ONLY].
	HtmlSanitization     HtmlSanitization `protobuf:"varint,2,opt,name=html_sanitization,json=htmlSanitization,proto3,enum=google.cloud.talent.v4beta1.HtmlSanitization" json:"html_sanitization,omitempty"`
	XXX_NoUnkeyedLiteral struct{}         `json:"-"`
	XXX_unrecognized     []byte           `json:"-"`
	XXX_sizecache        int32            `json:"-"`
}

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

var xxx_messageInfo_Job_ProcessingOptions proto.InternalMessageInfo

func (m *Job_ProcessingOptions) GetDisableStreetAddressResolution() bool {
	if m != nil {
		return m.DisableStreetAddressResolution
	}
	return false
}

func (m *Job_ProcessingOptions) GetHtmlSanitization() HtmlSanitization {
	if m != nil {
		return m.HtmlSanitization
	}
	return HtmlSanitization_HTML_SANITIZATION_UNSPECIFIED
}

func init() {
	proto.RegisterType((*Job)(nil), "google.cloud.talent.v4beta1.Job")
	proto.RegisterMapType((map[string]*CustomAttribute)(nil), "google.cloud.talent.v4beta1.Job.CustomAttributesEntry")
	proto.RegisterType((*Job_ApplicationInfo)(nil), "google.cloud.talent.v4beta1.Job.ApplicationInfo")
	proto.RegisterType((*Job_DerivedInfo)(nil), "google.cloud.talent.v4beta1.Job.DerivedInfo")
	proto.RegisterType((*Job_ProcessingOptions)(nil), "google.cloud.talent.v4beta1.Job.ProcessingOptions")
}

func init() {
	proto.RegisterFile("google/cloud/talent/v4beta1/job.proto", fileDescriptor_job_dd120b625d7d4d44)
}

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


<|start_filename|>vendor/github.com/goph/emperror/handler/bugsnaghandler/handler.go<|end_filename|>
// Package bugsnaghandler provides Bugsnag integration.
package bugsnaghandler

import (
	"reflect"

	"github.com/bugsnag/bugsnag-go"
	"github.com/pkg/errors"

	"github.com/goph/emperror"
	"github.com/goph/emperror/internal/keyvals"
)

// Handler is responsible for sending errors to Bugsnag.
type Handler struct {
	notifier *bugsnag.Notifier
}

// New creates a new handler.
func New(apiKey string) *Handler {
	return NewFromNotifier(bugsnag.New(bugsnag.Configuration{
		APIKey: apiKey,
	}))
}

// NewFromNotifier creates a new handler from an existing notifier instance.
func NewFromNotifier(notifier *bugsnag.Notifier) *Handler {
	return &Handler{
		notifier: notifier,
	}
}

// Handle sends the error to Bugsnag.
func (h *Handler) Handle(err error) {
	// Expose the stackTracer interface on the outer error (if there is stack trace in the error)
	// Convert error with stack trace to an internal error type
	if e, ok := emperror.ExposeStackTrace(err).(stackTracer); ok {
		err = newErrorWithStackFrames(e)
	}

	var rawData []interface{}

	if cause := errors.Cause(err); cause != nil {
		if name := reflect.TypeOf(cause).String(); len(name) > 0 {
			errorClass := bugsnag.ErrorClass{Name: name}

			rawData = append(rawData, errorClass)
		}
	}

	if ctx := emperror.Context(err); len(ctx) > 0 {
		rawData = append(rawData, bugsnag.MetaData{
			"Params": keyvals.ToMap(ctx),
		})
	}

	_ = h.notifier.Notify(err, rawData...)
}


<|start_filename|>vendor/github.com/goph/emperror/handler_noop.go<|end_filename|>
package emperror

type noopHandler struct{}

// NewNoopHandler creates a no-op error handler that discards all received errors.
// Useful in examples and as a fallback error handler.
func NewNoopHandler() Handler {
	return &noopHandler{}
}

func (*noopHandler) Handle(err error) {}


<|start_filename|>vendor/github.com/goph/emperror/emperror.go<|end_filename|>
// Package emperror provides error handling solutions and tools for libraries and applications.
package emperror
