// Code generated by protoc-gen-go. DO NOT EDIT.
// source: prototype/client_id.proto

package prototype

import (
	fmt "fmt"
	proto "github.com/golang/protobuf/proto"
	math "math"
)

// Reference imports to suppress errors if they are not otherwise used.
var _ = proto.Marshal
var _ = fmt.Errorf
var _ = math.Inf

// This is a compile-time assertion to ensure that this generated file
// is compatible with the proto package it is being compiled against.
// A compilation error at this line likely means your copy of the
// proto package needs to be updated.
const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package

type ClientId struct {
	Id                   string   `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_ClientId proto.InternalMessageInfo

func (m *ClientId) GetId() string {
	if m != nil {
		return m.Id
	}
	return ""
}

func init() {
	proto.RegisterType((*ClientId)(nil), "prototype.ClientId")
}

func init() { proto.RegisterFile("prototype/client_id.proto", fileDescriptor_decd91802e961598) }

var fileDescriptor_decd91802e961598 = []byte{
	// 120 bytes of a gzipped FileDescriptorProto
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x92, 0x2c, 0x28, 0xca, 0x2f,
	0xc9, 0x2f, 0xa9, 0x2c, 0x48, 0xd5, 0x4f, 0xce, 0xc9, 0x4c, 0xcd, 0x2b, 0x89, 0xcf, 0x4c, 0xd1,
	0x03, 0x8b, 0x09, 0x71, 0xc2, 0xa5, 0x94, 0xa4, 0xb8, 0x38, 0x9c, 0xc1, 0xb2, 0x9e, 0x29, 0x42,
	0x7c, 0x5c, 0x4c, 0x99, 0x29, 0x12, 0x8c, 0x0a, 0x8c, 0x1a, 0x9c, 0x41, 0x4c, 0x99, 0x29, 0x4e,
	0xa6, 0x51, 0xc6, 0xe9, 0xf9, 0x7a, 0xc9, 0x19, 0x45, 0xf9, 0xb9, 0x99, 0xa5, 0xb9, 0x7a, 0xf9,
	0x45, 0xe9, 0xfa, 0x30, 0x4e, 0x7e, 0xb1, 0x7e, 0x66, 0x5e, 0x5a, 0x51, 0xa2, 0x3e, 0xd8, 0x24,
	0xfd, 0xf4, 0x7c, 0x7d, 0xb8, 0x91, 0x49, 0x6c, 0x60, 0xa6, 0x31, 0x20, 0x00, 0x00, 0xff, 0xff,
	0xa1, 0x59, 0xe9, 0x52, 0x81, 0x00, 0x00, 0x00,
}
