// Copyright 2017 Google Inc.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

// Code generated by protoc-gen-go. DO NOT EDIT.
// versions:
// 	protoc-gen-go v1.22.0
// 	protoc        v3.11.2
// source: google/api/servicecontrol/v1/check_error.proto

package servicecontrol

import (
	reflect "reflect"
	sync "sync"

	proto "github.com/golang/protobuf/proto"
	_ "google.golang.org/genproto/googleapis/api/annotations"
	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
)

const (
	// Verify that this generated code is sufficiently up-to-date.
	_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
	// Verify that runtime/protoimpl is sufficiently up-to-date.
	_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
)

// This is a compile-time assertion that a sufficiently up-to-date version
// of the legacy proto package is being used.
const _ = proto.ProtoPackageIsVersion4

// Error codes for Check responses.
type CheckError_Code int32

const (
	// This is never used in `CheckResponse`.
	CheckError_ERROR_CODE_UNSPECIFIED CheckError_Code = 0
	// The consumer's project id, network container, or resource container was
	// not found. Same as [google.rpc.Code.NOT_FOUND][].
	CheckError_NOT_FOUND CheckError_Code = 5
	// The consumer doesn't have access to the specified resource.
	// Same as [google.rpc.Code.PERMISSION_DENIED][].
	CheckError_PERMISSION_DENIED CheckError_Code = 7
	// Quota check failed. Same as [google.rpc.Code.RESOURCE_EXHAUSTED][].
	CheckError_RESOURCE_EXHAUSTED CheckError_Code = 8
	// The consumer has been flagged as an abuser.
	CheckError_ABUSER_DETECTED CheckError_Code = 103
	// The consumer hasn't activated the service.
	CheckError_SERVICE_NOT_ACTIVATED CheckError_Code = 104
	// The consumer cannot access the service because billing is disabled.
	CheckError_BILLING_DISABLED CheckError_Code = 107
	// The consumer's project has been marked as deleted (soft deletion).
	CheckError_PROJECT_DELETED CheckError_Code = 108
	// The consumer's project number or id does not represent a valid project.
	CheckError_PROJECT_INVALID CheckError_Code = 114
	// The IP address of the consumer is invalid for the specific consumer
	// project.
	CheckError_IP_ADDRESS_BLOCKED CheckError_Code = 109
	// The referer address of the consumer request is invalid for the specific
	// consumer project.
	CheckError_REFERER_BLOCKED CheckError_Code = 110
	// The client application of the consumer request is invalid for the
	// specific consumer project.
	CheckError_CLIENT_APP_BLOCKED CheckError_Code = 111
	// The API targeted by this request is invalid for the specified consumer
	// project.
	CheckError_API_TARGET_BLOCKED CheckError_Code = 122
	// The consumer's API key is invalid.
	CheckError_API_KEY_INVALID CheckError_Code = 105
	// The consumer's API Key has expired.
	CheckError_API_KEY_EXPIRED CheckError_Code = 112
	// The consumer's API Key was not found in config record.
	CheckError_API_KEY_NOT_FOUND CheckError_Code = 113
	// Request is not allowed as per security policies defined in Org Policy.
	CheckError_SECURITY_POLICY_VIOLATED CheckError_Code = 121
	// The credential in the request can not be verified.
	CheckError_INVALID_CREDENTIAL CheckError_Code = 123
	// Request is not allowed as per location policies defined in Org Policy.
	CheckError_LOCATION_POLICY_VIOLATED CheckError_Code = 124
	// The input consumer info does not represent a valid consumer folder or
	// organization.
	CheckError_CONSUMER_INVALID CheckError_Code = 125
	// The backend server for looking up project id/number is unavailable.
	CheckError_NAMESPACE_LOOKUP_UNAVAILABLE CheckError_Code = 300
	// The backend server for checking service status is unavailable.
	CheckError_SERVICE_STATUS_UNAVAILABLE CheckError_Code = 301
	// The backend server for checking billing status is unavailable.
	CheckError_BILLING_STATUS_UNAVAILABLE CheckError_Code = 302
	// The backend server for checking quota limits is unavailable.
	CheckError_QUOTA_CHECK_UNAVAILABLE CheckError_Code = 303
	// Cloud Resource Manager backend server is unavailable.
	CheckError_CLOUD_RESOURCE_MANAGER_BACKEND_UNAVAILABLE CheckError_Code = 305
	// Backend server for evaluating security policy is unavailable.
	CheckError_SECURITY_POLICY_BACKEND_UNAVAILABLE CheckError_Code = 306
	// Backend server for evaluating location policy is unavailable.
	CheckError_LOCATION_POLICY_BACKEND_UNAVAILABLE CheckError_Code = 307
)

// Enum value maps for CheckError_Code.
var (
	CheckError_Code_name = map[int32]string{
		0:   "ERROR_CODE_UNSPECIFIED",
		5:   "NOT_FOUND",
		7:   "PERMISSION_DENIED",
		8:   "RESOURCE_EXHAUSTED",
		103: "ABUSER_DETECTED",
		104: "SERVICE_NOT_ACTIVATED",
		107: "BILLING_DISABLED",
		108: "PROJECT_DELETED",
		114: "PROJECT_INVALID",
		109: "IP_ADDRESS_BLOCKED",
		110: "REFERER_BLOCKED",
		111: "CLIENT_APP_BLOCKED",
		122: "API_TARGET_BLOCKED",
		105: "API_KEY_INVALID",
		112: "API_KEY_EXPIRED",
		113: "API_KEY_NOT_FOUND",
		121: "SECURITY_POLICY_VIOLATED",
		123: "INVALID_CREDENTIAL",
		124: "LOCATION_POLICY_VIOLATED",
		125: "CONSUMER_INVALID",
		300: "NAMESPACE_LOOKUP_UNAVAILABLE",
		301: "SERVICE_STATUS_UNAVAILABLE",
		302: "BILLING_STATUS_UNAVAILABLE",
		303: "QUOTA_CHECK_UNAVAILABLE",
		305: "CLOUD_RESOURCE_MANAGER_BACKEND_UNAVAILABLE",
		306: "SECURITY_POLICY_BACKEND_UNAVAILABLE",
		307: "LOCATION_POLICY_BACKEND_UNAVAILABLE",
	}
	CheckError_Code_value = map[string]int32{
		"ERROR_CODE_UNSPECIFIED":                     0,
		"NOT_FOUND":                                  5,
		"PERMISSION_DENIED":                          7,
		"RESOURCE_EXHAUSTED":                         8,
		"ABUSER_DETECTED":                            103,
		"SERVICE_NOT_ACTIVATED":                      104,
		"BILLING_DISABLED":                           107,
		"PROJECT_DELETED":                            108,
		"PROJECT_INVALID":                            114,
		"IP_ADDRESS_BLOCKED":                         109,
		"REFERER_BLOCKED":                            110,
		"CLIENT_APP_BLOCKED":                         111,
		"API_TARGET_BLOCKED":                         122,
		"API_KEY_INVALID":                            105,
		"API_KEY_EXPIRED":                            112,
		"API_KEY_NOT_FOUND":                          113,
		"SECURITY_POLICY_VIOLATED":                   121,
		"INVALID_CREDENTIAL":                         123,
		"LOCATION_POLICY_VIOLATED":                   124,
		"CONSUMER_INVALID":                           125,
		"NAMESPACE_LOOKUP_UNAVAILABLE":               300,
		"SERVICE_STATUS_UNAVAILABLE":                 301,
		"BILLING_STATUS_UNAVAILABLE":                 302,
		"QUOTA_CHECK_UNAVAILABLE":                    303,
		"CLOUD_RESOURCE_MANAGER_BACKEND_UNAVAILABLE": 305,
		"SECURITY_POLICY_BACKEND_UNAVAILABLE":        306,
		"LOCATION_POLICY_BACKEND_UNAVAILABLE":        307,
	}
)

func (x CheckError_Code) Enum() *CheckError_Code {
	p := new(CheckError_Code)
	*p = x
	return p
}

func (x CheckError_Code) String() string {
	return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
}

func (CheckError_Code) Descriptor() protoreflect.EnumDescriptor {
	return file_google_api_servicecontrol_v1_check_error_proto_enumTypes[0].Descriptor()
}

func (CheckError_Code) Type() protoreflect.EnumType {
	return &file_google_api_servicecontrol_v1_check_error_proto_enumTypes[0]
}

func (x CheckError_Code) Number() protoreflect.EnumNumber {
	return protoreflect.EnumNumber(x)
}

// Deprecated: Use CheckError_Code.Descriptor instead.
func (CheckError_Code) EnumDescriptor() ([]byte, []int) {
	return file_google_api_servicecontrol_v1_check_error_proto_rawDescGZIP(), []int{0, 0}
}

// Defines the errors to be returned in
// [google.api.servicecontrol.v1.CheckResponse.check_errors][google.api.servicecontrol.v1.CheckResponse.check_errors].
type CheckError struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// The error code.
	Code CheckError_Code `protobuf:"varint,1,opt,name=code,proto3,enum=google.api.servicecontrol.v1.CheckError_Code" json:"code,omitempty"`
	// Free-form text providing details on the error cause of the error.
	Detail string `protobuf:"bytes,2,opt,name=detail,proto3" json:"detail,omitempty"`
}

func (x *CheckError) Reset() {
	*x = CheckError{}
	if protoimpl.UnsafeEnabled {
		mi := &file_google_api_servicecontrol_v1_check_error_proto_msgTypes[0]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *CheckError) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*CheckError) ProtoMessage() {}

func (x *CheckError) ProtoReflect() protoreflect.Message {
	mi := &file_google_api_servicecontrol_v1_check_error_proto_msgTypes[0]
	if protoimpl.UnsafeEnabled && x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use CheckError.ProtoReflect.Descriptor instead.
func (*CheckError) Descriptor() ([]byte, []int) {
	return file_google_api_servicecontrol_v1_check_error_proto_rawDescGZIP(), []int{0}
}

func (x *CheckError) GetCode() CheckError_Code {
	if x != nil {
		return x.Code
	}
	return CheckError_ERROR_CODE_UNSPECIFIED
}

func (x *CheckError) GetDetail() string {
	if x != nil {
		return x.Detail
	}
	return ""
}

var File_google_api_servicecontrol_v1_check_error_proto protoreflect.FileDescriptor

var file_google_api_servicecontrol_v1_check_error_proto_rawDesc = []byte{
	0x0a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x73, 0x65, 0x72,
	0x76, 0x69, 0x63, 0x65, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2f, 0x76, 0x31, 0x2f, 0x63,
	0x68, 0x65, 0x63, 0x6b, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f,
	0x12, 0x1c, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x73, 0x65, 0x72,
	0x76, 0x69, 0x63, 0x65, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x76, 0x31, 0x1a, 0x1c,
	0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x61, 0x6e, 0x6e, 0x6f, 0x74,
	0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xca, 0x06, 0x0a,
	0x0a, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x41, 0x0a, 0x04, 0x63,
	0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2d, 0x2e, 0x67, 0x6f, 0x6f, 0x67,
	0x6c, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x63, 0x6f,
	0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x45, 0x72,
	0x72, 0x6f, 0x72, 0x2e, 0x43, 0x6f, 0x64, 0x65, 0x52, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x12, 0x16,
	0x0a, 0x06, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06,
	0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x22, 0xe0, 0x05, 0x0a, 0x04, 0x43, 0x6f, 0x64, 0x65, 0x12,
	0x1a, 0x0a, 0x16, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x43, 0x4f, 0x44, 0x45, 0x5f, 0x55, 0x4e,
	0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x0d, 0x0a, 0x09, 0x4e,
	0x4f, 0x54, 0x5f, 0x46, 0x4f, 0x55, 0x4e, 0x44, 0x10, 0x05, 0x12, 0x15, 0x0a, 0x11, 0x50, 0x45,
	0x52, 0x4d, 0x49, 0x53, 0x53, 0x49, 0x4f, 0x4e, 0x5f, 0x44, 0x45, 0x4e, 0x49, 0x45, 0x44, 0x10,
	0x07, 0x12, 0x16, 0x0a, 0x12, 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x45, 0x58,
	0x48, 0x41, 0x55, 0x53, 0x54, 0x45, 0x44, 0x10, 0x08, 0x12, 0x13, 0x0a, 0x0f, 0x41, 0x42, 0x55,
	0x53, 0x45, 0x52, 0x5f, 0x44, 0x45, 0x54, 0x45, 0x43, 0x54, 0x45, 0x44, 0x10, 0x67, 0x12, 0x19,
	0x0a, 0x15, 0x53, 0x45, 0x52, 0x56, 0x49, 0x43, 0x45, 0x5f, 0x4e, 0x4f, 0x54, 0x5f, 0x41, 0x43,
	0x54, 0x49, 0x56, 0x41, 0x54, 0x45, 0x44, 0x10, 0x68, 0x12, 0x14, 0x0a, 0x10, 0x42, 0x49, 0x4c,
	0x4c, 0x49, 0x4e, 0x47, 0x5f, 0x44, 0x49, 0x53, 0x41, 0x42, 0x4c, 0x45, 0x44, 0x10, 0x6b, 0x12,
	0x13, 0x0a, 0x0f, 0x50, 0x52, 0x4f, 0x4a, 0x45, 0x43, 0x54, 0x5f, 0x44, 0x45, 0x4c, 0x45, 0x54,
	0x45, 0x44, 0x10, 0x6c, 0x12, 0x13, 0x0a, 0x0f, 0x50, 0x52, 0x4f, 0x4a, 0x45, 0x43, 0x54, 0x5f,
	0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x10, 0x72, 0x12, 0x16, 0x0a, 0x12, 0x49, 0x50, 0x5f,
	0x41, 0x44, 0x44, 0x52, 0x45, 0x53, 0x53, 0x5f, 0x42, 0x4c, 0x4f, 0x43, 0x4b, 0x45, 0x44, 0x10,
	0x6d, 0x12, 0x13, 0x0a, 0x0f, 0x52, 0x45, 0x46, 0x45, 0x52, 0x45, 0x52, 0x5f, 0x42, 0x4c, 0x4f,
	0x43, 0x4b, 0x45, 0x44, 0x10, 0x6e, 0x12, 0x16, 0x0a, 0x12, 0x43, 0x4c, 0x49, 0x45, 0x4e, 0x54,
	0x5f, 0x41, 0x50, 0x50, 0x5f, 0x42, 0x4c, 0x4f, 0x43, 0x4b, 0x45, 0x44, 0x10, 0x6f, 0x12, 0x16,
	0x0a, 0x12, 0x41, 0x50, 0x49, 0x5f, 0x54, 0x41, 0x52, 0x47, 0x45, 0x54, 0x5f, 0x42, 0x4c, 0x4f,
	0x43, 0x4b, 0x45, 0x44, 0x10, 0x7a, 0x12, 0x13, 0x0a, 0x0f, 0x41, 0x50, 0x49, 0x5f, 0x4b, 0x45,
	0x59, 0x5f, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x10, 0x69, 0x12, 0x13, 0x0a, 0x0f, 0x41,
	0x50, 0x49, 0x5f, 0x4b, 0x45, 0x59, 0x5f, 0x45, 0x58, 0x50, 0x49, 0x52, 0x45, 0x44, 0x10, 0x70,
	0x12, 0x15, 0x0a, 0x11, 0x41, 0x50, 0x49, 0x5f, 0x4b, 0x45, 0x59, 0x5f, 0x4e, 0x4f, 0x54, 0x5f,
	0x46, 0x4f, 0x55, 0x4e, 0x44, 0x10, 0x71, 0x12, 0x1c, 0x0a, 0x18, 0x53, 0x45, 0x43, 0x55, 0x52,
	0x49, 0x54, 0x59, 0x5f, 0x50, 0x4f, 0x4c, 0x49, 0x43, 0x59, 0x5f, 0x56, 0x49, 0x4f, 0x4c, 0x41,
	0x54, 0x45, 0x44, 0x10, 0x79, 0x12, 0x16, 0x0a, 0x12, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44,
	0x5f, 0x43, 0x52, 0x45, 0x44, 0x45, 0x4e, 0x54, 0x49, 0x41, 0x4c, 0x10, 0x7b, 0x12, 0x1c, 0x0a,
	0x18, 0x4c, 0x4f, 0x43, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x50, 0x4f, 0x4c, 0x49, 0x43, 0x59,
	0x5f, 0x56, 0x49, 0x4f, 0x4c, 0x41, 0x54, 0x45, 0x44, 0x10, 0x7c, 0x12, 0x14, 0x0a, 0x10, 0x43,
	0x4f, 0x4e, 0x53, 0x55, 0x4d, 0x45, 0x52, 0x5f, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x10,
	0x7d, 0x12, 0x21, 0x0a, 0x1c, 0x4e, 0x41, 0x4d, 0x45, 0x53, 0x50, 0x41, 0x43, 0x45, 0x5f, 0x4c,
	0x4f, 0x4f, 0x4b, 0x55, 0x50, 0x5f, 0x55, 0x4e, 0x41, 0x56, 0x41, 0x49, 0x4c, 0x41, 0x42, 0x4c,
	0x45, 0x10, 0xac, 0x02, 0x12, 0x1f, 0x0a, 0x1a, 0x53, 0x45, 0x52, 0x56, 0x49, 0x43, 0x45, 0x5f,
	0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x55, 0x4e, 0x41, 0x56, 0x41, 0x49, 0x4c, 0x41, 0x42,
	0x4c, 0x45, 0x10, 0xad, 0x02, 0x12, 0x1f, 0x0a, 0x1a, 0x42, 0x49, 0x4c, 0x4c, 0x49, 0x4e, 0x47,
	0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x55, 0x4e, 0x41, 0x56, 0x41, 0x49, 0x4c, 0x41,
	0x42, 0x4c, 0x45, 0x10, 0xae, 0x02, 0x12, 0x1c, 0x0a, 0x17, 0x51, 0x55, 0x4f, 0x54, 0x41, 0x5f,
	0x43, 0x48, 0x45, 0x43, 0x4b, 0x5f, 0x55, 0x4e, 0x41, 0x56, 0x41, 0x49, 0x4c, 0x41, 0x42, 0x4c,
	0x45, 0x10, 0xaf, 0x02, 0x12, 0x2f, 0x0a, 0x2a, 0x43, 0x4c, 0x4f, 0x55, 0x44, 0x5f, 0x52, 0x45,
	0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x4d, 0x41, 0x4e, 0x41, 0x47, 0x45, 0x52, 0x5f, 0x42,
	0x41, 0x43, 0x4b, 0x45, 0x4e, 0x44, 0x5f, 0x55, 0x4e, 0x41, 0x56, 0x41, 0x49, 0x4c, 0x41, 0x42,
	0x4c, 0x45, 0x10, 0xb1, 0x02, 0x12, 0x28, 0x0a, 0x23, 0x53, 0x45, 0x43, 0x55, 0x52, 0x49, 0x54,
	0x59, 0x5f, 0x50, 0x4f, 0x4c, 0x49, 0x43, 0x59, 0x5f, 0x42, 0x41, 0x43, 0x4b, 0x45, 0x4e, 0x44,
	0x5f, 0x55, 0x4e, 0x41, 0x56, 0x41, 0x49, 0x4c, 0x41, 0x42, 0x4c, 0x45, 0x10, 0xb2, 0x02, 0x12,
	0x28, 0x0a, 0x23, 0x4c, 0x4f, 0x43, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x50, 0x4f, 0x4c, 0x49,
	0x43, 0x59, 0x5f, 0x42, 0x41, 0x43, 0x4b, 0x45, 0x4e, 0x44, 0x5f, 0x55, 0x4e, 0x41, 0x56, 0x41,
	0x49, 0x4c, 0x41, 0x42, 0x4c, 0x45, 0x10, 0xb3, 0x02, 0x42, 0x84, 0x01, 0x0a, 0x20, 0x63, 0x6f,
	0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x73, 0x65, 0x72,
	0x76, 0x69, 0x63, 0x65, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x76, 0x31, 0x42, 0x0f,
	0x43, 0x68, 0x65, 0x63, 0x6b, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50,
	0x01, 0x5a, 0x4a, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x67, 0x6f, 0x6c, 0x61, 0x6e, 0x67,
	0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x67, 0x65, 0x6e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x67, 0x6f,
	0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x73, 0x65, 0x72,
	0x76, 0x69, 0x63, 0x65, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2f, 0x76, 0x31, 0x3b, 0x73,
	0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0xf8, 0x01, 0x01,
	0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
}

var (
	file_google_api_servicecontrol_v1_check_error_proto_rawDescOnce sync.Once
	file_google_api_servicecontrol_v1_check_error_proto_rawDescData = file_google_api_servicecontrol_v1_check_error_proto_rawDesc
)

func file_google_api_servicecontrol_v1_check_error_proto_rawDescGZIP() []byte {
	file_google_api_servicecontrol_v1_check_error_proto_rawDescOnce.Do(func() {
		file_google_api_servicecontrol_v1_check_error_proto_rawDescData = protoimpl.X.CompressGZIP(file_google_api_servicecontrol_v1_check_error_proto_rawDescData)
	})
	return file_google_api_servicecontrol_v1_check_error_proto_rawDescData
}

var file_google_api_servicecontrol_v1_check_error_proto_enumTypes = make([]protoimpl.EnumInfo, 1)
var file_google_api_servicecontrol_v1_check_error_proto_msgTypes = make([]protoimpl.MessageInfo, 1)
var file_google_api_servicecontrol_v1_check_error_proto_goTypes = []interface{}{
	(CheckError_Code)(0), // 0: google.api.servicecontrol.v1.CheckError.Code
	(*CheckError)(nil),   // 1: google.api.servicecontrol.v1.CheckError
}
var file_google_api_servicecontrol_v1_check_error_proto_depIdxs = []int32{
	0, // 0: google.api.servicecontrol.v1.CheckError.code:type_name -> google.api.servicecontrol.v1.CheckError.Code
	1, // [1:1] is the sub-list for method output_type
	1, // [1:1] is the sub-list for method input_type
	1, // [1:1] is the sub-list for extension type_name
	1, // [1:1] is the sub-list for extension extendee
	0, // [0:1] is the sub-list for field type_name
}

func init() { file_google_api_servicecontrol_v1_check_error_proto_init() }
func file_google_api_servicecontrol_v1_check_error_proto_init() {
	if File_google_api_servicecontrol_v1_check_error_proto != nil {
		return
	}
	if !protoimpl.UnsafeEnabled {
		file_google_api_servicecontrol_v1_check_error_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*CheckError); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
	}
	type x struct{}
	out := protoimpl.TypeBuilder{
		File: protoimpl.DescBuilder{
			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
			RawDescriptor: file_google_api_servicecontrol_v1_check_error_proto_rawDesc,
			NumEnums:      1,
			NumMessages:   1,
			NumExtensions: 0,
			NumServices:   0,
		},
		GoTypes:           file_google_api_servicecontrol_v1_check_error_proto_goTypes,
		DependencyIndexes: file_google_api_servicecontrol_v1_check_error_proto_depIdxs,
		EnumInfos:         file_google_api_servicecontrol_v1_check_error_proto_enumTypes,
		MessageInfos:      file_google_api_servicecontrol_v1_check_error_proto_msgTypes,
	}.Build()
	File_google_api_servicecontrol_v1_check_error_proto = out.File
	file_google_api_servicecontrol_v1_check_error_proto_rawDesc = nil
	file_google_api_servicecontrol_v1_check_error_proto_goTypes = nil
	file_google_api_servicecontrol_v1_check_error_proto_depIdxs = nil
}
