IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 网络协议 -> WebSocket接收与发送Protobuf消息及消息的打包与解包 -> 正文阅读

[网络协议]WebSocket接收与发送Protobuf消息及消息的打包与解包

?server:

package main
import (
		//"strings"
		//"reflect"
		"bytes"
		"fmt"
		"encoding/binary"
		"net/http"
		"github.com/gorilla/websocket"
		"time"
		"gowebsocket/impl"
		"github.com/golang/protobuf/proto"
		)
var(
	upgrader = websocket.Upgrader{
		// 允许跨域
		CheckOrigin:func(r *http.Request) bool{
			return true
		},
	}
)
 
func wsHandler(w http.ResponseWriter , r *http.Request){
	var(
		wsConn *websocket.Conn
		err error
		conn *impl.Connection
		data []byte
	)
	// 完成ws协议的握手操作
	// Upgrade:websocket
	if wsConn , err = upgrader.Upgrade(w,r,nil); err != nil{
		return 
	}
 
	if conn , err = impl.InitConnection(wsConn); err != nil{
		goto ERR
	}
 
	// 启动线程,不断发消息
	go func(){
		for{
			//发送二进制数据
			//SendGatewayLogin(conn)
			//SendPlayerBalanceData(conn)
			time.Sleep(1*time.Second)
		}
	}()
 
	for {
		data , err = conn.ReadMessage();//接收数据
		pkg_length,gateway_type,protocol_type,UID,protoBytes := unpkgData(data) //解包
		fmt.Println(fmt.Sprintf("长度=%v,主协议=%v,消息协议=%v,UID=%v,protobuf结构=%v",pkg_length,gateway_type,protocol_type,UID,protoBytes))
		newData := getDataByProtocol(pkg_length,gateway_type,protocol_type,UID,protoBytes)//处理协议数据
		if err != nil{ //错误处理
			goto ERR
		}
        fmt.Println("发送给客户端的:",newData)
		fmt.Println("======",gateway_type,protocol_type,"=================================================================")
		err = conn.WriteMessage(newData);//发送数据
		if err !=nil{//错误处理
			goto ERR
		}
	}
 
	ERR:
		conn.Close()
 
}

//处理协议数据 CMD_BS_REQ
func getDataByProtocol(len int32,gatetype int32,msgtype int32,uid int32,protoData []byte) []byte {
	data :=[]byte{}
    //登陆 1000 1
	if gatetype == int32(ServerType_SERVER_TYPE_GATEWAY) && msgtype == int32(ServerGatewayCmd_CMD_GATEWAY_LOGIN_REQ) {
		data = SendGatewayLogin()
    }
    //心跳 1000 9
	if gatetype == int32(ServerType_SERVER_TYPE_GATEWAY) && msgtype == int32(ServerGatewayCmd_CMD_GATEWAY_PING_REQ) {
		data = SendNetworkPingPong()
    }
    //金币 1100 9
	if gatetype == int32(ServerType_SERVER_TYPE_COMMON) && msgtype == int32(ServerCommonCmd_CMD_GET_PLAYER_BALANCE_REQ) {
	  	data = SendPlayerBalanceData()
	}
    //用户信息 1100 3
	if gatetype == int32(ServerType_SERVER_TYPE_COMMON) && msgtype == int32(ServerCommonCmd_CMD_GET_USER_ATTRI_REQ) {
		data = SendUserAttri()
    }
    //跑马灯 1100 15 
	if gatetype == int32(ServerType_SERVER_TYPE_COMMON) && msgtype == int32(ServerCommonCmd_CMD_BS_REQ) {
		data = SendHorseRaceLamp()
    }
	//匹配服务-房间列表 1101 1
	if gatetype == int32(ServerType_SERVER_TYPE_MATCH) && msgtype == int32(ServerMatchCmd_CMD_GET_GAME_KIND_REQ) {
		gameKindRequest :=&GameKindRequest{}
		proto.Unmarshal(protoData,gameKindRequest)
		gameKind := int32(gameKindRequest.GameKind)
		data = SendGameRoomList(gameKind)
		
    }
	return data
}


//房间列表
func SendGameRoomList(gameKind int32) []byte  {
	// //构造二进制数据
	// gameKindResponse :=&GameKindResponse{

	// }
	// //protobuf编码
	// data,_:=proto.Marshal(gameKindResponse)

	//模拟游戏类型列表数据
	data := []byte{10,1,4,26,30,10,18,8,5,16,1,24,100,34,7,76,101,118,101,108,32,73,40,194,20,16,10,24,128,10,32,128,80,40,10,26,33,10,20,8,6,16,1,24,220,11,34,8,76,101,118,101,108,32,73,73,40,233,22,16,30,24,128,30,32,128,240,1,40,40,26,49,10,31,8,7,16,2,24,160,194,30,34,18,116,101,101,110,112,97,116,116,105,32,112,114,97,99,116,105,99,101,40,185,28,16,160,156,1,24,128,160,156,1,32,128,128,226,9,40,40,26,34,10,21,8,8,16,1,24,144,78,34,9,76,101,118,101,108,32,73,73,73,40,190,5,16,100,24,128,100,32,128,160,6,40,40,26,36,10,21,8,12,16,1,24,176,234,1,34,8,76,101,118,101,108,32,73,86,40,233,7,16,172,2,24,128,172,2,32,128,224,18,40,40,26,35,10,20,8,13,16,1,24,160,141,6,34,7,76,101,118,101,108,32,86,40,252,2,16,232,7,24,128,232,7,32,128,192,62,40,40,26,36,10,21,8,15,16,1,24,192,154,12,34,8,76,101,118,101,108,32,86,73,40,218,1,16,208,15,24,128,208,15,32,128,128,125,40,40,26,37,10,21,8,16,16,1,24,160,194,30,34,9,76,101,118,101,108,32,86,73,73,40,106,16,136,39,24,128,136,39,32,128,192,184,2,40,40}
	//打包数据数据
	pkg_data:=packageData(int32(ServerType_SERVER_TYPE_MATCH), //匹配服务
						   int32(ServerMatchCmd_CMD_GET_GAME_KIND_RESP),//返回房间列表
						   data,int64(len(data)))
	return pkg_data;
}

//ServerCommonCmd_CMD_BS_REQ
func SendHorseRaceLamp() []byte {
	//构造二进制数据
	// loginResponse := &LoginResponse{
	// 	Result: 0,
	// 	UserId: 573232,
	// }
	//protobuf编码
	//data,_:=proto.Marshal(loginResponse)
	//模拟跑马灯
	data:=[]byte{10,114,10,112,80,108,97,121,101,114,32,42,42,42,52,56,54,55,32,119,111,110,32,60,99,111,108,111,114,61,35,100,97,99,48,56,57,62,82,115,46,49,50,48,48,46,48,60,47,99,62,32,105,110,32,60,99,111,108,111,114,61,35,53,53,69,48,70,70,62,82,97,112,105,100,32,84,101,101,110,32,80,97,116,116,105,60,47,99,111,108,111,114,62,44,32,109,111,110,101,121,32,99,111,109,101,115,32,115,111,32,102,97,115,116,33,10,114,10,112,80,108,97,121,101,114,32,42,42,42,50,51,48,53,32,119,111,110,32,60,99,111,108,111,114,61,35,100,97,99,48,56,57,62,82,115,46,51,54,48,48,46,48,60,47,99,62,32,105,110,32,60,99,111,108,111,114,61,35,53,53,69,48,70,70,62,82,97,112,105,100,32,84,101,101,110,32,80,97,116,116,105,60,47,99,111,108,111,114,62,44,32,109,111,110,101,121,32,99,111,109,101,115,32,115,111,32,102,97,115,116,33,10,97,10,95,83,111,32,108,117,99,107,121,33,32,80,108,97,121,101,114,32,42,42,42,56,49,56,48,32,119,111,110,32,60,99,111,108,111,114,61,35,100,97,99,48,56,57,62,82,115,46,49,57,48,48,46,48,60,47,99,62,32,105,110,32,60,99,111,108,111,114,61,35,54,68,66,57,56,48,62,65,110,100,97,114,32,66,97,104,97,114,60,47,99,111,108,111,114,62,10,97,10,95,83,111,32,108,117,99,107,121,33,32,80,108,97,121,101,114,32,42,42,42,56,49,56,48,32,119,111,110,32,60,99,111,108,111,114,61,35,100,97,99,48,56,57,62,82,115,46,49,57,48,48,46,48,60,47,99,62,32,105,110,32,60,99,111,108,111,114,61,35,54,68,66,57,56,48,62,65,110,100,97,114,32,66,97,104,97,114,60,47,99,111,108,111,114,62,10,114,10,112,80,108,97,121,101,114,32,42,42,42,55,50,51,56,32,119,111,110,32,60,99,111,108,111,114,61,35,100,97,99,48,56,57,62,82,115,46,54,48,48,48,46,48,60,47,99,62,32,105,110,32,60,99,111,108,111,114,61,35,53,53,69,48,70,70,62,82,97,112,105,100,32,84,101,101,110,32,80,97,116,116,105,60,47,99,111,108,111,114,62,44,32,109,111,110,101,121,32,99,111,109,101,115,32,115,111,32,102,97,115,116,33,10,72,10,70,80,108,97,121,101,114,32,60,99,111,108,111,114,61,35,48,48,102,102,48,48,62,42,42,42,55,55,54,57,60,47,99,62,32,119,105,116,104,100,114,97,119,32,60,99,111,108,111,114,61,35,100,97,99,48,56,57,62,82,115,46,53,48,48,46,48,60,47,99,62,10,114,10,112,80,108,97,121,101,114,32,42,42,42,52,56,54,55,32,119,111,110,32,60,99,111,108,111,114,61,35,100,97,99,48,56,57,62,82,115,46,51,54,48,48,46,48,60,47,99,62,32,105,110,32,60,99,111,108,111,114,61,35,53,53,69,48,70,70,62,82,97,112,105,100,32,84,101,101,110,32,80,97,116,116,105,60,47,99,111,108,111,114,62,44,32,109,111,110,101,121,32,99,111,109,101,115,32,115,111,32,102,97,115,116,33,10,97,10,95,83,111,32,108,117,99,107,121,33,32,80,108,97,121,101,114,32,42,42,42,55,55,54,57,32,119,111,110,32,60,99,111,108,111,114,61,35,100,97,99,48,56,57,62,82,115,46,50,48,48,48,46,48,60,47,99,62,32,105,110,32,60,99,111,108,111,114,61,35,54,68,66,57,56,48,62,65,110,100,97,114,32,66,97,104,97,114,60,47,99,111,108,111,114,62,10,97,10,95,83,111,32,108,117,99,107,121,33,32,80,108,97,121,101,114,32,42,42,42,56,49,56,48,32,119,111,110,32,60,99,111,108,111,114,61,35,100,97,99,48,56,57,62,82,115,46,49,57,48,48,46,48,60,47,99,62,32,105,110,32,60,99,111,108,111,114,61,35,54,68,66,57,56,48,62,65,110,100,97,114,32,66,97,104,97,114,60,47,99,111,108,111,114,62,10,97,10,95,83,111,32,108,117,99,107,121,33,32,80,108,97,121,101,114,32,42,42,42,56,49,56,48,32,119,111,110,32,60,99,111,108,111,114,61,35,100,97,99,48,56,57,62,82,115,46,49,57,48,48,46,48,60,47,99,62,32,105,110,32,60,99,111,108,111,114,61,35,54,68,66,57,56,48,62,65,110,100,97,114,32,66,97,104,97,114,60,47,99,111,108,111,114,62}
	fmt.Println("模拟跑马灯",data)
	//打包数据数据
	pkg_data:=packageData(int32(ServerType_SERVER_TYPE_COMMON), //网关服务
						   int32(ServerCommonCmd_CMD_BS_RESP),//返回跑马灯数据
						   data,int64(len(data)))
	return pkg_data;
}
 
//ServerGatewayCmd_CMD_GATEWAY_PING_REQ
func SendNetworkPingPong() []byte {
	//打包数据
	pkg_data:=packageData(int32(ServerType_SERVER_TYPE_GATEWAY), //网关服务
						   int32(ServerGatewayCmd_CMD_GATEWAY_PING_RESP),//返回心跳
						   []byte{},int64(0))
	return pkg_data;
}

//ServerGatewayCmd_CMD_GATEWAY_LOGIN_REQ
func SendGatewayLogin()[]byte  {
	//构造二进制数据
	loginResponse := &LoginResponse{
		Result: 0,
		UserId: 573232,
	}
	//protobuf编码
	data,_:=proto.Marshal(loginResponse)
	//打包数据
	pkg_data:=packageData(int32(ServerType_SERVER_TYPE_GATEWAY), //网关服务
						   int32(ServerGatewayCmd_CMD_GATEWAY_LOGIN_RESP),//登录返回
						   data,int64(len(data)))
	return pkg_data;
}

//ServerCommonCmd_CMD_GET_USER_ATTRI_REQFantasy Time
func SendUserAttri() []byte {
	//实体结构
	userResp := &MSG_GET_USER_ATTRI_RESP{
		UserAttris:[]*UserAttri{
			&UserAttri{
				UserId:573232, //用户ID
				Nick:"User573232", //昵称
				Head:"111",//头像
			},
			
		},
	}
	//protobuf编码
	data,_:=proto.Marshal(userResp)
	//打包数据
	pkg_data:=packageData(int32(ServerType_SERVER_TYPE_COMMON),
						   int32(ServerCommonCmd_CMD_GET_USER_ATTRI_RESP),
						   data,int64(len(data)))
	return pkg_data
}

//ServerCommonCmd_CMD_GET_PLAYER_BALANCE_REQ
func SendPlayerBalanceData() []byte{
	//用户金币结构
	balance:=&GetPlayerBalanceResponse{
		Result:0,        //请求结果 0:成功  
		Balance:99999,   //账户余额
		BalanceWins: 100,//提现余额
		Partices:50000,  //练习币余额
		GameCurrency:CurrencyKind_CK_Money,
	}
	//protobuf编码
	data,_:=proto.Marshal(balance)
	//打包数据
	pkg_data:=packageData(int32(ServerType_SERVER_TYPE_COMMON), //网关服务
						   int32(ServerCommonCmd_CMD_GET_PLAYER_BALANCE_RESP),//返回金钱
						   data,int64(len(data)))
	return pkg_data
}

//打包数据
func packageData( main_cmd int32,sub_cmd int32,protoData []byte,dataSize int64) []byte  {
	pkgsize  := dataSize+10
	datapkg := make([]byte,pkgsize)
	//数据长度
	pByteLength := byteEncrypt(pkgsize,2)
    datapkg[0]=pByteLength[0]
	datapkg[1]=pByteLength[1]
    //网关类型
	pGateType:=byteEncrypt( int64(main_cmd),2)
	datapkg[2]=pGateType[0]  
    datapkg[3]=pGateType[1]  
	//消息协议
	pProtoData:=byteEncrypt(int64(sub_cmd),2)
	datapkg[4]=pProtoData[0]            
	datapkg[5]=pProtoData[1]
	//UID  
	//pUID:=byteEncrypt(573232,4)
	datapkg[6]=0 //pUID[0]
	datapkg[7]=0 //pUID[1]
	datapkg[8]=0 //pUID[2]
	datapkg[9]=0 //pUID[3]
	//数据实体
	for i,_ := range protoData{
	 	datapkg[i+10]=protoData[i]
	} 
    //fmt.Println(fmt.Sprintf("进行包装后的包头数据: [%v %v %v %v %v %v %v %v %v %v]",datapkg[0],datapkg[1],datapkg[2],datapkg[3],datapkg[4],datapkg[5],datapkg[6],datapkg[7],datapkg[8],datapkg[9]))
	//fmt.Println(fmt.Sprintf("进行包装后的Protobuf实体数据: %v ",protoData))
	//fmt.Println(fmt.Sprintf("进行包装后的完整二进制: %v ",datapkg))
	return datapkg
}
 

//加密
func byteEncrypt(num int64,len int) []byte  {
	x :=num
	byteData := make([]byte,len)
	for i := 0; i < len; i++ {
		byteData[i] = byte(x & 255) //进行与运算 
		x = x >> 8                  //右移8位
	}
	return byteData 	 
}

//解密
func byteDencrypt(byteData []byte,len int) int32 { 
	//测试位 []byte{48,191,8,0}
    //4-1-0  = 3  byteData[3] = 0       
	//4-1-1  = 2  byteData[2] = 8       
	//4-1-2  = 1  byteData[1] = 191
	//4-1-3  = 0  byteData[0] = 48
    //取最后一位
	x := int32(byteData[len-1])
	//len-1为第一个数没有进行位移,所以去掉循环
	for i := 0; i < len-1; i++ {
		index :=len-1-i //反向取数
		x=x<<8+int32(byteData[index-1]) //保存上次计算结果 
		//fmt.Println(x,i,index)
	}
	//fmt.Println(x)
    return x
}  


//字符串加密  
func stringEncrypt(str string) []byte{
    return []byte("a")
}

//字符串解密
func stringDencrypt(bytes []byte) string  {
	
	return ""
}

//解析客户端发来的数据包
//返回参数: int32:长度 int32:主协议 int32:消息协议 int32:UID  []byte:proto二进制数据
func unpkgData(data []byte) (int32 , int32 , int32 ,int32,[]byte) {
    pkg_length := byteDencrypt([]byte{data[0],data[1]},2)
	gateway_type := byteDencrypt([]byte{data[2],data[3]},2)
	protocol_type := byteDencrypt([]byte{data[4],data[5]},2)
	UID := byteDencrypt([]byte{data[6],data[7],data[8],data[9]},4)
	protoBytes := make([]byte,pkg_length-10)
	for i,_:= range protoBytes {
		protoBytes[i] = data[i+10]
	}
    return pkg_length,gateway_type,protocol_type,UID,protoBytes
}

func  Uint8ToByte(num uint8) []byte  {
	var buf bytes.Buffer;
	err:=binary.Write(&buf,binary.BigEndian,num)
	fmt.Println(err)
	return buf.Bytes()
}

func  Int16ToByteBig(num int16) []byte  {
	var buf bytes.Buffer;
	err:=binary.Write(&buf,binary.BigEndian,num)
	fmt.Println(err)
	return buf.Bytes()
}

func  Int16ToByteLittle(num int16) []byte  {
	var buf bytes.Buffer;
	err:=binary.Write(&buf,binary.LittleEndian,num)
	fmt.Println(err)
	return buf.Bytes()
}



func main(){
	fmt.Println("WebSocket服务已启动: 0.0.0.0:7700")
	// protoData :=[]byte{8,4}
	// gameKindRequest :=&GameKindRequest{}
	// proto.Unmarshal(protoData,gameKindRequest)
	// fmt.Println("GameKindRequest:",gameKindRequest)

	http.HandleFunc("/ws",wsHandler)
	http.ListenAndServe("0.0.0.0:7700",nil)
}

client:

package main

import (
    "fmt"
    "github.com/gorilla/websocket"
    "log"
    "net/url"
    "sync"
    "time"
)

type websocketClientManager struct {
    conn        *websocket.Conn
    addr        *string
    path        string
    sendMsgChan chan []byte //string
    recvMsgChan chan []byte //string
    isAlive     bool
    timeout     int
}

// 构造函数
func NewWsClientManager(addrIp, addrPort, path string, timeout int) *websocketClientManager {
    addrString := addrIp + ":" + addrPort
    var sendChan = make(chan []byte, 65535)
    var recvChan = make(chan []byte, 65535)
    var conn *websocket.Conn
    return &websocketClientManager{
        addr:        &addrString,
        path:        path,
        conn:        conn,
        sendMsgChan: sendChan,
        recvMsgChan: recvChan,
        isAlive:     false,
        timeout:     timeout,
    }
}

// 链接服务端
func (wsc *websocketClientManager) dail() {
    var err error
    u := url.URL{Scheme: "ws", Host: *wsc.addr, Path: wsc.path}
    log.Printf("connecting to %s", u.String())
    wsc.conn, _, err = websocket.DefaultDialer.Dial(u.String(), nil)
    if err != nil {
        fmt.Println(err)
        return

    }
    wsc.isAlive = true
    log.Printf("connecting to %s 链接成功!!!", u.String())

}

// 发送消息
func (wsc *websocketClientManager) sendMsgThread() {
    go func() {
        for {
            msg := <-wsc.sendMsgChan
		    fmt.Println("发送给服务器:",msg)
            err := wsc.conn.WriteMessage(websocket.BinaryMessage, []byte(msg))
            if err != nil {
                log.Println("write:", err)
                continue
            }
        }
    }()
}

// 读取消息
func (wsc *websocketClientManager) readMsgThread() {
    go func() {
        for {
            if  wsc.conn!= nil {
                _, message, err :=  wsc.conn.ReadMessage()
                if err != nil {
                    log.Println("read:", err)
                    wsc.isAlive = false
                    // 出现错误,退出读取,尝试重连
                    break
                }
                log.Printf("接收到服务器发来的:", message)
				log.Printf("============================================================")
                // 需要读取数据,不然会阻塞
                wsc.recvMsgChan <- []byte(message)
            }

        }
    }()
}

// 开启服务并重连
func (wsc *websocketClientManager) start() {
    for {
        if wsc.isAlive == false {
            wsc.dail()
            wsc.sendMsgThread()
            wsc.readMsgThread()
        }
        time.Sleep(time.Second * time.Duration(wsc.timeout))
    }
}

func main() {
    wsc := NewWsClientManager("127.0.0.1", "7700", "/ws", 10)

	// data:=[]byte{10,114,10,112,80,108,97,121,101,114,32,42,42,42,52,56,54,55,32,119,111,110,32,60,99,111,108,111,114,61,35,100,97,99,48,56,57,62,82,115,46,49,50,48,48,46,48,60,47,99,62,32,105,110,32,60,99,111,108,111,114,61,35,53,53,69,48,70,70,62,82,97,112,105,100,32,84,101,101,110,32,80,97,116,116,105,60,47,99,111,108,111,114,62,44,32,109,111,110,101,121,32,99,111,109,101,115,32,115,111,32,102,97,115,116,33,10,114,10,112,80,108,97,121,101,114,32,42,42,42,50,51,48,53,32,119,111,110,32,60,99,111,108,111,114,61,35,100,97,99,48,56,57,62,82,115,46,51,54,48,48,46,48,60,47,99,62,32,105,110,32,60,99,111,108,111,114,61,35,53,53,69,48,70,70,62,82,97,112,105,100,32,84,101,101,110,32,80,97,116,116,105,60,47,99,111,108,111,114,62,44,32,109,111,110,101,121,32,99,111,109,101,115,32,115,111,32,102,97,115,116,33,10,97,10,95,83,111,32,108,117,99,107,121,33,32,80,108,97,121,101,114,32,42,42,42,56,49,56,48,32,119,111,110,32,60,99,111,108,111,114,61,35,100,97,99,48,56,57,62,82,115,46,49,57,48,48,46,48,60,47,99,62,32,105,110,32,60,99,111,108,111,114,61,35,54,68,66,57,56,48,62,65,110,100,97,114,32,66,97,104,97,114,60,47,99,111,108,111,114,62,10,97,10,95,83,111,32,108,117,99,107,121,33,32,80,108,97,121,101,114,32,42,42,42,56,49,56,48,32,119,111,110,32,60,99,111,108,111,114,61,35,100,97,99,48,56,57,62,82,115,46,49,57,48,48,46,48,60,47,99,62,32,105,110,32,60,99,111,108,111,114,61,35,54,68,66,57,56,48,62,65,110,100,97,114,32,66,97,104,97,114,60,47,99,111,108,111,114,62,10,114,10,112,80,108,97,121,101,114,32,42,42,42,55,50,51,56,32,119,111,110,32,60,99,111,108,111,114,61,35,100,97,99,48,56,57,62,82,115,46,54,48,48,48,46,48,60,47,99,62,32,105,110,32,60,99,111,108,111,114,61,35,53,53,69,48,70,70,62,82,97,112,105,100,32,84,101,101,110,32,80,97,116,116,105,60,47,99,111,108,111,114,62,44,32,109,111,110,101,121,32,99,111,109,101,115,32,115,111,32,102,97,115,116,33,10,72,10,70,80,108,97,121,101,114,32,60,99,111,108,111,114,61,35,48,48,102,102,48,48,62,42,42,42,55,55,54,57,60,47,99,62,32,119,105,116,104,100,114,97,119,32,60,99,111,108,111,114,61,35,100,97,99,48,56,57,62,82,115,46,53,48,48,46,48,60,47,99,62,10,114,10,112,80,108,97,121,101,114,32,42,42,42,52,56,54,55,32,119,111,110,32,60,99,111,108,111,114,61,35,100,97,99,48,56,57,62,82,115,46,51,54,48,48,46,48,60,47,99,62,32,105,110,32,60,99,111,108,111,114,61,35,53,53,69,48,70,70,62,82,97,112,105,100,32,84,101,101,110,32,80,97,116,116,105,60,47,99,111,108,111,114,62,44,32,109,111,110,101,121,32,99,111,109,101,115,32,115,111,32,102,97,115,116,33,10,97,10,95,83,111,32,108,117,99,107,121,33,32,80,108,97,121,101,114,32,42,42,42,55,55,54,57,32,119,111,110,32,60,99,111,108,111,114,61,35,100,97,99,48,56,57,62,82,115,46,50,48,48,48,46,48,60,47,99,62,32,105,110,32,60,99,111,108,111,114,61,35,54,68,66,57,56,48,62,65,110,100,97,114,32,66,97,104,97,114,60,47,99,111,108,111,114,62,10,97,10,95,83,111,32,108,117,99,107,121,33,32,80,108,97,121,101,114,32,42,42,42,56,49,56,48,32,119,111,110,32,60,99,111,108,111,114,61,35,100,97,99,48,56,57,62,82,115,46,49,57,48,48,46,48,60,47,99,62,32,105,110,32,60,99,111,108,111,114,61,35,54,68,66,57,56,48,62,65,110,100,97,114,32,66,97,104,97,114,60,47,99,111,108,111,114,62,10,97,10,95,83,111,32,108,117,99,107,121,33,32,80,108,97,121,101,114,32,42,42,42,56,49,56,48,32,119,111,110,32,60,99,111,108,111,114,61,35,100,97,99,48,56,57,62,82,115,46,49,57,48,48,46,48,60,47,99,62,32,105,110,32,60,99,111,108,111,114,61,35,54,68,66,57,56,48,62,65,110,100,97,114,32,66,97,104,97,114,60,47,99,111,108,111,114,62}
	// fmt.Println("模拟跑马灯",data)
    // fmt.Println(data[0],data[1],data[2])

	// head_data:=make([]byte,10)
    // //1100 3
	// for i := 0; i < 10; i++ {
	// 	head_data[0]=10
	// 	head_data[1]=0
	// 	head_data[2]=76
	// 	head_data[3]=4
	// 	head_data[4]=3
	// 	head_data[5]=0
	// 	head_data[6]=0
	// 	head_data[7]=0
	// 	head_data[8]=0
	// 	head_data[9]=0
	// }
	// wsc.sendMsgChan<-head_data //写入数据到通道

    // //1100 9
	// head_data1:=make([]byte,10)
	// for i := 0; i < 10; i++ {
	// 	head_data1[0]=10
	// 	head_data1[1]=0
	// 	head_data1[2]=76
	// 	head_data1[3]=4
	// 	head_data1[4]=9
	// 	head_data1[5]=0
	// 	head_data1[6]=0
	// 	head_data1[7]=0
	// 	head_data1[8]=0
	// 	head_data1[9]=0
	// }
	// wsc.sendMsgChan<-head_data1 //写入数据到通道

	// //1000 1
	// head_data2:=make([]byte,10)
	// for i := 0; i < 10; i++ {
	// 	head_data2[0]=10
	// 	head_data2[1]=0
	// 	head_data2[2]=232
	// 	head_data2[3]=3
	// 	head_data2[4]=2
	// 	head_data2[5]=0
	// 	head_data2[6]=0
	// 	head_data2[7]=0
	// 	head_data2[8]=0
	// 	head_data2[9]=0
	// }
	// wsc.sendMsgChan<-head_data2 //写入数据到通道

	// //1000 9
	// head_data3:=make([]byte,10)
	// for i := 0; i < 10; i++ {
	// 	head_data3[0]=10
	// 	head_data3[1]=0
	// 	head_data3[2]=232
	// 	head_data3[3]=3
	// 	head_data3[4]=10
	// 	head_data3[5]=0
	// 	head_data3[6]=0
	// 	head_data3[7]=0
	// 	head_data3[8]=0
	// 	head_data3[9]=0
	// }
	// wsc.sendMsgChan<-head_data3 //写入数据到通道

	//1100 15
	// head_data4:=make([]byte,10)
	// for i := 0; i < 10; i++ {
	// 	head_data4[0]=10
	// 	head_data4[1]=0
	// 	head_data4[2]=76
	// 	head_data4[3]=4
	// 	head_data4[4]=15
	// 	head_data4[5]=0
	// 	head_data4[6]=0
	// 	head_data4[7]=0
	// 	head_data4[8]=0
	// 	head_data4[9]=0
	// }
	// wsc.sendMsgChan<-head_data4 //写入数据到通道

	//1101 1
	head_data5:=make([]byte,12)
	for i := 0; i < 12; i++ {
		head_data5[0]=12
		head_data5[1]=0
		head_data5[2]=77
		head_data5[3]=4
		head_data5[4]=1
		head_data5[5]=0
		head_data5[6]=0
		head_data5[7]=0
		head_data5[8]=0
		head_data5[9]=0
		head_data5[10]=8
		head_data5[11]=4
	}
	wsc.sendMsgChan<-head_data5 //写入数据到通道

	wsc.start()
    var w1 sync.WaitGroup
    w1.Add(1)
    w1.Wait()
}

protobuf:

// Code generated by protoc-gen-go. DO NOT EDIT.
// versions:
// 	protoc-gen-go v1.26.0
// 	protoc        v3.12.4
// source: platform.proto

package main

import (
	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
	reflect "reflect"
	sync "sync"
)

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

//静态服务定义:这里定义的静态服务,如果是具体游戏,则是动态值
type ServerType int32

const (
	ServerType_SERVER_TPYE_INVALID      ServerType = 0     // 无效
	ServerType_SERVER_TYPE_GATEWAY      ServerType = 1000  // 网关服务
	ServerType_SERVER_TYPE_COMMON       ServerType = 1100  // 通用服务
	ServerType_SERVER_TYPE_MATCH        ServerType = 1101  // 匹配服务
	ServerType_SERVER_TYPE_FT           ServerType = 1102  // Fantasy Time
	ServerType_SERVER_TYPE_BA           ServerType = 2002  // 扣费服务(不直接对外)
	ServerType_SERVER_TYPE_RUMMY_       ServerType = 3000  // rummy游戏服务(注:不要直接使用,实际会是3000/3001/3002等等,会在匹配逻辑完成后通知客户端,这里只是标注起始)
	ServerType_SERVER_TYPE_TEEPATTI_    ServerType = 4000  // teepatti游戏服务(注:同上)
	ServerType_SERVER_TYPE_AB_          ServerType = 5000  // AB游戏(注:同上)
	ServerType_SERVER_TYPE_7UD_         ServerType = 6000  // 7UD(注:同上)
	ServerType_SERVER_TYPE_RAPIDTP_     ServerType = 7000  // rapid teenaptti(注:同上)
	ServerType_SERVER_TYPE_DRAGONTIGER_ ServerType = 8000  // 龙虎(注:同上)
	ServerType_SERVER_TYPE_BLACKRED_    ServerType = 9000  // 黑红梅方
	ServerType_SERVER_TYPE_HORSERACING_ ServerType = 10000 // 赛马
	ServerType_SERVER_TYPE_JM_          ServerType = 11000 // Jhandi Munda
	ServerType_SERVER_TYPE_BACCARAT_    ServerType = 12000 // baccarat
)

// Enum value maps for ServerType.
var (
	ServerType_name = map[int32]string{
		0:     "SERVER_TPYE_INVALID",
		1000:  "SERVER_TYPE_GATEWAY",
		1100:  "SERVER_TYPE_COMMON",
		1101:  "SERVER_TYPE_MATCH",
		1102:  "SERVER_TYPE_FT",
		2002:  "SERVER_TYPE_BA",
		3000:  "SERVER_TYPE_RUMMY_",
		4000:  "SERVER_TYPE_TEEPATTI_",
		5000:  "SERVER_TYPE_AB_",
		6000:  "SERVER_TYPE_7UD_",
		7000:  "SERVER_TYPE_RAPIDTP_",
		8000:  "SERVER_TYPE_DRAGONTIGER_",
		9000:  "SERVER_TYPE_BLACKRED_",
		10000: "SERVER_TYPE_HORSERACING_",
		11000: "SERVER_TYPE_JM_",
		12000: "SERVER_TYPE_BACCARAT_",
	}
	ServerType_value = map[string]int32{
		"SERVER_TPYE_INVALID":      0,
		"SERVER_TYPE_GATEWAY":      1000,
		"SERVER_TYPE_COMMON":       1100,
		"SERVER_TYPE_MATCH":        1101,
		"SERVER_TYPE_FT":           1102,
		"SERVER_TYPE_BA":           2002,
		"SERVER_TYPE_RUMMY_":       3000,
		"SERVER_TYPE_TEEPATTI_":    4000,
		"SERVER_TYPE_AB_":          5000,
		"SERVER_TYPE_7UD_":         6000,
		"SERVER_TYPE_RAPIDTP_":     7000,
		"SERVER_TYPE_DRAGONTIGER_": 8000,
		"SERVER_TYPE_BLACKRED_":    9000,
		"SERVER_TYPE_HORSERACING_": 10000,
		"SERVER_TYPE_JM_":          11000,
		"SERVER_TYPE_BACCARAT_":    12000,
	}
)

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

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

func (ServerType) Descriptor() protoreflect.EnumDescriptor {
	return file_platform_proto_enumTypes[0].Descriptor()
}

func (ServerType) Type() protoreflect.EnumType {
	return &file_platform_proto_enumTypes[0]
}

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

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

//**************************************网关消息开始******************************************
type ServerGatewayCmd int32

const (
	ServerGatewayCmd_CMD_GATEWAY_INVALID           ServerGatewayCmd = 0  // 无效网关消息
	ServerGatewayCmd_CMD_GATEWAY_LOGIN_REQ         ServerGatewayCmd = 1  // 登录请求:LoginRequest
	ServerGatewayCmd_CMD_GATEWAY_LOGIN_RESP        ServerGatewayCmd = 2  // 登录返回:LoginResponse
	ServerGatewayCmd_CMD_GATEWAY_LOGOUT_REQ        ServerGatewayCmd = 3  // 请求注销
	ServerGatewayCmd_CMD_GATEWAY_LOGOUT_RESP       ServerGatewayCmd = 4  // 返回注销
	ServerGatewayCmd_CMD_GATEWAY_DISCONNECT_REQ    ServerGatewayCmd = 5  // 请求断开
	ServerGatewayCmd_CMD_GATEWAY_DISCONNECT_RESP   ServerGatewayCmd = 6  // 返回断开
	ServerGatewayCmd_CMD_GATEWAY_REPEAT_LOGIN_REQ  ServerGatewayCmd = 7  // 请求重复登录
	ServerGatewayCmd_CMD_GATEWAY_REPEAT_LOGIN_RESP ServerGatewayCmd = 8  // 返回重复登录
	ServerGatewayCmd_CMD_GATEWAY_PING_REQ          ServerGatewayCmd = 9  // 请求心跳
	ServerGatewayCmd_CMD_GATEWAY_PING_RESP         ServerGatewayCmd = 10 // 返回心跳
)

// Enum value maps for ServerGatewayCmd.
var (
	ServerGatewayCmd_name = map[int32]string{
		0:  "CMD_GATEWAY_INVALID",
		1:  "CMD_GATEWAY_LOGIN_REQ",
		2:  "CMD_GATEWAY_LOGIN_RESP",
		3:  "CMD_GATEWAY_LOGOUT_REQ",
		4:  "CMD_GATEWAY_LOGOUT_RESP",
		5:  "CMD_GATEWAY_DISCONNECT_REQ",
		6:  "CMD_GATEWAY_DISCONNECT_RESP",
		7:  "CMD_GATEWAY_REPEAT_LOGIN_REQ",
		8:  "CMD_GATEWAY_REPEAT_LOGIN_RESP",
		9:  "CMD_GATEWAY_PING_REQ",
		10: "CMD_GATEWAY_PING_RESP",
	}
	ServerGatewayCmd_value = map[string]int32{
		"CMD_GATEWAY_INVALID":           0,
		"CMD_GATEWAY_LOGIN_REQ":         1,
		"CMD_GATEWAY_LOGIN_RESP":        2,
		"CMD_GATEWAY_LOGOUT_REQ":        3,
		"CMD_GATEWAY_LOGOUT_RESP":       4,
		"CMD_GATEWAY_DISCONNECT_REQ":    5,
		"CMD_GATEWAY_DISCONNECT_RESP":   6,
		"CMD_GATEWAY_REPEAT_LOGIN_REQ":  7,
		"CMD_GATEWAY_REPEAT_LOGIN_RESP": 8,
		"CMD_GATEWAY_PING_REQ":          9,
		"CMD_GATEWAY_PING_RESP":         10,
	}
)

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

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

func (ServerGatewayCmd) Descriptor() protoreflect.EnumDescriptor {
	return file_platform_proto_enumTypes[1].Descriptor()
}

func (ServerGatewayCmd) Type() protoreflect.EnumType {
	return &file_platform_proto_enumTypes[1]
}

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

// Deprecated: Use ServerGatewayCmd.Descriptor instead.
func (ServerGatewayCmd) EnumDescriptor() ([]byte, []int) {
	return file_platform_proto_rawDescGZIP(), []int{1}
}

//***************************************通用平台类消息开始*********************************************
type ServerCommonCmd int32

const (
	ServerCommonCmd_CMD_COMMON_INVALID          ServerCommonCmd = 0 // 无效
	ServerCommonCmd_CMD_NA_1                    ServerCommonCmd = 1 // NA
	ServerCommonCmd_CMD_FREEZE_PLAYER_RESP      ServerCommonCmd = 2 // 账户被冻结
	ServerCommonCmd_CMD_GET_PLAYER_BALANCE_REQ  ServerCommonCmd = 3 // 请求金钱:NULL
	ServerCommonCmd_CMD_GET_PLAYER_BALANCE_RESP ServerCommonCmd = 4 // 返回金钱:GetPlayerBalanceResponse
	ServerCommonCmd_CMD_NA_5                    ServerCommonCmd = 5 // NA
	ServerCommonCmd_CMD_SYSMESSAGE_TO_USER_RESP ServerCommonCmd = 6 // 系统消息:MessageToUserResp
	ServerCommonCmd_CMD_NA_7                    ServerCommonCmd = 7
	ServerCommonCmd_CMD_PHP_2_USER_COMMON_RESP  ServerCommonCmd = 8  // 这个是转发PHP到客户端的协议:对应的结构PHP_2_USER_DATA_REQ是在web_msg_define.proto中定义的,消息中是嵌套结构,嵌套的协议定义由客户端和PHP自行商定
	ServerCommonCmd_CMD_GET_USER_ATTRI_REQ      ServerCommonCmd = 9  // 获取用户属性 MSG_GET_USER_ATTRI_REQ
	ServerCommonCmd_CMD_GET_USER_ATTRI_RESP     ServerCommonCmd = 10 // 获取用户属性 MSG_GET_USER_ATTRI_RESP
	ServerCommonCmd_CMD_UPDATE_USER_ATTRI_REQ   ServerCommonCmd = 11 // 更新用户属性 MSG_UPDATE_USER_ATTRI_REQ
	ServerCommonCmd_CMD_UPDATE_USER_ATTRI_RESP  ServerCommonCmd = 12 // 更新用户属性 CommonResponse
	ServerCommonCmd_CMD_GET_BONUS_REQ           ServerCommonCmd = 13 // NULL
	ServerCommonCmd_CMD_GET_BONUS_RESP          ServerCommonCmd = 14 // MSG_GET_BONUS_RESP
	ServerCommonCmd_CMD_BS_REQ                  ServerCommonCmd = 15 // 跑马灯
	ServerCommonCmd_CMD_BS_RESP                 ServerCommonCmd = 16 // MSG_MSG_QUE
)

// Enum value maps for ServerCommonCmd.
var (
	ServerCommonCmd_name = map[int32]string{
		0:  "CMD_COMMON_INVALID",
		1:  "CMD_NA_1",
		2:  "CMD_FREEZE_PLAYER_RESP",
		3:  "CMD_GET_PLAYER_BALANCE_REQ",
		4:  "CMD_GET_PLAYER_BALANCE_RESP",
		5:  "CMD_NA_5",
		6:  "CMD_SYSMESSAGE_TO_USER_RESP",
		7:  "CMD_NA_7",
		8:  "CMD_PHP_2_USER_COMMON_RESP",
		9:  "CMD_GET_USER_ATTRI_REQ",
		10: "CMD_GET_USER_ATTRI_RESP",
		11: "CMD_UPDATE_USER_ATTRI_REQ",
		12: "CMD_UPDATE_USER_ATTRI_RESP",
		13: "CMD_GET_BONUS_REQ",
		14: "CMD_GET_BONUS_RESP",
		15: "CMD_BS_REQ",
		16: "CMD_BS_RESP",
	}
	ServerCommonCmd_value = map[string]int32{
		"CMD_COMMON_INVALID":          0,
		"CMD_NA_1":                    1,
		"CMD_FREEZE_PLAYER_RESP":      2,
		"CMD_GET_PLAYER_BALANCE_REQ":  3,
		"CMD_GET_PLAYER_BALANCE_RESP": 4,
		"CMD_NA_5":                    5,
		"CMD_SYSMESSAGE_TO_USER_RESP": 6,
		"CMD_NA_7":                    7,
		"CMD_PHP_2_USER_COMMON_RESP":  8,
		"CMD_GET_USER_ATTRI_REQ":      9,
		"CMD_GET_USER_ATTRI_RESP":     10,
		"CMD_UPDATE_USER_ATTRI_REQ":   11,
		"CMD_UPDATE_USER_ATTRI_RESP":  12,
		"CMD_GET_BONUS_REQ":           13,
		"CMD_GET_BONUS_RESP":          14,
		"CMD_BS_REQ":                  15,
		"CMD_BS_RESP":                 16,
	}
)

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

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

func (ServerCommonCmd) Descriptor() protoreflect.EnumDescriptor {
	return file_platform_proto_enumTypes[2].Descriptor()
}

func (ServerCommonCmd) Type() protoreflect.EnumType {
	return &file_platform_proto_enumTypes[2]
}

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

// Deprecated: Use ServerCommonCmd.Descriptor instead.
func (ServerCommonCmd) EnumDescriptor() ([]byte, []int) {
	return file_platform_proto_rawDescGZIP(), []int{2}
}

type CurrencyKind int32

const (
	CurrencyKind_CK_INVALID  CurrencyKind = 0
	CurrencyKind_CK_Money    CurrencyKind = 1 // 真金
	CurrencyKind_CK_Practice CurrencyKind = 2 // 训练
)

// Enum value maps for CurrencyKind.
var (
	CurrencyKind_name = map[int32]string{
		0: "CK_INVALID",
		1: "CK_Money",
		2: "CK_Practice",
	}
	CurrencyKind_value = map[string]int32{
		"CK_INVALID":  0,
		"CK_Money":    1,
		"CK_Practice": 2,
	}
)

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

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

func (CurrencyKind) Descriptor() protoreflect.EnumDescriptor {
	return file_platform_proto_enumTypes[3].Descriptor()
}

func (CurrencyKind) Type() protoreflect.EnumType {
	return &file_platform_proto_enumTypes[3]
}

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

// Deprecated: Use CurrencyKind.Descriptor instead.
func (CurrencyKind) EnumDescriptor() ([]byte, []int) {
	return file_platform_proto_rawDescGZIP(), []int{3}
}

//以下部分为内网使用,通用服务器内网处理,目前主要是处理跑马灯的功能,其中服务号必须为SERVER_TYPE_COMMON,以免和web服务分开
type Common_S_Cmd int32

const (
	Common_S_Cmd_CMD_S_INVALID             Common_S_Cmd = 0
	Common_S_Cmd_CMD_S_PING                Common_S_Cmd = 1
	Common_S_Cmd_CMD_S_PONG                Common_S_Cmd = 2
	Common_S_Cmd_CMD_S_RUMMY_BS_REQ        Common_S_Cmd = 3  // MSG_BS_DATA
	Common_S_Cmd_CMD_S_RUMMY_BS_RESP       Common_S_Cmd = 4  // CommonResponse
	Common_S_Cmd_CMD_S_TEENPATTI_BS_REQ    Common_S_Cmd = 5  // MSG_BS_DATA
	Common_S_Cmd_CMD_S_TEENPATTI_BS_RESP   Common_S_Cmd = 6  // CommonResponse
	Common_S_Cmd_CMD_S_AB_BS_REQ           Common_S_Cmd = 7  // MSG_BS_DATA
	Common_S_Cmd_CMD_S_AB_BS_RESP          Common_S_Cmd = 8  // CommonResponse
	Common_S_Cmd_CMD_S_FT_BS_REQ           Common_S_Cmd = 9  // MSG_BS_DATA
	Common_S_Cmd_CMD_S_FT_BS_RESP          Common_S_Cmd = 10 // CommonResponse
	Common_S_Cmd_CMD_S_SEVENUPDOWN_BS_REQ  Common_S_Cmd = 11 //
	Common_S_Cmd_CMD_S_SEVENUPDOWN_BS_RESP Common_S_Cmd = 12 //
	Common_S_Cmd_CMD_S_DRAGONTIGER_BS_REQ  Common_S_Cmd = 13 //
	Common_S_Cmd_CMD_S_DRAGONTIGER_BS_RESP Common_S_Cmd = 14
	Common_S_Cmd_CMD_S_RAPIDTP_BS_REQ      Common_S_Cmd = 15 //
	Common_S_Cmd_CMD_S_RAPIDTP_BS_RESP     Common_S_Cmd = 16
	Common_S_Cmd_CMD_S_BLACKRED_BS_REQ     Common_S_Cmd = 17
	Common_S_Cmd_CMD_S_BLACKRED_BS_RESP    Common_S_Cmd = 18
	Common_S_Cmd_CMD_S_HORSERACING_BS_REQ  Common_S_Cmd = 19
	Common_S_Cmd_CMD_S_HORSERACING_BS_RESP Common_S_Cmd = 20
	Common_S_Cmd_CMD_S_JM_BS_REQ           Common_S_Cmd = 21
	Common_S_Cmd_CMD_S_JM_BS_RESP          Common_S_Cmd = 22
	Common_S_Cmd_CMD_S_BACCARAT_REQ        Common_S_Cmd = 23
	Common_S_Cmd_CMD_S_BACCARAT_RESP       Common_S_Cmd = 24
)

// Enum value maps for Common_S_Cmd.
var (
	Common_S_Cmd_name = map[int32]string{
		0:  "CMD_S_INVALID",
		1:  "CMD_S_PING",
		2:  "CMD_S_PONG",
		3:  "CMD_S_RUMMY_BS_REQ",
		4:  "CMD_S_RUMMY_BS_RESP",
		5:  "CMD_S_TEENPATTI_BS_REQ",
		6:  "CMD_S_TEENPATTI_BS_RESP",
		7:  "CMD_S_AB_BS_REQ",
		8:  "CMD_S_AB_BS_RESP",
		9:  "CMD_S_FT_BS_REQ",
		10: "CMD_S_FT_BS_RESP",
		11: "CMD_S_SEVENUPDOWN_BS_REQ",
		12: "CMD_S_SEVENUPDOWN_BS_RESP",
		13: "CMD_S_DRAGONTIGER_BS_REQ",
		14: "CMD_S_DRAGONTIGER_BS_RESP",
		15: "CMD_S_RAPIDTP_BS_REQ",
		16: "CMD_S_RAPIDTP_BS_RESP",
		17: "CMD_S_BLACKRED_BS_REQ",
		18: "CMD_S_BLACKRED_BS_RESP",
		19: "CMD_S_HORSERACING_BS_REQ",
		20: "CMD_S_HORSERACING_BS_RESP",
		21: "CMD_S_JM_BS_REQ",
		22: "CMD_S_JM_BS_RESP",
		23: "CMD_S_BACCARAT_REQ",
		24: "CMD_S_BACCARAT_RESP",
	}
	Common_S_Cmd_value = map[string]int32{
		"CMD_S_INVALID":             0,
		"CMD_S_PING":                1,
		"CMD_S_PONG":                2,
		"CMD_S_RUMMY_BS_REQ":        3,
		"CMD_S_RUMMY_BS_RESP":       4,
		"CMD_S_TEENPATTI_BS_REQ":    5,
		"CMD_S_TEENPATTI_BS_RESP":   6,
		"CMD_S_AB_BS_REQ":           7,
		"CMD_S_AB_BS_RESP":          8,
		"CMD_S_FT_BS_REQ":           9,
		"CMD_S_FT_BS_RESP":          10,
		"CMD_S_SEVENUPDOWN_BS_REQ":  11,
		"CMD_S_SEVENUPDOWN_BS_RESP": 12,
		"CMD_S_DRAGONTIGER_BS_REQ":  13,
		"CMD_S_DRAGONTIGER_BS_RESP": 14,
		"CMD_S_RAPIDTP_BS_REQ":      15,
		"CMD_S_RAPIDTP_BS_RESP":     16,
		"CMD_S_BLACKRED_BS_REQ":     17,
		"CMD_S_BLACKRED_BS_RESP":    18,
		"CMD_S_HORSERACING_BS_REQ":  19,
		"CMD_S_HORSERACING_BS_RESP": 20,
		"CMD_S_JM_BS_REQ":           21,
		"CMD_S_JM_BS_RESP":          22,
		"CMD_S_BACCARAT_REQ":        23,
		"CMD_S_BACCARAT_RESP":       24,
	}
)

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

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

func (Common_S_Cmd) Descriptor() protoreflect.EnumDescriptor {
	return file_platform_proto_enumTypes[4].Descriptor()
}

func (Common_S_Cmd) Type() protoreflect.EnumType {
	return &file_platform_proto_enumTypes[4]
}

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

// Deprecated: Use Common_S_Cmd.Descriptor instead.
func (Common_S_Cmd) EnumDescriptor() ([]byte, []int) {
	return file_platform_proto_rawDescGZIP(), []int{4}
}

// 客户端请求定义
type ServerMatchCmd int32

const (
	ServerMatchCmd_CMD_MATCH_INVALID      ServerMatchCmd = 0 // 无效
	ServerMatchCmd_CMD_GET_GAME_KIND_REQ  ServerMatchCmd = 1 // 请求游戏种类:GameKindRequest
	ServerMatchCmd_CMD_GET_GAME_KIND_RESP ServerMatchCmd = 2 // 返回游戏种类:GameKindResponse
	ServerMatchCmd_CMD_GET_ROOMS_REQ      ServerMatchCmd = 3 // 获取所有游戏类型:由于我们是匹配机制,这个暂时不实现
	ServerMatchCmd_CMD_GET_ROOMS_RESP     ServerMatchCmd = 4 //
	ServerMatchCmd_CMD_MATCH_REQ          ServerMatchCmd = 5 // 请求rummy\teenpatti匹配:MatchRequest
	ServerMatchCmd_CMD_MATCH_RESP         ServerMatchCmd = 6 // 返回rummy\teenpatti匹配:MatchResponse(这里只是告诉客户端收到了匹配申请)
	ServerMatchCmd_CMD_MATCH_NA_7         ServerMatchCmd = 7
	ServerMatchCmd_CMD_MATCH_OK_RESP      ServerMatchCmd = 8  // 通知客户端匹配成功:MatchOKResponse
	ServerMatchCmd_CMD_ENTER_GAME_REQ     ServerMatchCmd = 9  // 请求非匹配类游戏直接进入:目前支持AB/7UD:EnterGameRequest
	ServerMatchCmd_CMD_ENTER_GAME_RESP    ServerMatchCmd = 10 // 请求非匹配类游戏直接进入:MatchOKResponse
)

// Enum value maps for ServerMatchCmd.
var (
	ServerMatchCmd_name = map[int32]string{
		0:  "CMD_MATCH_INVALID",
		1:  "CMD_GET_GAME_KIND_REQ",
		2:  "CMD_GET_GAME_KIND_RESP",
		3:  "CMD_GET_ROOMS_REQ",
		4:  "CMD_GET_ROOMS_RESP",
		5:  "CMD_MATCH_REQ",
		6:  "CMD_MATCH_RESP",
		7:  "CMD_MATCH_NA_7",
		8:  "CMD_MATCH_OK_RESP",
		9:  "CMD_ENTER_GAME_REQ",
		10: "CMD_ENTER_GAME_RESP",
	}
	ServerMatchCmd_value = map[string]int32{
		"CMD_MATCH_INVALID":      0,
		"CMD_GET_GAME_KIND_REQ":  1,
		"CMD_GET_GAME_KIND_RESP": 2,
		"CMD_GET_ROOMS_REQ":      3,
		"CMD_GET_ROOMS_RESP":     4,
		"CMD_MATCH_REQ":          5,
		"CMD_MATCH_RESP":         6,
		"CMD_MATCH_NA_7":         7,
		"CMD_MATCH_OK_RESP":      8,
		"CMD_ENTER_GAME_REQ":     9,
		"CMD_ENTER_GAME_RESP":    10,
	}
)

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

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

func (ServerMatchCmd) Descriptor() protoreflect.EnumDescriptor {
	return file_platform_proto_enumTypes[5].Descriptor()
}

func (ServerMatchCmd) Type() protoreflect.EnumType {
	return &file_platform_proto_enumTypes[5]
}

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

// Deprecated: Use ServerMatchCmd.Descriptor instead.
func (ServerMatchCmd) EnumDescriptor() ([]byte, []int) {
	return file_platform_proto_rawDescGZIP(), []int{5}
}

// 游戏支持的种类
type GameKind int32

const (
	GameKind_INVALID                  GameKind = 0
	GameKind_GAME_KIND_Rummy          GameKind = 1  // rummy
	GameKind_GAME_KIND_Rummy_pool     GameKind = 2  // rummy_pool
	GameKind_GAME_KIND_Rummy_10       GameKind = 3  // rummy_10
	GameKind_GAME_KIND_TEEPATTI       GameKind = 4  // teepatti
	GameKind_GAME_KIND_AB             GameKind = 5  // Andar Bahar
	GameKind_GAME_KIND_SevenUD        GameKind = 6  // seven up down
	GameKind_GAME_KIND_RapidTeenaptti GameKind = 7  // rapid teenpatti
	GameKind_GAME_KIND_DragonTiger    GameKind = 8  // DragonTiger
	GameKind_GAME_KIND_BlackRed       GameKind = 9  // Black Red
	GameKind_GAME_KIND_HorseRacing    GameKind = 10 // 赛马
	GameKind_GAME_KIND_JM             GameKind = 11 // Jhandi Munda
	GameKind_GAME_KIND_BACCARAT       GameKind = 12 // baccarat
	GameKind_GAME_KIND_FT             GameKind = 20 // fantasy time
)

// Enum value maps for GameKind.
var (
	GameKind_name = map[int32]string{
		0:  "INVALID",
		1:  "GAME_KIND_Rummy",
		2:  "GAME_KIND_Rummy_pool",
		3:  "GAME_KIND_Rummy_10",
		4:  "GAME_KIND_TEEPATTI",
		5:  "GAME_KIND_AB",
		6:  "GAME_KIND_SevenUD",
		7:  "GAME_KIND_RapidTeenaptti",
		8:  "GAME_KIND_DragonTiger",
		9:  "GAME_KIND_BlackRed",
		10: "GAME_KIND_HorseRacing",
		11: "GAME_KIND_JM",
		12: "GAME_KIND_BACCARAT",
		20: "GAME_KIND_FT",
	}
	GameKind_value = map[string]int32{
		"INVALID":                  0,
		"GAME_KIND_Rummy":          1,
		"GAME_KIND_Rummy_pool":     2,
		"GAME_KIND_Rummy_10":       3,
		"GAME_KIND_TEEPATTI":       4,
		"GAME_KIND_AB":             5,
		"GAME_KIND_SevenUD":        6,
		"GAME_KIND_RapidTeenaptti": 7,
		"GAME_KIND_DragonTiger":    8,
		"GAME_KIND_BlackRed":       9,
		"GAME_KIND_HorseRacing":    10,
		"GAME_KIND_JM":             11,
		"GAME_KIND_BACCARAT":       12,
		"GAME_KIND_FT":             20,
	}
)

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

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

func (GameKind) Descriptor() protoreflect.EnumDescriptor {
	return file_platform_proto_enumTypes[6].Descriptor()
}

func (GameKind) Type() protoreflect.EnumType {
	return &file_platform_proto_enumTypes[6]
}

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

// Deprecated: Use GameKind.Descriptor instead.
func (GameKind) EnumDescriptor() ([]byte, []int) {
	return file_platform_proto_rawDescGZIP(), []int{6}
}

// 用户数据
type GameUser struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	Uid      uint32 `protobuf:"varint,1,opt,name=uid,proto3" json:"uid,omitempty"`                           // 用户id
	RealUser uint32 `protobuf:"varint,2,opt,name=real_user,json=realUser,proto3" json:"real_user,omitempty"` // 0:真实用户;1:机器人
	Coin     uint32 `protobuf:"varint,3,opt,name=coin,proto3" json:"coin,omitempty"`                         // 用户的金币:此值不一定会填写,根据游戏类型决定
	UserNick string `protobuf:"bytes,4,opt,name=user_nick,json=userNick,proto3" json:"user_nick,omitempty"`  // 用户的昵称
	UserHead string `protobuf:"bytes,5,opt,name=user_head,json=userHead,proto3" json:"user_head,omitempty"`  // 用户的头像
}

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

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

func (*GameUser) ProtoMessage() {}

func (x *GameUser) ProtoReflect() protoreflect.Message {
	mi := &file_platform_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 GameUser.ProtoReflect.Descriptor instead.
func (*GameUser) Descriptor() ([]byte, []int) {
	return file_platform_proto_rawDescGZIP(), []int{0}
}

func (x *GameUser) GetUid() uint32 {
	if x != nil {
		return x.Uid
	}
	return 0
}

func (x *GameUser) GetRealUser() uint32 {
	if x != nil {
		return x.RealUser
	}
	return 0
}

func (x *GameUser) GetCoin() uint32 {
	if x != nil {
		return x.Coin
	}
	return 0
}

func (x *GameUser) GetUserNick() string {
	if x != nil {
		return x.UserNick
	}
	return ""
}

func (x *GameUser) GetUserHead() string {
	if x != nil {
		return x.UserHead
	}
	return ""
}

// 通用消息
type CommonResponse struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	Result uint32 `protobuf:"varint,1,opt,name=result,proto3" json:"result,omitempty"` // 0:成功
}

func (x *CommonResponse) Reset() {
	*x = CommonResponse{}
	if protoimpl.UnsafeEnabled {
		mi := &file_platform_proto_msgTypes[1]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

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

func (*CommonResponse) ProtoMessage() {}

func (x *CommonResponse) ProtoReflect() protoreflect.Message {
	mi := &file_platform_proto_msgTypes[1]
	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 CommonResponse.ProtoReflect.Descriptor instead.
func (*CommonResponse) Descriptor() ([]byte, []int) {
	return file_platform_proto_rawDescGZIP(), []int{1}
}

func (x *CommonResponse) GetResult() uint32 {
	if x != nil {
		return x.Result
	}
	return 0
}

// 登录请求 :这个登录请求的command可能有多个,但是返回取都是一样的
type LoginRequest struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	UserId uint32 `protobuf:"varint,1,opt,name=user_id,json=userId,proto3" json:"user_id,omitempty"` // UID
	Token  string `protobuf:"bytes,2,opt,name=token,proto3" json:"token,omitempty"`                  // Token
}

func (x *LoginRequest) Reset() {
	*x = LoginRequest{}
	if protoimpl.UnsafeEnabled {
		mi := &file_platform_proto_msgTypes[2]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

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

func (*LoginRequest) ProtoMessage() {}

func (x *LoginRequest) ProtoReflect() protoreflect.Message {
	mi := &file_platform_proto_msgTypes[2]
	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 LoginRequest.ProtoReflect.Descriptor instead.
func (*LoginRequest) Descriptor() ([]byte, []int) {
	return file_platform_proto_rawDescGZIP(), []int{2}
}

func (x *LoginRequest) GetUserId() uint32 {
	if x != nil {
		return x.UserId
	}
	return 0
}

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

// 登录返回
type LoginResponse struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	Result uint32 `protobuf:"varint,1,opt,name=result,proto3" json:"result,omitempty"`               // 0 成功;1 userId错误(用户不存在)
	UserId uint32 `protobuf:"varint,2,opt,name=user_id,json=userId,proto3" json:"user_id,omitempty"` // UID:这个地方必定和请求中的uid一致,但是为了方便客户端异步处理,把UID返回了
}

func (x *LoginResponse) Reset() {
	*x = LoginResponse{}
	if protoimpl.UnsafeEnabled {
		mi := &file_platform_proto_msgTypes[3]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

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

func (*LoginResponse) ProtoMessage() {}

func (x *LoginResponse) ProtoReflect() protoreflect.Message {
	mi := &file_platform_proto_msgTypes[3]
	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 LoginResponse.ProtoReflect.Descriptor instead.
func (*LoginResponse) Descriptor() ([]byte, []int) {
	return file_platform_proto_rawDescGZIP(), []int{3}
}

func (x *LoginResponse) GetResult() uint32 {
	if x != nil {
		return x.Result
	}
	return 0
}

func (x *LoginResponse) GetUserId() uint32 {
	if x != nil {
		return x.UserId
	}
	return 0
}

// 获取用户余额返回
type GetPlayerBalanceResponse struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	Result       uint32       `protobuf:"varint,1,opt,name=result,proto3" json:"result,omitempty"`                                                                         // 是否取到了值, 0 表示取到了值, 1 表示没有取到
	Balance      uint32       `protobuf:"varint,2,opt,name=balance,proto3" json:"balance,omitempty"`                                                                       // 存储账户余额
	BalanceWins  uint32       `protobuf:"varint,3,opt,name=balance_wins,json=balanceWins,proto3" json:"balance_wins,omitempty"`                                            // 可提现账户余额
	Partices     uint32       `protobuf:"varint,4,opt,name=partices,proto3" json:"partices,omitempty"`                                                                     // 练习币余额
	GameCurrency CurrencyKind `protobuf:"varint,5,opt,name=game_currency,json=gameCurrency,proto3,enum=com.cw.chess.platform.CurrencyKind" json:"game_currency,omitempty"` // (建议使用:因为不管怎么样,这个结构会返回所有的数据,但到底显示是真金还是训练币,由其他逻辑保证)
}

func (x *GetPlayerBalanceResponse) Reset() {
	*x = GetPlayerBalanceResponse{}
	if protoimpl.UnsafeEnabled {
		mi := &file_platform_proto_msgTypes[4]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

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

func (*GetPlayerBalanceResponse) ProtoMessage() {}

func (x *GetPlayerBalanceResponse) ProtoReflect() protoreflect.Message {
	mi := &file_platform_proto_msgTypes[4]
	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 GetPlayerBalanceResponse.ProtoReflect.Descriptor instead.
func (*GetPlayerBalanceResponse) Descriptor() ([]byte, []int) {
	return file_platform_proto_rawDescGZIP(), []int{4}
}

func (x *GetPlayerBalanceResponse) GetResult() uint32 {
	if x != nil {
		return x.Result
	}
	return 0
}

func (x *GetPlayerBalanceResponse) GetBalance() uint32 {
	if x != nil {
		return x.Balance
	}
	return 0
}

func (x *GetPlayerBalanceResponse) GetBalanceWins() uint32 {
	if x != nil {
		return x.BalanceWins
	}
	return 0
}

func (x *GetPlayerBalanceResponse) GetPartices() uint32 {
	if x != nil {
		return x.Partices
	}
	return 0
}

func (x *GetPlayerBalanceResponse) GetGameCurrency() CurrencyKind {
	if x != nil {
		return x.GameCurrency
	}
	return CurrencyKind_CK_INVALID
}

// 系统消息
type MessageToUserResp struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	LastTime uint32 `protobuf:"varint,1,opt,name=lastTime,proto3" json:"lastTime,omitempty"` // 持续时间,单位:秒,最大值2小时=2*60*60
	Context  string `protobuf:"bytes,2,opt,name=context,proto3" json:"context,omitempty"`    // 内容:消息内容
}

func (x *MessageToUserResp) Reset() {
	*x = MessageToUserResp{}
	if protoimpl.UnsafeEnabled {
		mi := &file_platform_proto_msgTypes[5]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

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

func (*MessageToUserResp) ProtoMessage() {}

func (x *MessageToUserResp) ProtoReflect() protoreflect.Message {
	mi := &file_platform_proto_msgTypes[5]
	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 MessageToUserResp.ProtoReflect.Descriptor instead.
func (*MessageToUserResp) Descriptor() ([]byte, []int) {
	return file_platform_proto_rawDescGZIP(), []int{5}
}

func (x *MessageToUserResp) GetLastTime() uint32 {
	if x != nil {
		return x.LastTime
	}
	return 0
}

func (x *MessageToUserResp) GetContext() string {
	if x != nil {
		return x.Context
	}
	return ""
}

type UserAttri struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	UserId uint32 `protobuf:"varint,1,opt,name=user_id,json=userId,proto3" json:"user_id,omitempty"`
	Nick   string `protobuf:"bytes,2,opt,name=nick,proto3" json:"nick,omitempty"`
	Head   string `protobuf:"bytes,3,opt,name=head,proto3" json:"head,omitempty"`
}

func (x *UserAttri) Reset() {
	*x = UserAttri{}
	if protoimpl.UnsafeEnabled {
		mi := &file_platform_proto_msgTypes[6]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

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

func (*UserAttri) ProtoMessage() {}

func (x *UserAttri) ProtoReflect() protoreflect.Message {
	mi := &file_platform_proto_msgTypes[6]
	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 UserAttri.ProtoReflect.Descriptor instead.
func (*UserAttri) Descriptor() ([]byte, []int) {
	return file_platform_proto_rawDescGZIP(), []int{6}
}

func (x *UserAttri) GetUserId() uint32 {
	if x != nil {
		return x.UserId
	}
	return 0
}

func (x *UserAttri) GetNick() string {
	if x != nil {
		return x.Nick
	}
	return ""
}

func (x *UserAttri) GetHead() string {
	if x != nil {
		return x.Head
	}
	return ""
}

type MSG_GET_USER_ATTRI_REQ struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	UserIds []uint32 `protobuf:"varint,1,rep,packed,name=user_ids,json=userIds,proto3" json:"user_ids,omitempty"` // 最多50个
}

func (x *MSG_GET_USER_ATTRI_REQ) Reset() {
	*x = MSG_GET_USER_ATTRI_REQ{}
	if protoimpl.UnsafeEnabled {
		mi := &file_platform_proto_msgTypes[7]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

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

func (*MSG_GET_USER_ATTRI_REQ) ProtoMessage() {}

func (x *MSG_GET_USER_ATTRI_REQ) ProtoReflect() protoreflect.Message {
	mi := &file_platform_proto_msgTypes[7]
	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 MSG_GET_USER_ATTRI_REQ.ProtoReflect.Descriptor instead.
func (*MSG_GET_USER_ATTRI_REQ) Descriptor() ([]byte, []int) {
	return file_platform_proto_rawDescGZIP(), []int{7}
}

func (x *MSG_GET_USER_ATTRI_REQ) GetUserIds() []uint32 {
	if x != nil {
		return x.UserIds
	}
	return nil
}

type MSG_GET_USER_ATTRI_RESP struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	UserAttris []*UserAttri `protobuf:"bytes,1,rep,name=user_attris,json=userAttris,proto3" json:"user_attris,omitempty"`
}

func (x *MSG_GET_USER_ATTRI_RESP) Reset() {
	*x = MSG_GET_USER_ATTRI_RESP{}
	if protoimpl.UnsafeEnabled {
		mi := &file_platform_proto_msgTypes[8]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

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

func (*MSG_GET_USER_ATTRI_RESP) ProtoMessage() {}

func (x *MSG_GET_USER_ATTRI_RESP) ProtoReflect() protoreflect.Message {
	mi := &file_platform_proto_msgTypes[8]
	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 MSG_GET_USER_ATTRI_RESP.ProtoReflect.Descriptor instead.
func (*MSG_GET_USER_ATTRI_RESP) Descriptor() ([]byte, []int) {
	return file_platform_proto_rawDescGZIP(), []int{8}
}

func (x *MSG_GET_USER_ATTRI_RESP) GetUserAttris() []*UserAttri {
	if x != nil {
		return x.UserAttris
	}
	return nil
}

type MSG_UPDATE_USER_ATTRI_REQ struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	UserAttri *UserAttri `protobuf:"bytes,1,opt,name=user_attri,json=userAttri,proto3" json:"user_attri,omitempty"` // 更新的属性,注意:只能更新自己的,UserAttri中的user_id可以不填
}

func (x *MSG_UPDATE_USER_ATTRI_REQ) Reset() {
	*x = MSG_UPDATE_USER_ATTRI_REQ{}
	if protoimpl.UnsafeEnabled {
		mi := &file_platform_proto_msgTypes[9]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

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

func (*MSG_UPDATE_USER_ATTRI_REQ) ProtoMessage() {}

func (x *MSG_UPDATE_USER_ATTRI_REQ) ProtoReflect() protoreflect.Message {
	mi := &file_platform_proto_msgTypes[9]
	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 MSG_UPDATE_USER_ATTRI_REQ.ProtoReflect.Descriptor instead.
func (*MSG_UPDATE_USER_ATTRI_REQ) Descriptor() ([]byte, []int) {
	return file_platform_proto_rawDescGZIP(), []int{9}
}

func (x *MSG_UPDATE_USER_ATTRI_REQ) GetUserAttri() *UserAttri {
	if x != nil {
		return x.UserAttri
	}
	return nil
}

type MSG_GET_BONUS_RESP struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	Bonus uint32 `protobuf:"varint,1,opt,name=bonus,proto3" json:"bonus,omitempty"`
}

func (x *MSG_GET_BONUS_RESP) Reset() {
	*x = MSG_GET_BONUS_RESP{}
	if protoimpl.UnsafeEnabled {
		mi := &file_platform_proto_msgTypes[10]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

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

func (*MSG_GET_BONUS_RESP) ProtoMessage() {}

func (x *MSG_GET_BONUS_RESP) ProtoReflect() protoreflect.Message {
	mi := &file_platform_proto_msgTypes[10]
	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 MSG_GET_BONUS_RESP.ProtoReflect.Descriptor instead.
func (*MSG_GET_BONUS_RESP) Descriptor() ([]byte, []int) {
	return file_platform_proto_rawDescGZIP(), []int{10}
}

func (x *MSG_GET_BONUS_RESP) GetBonus() uint32 {
	if x != nil {
		return x.Bonus
	}
	return 0
}

// 任意用户充值达到 Rs.1000(配置项)将进行广播
type BS_RECHARGE struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	Recharge      uint32 `protobuf:"varint,1,opt,name=recharge,proto3" json:"recharge,omitempty"`                                // 1:充值;2:提现
	CurrencyValue uint32 `protobuf:"varint,2,opt,name=currency_value,json=currencyValue,proto3" json:"currency_value,omitempty"` // 金额
}

func (x *BS_RECHARGE) Reset() {
	*x = BS_RECHARGE{}
	if protoimpl.UnsafeEnabled {
		mi := &file_platform_proto_msgTypes[11]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

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

func (*BS_RECHARGE) ProtoMessage() {}

func (x *BS_RECHARGE) ProtoReflect() protoreflect.Message {
	mi := &file_platform_proto_msgTypes[11]
	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 BS_RECHARGE.ProtoReflect.Descriptor instead.
func (*BS_RECHARGE) Descriptor() ([]byte, []int) {
	return file_platform_proto_rawDescGZIP(), []int{11}
}

func (x *BS_RECHARGE) GetRecharge() uint32 {
	if x != nil {
		return x.Recharge
	}
	return 0
}

func (x *BS_RECHARGE) GetCurrencyValue() uint32 {
	if x != nil {
		return x.CurrencyValue
	}
	return 0
}

// Wow! Player ***1234 just won Rs.xxx in Rummy/Teen Patti/Andar Bahar.
type BS_GAME struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	GameType      uint32 `protobuf:"varint,1,opt,name=game_type,json=gameType,proto3" json:"game_type,omitempty"`                // 1:rummy;4:teenpatti;5:Andar Bahar
	CurrencyValue uint32 `protobuf:"varint,2,opt,name=currency_value,json=currencyValue,proto3" json:"currency_value,omitempty"` // 金额
	Parameter_1   uint32 `protobuf:"varint,3,opt,name=parameter_1,json=parameter1,proto3" json:"parameter_1,omitempty"`
	Parameter_2   uint32 `protobuf:"varint,4,opt,name=parameter_2,json=parameter2,proto3" json:"parameter_2,omitempty"`
	Parameter_3   uint32 `protobuf:"varint,5,opt,name=parameter_3,json=parameter3,proto3" json:"parameter_3,omitempty"`
}

func (x *BS_GAME) Reset() {
	*x = BS_GAME{}
	if protoimpl.UnsafeEnabled {
		mi := &file_platform_proto_msgTypes[12]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

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

func (*BS_GAME) ProtoMessage() {}

func (x *BS_GAME) ProtoReflect() protoreflect.Message {
	mi := &file_platform_proto_msgTypes[12]
	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 BS_GAME.ProtoReflect.Descriptor instead.
func (*BS_GAME) Descriptor() ([]byte, []int) {
	return file_platform_proto_rawDescGZIP(), []int{12}
}

func (x *BS_GAME) GetGameType() uint32 {
	if x != nil {
		return x.GameType
	}
	return 0
}

func (x *BS_GAME) GetCurrencyValue() uint32 {
	if x != nil {
		return x.CurrencyValue
	}
	return 0
}

func (x *BS_GAME) GetParameter_1() uint32 {
	if x != nil {
		return x.Parameter_1
	}
	return 0
}

func (x *BS_GAME) GetParameter_2() uint32 {
	if x != nil {
		return x.Parameter_2
	}
	return 0
}

func (x *BS_GAME) GetParameter_3() uint32 {
	if x != nil {
		return x.Parameter_3
	}
	return 0
}

type MSG_BS_DATA struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	UserId      uint32       `protobuf:"varint,1,opt,name=user_id,json=userId,proto3" json:"user_id,omitempty"`
	UserNick    uint32       `protobuf:"varint,2,opt,name=user_nick,json=userNick,proto3" json:"user_nick,omitempty"`
	BsType      uint32       `protobuf:"varint,3,opt,name=bs_type,json=bsType,proto3" json:"bs_type,omitempty"`
	MsgRecharge *BS_RECHARGE `protobuf:"bytes,4,opt,name=msg_recharge,json=msgRecharge,proto3" json:"msg_recharge,omitempty"`
	MsgGame     *BS_GAME     `protobuf:"bytes,5,opt,name=msg_game,json=msgGame,proto3" json:"msg_game,omitempty"`
	TimeStamp   uint32       `protobuf:"varint,6,opt,name=time_stamp,json=timeStamp,proto3" json:"time_stamp,omitempty"` // 时间戳(客户端不需要使用该值)
}

func (x *MSG_BS_DATA) Reset() {
	*x = MSG_BS_DATA{}
	if protoimpl.UnsafeEnabled {
		mi := &file_platform_proto_msgTypes[13]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

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

func (*MSG_BS_DATA) ProtoMessage() {}

func (x *MSG_BS_DATA) ProtoReflect() protoreflect.Message {
	mi := &file_platform_proto_msgTypes[13]
	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 MSG_BS_DATA.ProtoReflect.Descriptor instead.
func (*MSG_BS_DATA) Descriptor() ([]byte, []int) {
	return file_platform_proto_rawDescGZIP(), []int{13}
}

func (x *MSG_BS_DATA) GetUserId() uint32 {
	if x != nil {
		return x.UserId
	}
	return 0
}

func (x *MSG_BS_DATA) GetUserNick() uint32 {
	if x != nil {
		return x.UserNick
	}
	return 0
}

func (x *MSG_BS_DATA) GetBsType() uint32 {
	if x != nil {
		return x.BsType
	}
	return 0
}

func (x *MSG_BS_DATA) GetMsgRecharge() *BS_RECHARGE {
	if x != nil {
		return x.MsgRecharge
	}
	return nil
}

func (x *MSG_BS_DATA) GetMsgGame() *BS_GAME {
	if x != nil {
		return x.MsgGame
	}
	return nil
}

func (x *MSG_BS_DATA) GetTimeStamp() uint32 {
	if x != nil {
		return x.TimeStamp
	}
	return 0
}

type MSG_MSG_QUE_DATA struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	//Wow! Player ***1234 just won <color=#00ff00>Rs.xxx</c> in <color=#0fffff>Rummy</color>
	//Play <color=#00ff00>***1234</c> add cash <color=#00ff00>Rs.xxx</c>
	MsgContent string `protobuf:"bytes,1,opt,name=msg_content,json=msgContent,proto3" json:"msg_content,omitempty"`
}

func (x *MSG_MSG_QUE_DATA) Reset() {
	*x = MSG_MSG_QUE_DATA{}
	if protoimpl.UnsafeEnabled {
		mi := &file_platform_proto_msgTypes[14]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

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

func (*MSG_MSG_QUE_DATA) ProtoMessage() {}

func (x *MSG_MSG_QUE_DATA) ProtoReflect() protoreflect.Message {
	mi := &file_platform_proto_msgTypes[14]
	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 MSG_MSG_QUE_DATA.ProtoReflect.Descriptor instead.
func (*MSG_MSG_QUE_DATA) Descriptor() ([]byte, []int) {
	return file_platform_proto_rawDescGZIP(), []int{14}
}

func (x *MSG_MSG_QUE_DATA) GetMsgContent() string {
	if x != nil {
		return x.MsgContent
	}
	return ""
}

type MSG_MSG_QUE struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	DataList []*MSG_MSG_QUE_DATA `protobuf:"bytes,1,rep,name=data_list,json=dataList,proto3" json:"data_list,omitempty"`
}

func (x *MSG_MSG_QUE) Reset() {
	*x = MSG_MSG_QUE{}
	if protoimpl.UnsafeEnabled {
		mi := &file_platform_proto_msgTypes[15]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

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

func (*MSG_MSG_QUE) ProtoMessage() {}

func (x *MSG_MSG_QUE) ProtoReflect() protoreflect.Message {
	mi := &file_platform_proto_msgTypes[15]
	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 MSG_MSG_QUE.ProtoReflect.Descriptor instead.
func (*MSG_MSG_QUE) Descriptor() ([]byte, []int) {
	return file_platform_proto_rawDescGZIP(), []int{15}
}

func (x *MSG_MSG_QUE) GetDataList() []*MSG_MSG_QUE_DATA {
	if x != nil {
		return x.DataList
	}
	return nil
}

// 游戏级别的基础定义
type GameLevelDesc struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	LevelId       uint32       `protobuf:"varint,1,opt,name=level_id,json=levelId,proto3" json:"level_id,omitempty"`                                                        // 级别ID
	CurrencyKind  CurrencyKind `protobuf:"varint,2,opt,name=currency_kind,json=currencyKind,proto3,enum=com.cw.chess.platform.CurrencyKind" json:"currency_kind,omitempty"` // 真金还是训练(这个逻辑客户端要判定)
	CurrencyLimit uint32       `protobuf:"varint,3,opt,name=currency_limit,json=currencyLimit,proto3" json:"currency_limit,omitempty"`                                      // 进入限制(这个逻辑客户端不需要判定,只显示,服务器会下发,免得以后要修改逻辑)
	LevelName     string       `protobuf:"bytes,4,opt,name=level_name,json=levelName,proto3" json:"level_name,omitempty"`                                                   // 级别名字,例如(中级房)
	UserCount     uint32       `protobuf:"varint,5,opt,name=user_count,json=userCount,proto3" json:"user_count,omitempty"`                                                  // 这个级别有多少个用户在玩
	TaxPermillage uint32       `protobuf:"varint,6,opt,name=tax_permillage,json=taxPermillage,proto3" json:"tax_permillage,omitempty"`                                      // 抽水比率(千分比)
	GameId        uint32       `protobuf:"varint,7,opt,name=game_id,json=gameId,proto3" json:"game_id,omitempty"`
}

func (x *GameLevelDesc) Reset() {
	*x = GameLevelDesc{}
	if protoimpl.UnsafeEnabled {
		mi := &file_platform_proto_msgTypes[16]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

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

func (*GameLevelDesc) ProtoMessage() {}

func (x *GameLevelDesc) ProtoReflect() protoreflect.Message {
	mi := &file_platform_proto_msgTypes[16]
	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 GameLevelDesc.ProtoReflect.Descriptor instead.
func (*GameLevelDesc) Descriptor() ([]byte, []int) {
	return file_platform_proto_rawDescGZIP(), []int{16}
}

func (x *GameLevelDesc) GetLevelId() uint32 {
	if x != nil {
		return x.LevelId
	}
	return 0
}

func (x *GameLevelDesc) GetCurrencyKind() CurrencyKind {
	if x != nil {
		return x.CurrencyKind
	}
	return CurrencyKind_CK_INVALID
}

func (x *GameLevelDesc) GetCurrencyLimit() uint32 {
	if x != nil {
		return x.CurrencyLimit
	}
	return 0
}

func (x *GameLevelDesc) GetLevelName() string {
	if x != nil {
		return x.LevelName
	}
	return ""
}

func (x *GameLevelDesc) GetUserCount() uint32 {
	if x != nil {
		return x.UserCount
	}
	return 0
}

func (x *GameLevelDesc) GetTaxPermillage() uint32 {
	if x != nil {
		return x.TaxPermillage
	}
	return 0
}

func (x *GameLevelDesc) GetGameId() uint32 {
	if x != nil {
		return x.GameId
	}
	return 0
}

// rummy每一个级别的数据描叙
type RummyLevelDesc struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	GameLevel        *GameLevelDesc `protobuf:"bytes,1,opt,name=game_level,json=gameLevel,proto3" json:"game_level,omitempty"`                         // 游戏通用描叙
	RummyPlayersSize uint32         `protobuf:"varint,2,opt,name=rummy_players_size,json=rummyPlayersSize,proto3" json:"rummy_players_size,omitempty"` // 一个桌子支持几个玩家,可能是2/6
	ScoreValue       uint32         `protobuf:"varint,3,opt,name=score_value,json=scoreValue,proto3" json:"score_value,omitempty"`                     // rummy一张牌的分数,后续计算全部根据这个值来
	TimesFeeRatio    uint32         `protobuf:"varint,4,opt,name=times_fee_ratio,json=timesFeeRatio,proto3" json:"times_fee_ratio,omitempty"`          // rummy的台费系数
	Fantasytime      uint32         `protobuf:"varint,5,opt,name=fantasytime,proto3" json:"fantasytime,omitempty"`                                     // 是否支持ft,0:不支持,1:支持
}

func (x *RummyLevelDesc) Reset() {
	*x = RummyLevelDesc{}
	if protoimpl.UnsafeEnabled {
		mi := &file_platform_proto_msgTypes[17]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

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

func (*RummyLevelDesc) ProtoMessage() {}

func (x *RummyLevelDesc) ProtoReflect() protoreflect.Message {
	mi := &file_platform_proto_msgTypes[17]
	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 RummyLevelDesc.ProtoReflect.Descriptor instead.
func (*RummyLevelDesc) Descriptor() ([]byte, []int) {
	return file_platform_proto_rawDescGZIP(), []int{17}
}

func (x *RummyLevelDesc) GetGameLevel() *GameLevelDesc {
	if x != nil {
		return x.GameLevel
	}
	return nil
}

func (x *RummyLevelDesc) GetRummyPlayersSize() uint32 {
	if x != nil {
		return x.RummyPlayersSize
	}
	return 0
}

func (x *RummyLevelDesc) GetScoreValue() uint32 {
	if x != nil {
		return x.ScoreValue
	}
	return 0
}

func (x *RummyLevelDesc) GetTimesFeeRatio() uint32 {
	if x != nil {
		return x.TimesFeeRatio
	}
	return 0
}

func (x *RummyLevelDesc) GetFantasytime() uint32 {
	if x != nil {
		return x.Fantasytime
	}
	return 0
}

// teepatti每一个级别的数据描叙
type TeepattiLevelDesc struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	GameLevel     *GameLevelDesc `protobuf:"bytes,1,opt,name=game_level,json=gameLevel,proto3" json:"game_level,omitempty"`                // 游戏通用描叙
	Blind         uint32         `protobuf:"varint,2,opt,name=blind,proto3" json:"blind,omitempty"`                                        // teepatti是按照盲注的倍数来计算分数
	SingleMaxBet  uint32         `protobuf:"varint,3,opt,name=single_max_bet,json=singleMaxBet,proto3" json:"single_max_bet,omitempty"`    // 单个用户最大封顶值
	TableMaxBet   uint32         `protobuf:"varint,4,opt,name=table_max_bet,json=tableMaxBet,proto3" json:"table_max_bet,omitempty"`       // 桌子最大封顶值
	TimesFeeRatio uint32         `protobuf:"varint,5,opt,name=times_fee_ratio,json=timesFeeRatio,proto3" json:"times_fee_ratio,omitempty"` // teenpatti的台费系数
	Fantasytime   uint32         `protobuf:"varint,6,opt,name=fantasytime,proto3" json:"fantasytime,omitempty"`                            // 是否支持ft,0:不支持,1:支持
}

func (x *TeepattiLevelDesc) Reset() {
	*x = TeepattiLevelDesc{}
	if protoimpl.UnsafeEnabled {
		mi := &file_platform_proto_msgTypes[18]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

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

func (*TeepattiLevelDesc) ProtoMessage() {}

func (x *TeepattiLevelDesc) ProtoReflect() protoreflect.Message {
	mi := &file_platform_proto_msgTypes[18]
	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 TeepattiLevelDesc.ProtoReflect.Descriptor instead.
func (*TeepattiLevelDesc) Descriptor() ([]byte, []int) {
	return file_platform_proto_rawDescGZIP(), []int{18}
}

func (x *TeepattiLevelDesc) GetGameLevel() *GameLevelDesc {
	if x != nil {
		return x.GameLevel
	}
	return nil
}

func (x *TeepattiLevelDesc) GetBlind() uint32 {
	if x != nil {
		return x.Blind
	}
	return 0
}

func (x *TeepattiLevelDesc) GetSingleMaxBet() uint32 {
	if x != nil {
		return x.SingleMaxBet
	}
	return 0
}

func (x *TeepattiLevelDesc) GetTableMaxBet() uint32 {
	if x != nil {
		return x.TableMaxBet
	}
	return 0
}

func (x *TeepattiLevelDesc) GetTimesFeeRatio() uint32 {
	if x != nil {
		return x.TimesFeeRatio
	}
	return 0
}

func (x *TeepattiLevelDesc) GetFantasytime() uint32 {
	if x != nil {
		return x.Fantasytime
	}
	return 0
}

// AB每一个级别的数据描叙
type ABLevelDesc struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	GameLevel     *GameLevelDesc `protobuf:"bytes,1,opt,name=game_level,json=gameLevel,proto3" json:"game_level,omitempty"`                // 游戏通用描叙
	BetMin        uint32         `protobuf:"varint,2,opt,name=bet_min,json=betMin,proto3" json:"bet_min,omitempty"`                        // 最小下注
	BetMax        uint32         `protobuf:"varint,3,opt,name=bet_max,json=betMax,proto3" json:"bet_max,omitempty"`                        // 最大下注
	ABPlayersSize uint32         `protobuf:"varint,4,opt,name=AB_players_size,json=ABPlayersSize,proto3" json:"AB_players_size,omitempty"` // 一个桌子支持几个玩家,通常是400
	ChipTemplete  uint32         `protobuf:"varint,5,opt,name=chip_templete,json=chipTemplete,proto3" json:"chip_templete,omitempty"`
}

func (x *ABLevelDesc) Reset() {
	*x = ABLevelDesc{}
	if protoimpl.UnsafeEnabled {
		mi := &file_platform_proto_msgTypes[19]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

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

func (*ABLevelDesc) ProtoMessage() {}

func (x *ABLevelDesc) ProtoReflect() protoreflect.Message {
	mi := &file_platform_proto_msgTypes[19]
	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 ABLevelDesc.ProtoReflect.Descriptor instead.
func (*ABLevelDesc) Descriptor() ([]byte, []int) {
	return file_platform_proto_rawDescGZIP(), []int{19}
}

func (x *ABLevelDesc) GetGameLevel() *GameLevelDesc {
	if x != nil {
		return x.GameLevel
	}
	return nil
}

func (x *ABLevelDesc) GetBetMin() uint32 {
	if x != nil {
		return x.BetMin
	}
	return 0
}

func (x *ABLevelDesc) GetBetMax() uint32 {
	if x != nil {
		return x.BetMax
	}
	return 0
}

func (x *ABLevelDesc) GetABPlayersSize() uint32 {
	if x != nil {
		return x.ABPlayersSize
	}
	return 0
}

func (x *ABLevelDesc) GetChipTemplete() uint32 {
	if x != nil {
		return x.ChipTemplete
	}
	return 0
}

// 7updown每一个级别的数据描叙
type SevenUpdownLevelDesc struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	GameLevel     *GameLevelDesc `protobuf:"bytes,1,opt,name=game_level,json=gameLevel,proto3" json:"game_level,omitempty"`                // 游戏通用描叙
	BetMin        uint32         `protobuf:"varint,2,opt,name=bet_min,json=betMin,proto3" json:"bet_min,omitempty"`                        // 最小下注
	BetMax        uint32         `protobuf:"varint,3,opt,name=bet_max,json=betMax,proto3" json:"bet_max,omitempty"`                        // 最大下注
	SDPlayersSize uint32         `protobuf:"varint,4,opt,name=SD_players_size,json=SDPlayersSize,proto3" json:"SD_players_size,omitempty"` // 一个桌子支持几个玩家,通常是400
	ChipTemplete  uint32         `protobuf:"varint,5,opt,name=chip_templete,json=chipTemplete,proto3" json:"chip_templete,omitempty"`
	BetMin1       uint32         `protobuf:"varint,6,opt,name=bet_min1,json=betMin1,proto3" json:"bet_min1,omitempty"`
	BetMax1       uint32         `protobuf:"varint,7,opt,name=bet_max1,json=betMax1,proto3" json:"bet_max1,omitempty"`
	BetMin2       uint32         `protobuf:"varint,8,opt,name=bet_min2,json=betMin2,proto3" json:"bet_min2,omitempty"`
	BetMax2       uint32         `protobuf:"varint,9,opt,name=bet_max2,json=betMax2,proto3" json:"bet_max2,omitempty"`
	BetMin0       uint32         `protobuf:"varint,10,opt,name=bet_min0,json=betMin0,proto3" json:"bet_min0,omitempty"`
	BetMax0       uint32         `protobuf:"varint,11,opt,name=bet_max0,json=betMax0,proto3" json:"bet_max0,omitempty"`
}

func (x *SevenUpdownLevelDesc) Reset() {
	*x = SevenUpdownLevelDesc{}
	if protoimpl.UnsafeEnabled {
		mi := &file_platform_proto_msgTypes[20]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

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

func (*SevenUpdownLevelDesc) ProtoMessage() {}

func (x *SevenUpdownLevelDesc) ProtoReflect() protoreflect.Message {
	mi := &file_platform_proto_msgTypes[20]
	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 SevenUpdownLevelDesc.ProtoReflect.Descriptor instead.
func (*SevenUpdownLevelDesc) Descriptor() ([]byte, []int) {
	return file_platform_proto_rawDescGZIP(), []int{20}
}

func (x *SevenUpdownLevelDesc) GetGameLevel() *GameLevelDesc {
	if x != nil {
		return x.GameLevel
	}
	return nil
}

func (x *SevenUpdownLevelDesc) GetBetMin() uint32 {
	if x != nil {
		return x.BetMin
	}
	return 0
}

func (x *SevenUpdownLevelDesc) GetBetMax() uint32 {
	if x != nil {
		return x.BetMax
	}
	return 0
}

func (x *SevenUpdownLevelDesc) GetSDPlayersSize() uint32 {
	if x != nil {
		return x.SDPlayersSize
	}
	return 0
}

func (x *SevenUpdownLevelDesc) GetChipTemplete() uint32 {
	if x != nil {
		return x.ChipTemplete
	}
	return 0
}

func (x *SevenUpdownLevelDesc) GetBetMin1() uint32 {
	if x != nil {
		return x.BetMin1
	}
	return 0
}

func (x *SevenUpdownLevelDesc) GetBetMax1() uint32 {
	if x != nil {
		return x.BetMax1
	}
	return 0
}

func (x *SevenUpdownLevelDesc) GetBetMin2() uint32 {
	if x != nil {
		return x.BetMin2
	}
	return 0
}

func (x *SevenUpdownLevelDesc) GetBetMax2() uint32 {
	if x != nil {
		return x.BetMax2
	}
	return 0
}

func (x *SevenUpdownLevelDesc) GetBetMin0() uint32 {
	if x != nil {
		return x.BetMin0
	}
	return 0
}

func (x *SevenUpdownLevelDesc) GetBetMax0() uint32 {
	if x != nil {
		return x.BetMax0
	}
	return 0
}

// rapid teenpatti每一个级别的数据描叙
type RapidTeenpattiLevelDesc struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	GameLevel *GameLevelDesc `protobuf:"bytes,1,opt,name=game_level,json=gameLevel,proto3" json:"game_level,omitempty"` // 游戏通用描叙
	Blind     uint32         `protobuf:"varint,2,opt,name=blind,proto3" json:"blind,omitempty"`                         // 盲注
}

func (x *RapidTeenpattiLevelDesc) Reset() {
	*x = RapidTeenpattiLevelDesc{}
	if protoimpl.UnsafeEnabled {
		mi := &file_platform_proto_msgTypes[21]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

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

func (*RapidTeenpattiLevelDesc) ProtoMessage() {}

func (x *RapidTeenpattiLevelDesc) ProtoReflect() protoreflect.Message {
	mi := &file_platform_proto_msgTypes[21]
	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 RapidTeenpattiLevelDesc.ProtoReflect.Descriptor instead.
func (*RapidTeenpattiLevelDesc) Descriptor() ([]byte, []int) {
	return file_platform_proto_rawDescGZIP(), []int{21}
}

func (x *RapidTeenpattiLevelDesc) GetGameLevel() *GameLevelDesc {
	if x != nil {
		return x.GameLevel
	}
	return nil
}

func (x *RapidTeenpattiLevelDesc) GetBlind() uint32 {
	if x != nil {
		return x.Blind
	}
	return 0
}

// DragonTiger每一个级别的数据描叙
type DragonTigerLevelDesc struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	GameLevel     *GameLevelDesc `protobuf:"bytes,1,opt,name=game_level,json=gameLevel,proto3" json:"game_level,omitempty"` // 游戏通用描叙
	BetMin        uint32         `protobuf:"varint,2,opt,name=bet_min,json=betMin,proto3" json:"bet_min,omitempty"`
	BetMax        uint32         `protobuf:"varint,3,opt,name=bet_max,json=betMax,proto3" json:"bet_max,omitempty"`
	SDPlayersSize uint32         `protobuf:"varint,4,opt,name=SD_players_size,json=SDPlayersSize,proto3" json:"SD_players_size,omitempty"`
	ChipTemplete  uint32         `protobuf:"varint,5,opt,name=chip_templete,json=chipTemplete,proto3" json:"chip_templete,omitempty"`
	BetMin1       uint32         `protobuf:"varint,6,opt,name=bet_min1,json=betMin1,proto3" json:"bet_min1,omitempty"`
	BetMax1       uint32         `protobuf:"varint,7,opt,name=bet_max1,json=betMax1,proto3" json:"bet_max1,omitempty"`
	BetMin2       uint32         `protobuf:"varint,8,opt,name=bet_min2,json=betMin2,proto3" json:"bet_min2,omitempty"`
	BetMax2       uint32         `protobuf:"varint,9,opt,name=bet_max2,json=betMax2,proto3" json:"bet_max2,omitempty"`
	BetMin0       uint32         `protobuf:"varint,10,opt,name=bet_min0,json=betMin0,proto3" json:"bet_min0,omitempty"`
	BetMax0       uint32         `protobuf:"varint,11,opt,name=bet_max0,json=betMax0,proto3" json:"bet_max0,omitempty"`
}

func (x *DragonTigerLevelDesc) Reset() {
	*x = DragonTigerLevelDesc{}
	if protoimpl.UnsafeEnabled {
		mi := &file_platform_proto_msgTypes[22]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

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

func (*DragonTigerLevelDesc) ProtoMessage() {}

func (x *DragonTigerLevelDesc) ProtoReflect() protoreflect.Message {
	mi := &file_platform_proto_msgTypes[22]
	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 DragonTigerLevelDesc.ProtoReflect.Descriptor instead.
func (*DragonTigerLevelDesc) Descriptor() ([]byte, []int) {
	return file_platform_proto_rawDescGZIP(), []int{22}
}

func (x *DragonTigerLevelDesc) GetGameLevel() *GameLevelDesc {
	if x != nil {
		return x.GameLevel
	}
	return nil
}

func (x *DragonTigerLevelDesc) GetBetMin() uint32 {
	if x != nil {
		return x.BetMin
	}
	return 0
}

func (x *DragonTigerLevelDesc) GetBetMax() uint32 {
	if x != nil {
		return x.BetMax
	}
	return 0
}

func (x *DragonTigerLevelDesc) GetSDPlayersSize() uint32 {
	if x != nil {
		return x.SDPlayersSize
	}
	return 0
}

func (x *DragonTigerLevelDesc) GetChipTemplete() uint32 {
	if x != nil {
		return x.ChipTemplete
	}
	return 0
}

func (x *DragonTigerLevelDesc) GetBetMin1() uint32 {
	if x != nil {
		return x.BetMin1
	}
	return 0
}

func (x *DragonTigerLevelDesc) GetBetMax1() uint32 {
	if x != nil {
		return x.BetMax1
	}
	return 0
}

func (x *DragonTigerLevelDesc) GetBetMin2() uint32 {
	if x != nil {
		return x.BetMin2
	}
	return 0
}

func (x *DragonTigerLevelDesc) GetBetMax2() uint32 {
	if x != nil {
		return x.BetMax2
	}
	return 0
}

func (x *DragonTigerLevelDesc) GetBetMin0() uint32 {
	if x != nil {
		return x.BetMin0
	}
	return 0
}

func (x *DragonTigerLevelDesc) GetBetMax0() uint32 {
	if x != nil {
		return x.BetMax0
	}
	return 0
}

// 红黑每一个级别的数据描叙
type BlackredLevelDesc struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	GameLevel     *GameLevelDesc `protobuf:"bytes,1,opt,name=game_level,json=gameLevel,proto3" json:"game_level,omitempty"` // 游戏通用描叙
	BetMin        uint32         `protobuf:"varint,2,opt,name=bet_min,json=betMin,proto3" json:"bet_min,omitempty"`
	BetMax        uint32         `protobuf:"varint,3,opt,name=bet_max,json=betMax,proto3" json:"bet_max,omitempty"`
	SDPlayersSize uint32         `protobuf:"varint,4,opt,name=SD_players_size,json=SDPlayersSize,proto3" json:"SD_players_size,omitempty"`
	ChipTemplete  uint32         `protobuf:"varint,5,opt,name=chip_templete,json=chipTemplete,proto3" json:"chip_templete,omitempty"`
}

func (x *BlackredLevelDesc) Reset() {
	*x = BlackredLevelDesc{}
	if protoimpl.UnsafeEnabled {
		mi := &file_platform_proto_msgTypes[23]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

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

func (*BlackredLevelDesc) ProtoMessage() {}

func (x *BlackredLevelDesc) ProtoReflect() protoreflect.Message {
	mi := &file_platform_proto_msgTypes[23]
	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 BlackredLevelDesc.ProtoReflect.Descriptor instead.
func (*BlackredLevelDesc) Descriptor() ([]byte, []int) {
	return file_platform_proto_rawDescGZIP(), []int{23}
}

func (x *BlackredLevelDesc) GetGameLevel() *GameLevelDesc {
	if x != nil {
		return x.GameLevel
	}
	return nil
}

func (x *BlackredLevelDesc) GetBetMin() uint32 {
	if x != nil {
		return x.BetMin
	}
	return 0
}

func (x *BlackredLevelDesc) GetBetMax() uint32 {
	if x != nil {
		return x.BetMax
	}
	return 0
}

func (x *BlackredLevelDesc) GetSDPlayersSize() uint32 {
	if x != nil {
		return x.SDPlayersSize
	}
	return 0
}

func (x *BlackredLevelDesc) GetChipTemplete() uint32 {
	if x != nil {
		return x.ChipTemplete
	}
	return 0
}

// 赛马每一个级别的数据描叙
type HorseracingDesc struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	GameLevel      *GameLevelDesc `protobuf:"bytes,1,opt,name=game_level,json=gameLevel,proto3" json:"game_level,omitempty"` // 游戏通用描叙
	SDPlayersSize  uint32         `protobuf:"varint,2,opt,name=SD_players_size,json=SDPlayersSize,proto3" json:"SD_players_size,omitempty"`
	ChipTemplete   uint32         `protobuf:"varint,3,opt,name=chip_templete,json=chipTemplete,proto3" json:"chip_templete,omitempty"`
	OExpectedValue uint32         `protobuf:"varint,4,opt,name=o_expected_value,json=oExpectedValue,proto3" json:"o_expected_value,omitempty"` // 胜利期望,百分制,例如85,代表85%
	BetMin         uint32         `protobuf:"varint,5,opt,name=bet_min,json=betMin,proto3" json:"bet_min,omitempty"`
	BetMax         uint32         `protobuf:"varint,6,opt,name=bet_max,json=betMax,proto3" json:"bet_max,omitempty"`
}

func (x *HorseracingDesc) Reset() {
	*x = HorseracingDesc{}
	if protoimpl.UnsafeEnabled {
		mi := &file_platform_proto_msgTypes[24]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

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

func (*HorseracingDesc) ProtoMessage() {}

func (x *HorseracingDesc) ProtoReflect() protoreflect.Message {
	mi := &file_platform_proto_msgTypes[24]
	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 HorseracingDesc.ProtoReflect.Descriptor instead.
func (*HorseracingDesc) Descriptor() ([]byte, []int) {
	return file_platform_proto_rawDescGZIP(), []int{24}
}

func (x *HorseracingDesc) GetGameLevel() *GameLevelDesc {
	if x != nil {
		return x.GameLevel
	}
	return nil
}

func (x *HorseracingDesc) GetSDPlayersSize() uint32 {
	if x != nil {
		return x.SDPlayersSize
	}
	return 0
}

func (x *HorseracingDesc) GetChipTemplete() uint32 {
	if x != nil {
		return x.ChipTemplete
	}
	return 0
}

func (x *HorseracingDesc) GetOExpectedValue() uint32 {
	if x != nil {
		return x.OExpectedValue
	}
	return 0
}

func (x *HorseracingDesc) GetBetMin() uint32 {
	if x != nil {
		return x.BetMin
	}
	return 0
}

func (x *HorseracingDesc) GetBetMax() uint32 {
	if x != nil {
		return x.BetMax
	}
	return 0
}

// Jhandi Munda每一个级别的数据描叙
type JMLevelDesc struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	GameLevel     *GameLevelDesc `protobuf:"bytes,1,opt,name=game_level,json=gameLevel,proto3" json:"game_level,omitempty"` // 游戏通用描叙
	BetMin        uint32         `protobuf:"varint,2,opt,name=bet_min,json=betMin,proto3" json:"bet_min,omitempty"`
	BetMax        uint32         `protobuf:"varint,3,opt,name=bet_max,json=betMax,proto3" json:"bet_max,omitempty"`
	SDPlayersSize uint32         `protobuf:"varint,4,opt,name=SD_players_size,json=SDPlayersSize,proto3" json:"SD_players_size,omitempty"`
	ChipTemplete  uint32         `protobuf:"varint,5,opt,name=chip_templete,json=chipTemplete,proto3" json:"chip_templete,omitempty"`
}

func (x *JMLevelDesc) Reset() {
	*x = JMLevelDesc{}
	if protoimpl.UnsafeEnabled {
		mi := &file_platform_proto_msgTypes[25]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

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

func (*JMLevelDesc) ProtoMessage() {}

func (x *JMLevelDesc) ProtoReflect() protoreflect.Message {
	mi := &file_platform_proto_msgTypes[25]
	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 JMLevelDesc.ProtoReflect.Descriptor instead.
func (*JMLevelDesc) Descriptor() ([]byte, []int) {
	return file_platform_proto_rawDescGZIP(), []int{25}
}

func (x *JMLevelDesc) GetGameLevel() *GameLevelDesc {
	if x != nil {
		return x.GameLevel
	}
	return nil
}

func (x *JMLevelDesc) GetBetMin() uint32 {
	if x != nil {
		return x.BetMin
	}
	return 0
}

func (x *JMLevelDesc) GetBetMax() uint32 {
	if x != nil {
		return x.BetMax
	}
	return 0
}

func (x *JMLevelDesc) GetSDPlayersSize() uint32 {
	if x != nil {
		return x.SDPlayersSize
	}
	return 0
}

func (x *JMLevelDesc) GetChipTemplete() uint32 {
	if x != nil {
		return x.ChipTemplete
	}
	return 0
}

// Baccarat每一个级别的数据描叙
type BaccaratLevelDesc struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	GameLevel     *GameLevelDesc `protobuf:"bytes,1,opt,name=game_level,json=gameLevel,proto3" json:"game_level,omitempty"` // 游戏通用描叙
	BetMin        uint32         `protobuf:"varint,2,opt,name=bet_min,json=betMin,proto3" json:"bet_min,omitempty"`
	BetMax        uint32         `protobuf:"varint,3,opt,name=bet_max,json=betMax,proto3" json:"bet_max,omitempty"`
	SDPlayersSize uint32         `protobuf:"varint,4,opt,name=SD_players_size,json=SDPlayersSize,proto3" json:"SD_players_size,omitempty"`
}

func (x *BaccaratLevelDesc) Reset() {
	*x = BaccaratLevelDesc{}
	if protoimpl.UnsafeEnabled {
		mi := &file_platform_proto_msgTypes[26]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

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

func (*BaccaratLevelDesc) ProtoMessage() {}

func (x *BaccaratLevelDesc) ProtoReflect() protoreflect.Message {
	mi := &file_platform_proto_msgTypes[26]
	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 BaccaratLevelDesc.ProtoReflect.Descriptor instead.
func (*BaccaratLevelDesc) Descriptor() ([]byte, []int) {
	return file_platform_proto_rawDescGZIP(), []int{26}
}

func (x *BaccaratLevelDesc) GetGameLevel() *GameLevelDesc {
	if x != nil {
		return x.GameLevel
	}
	return nil
}

func (x *BaccaratLevelDesc) GetBetMin() uint32 {
	if x != nil {
		return x.BetMin
	}
	return 0
}

func (x *BaccaratLevelDesc) GetBetMax() uint32 {
	if x != nil {
		return x.BetMax
	}
	return 0
}

func (x *BaccaratLevelDesc) GetSDPlayersSize() uint32 {
	if x != nil {
		return x.SDPlayersSize
	}
	return 0
}

// 获取游戏level信息
type GameKindRequest struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	GameKind GameKind `protobuf:"varint,1,opt,name=game_kind,json=gameKind,proto3,enum=com.cw.chess.platform.GameKind" json:"game_kind,omitempty"` // 请求获取的游戏对应的数据,如果填写INVALID,会返回所有支持的游戏
}

func (x *GameKindRequest) Reset() {
	*x = GameKindRequest{}
	if protoimpl.UnsafeEnabled {
		mi := &file_platform_proto_msgTypes[27]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

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

func (*GameKindRequest) ProtoMessage() {}

func (x *GameKindRequest) ProtoReflect() protoreflect.Message {
	mi := &file_platform_proto_msgTypes[27]
	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 GameKindRequest.ProtoReflect.Descriptor instead.
func (*GameKindRequest) Descriptor() ([]byte, []int) {
	return file_platform_proto_rawDescGZIP(), []int{27}
}

func (x *GameKindRequest) GetGameKind() GameKind {
	if x != nil {
		return x.GameKind
	}
	return GameKind_INVALID
}

type GameKindResponse struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	GameKind             []GameKind                 `protobuf:"varint,1,rep,packed,name=game_kind,json=gameKind,proto3,enum=com.cw.chess.platform.GameKind" json:"game_kind,omitempty"` // 游戏类型的通用描叙
	RummyLevels          []*RummyLevelDesc          `protobuf:"bytes,2,rep,name=rummy_levels,json=rummyLevels,proto3" json:"rummy_levels,omitempty"`                                    // rummy的级别描叙
	TeepattiLevels       []*TeepattiLevelDesc       `protobuf:"bytes,3,rep,name=teepatti_levels,json=teepattiLevels,proto3" json:"teepatti_levels,omitempty"`                           // teepatii的级别描叙
	AbLevels             []*ABLevelDesc             `protobuf:"bytes,4,rep,name=ab_levels,json=abLevels,proto3" json:"ab_levels,omitempty"`                                             // AB的级别描叙
	SevenupdownLevels    []*SevenUpdownLevelDesc    `protobuf:"bytes,5,rep,name=sevenupdown_levels,json=sevenupdownLevels,proto3" json:"sevenupdown_levels,omitempty"`                  // SevenUpDown
	RapidteenpattiLevels []*RapidTeenpattiLevelDesc `protobuf:"bytes,6,rep,name=rapidteenpatti_levels,json=rapidteenpattiLevels,proto3" json:"rapidteenpatti_levels,omitempty"`         // rapid teenpatti的级别描叙
	DragontigerLevels    []*DragonTigerLevelDesc    `protobuf:"bytes,7,rep,name=dragontiger_levels,json=dragontigerLevels,proto3" json:"dragontiger_levels,omitempty"`                  // 龙虎级别描叙
	BlackredLevels       []*BlackredLevelDesc       `protobuf:"bytes,8,rep,name=blackred_levels,json=blackredLevels,proto3" json:"blackred_levels,omitempty"`                           // 红黑的级别描叙
	HorseracingLevels    []*HorseracingDesc         `protobuf:"bytes,9,rep,name=horseracing_levels,json=horseracingLevels,proto3" json:"horseracing_levels,omitempty"`                  // 赛马的级别描叙
	JmLevels             []*JMLevelDesc             `protobuf:"bytes,10,rep,name=jm_levels,json=jmLevels,proto3" json:"jm_levels,omitempty"`                                            // Jhandi Munda的级别描述
	BaccaratLevels       []*BaccaratLevelDesc       `protobuf:"bytes,11,rep,name=baccarat_levels,json=baccaratLevels,proto3" json:"baccarat_levels,omitempty"`                          // baccarat级别描叙
}

func (x *GameKindResponse) Reset() {
	*x = GameKindResponse{}
	if protoimpl.UnsafeEnabled {
		mi := &file_platform_proto_msgTypes[28]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

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

func (*GameKindResponse) ProtoMessage() {}

func (x *GameKindResponse) ProtoReflect() protoreflect.Message {
	mi := &file_platform_proto_msgTypes[28]
	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 GameKindResponse.ProtoReflect.Descriptor instead.
func (*GameKindResponse) Descriptor() ([]byte, []int) {
	return file_platform_proto_rawDescGZIP(), []int{28}
}

func (x *GameKindResponse) GetGameKind() []GameKind {
	if x != nil {
		return x.GameKind
	}
	return nil
}

func (x *GameKindResponse) GetRummyLevels() []*RummyLevelDesc {
	if x != nil {
		return x.RummyLevels
	}
	return nil
}

func (x *GameKindResponse) GetTeepattiLevels() []*TeepattiLevelDesc {
	if x != nil {
		return x.TeepattiLevels
	}
	return nil
}

func (x *GameKindResponse) GetAbLevels() []*ABLevelDesc {
	if x != nil {
		return x.AbLevels
	}
	return nil
}

func (x *GameKindResponse) GetSevenupdownLevels() []*SevenUpdownLevelDesc {
	if x != nil {
		return x.SevenupdownLevels
	}
	return nil
}

func (x *GameKindResponse) GetRapidteenpattiLevels() []*RapidTeenpattiLevelDesc {
	if x != nil {
		return x.RapidteenpattiLevels
	}
	return nil
}

func (x *GameKindResponse) GetDragontigerLevels() []*DragonTigerLevelDesc {
	if x != nil {
		return x.DragontigerLevels
	}
	return nil
}

func (x *GameKindResponse) GetBlackredLevels() []*BlackredLevelDesc {
	if x != nil {
		return x.BlackredLevels
	}
	return nil
}

func (x *GameKindResponse) GetHorseracingLevels() []*HorseracingDesc {
	if x != nil {
		return x.HorseracingLevels
	}
	return nil
}

func (x *GameKindResponse) GetJmLevels() []*JMLevelDesc {
	if x != nil {
		return x.JmLevels
	}
	return nil
}

func (x *GameKindResponse) GetBaccaratLevels() []*BaccaratLevelDesc {
	if x != nil {
		return x.BaccaratLevels
	}
	return nil
}

// 进行匹配
type MatchRequest struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	Action uint32 `protobuf:"varint,1,opt,name=action,proto3" json:"action,omitempty"` // 0:请求匹配;1:取消匹配
	//
	//如果是取消,则后续参数也需要填写,以防止未来可以同时匹配多个游戏而只取消其中某一个;
	//只有确实取消了,消息才会返回1,防止已经匹配好了,但是再发取消匹配的情况
	//如果取消失败,会返回102,客户端可以解除匹配状态
	GameKind  GameKind `protobuf:"varint,2,opt,name=game_kind,json=gameKind,proto3,enum=com.cw.chess.platform.GameKind" json:"game_kind,omitempty"`
	GameLevel uint32   `protobuf:"varint,3,opt,name=game_level,json=gameLevel,proto3" json:"game_level,omitempty"`
}

func (x *MatchRequest) Reset() {
	*x = MatchRequest{}
	if protoimpl.UnsafeEnabled {
		mi := &file_platform_proto_msgTypes[29]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

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

func (*MatchRequest) ProtoMessage() {}

func (x *MatchRequest) ProtoReflect() protoreflect.Message {
	mi := &file_platform_proto_msgTypes[29]
	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 MatchRequest.ProtoReflect.Descriptor instead.
func (*MatchRequest) Descriptor() ([]byte, []int) {
	return file_platform_proto_rawDescGZIP(), []int{29}
}

func (x *MatchRequest) GetAction() uint32 {
	if x != nil {
		return x.Action
	}
	return 0
}

func (x *MatchRequest) GetGameKind() GameKind {
	if x != nil {
		return x.GameKind
	}
	return GameKind_INVALID
}

func (x *MatchRequest) GetGameLevel() uint32 {
	if x != nil {
		return x.GameLevel
	}
	return 0
}

// 匹配通知
type MatchResponse struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	Result      uint32 `protobuf:"varint,1,opt,name=result,proto3" json:"result,omitempty"`                              // 0:成功申请匹配;1:成功取消匹配;100:余额不够;101:目前已经在匹配队列中,不能重复匹配;102:不在匹配队列中,无法取消
	MaxTime     uint32 `protobuf:"varint,2,opt,name=max_time,json=maxTime,proto3" json:"max_time,omitempty"`             // 最大匹配时间:单位秒
	AverageTime uint32 `protobuf:"varint,3,opt,name=average_time,json=averageTime,proto3" json:"average_time,omitempty"` // 平均匹配时间:单位秒
}

func (x *MatchResponse) Reset() {
	*x = MatchResponse{}
	if protoimpl.UnsafeEnabled {
		mi := &file_platform_proto_msgTypes[30]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

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

func (*MatchResponse) ProtoMessage() {}

func (x *MatchResponse) ProtoReflect() protoreflect.Message {
	mi := &file_platform_proto_msgTypes[30]
	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 MatchResponse.ProtoReflect.Descriptor instead.
func (*MatchResponse) Descriptor() ([]byte, []int) {
	return file_platform_proto_rawDescGZIP(), []int{30}
}

func (x *MatchResponse) GetResult() uint32 {
	if x != nil {
		return x.Result
	}
	return 0
}

func (x *MatchResponse) GetMaxTime() uint32 {
	if x != nil {
		return x.MaxTime
	}
	return 0
}

func (x *MatchResponse) GetAverageTime() uint32 {
	if x != nil {
		return x.AverageTime
	}
	return 0
}

// 匹配成功通知
type MatchOKResponse struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	Result    uint32   `protobuf:"varint,1,opt,name=result,proto3" json:"result,omitempty"`                                                         // 0:成功:100:用户余额不够;101:申请的游戏已经过期;102:账户被限制,不能匹配;103:服务器正在维护中:105:人数太多
	GameType  uint32   `protobuf:"varint,2,opt,name=game_type,json=gameType,proto3" json:"game_type,omitempty"`                                     // 这个值就是动态servertype,后续我们就正式开始游戏了
	TableId   uint32   `protobuf:"varint,3,opt,name=table_id,json=tableId,proto3" json:"table_id,omitempty"`                                        // 分配在哪个桌子上
	GameKind  GameKind `protobuf:"varint,4,opt,name=game_kind,json=gameKind,proto3,enum=com.cw.chess.platform.GameKind" json:"game_kind,omitempty"` // 以下字段和请求一致,方便客户端处理
	GameLevel uint32   `protobuf:"varint,5,opt,name=game_level,json=gameLevel,proto3" json:"game_level,omitempty"`                                  // 游戏级别ID
}

func (x *MatchOKResponse) Reset() {
	*x = MatchOKResponse{}
	if protoimpl.UnsafeEnabled {
		mi := &file_platform_proto_msgTypes[31]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

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

func (*MatchOKResponse) ProtoMessage() {}

func (x *MatchOKResponse) ProtoReflect() protoreflect.Message {
	mi := &file_platform_proto_msgTypes[31]
	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 MatchOKResponse.ProtoReflect.Descriptor instead.
func (*MatchOKResponse) Descriptor() ([]byte, []int) {
	return file_platform_proto_rawDescGZIP(), []int{31}
}

func (x *MatchOKResponse) GetResult() uint32 {
	if x != nil {
		return x.Result
	}
	return 0
}

func (x *MatchOKResponse) GetGameType() uint32 {
	if x != nil {
		return x.GameType
	}
	return 0
}

func (x *MatchOKResponse) GetTableId() uint32 {
	if x != nil {
		return x.TableId
	}
	return 0
}

func (x *MatchOKResponse) GetGameKind() GameKind {
	if x != nil {
		return x.GameKind
	}
	return GameKind_INVALID
}

func (x *MatchOKResponse) GetGameLevel() uint32 {
	if x != nil {
		return x.GameLevel
	}
	return 0
}

// 请求直接进入游戏
type EnterGameRequest struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	GameKind  GameKind `protobuf:"varint,1,opt,name=game_kind,json=gameKind,proto3,enum=com.cw.chess.platform.GameKind" json:"game_kind,omitempty"`
	GameLevel uint32   `protobuf:"varint,2,opt,name=game_level,json=gameLevel,proto3" json:"game_level,omitempty"`
}

func (x *EnterGameRequest) Reset() {
	*x = EnterGameRequest{}
	if protoimpl.UnsafeEnabled {
		mi := &file_platform_proto_msgTypes[32]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

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

func (*EnterGameRequest) ProtoMessage() {}

func (x *EnterGameRequest) ProtoReflect() protoreflect.Message {
	mi := &file_platform_proto_msgTypes[32]
	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 EnterGameRequest.ProtoReflect.Descriptor instead.
func (*EnterGameRequest) Descriptor() ([]byte, []int) {
	return file_platform_proto_rawDescGZIP(), []int{32}
}

func (x *EnterGameRequest) GetGameKind() GameKind {
	if x != nil {
		return x.GameKind
	}
	return GameKind_INVALID
}

func (x *EnterGameRequest) GetGameLevel() uint32 {
	if x != nil {
		return x.GameLevel
	}
	return 0
}

var File_platform_proto protoreflect.FileDescriptor

var file_platform_proto_rawDesc = []byte{
	0x0a, 0x0e, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f,
	0x12, 0x15, 0x63, 0x6f, 0x6d, 0x2e, 0x63, 0x77, 0x2e, 0x63, 0x68, 0x65, 0x73, 0x73, 0x2e, 0x70,
	0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x22, 0x87, 0x01, 0x0a, 0x08, 0x47, 0x61, 0x6d, 0x65,
	0x55, 0x73, 0x65, 0x72, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28,
	0x0d, 0x52, 0x03, 0x75, 0x69, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x72, 0x65, 0x61, 0x6c, 0x5f, 0x75,
	0x73, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x72, 0x65, 0x61, 0x6c, 0x55,
	0x73, 0x65, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x6f, 0x69, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28,
	0x0d, 0x52, 0x04, 0x63, 0x6f, 0x69, 0x6e, 0x12, 0x1b, 0x0a, 0x09, 0x75, 0x73, 0x65, 0x72, 0x5f,
	0x6e, 0x69, 0x63, 0x6b, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72,
	0x4e, 0x69, 0x63, 0x6b, 0x12, 0x1b, 0x0a, 0x09, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x68, 0x65, 0x61,
	0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x48, 0x65, 0x61,
	0x64, 0x22, 0x28, 0x0a, 0x0e, 0x43, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f,
	0x6e, 0x73, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x18, 0x01, 0x20,
	0x01, 0x28, 0x0d, 0x52, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0x3d, 0x0a, 0x0c, 0x4c,
	0x6f, 0x67, 0x69, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x75,
	0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x06, 0x75, 0x73,
	0x65, 0x72, 0x49, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x02, 0x20,
	0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0x40, 0x0a, 0x0d, 0x4c, 0x6f,
	0x67, 0x69, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x72,
	0x65, 0x73, 0x75, 0x6c, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x06, 0x72, 0x65, 0x73,
	0x75, 0x6c, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x02,
	0x20, 0x01, 0x28, 0x0d, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x22, 0xd5, 0x01, 0x0a,
	0x18, 0x47, 0x65, 0x74, 0x50, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63,
	0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x65, 0x73,
	0x75, 0x6c, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c,
	0x74, 0x12, 0x18, 0x0a, 0x07, 0x62, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01,
	0x28, 0x0d, 0x52, 0x07, 0x62, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x62,
	0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x77, 0x69, 0x6e, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28,
	0x0d, 0x52, 0x0b, 0x62, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x57, 0x69, 0x6e, 0x73, 0x12, 0x1a,
	0x0a, 0x08, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, 0x65, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d,
	0x52, 0x08, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, 0x65, 0x73, 0x12, 0x48, 0x0a, 0x0d, 0x67, 0x61,
	0x6d, 0x65, 0x5f, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x63, 0x79, 0x18, 0x05, 0x20, 0x01, 0x28,
	0x0e, 0x32, 0x23, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x63, 0x77, 0x2e, 0x63, 0x68, 0x65, 0x73, 0x73,
	0x2e, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x2e, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e,
	0x63, 0x79, 0x4b, 0x69, 0x6e, 0x64, 0x52, 0x0c, 0x67, 0x61, 0x6d, 0x65, 0x43, 0x75, 0x72, 0x72,
	0x65, 0x6e, 0x63, 0x79, 0x22, 0x49, 0x0a, 0x11, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x54,
	0x6f, 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x12, 0x1a, 0x0a, 0x08, 0x6c, 0x61, 0x73,
	0x74, 0x54, 0x69, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x6c, 0x61, 0x73,
	0x74, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74,
	0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x22,
	0x4c, 0x0a, 0x09, 0x55, 0x73, 0x65, 0x72, 0x41, 0x74, 0x74, 0x72, 0x69, 0x12, 0x17, 0x0a, 0x07,
	0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x06, 0x75,
	0x73, 0x65, 0x72, 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x69, 0x63, 0x6b, 0x18, 0x02, 0x20,
	0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x69, 0x63, 0x6b, 0x12, 0x12, 0x0a, 0x04, 0x68, 0x65, 0x61,
	0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x68, 0x65, 0x61, 0x64, 0x22, 0x33, 0x0a,
	0x16, 0x4d, 0x53, 0x47, 0x5f, 0x47, 0x45, 0x54, 0x5f, 0x55, 0x53, 0x45, 0x52, 0x5f, 0x41, 0x54,
	0x54, 0x52, 0x49, 0x5f, 0x52, 0x45, 0x51, 0x12, 0x19, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x5f,
	0x69, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0d, 0x52, 0x07, 0x75, 0x73, 0x65, 0x72, 0x49,
	0x64, 0x73, 0x22, 0x5c, 0x0a, 0x17, 0x4d, 0x53, 0x47, 0x5f, 0x47, 0x45, 0x54, 0x5f, 0x55, 0x53,
	0x45, 0x52, 0x5f, 0x41, 0x54, 0x54, 0x52, 0x49, 0x5f, 0x52, 0x45, 0x53, 0x50, 0x12, 0x41, 0x0a,
	0x0b, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x61, 0x74, 0x74, 0x72, 0x69, 0x73, 0x18, 0x01, 0x20, 0x03,
	0x28, 0x0b, 0x32, 0x20, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x63, 0x77, 0x2e, 0x63, 0x68, 0x65, 0x73,
	0x73, 0x2e, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x41,
	0x74, 0x74, 0x72, 0x69, 0x52, 0x0a, 0x75, 0x73, 0x65, 0x72, 0x41, 0x74, 0x74, 0x72, 0x69, 0x73,
	0x22, 0x5c, 0x0a, 0x19, 0x4d, 0x53, 0x47, 0x5f, 0x55, 0x50, 0x44, 0x41, 0x54, 0x45, 0x5f, 0x55,
	0x53, 0x45, 0x52, 0x5f, 0x41, 0x54, 0x54, 0x52, 0x49, 0x5f, 0x52, 0x45, 0x51, 0x12, 0x3f, 0x0a,
	0x0a, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x61, 0x74, 0x74, 0x72, 0x69, 0x18, 0x01, 0x20, 0x01, 0x28,
	0x0b, 0x32, 0x20, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x63, 0x77, 0x2e, 0x63, 0x68, 0x65, 0x73, 0x73,
	0x2e, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x41, 0x74,
	0x74, 0x72, 0x69, 0x52, 0x09, 0x75, 0x73, 0x65, 0x72, 0x41, 0x74, 0x74, 0x72, 0x69, 0x22, 0x2a,
	0x0a, 0x12, 0x4d, 0x53, 0x47, 0x5f, 0x47, 0x45, 0x54, 0x5f, 0x42, 0x4f, 0x4e, 0x55, 0x53, 0x5f,
	0x52, 0x45, 0x53, 0x50, 0x12, 0x14, 0x0a, 0x05, 0x62, 0x6f, 0x6e, 0x75, 0x73, 0x18, 0x01, 0x20,
	0x01, 0x28, 0x0d, 0x52, 0x05, 0x62, 0x6f, 0x6e, 0x75, 0x73, 0x22, 0x50, 0x0a, 0x0b, 0x42, 0x53,
	0x5f, 0x52, 0x45, 0x43, 0x48, 0x41, 0x52, 0x47, 0x45, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x63,
	0x68, 0x61, 0x72, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x72, 0x65, 0x63,
	0x68, 0x61, 0x72, 0x67, 0x65, 0x12, 0x25, 0x0a, 0x0e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x63,
	0x79, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0d, 0x63,
	0x75, 0x72, 0x72, 0x65, 0x6e, 0x63, 0x79, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x22, 0xb0, 0x01, 0x0a,
	0x07, 0x42, 0x53, 0x5f, 0x47, 0x41, 0x4d, 0x45, 0x12, 0x1b, 0x0a, 0x09, 0x67, 0x61, 0x6d, 0x65,
	0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x67, 0x61, 0x6d,
	0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x25, 0x0a, 0x0e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x63,
	0x79, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0d, 0x63,
	0x75, 0x72, 0x72, 0x65, 0x6e, 0x63, 0x79, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x1f, 0x0a, 0x0b,
	0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x5f, 0x31, 0x18, 0x03, 0x20, 0x01, 0x28,
	0x0d, 0x52, 0x0a, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x31, 0x12, 0x1f, 0x0a,
	0x0b, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x5f, 0x32, 0x18, 0x04, 0x20, 0x01,
	0x28, 0x0d, 0x52, 0x0a, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x32, 0x12, 0x1f,
	0x0a, 0x0b, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x5f, 0x33, 0x18, 0x05, 0x20,
	0x01, 0x28, 0x0d, 0x52, 0x0a, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x33, 0x22,
	0xfd, 0x01, 0x0a, 0x0b, 0x4d, 0x53, 0x47, 0x5f, 0x42, 0x53, 0x5f, 0x44, 0x41, 0x54, 0x41, 0x12,
	0x17, 0x0a, 0x07, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d,
	0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x75, 0x73, 0x65, 0x72,
	0x5f, 0x6e, 0x69, 0x63, 0x6b, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x75, 0x73, 0x65,
	0x72, 0x4e, 0x69, 0x63, 0x6b, 0x12, 0x17, 0x0a, 0x07, 0x62, 0x73, 0x5f, 0x74, 0x79, 0x70, 0x65,
	0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x06, 0x62, 0x73, 0x54, 0x79, 0x70, 0x65, 0x12, 0x45,
	0x0a, 0x0c, 0x6d, 0x73, 0x67, 0x5f, 0x72, 0x65, 0x63, 0x68, 0x61, 0x72, 0x67, 0x65, 0x18, 0x04,
	0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x63, 0x77, 0x2e, 0x63, 0x68,
	0x65, 0x73, 0x73, 0x2e, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x2e, 0x42, 0x53, 0x5f,
	0x52, 0x45, 0x43, 0x48, 0x41, 0x52, 0x47, 0x45, 0x52, 0x0b, 0x6d, 0x73, 0x67, 0x52, 0x65, 0x63,
	0x68, 0x61, 0x72, 0x67, 0x65, 0x12, 0x39, 0x0a, 0x08, 0x6d, 0x73, 0x67, 0x5f, 0x67, 0x61, 0x6d,
	0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x63, 0x77,
	0x2e, 0x63, 0x68, 0x65, 0x73, 0x73, 0x2e, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x2e,
	0x42, 0x53, 0x5f, 0x47, 0x41, 0x4d, 0x45, 0x52, 0x07, 0x6d, 0x73, 0x67, 0x47, 0x61, 0x6d, 0x65,
	0x12, 0x1d, 0x0a, 0x0a, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x06,
	0x20, 0x01, 0x28, 0x0d, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x53, 0x74, 0x61, 0x6d, 0x70, 0x22,
	0x33, 0x0a, 0x10, 0x4d, 0x53, 0x47, 0x5f, 0x4d, 0x53, 0x47, 0x5f, 0x51, 0x55, 0x45, 0x5f, 0x44,
	0x41, 0x54, 0x41, 0x12, 0x1f, 0x0a, 0x0b, 0x6d, 0x73, 0x67, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x65,
	0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x6d, 0x73, 0x67, 0x43, 0x6f, 0x6e,
	0x74, 0x65, 0x6e, 0x74, 0x22, 0x53, 0x0a, 0x0b, 0x4d, 0x53, 0x47, 0x5f, 0x4d, 0x53, 0x47, 0x5f,
	0x51, 0x55, 0x45, 0x12, 0x44, 0x0a, 0x09, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x6c, 0x69, 0x73, 0x74,
	0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x63, 0x77, 0x2e,
	0x63, 0x68, 0x65, 0x73, 0x73, 0x2e, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x2e, 0x4d,
	0x53, 0x47, 0x5f, 0x4d, 0x53, 0x47, 0x5f, 0x51, 0x55, 0x45, 0x5f, 0x44, 0x41, 0x54, 0x41, 0x52,
	0x08, 0x64, 0x61, 0x74, 0x61, 0x4c, 0x69, 0x73, 0x74, 0x22, 0x99, 0x02, 0x0a, 0x0d, 0x47, 0x61,
	0x6d, 0x65, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x44, 0x65, 0x73, 0x63, 0x12, 0x19, 0x0a, 0x08, 0x6c,
	0x65, 0x76, 0x65, 0x6c, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x6c,
	0x65, 0x76, 0x65, 0x6c, 0x49, 0x64, 0x12, 0x48, 0x0a, 0x0d, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e,
	0x63, 0x79, 0x5f, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x23, 0x2e,
	0x63, 0x6f, 0x6d, 0x2e, 0x63, 0x77, 0x2e, 0x63, 0x68, 0x65, 0x73, 0x73, 0x2e, 0x70, 0x6c, 0x61,
	0x74, 0x66, 0x6f, 0x72, 0x6d, 0x2e, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x63, 0x79, 0x4b, 0x69,
	0x6e, 0x64, 0x52, 0x0c, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x63, 0x79, 0x4b, 0x69, 0x6e, 0x64,
	0x12, 0x25, 0x0a, 0x0e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x63, 0x79, 0x5f, 0x6c, 0x69, 0x6d,
	0x69, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0d, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e,
	0x63, 0x79, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x6c, 0x65, 0x76, 0x65, 0x6c,
	0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6c, 0x65, 0x76,
	0x65, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x63,
	0x6f, 0x75, 0x6e, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x09, 0x75, 0x73, 0x65, 0x72,
	0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x25, 0x0a, 0x0e, 0x74, 0x61, 0x78, 0x5f, 0x70, 0x65, 0x72,
	0x6d, 0x69, 0x6c, 0x6c, 0x61, 0x67, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0d, 0x74,
	0x61, 0x78, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x6c, 0x6c, 0x61, 0x67, 0x65, 0x12, 0x17, 0x0a, 0x07,
	0x67, 0x61, 0x6d, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x06, 0x67,
	0x61, 0x6d, 0x65, 0x49, 0x64, 0x22, 0xee, 0x01, 0x0a, 0x0e, 0x52, 0x75, 0x6d, 0x6d, 0x79, 0x4c,
	0x65, 0x76, 0x65, 0x6c, 0x44, 0x65, 0x73, 0x63, 0x12, 0x43, 0x0a, 0x0a, 0x67, 0x61, 0x6d, 0x65,
	0x5f, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x63,
	0x6f, 0x6d, 0x2e, 0x63, 0x77, 0x2e, 0x63, 0x68, 0x65, 0x73, 0x73, 0x2e, 0x70, 0x6c, 0x61, 0x74,
	0x66, 0x6f, 0x72, 0x6d, 0x2e, 0x47, 0x61, 0x6d, 0x65, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x44, 0x65,
	0x73, 0x63, 0x52, 0x09, 0x67, 0x61, 0x6d, 0x65, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x12, 0x2c, 0x0a,
	0x12, 0x72, 0x75, 0x6d, 0x6d, 0x79, 0x5f, 0x70, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x73, 0x5f, 0x73,
	0x69, 0x7a, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x10, 0x72, 0x75, 0x6d, 0x6d, 0x79,
	0x50, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x73, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x73,
	0x63, 0x6f, 0x72, 0x65, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d,
	0x52, 0x0a, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x26, 0x0a, 0x0f,
	0x74, 0x69, 0x6d, 0x65, 0x73, 0x5f, 0x66, 0x65, 0x65, 0x5f, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x18,
	0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0d, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x46, 0x65, 0x65, 0x52,
	0x61, 0x74, 0x69, 0x6f, 0x12, 0x20, 0x0a, 0x0b, 0x66, 0x61, 0x6e, 0x74, 0x61, 0x73, 0x79, 0x74,
	0x69, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x66, 0x61, 0x6e, 0x74, 0x61,
	0x73, 0x79, 0x74, 0x69, 0x6d, 0x65, 0x22, 0x82, 0x02, 0x0a, 0x11, 0x54, 0x65, 0x65, 0x70, 0x61,
	0x74, 0x74, 0x69, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x44, 0x65, 0x73, 0x63, 0x12, 0x43, 0x0a, 0x0a,
	0x67, 0x61, 0x6d, 0x65, 0x5f, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b,
	0x32, 0x24, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x63, 0x77, 0x2e, 0x63, 0x68, 0x65, 0x73, 0x73, 0x2e,
	0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x2e, 0x47, 0x61, 0x6d, 0x65, 0x4c, 0x65, 0x76,
	0x65, 0x6c, 0x44, 0x65, 0x73, 0x63, 0x52, 0x09, 0x67, 0x61, 0x6d, 0x65, 0x4c, 0x65, 0x76, 0x65,
	0x6c, 0x12, 0x14, 0x0a, 0x05, 0x62, 0x6c, 0x69, 0x6e, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d,
	0x52, 0x05, 0x62, 0x6c, 0x69, 0x6e, 0x64, 0x12, 0x24, 0x0a, 0x0e, 0x73, 0x69, 0x6e, 0x67, 0x6c,
	0x65, 0x5f, 0x6d, 0x61, 0x78, 0x5f, 0x62, 0x65, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52,
	0x0c, 0x73, 0x69, 0x6e, 0x67, 0x6c, 0x65, 0x4d, 0x61, 0x78, 0x42, 0x65, 0x74, 0x12, 0x22, 0x0a,
	0x0d, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x6d, 0x61, 0x78, 0x5f, 0x62, 0x65, 0x74, 0x18, 0x04,
	0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x4d, 0x61, 0x78, 0x42, 0x65,
	0x74, 0x12, 0x26, 0x0a, 0x0f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x5f, 0x66, 0x65, 0x65, 0x5f, 0x72,
	0x61, 0x74, 0x69, 0x6f, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0d, 0x74, 0x69, 0x6d, 0x65,
	0x73, 0x46, 0x65, 0x65, 0x52, 0x61, 0x74, 0x69, 0x6f, 0x12, 0x20, 0x0a, 0x0b, 0x66, 0x61, 0x6e,
	0x74, 0x61, 0x73, 0x79, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b,
	0x66, 0x61, 0x6e, 0x74, 0x61, 0x73, 0x79, 0x74, 0x69, 0x6d, 0x65, 0x22, 0xd1, 0x01, 0x0a, 0x0b,
	0x41, 0x42, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x44, 0x65, 0x73, 0x63, 0x12, 0x43, 0x0a, 0x0a, 0x67,
	0x61, 0x6d, 0x65, 0x5f, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32,
	0x24, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x63, 0x77, 0x2e, 0x63, 0x68, 0x65, 0x73, 0x73, 0x2e, 0x70,
	0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x2e, 0x47, 0x61, 0x6d, 0x65, 0x4c, 0x65, 0x76, 0x65,
	0x6c, 0x44, 0x65, 0x73, 0x63, 0x52, 0x09, 0x67, 0x61, 0x6d, 0x65, 0x4c, 0x65, 0x76, 0x65, 0x6c,
	0x12, 0x17, 0x0a, 0x07, 0x62, 0x65, 0x74, 0x5f, 0x6d, 0x69, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28,
	0x0d, 0x52, 0x06, 0x62, 0x65, 0x74, 0x4d, 0x69, 0x6e, 0x12, 0x17, 0x0a, 0x07, 0x62, 0x65, 0x74,
	0x5f, 0x6d, 0x61, 0x78, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x06, 0x62, 0x65, 0x74, 0x4d,
	0x61, 0x78, 0x12, 0x26, 0x0a, 0x0f, 0x41, 0x42, 0x5f, 0x70, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x73,
	0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0d, 0x41, 0x42, 0x50,
	0x6c, 0x61, 0x79, 0x65, 0x72, 0x73, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x63, 0x68,
	0x69, 0x70, 0x5f, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28,
	0x0d, 0x52, 0x0c, 0x63, 0x68, 0x69, 0x70, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x22,
	0xfc, 0x02, 0x0a, 0x14, 0x53, 0x65, 0x76, 0x65, 0x6e, 0x55, 0x70, 0x64, 0x6f, 0x77, 0x6e, 0x4c,
	0x65, 0x76, 0x65, 0x6c, 0x44, 0x65, 0x73, 0x63, 0x12, 0x43, 0x0a, 0x0a, 0x67, 0x61, 0x6d, 0x65,
	0x5f, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x63,
	0x6f, 0x6d, 0x2e, 0x63, 0x77, 0x2e, 0x63, 0x68, 0x65, 0x73, 0x73, 0x2e, 0x70, 0x6c, 0x61, 0x74,
	0x66, 0x6f, 0x72, 0x6d, 0x2e, 0x47, 0x61, 0x6d, 0x65, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x44, 0x65,
	0x73, 0x63, 0x52, 0x09, 0x67, 0x61, 0x6d, 0x65, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x12, 0x17, 0x0a,
	0x07, 0x62, 0x65, 0x74, 0x5f, 0x6d, 0x69, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x06,
	0x62, 0x65, 0x74, 0x4d, 0x69, 0x6e, 0x12, 0x17, 0x0a, 0x07, 0x62, 0x65, 0x74, 0x5f, 0x6d, 0x61,
	0x78, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x06, 0x62, 0x65, 0x74, 0x4d, 0x61, 0x78, 0x12,
	0x26, 0x0a, 0x0f, 0x53, 0x44, 0x5f, 0x70, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x73, 0x5f, 0x73, 0x69,
	0x7a, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0d, 0x53, 0x44, 0x50, 0x6c, 0x61, 0x79,
	0x65, 0x72, 0x73, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x63, 0x68, 0x69, 0x70, 0x5f,
	0x74, 0x65, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0c,
	0x63, 0x68, 0x69, 0x70, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x19, 0x0a, 0x08,
	0x62, 0x65, 0x74, 0x5f, 0x6d, 0x69, 0x6e, 0x31, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07,
	0x62, 0x65, 0x74, 0x4d, 0x69, 0x6e, 0x31, 0x12, 0x19, 0x0a, 0x08, 0x62, 0x65, 0x74, 0x5f, 0x6d,
	0x61, 0x78, 0x31, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x62, 0x65, 0x74, 0x4d, 0x61,
	0x78, 0x31, 0x12, 0x19, 0x0a, 0x08, 0x62, 0x65, 0x74, 0x5f, 0x6d, 0x69, 0x6e, 0x32, 0x18, 0x08,
	0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x62, 0x65, 0x74, 0x4d, 0x69, 0x6e, 0x32, 0x12, 0x19, 0x0a,
	0x08, 0x62, 0x65, 0x74, 0x5f, 0x6d, 0x61, 0x78, 0x32, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0d, 0x52,
	0x07, 0x62, 0x65, 0x74, 0x4d, 0x61, 0x78, 0x32, 0x12, 0x19, 0x0a, 0x08, 0x62, 0x65, 0x74, 0x5f,
	0x6d, 0x69, 0x6e, 0x30, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x62, 0x65, 0x74, 0x4d,
	0x69, 0x6e, 0x30, 0x12, 0x19, 0x0a, 0x08, 0x62, 0x65, 0x74, 0x5f, 0x6d, 0x61, 0x78, 0x30, 0x18,
	0x0b, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x62, 0x65, 0x74, 0x4d, 0x61, 0x78, 0x30, 0x22, 0x74,
	0x0a, 0x17, 0x52, 0x61, 0x70, 0x69, 0x64, 0x54, 0x65, 0x65, 0x6e, 0x70, 0x61, 0x74, 0x74, 0x69,
	0x4c, 0x65, 0x76, 0x65, 0x6c, 0x44, 0x65, 0x73, 0x63, 0x12, 0x43, 0x0a, 0x0a, 0x67, 0x61, 0x6d,
	0x65, 0x5f, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e,
	0x63, 0x6f, 0x6d, 0x2e, 0x63, 0x77, 0x2e, 0x63, 0x68, 0x65, 0x73, 0x73, 0x2e, 0x70, 0x6c, 0x61,
	0x74, 0x66, 0x6f, 0x72, 0x6d, 0x2e, 0x47, 0x61, 0x6d, 0x65, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x44,
	0x65, 0x73, 0x63, 0x52, 0x09, 0x67, 0x61, 0x6d, 0x65, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x12, 0x14,
	0x0a, 0x05, 0x62, 0x6c, 0x69, 0x6e, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x62,
	0x6c, 0x69, 0x6e, 0x64, 0x22, 0xfc, 0x02, 0x0a, 0x14, 0x44, 0x72, 0x61, 0x67, 0x6f, 0x6e, 0x54,
	0x69, 0x67, 0x65, 0x72, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x44, 0x65, 0x73, 0x63, 0x12, 0x43, 0x0a,
	0x0a, 0x67, 0x61, 0x6d, 0x65, 0x5f, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28,
	0x0b, 0x32, 0x24, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x63, 0x77, 0x2e, 0x63, 0x68, 0x65, 0x73, 0x73,
	0x2e, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x2e, 0x47, 0x61, 0x6d, 0x65, 0x4c, 0x65,
	0x76, 0x65, 0x6c, 0x44, 0x65, 0x73, 0x63, 0x52, 0x09, 0x67, 0x61, 0x6d, 0x65, 0x4c, 0x65, 0x76,
	0x65, 0x6c, 0x12, 0x17, 0x0a, 0x07, 0x62, 0x65, 0x74, 0x5f, 0x6d, 0x69, 0x6e, 0x18, 0x02, 0x20,
	0x01, 0x28, 0x0d, 0x52, 0x06, 0x62, 0x65, 0x74, 0x4d, 0x69, 0x6e, 0x12, 0x17, 0x0a, 0x07, 0x62,
	0x65, 0x74, 0x5f, 0x6d, 0x61, 0x78, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x06, 0x62, 0x65,
	0x74, 0x4d, 0x61, 0x78, 0x12, 0x26, 0x0a, 0x0f, 0x53, 0x44, 0x5f, 0x70, 0x6c, 0x61, 0x79, 0x65,
	0x72, 0x73, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0d, 0x53,
	0x44, 0x50, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x73, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x23, 0x0a, 0x0d,
	0x63, 0x68, 0x69, 0x70, 0x5f, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x18, 0x05, 0x20,
	0x01, 0x28, 0x0d, 0x52, 0x0c, 0x63, 0x68, 0x69, 0x70, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x65, 0x74,
	0x65, 0x12, 0x19, 0x0a, 0x08, 0x62, 0x65, 0x74, 0x5f, 0x6d, 0x69, 0x6e, 0x31, 0x18, 0x06, 0x20,
	0x01, 0x28, 0x0d, 0x52, 0x07, 0x62, 0x65, 0x74, 0x4d, 0x69, 0x6e, 0x31, 0x12, 0x19, 0x0a, 0x08,
	0x62, 0x65, 0x74, 0x5f, 0x6d, 0x61, 0x78, 0x31, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07,
	0x62, 0x65, 0x74, 0x4d, 0x61, 0x78, 0x31, 0x12, 0x19, 0x0a, 0x08, 0x62, 0x65, 0x74, 0x5f, 0x6d,
	0x69, 0x6e, 0x32, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x62, 0x65, 0x74, 0x4d, 0x69,
	0x6e, 0x32, 0x12, 0x19, 0x0a, 0x08, 0x62, 0x65, 0x74, 0x5f, 0x6d, 0x61, 0x78, 0x32, 0x18, 0x09,
	0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x62, 0x65, 0x74, 0x4d, 0x61, 0x78, 0x32, 0x12, 0x19, 0x0a,
	0x08, 0x62, 0x65, 0x74, 0x5f, 0x6d, 0x69, 0x6e, 0x30, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0d, 0x52,
	0x07, 0x62, 0x65, 0x74, 0x4d, 0x69, 0x6e, 0x30, 0x12, 0x19, 0x0a, 0x08, 0x62, 0x65, 0x74, 0x5f,
	0x6d, 0x61, 0x78, 0x30, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x62, 0x65, 0x74, 0x4d,
	0x61, 0x78, 0x30, 0x22, 0xd7, 0x01, 0x0a, 0x11, 0x42, 0x6c, 0x61, 0x63, 0x6b, 0x72, 0x65, 0x64,
	0x4c, 0x65, 0x76, 0x65, 0x6c, 0x44, 0x65, 0x73, 0x63, 0x12, 0x43, 0x0a, 0x0a, 0x67, 0x61, 0x6d,
	0x65, 0x5f, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e,
	0x63, 0x6f, 0x6d, 0x2e, 0x63, 0x77, 0x2e, 0x63, 0x68, 0x65, 0x73, 0x73, 0x2e, 0x70, 0x6c, 0x61,
	0x74, 0x66, 0x6f, 0x72, 0x6d, 0x2e, 0x47, 0x61, 0x6d, 0x65, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x44,
	0x65, 0x73, 0x63, 0x52, 0x09, 0x67, 0x61, 0x6d, 0x65, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x12, 0x17,
	0x0a, 0x07, 0x62, 0x65, 0x74, 0x5f, 0x6d, 0x69, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52,
	0x06, 0x62, 0x65, 0x74, 0x4d, 0x69, 0x6e, 0x12, 0x17, 0x0a, 0x07, 0x62, 0x65, 0x74, 0x5f, 0x6d,
	0x61, 0x78, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x06, 0x62, 0x65, 0x74, 0x4d, 0x61, 0x78,
	0x12, 0x26, 0x0a, 0x0f, 0x53, 0x44, 0x5f, 0x70, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x73, 0x5f, 0x73,
	0x69, 0x7a, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0d, 0x53, 0x44, 0x50, 0x6c, 0x61,
	0x79, 0x65, 0x72, 0x73, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x63, 0x68, 0x69, 0x70,
	0x5f, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, 0x52,
	0x0c, 0x63, 0x68, 0x69, 0x70, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x22, 0xff, 0x01,
	0x0a, 0x0f, 0x48, 0x6f, 0x72, 0x73, 0x65, 0x72, 0x61, 0x63, 0x69, 0x6e, 0x67, 0x44, 0x65, 0x73,
	0x63, 0x12, 0x43, 0x0a, 0x0a, 0x67, 0x61, 0x6d, 0x65, 0x5f, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x18,
	0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x63, 0x77, 0x2e, 0x63,
	0x68, 0x65, 0x73, 0x73, 0x2e, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x2e, 0x47, 0x61,
	0x6d, 0x65, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x44, 0x65, 0x73, 0x63, 0x52, 0x09, 0x67, 0x61, 0x6d,
	0x65, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x12, 0x26, 0x0a, 0x0f, 0x53, 0x44, 0x5f, 0x70, 0x6c, 0x61,
	0x79, 0x65, 0x72, 0x73, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52,
	0x0d, 0x53, 0x44, 0x50, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x73, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x23,
	0x0a, 0x0d, 0x63, 0x68, 0x69, 0x70, 0x5f, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x18,
	0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0c, 0x63, 0x68, 0x69, 0x70, 0x54, 0x65, 0x6d, 0x70, 0x6c,
	0x65, 0x74, 0x65, 0x12, 0x28, 0x0a, 0x10, 0x6f, 0x5f, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65,
	0x64, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0e, 0x6f,
	0x45, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x17, 0x0a,
	0x07, 0x62, 0x65, 0x74, 0x5f, 0x6d, 0x69, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x06,
	0x62, 0x65, 0x74, 0x4d, 0x69, 0x6e, 0x12, 0x17, 0x0a, 0x07, 0x62, 0x65, 0x74, 0x5f, 0x6d, 0x61,
	0x78, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x06, 0x62, 0x65, 0x74, 0x4d, 0x61, 0x78, 0x22,
	0xd1, 0x01, 0x0a, 0x0b, 0x4a, 0x4d, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x44, 0x65, 0x73, 0x63, 0x12,
	0x43, 0x0a, 0x0a, 0x67, 0x61, 0x6d, 0x65, 0x5f, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x18, 0x01, 0x20,
	0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x63, 0x77, 0x2e, 0x63, 0x68, 0x65,
	0x73, 0x73, 0x2e, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x2e, 0x47, 0x61, 0x6d, 0x65,
	0x4c, 0x65, 0x76, 0x65, 0x6c, 0x44, 0x65, 0x73, 0x63, 0x52, 0x09, 0x67, 0x61, 0x6d, 0x65, 0x4c,
	0x65, 0x76, 0x65, 0x6c, 0x12, 0x17, 0x0a, 0x07, 0x62, 0x65, 0x74, 0x5f, 0x6d, 0x69, 0x6e, 0x18,
	0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x06, 0x62, 0x65, 0x74, 0x4d, 0x69, 0x6e, 0x12, 0x17, 0x0a,
	0x07, 0x62, 0x65, 0x74, 0x5f, 0x6d, 0x61, 0x78, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x06,
	0x62, 0x65, 0x74, 0x4d, 0x61, 0x78, 0x12, 0x26, 0x0a, 0x0f, 0x53, 0x44, 0x5f, 0x70, 0x6c, 0x61,
	0x79, 0x65, 0x72, 0x73, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52,
	0x0d, 0x53, 0x44, 0x50, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x73, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x23,
	0x0a, 0x0d, 0x63, 0x68, 0x69, 0x70, 0x5f, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x18,
	0x05, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0c, 0x63, 0x68, 0x69, 0x70, 0x54, 0x65, 0x6d, 0x70, 0x6c,
	0x65, 0x74, 0x65, 0x22, 0xb2, 0x01, 0x0a, 0x11, 0x42, 0x61, 0x63, 0x63, 0x61, 0x72, 0x61, 0x74,
	0x4c, 0x65, 0x76, 0x65, 0x6c, 0x44, 0x65, 0x73, 0x63, 0x12, 0x43, 0x0a, 0x0a, 0x67, 0x61, 0x6d,
	0x65, 0x5f, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e,
	0x63, 0x6f, 0x6d, 0x2e, 0x63, 0x77, 0x2e, 0x63, 0x68, 0x65, 0x73, 0x73, 0x2e, 0x70, 0x6c, 0x61,
	0x74, 0x66, 0x6f, 0x72, 0x6d, 0x2e, 0x47, 0x61, 0x6d, 0x65, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x44,
	0x65, 0x73, 0x63, 0x52, 0x09, 0x67, 0x61, 0x6d, 0x65, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x12, 0x17,
	0x0a, 0x07, 0x62, 0x65, 0x74, 0x5f, 0x6d, 0x69, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52,
	0x06, 0x62, 0x65, 0x74, 0x4d, 0x69, 0x6e, 0x12, 0x17, 0x0a, 0x07, 0x62, 0x65, 0x74, 0x5f, 0x6d,
	0x61, 0x78, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x06, 0x62, 0x65, 0x74, 0x4d, 0x61, 0x78,
	0x12, 0x26, 0x0a, 0x0f, 0x53, 0x44, 0x5f, 0x70, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x73, 0x5f, 0x73,
	0x69, 0x7a, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0d, 0x53, 0x44, 0x50, 0x6c, 0x61,
	0x79, 0x65, 0x72, 0x73, 0x53, 0x69, 0x7a, 0x65, 0x22, 0x4f, 0x0a, 0x0f, 0x47, 0x61, 0x6d, 0x65,
	0x4b, 0x69, 0x6e, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x3c, 0x0a, 0x09, 0x67,
	0x61, 0x6d, 0x65, 0x5f, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1f,
	0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x63, 0x77, 0x2e, 0x63, 0x68, 0x65, 0x73, 0x73, 0x2e, 0x70, 0x6c,
	0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x2e, 0x47, 0x61, 0x6d, 0x65, 0x4b, 0x69, 0x6e, 0x64, 0x52,
	0x08, 0x67, 0x61, 0x6d, 0x65, 0x4b, 0x69, 0x6e, 0x64, 0x22, 0x89, 0x07, 0x0a, 0x10, 0x47, 0x61,
	0x6d, 0x65, 0x4b, 0x69, 0x6e, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3c,
	0x0a, 0x09, 0x67, 0x61, 0x6d, 0x65, 0x5f, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x01, 0x20, 0x03, 0x28,
	0x0e, 0x32, 0x1f, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x63, 0x77, 0x2e, 0x63, 0x68, 0x65, 0x73, 0x73,
	0x2e, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x2e, 0x47, 0x61, 0x6d, 0x65, 0x4b, 0x69,
	0x6e, 0x64, 0x52, 0x08, 0x67, 0x61, 0x6d, 0x65, 0x4b, 0x69, 0x6e, 0x64, 0x12, 0x48, 0x0a, 0x0c,
	0x72, 0x75, 0x6d, 0x6d, 0x79, 0x5f, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x73, 0x18, 0x02, 0x20, 0x03,
	0x28, 0x0b, 0x32, 0x25, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x63, 0x77, 0x2e, 0x63, 0x68, 0x65, 0x73,
	0x73, 0x2e, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x2e, 0x52, 0x75, 0x6d, 0x6d, 0x79,
	0x4c, 0x65, 0x76, 0x65, 0x6c, 0x44, 0x65, 0x73, 0x63, 0x52, 0x0b, 0x72, 0x75, 0x6d, 0x6d, 0x79,
	0x4c, 0x65, 0x76, 0x65, 0x6c, 0x73, 0x12, 0x51, 0x0a, 0x0f, 0x74, 0x65, 0x65, 0x70, 0x61, 0x74,
	0x74, 0x69, 0x5f, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32,
	0x28, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x63, 0x77, 0x2e, 0x63, 0x68, 0x65, 0x73, 0x73, 0x2e, 0x70,
	0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x2e, 0x54, 0x65, 0x65, 0x70, 0x61, 0x74, 0x74, 0x69,
	0x4c, 0x65, 0x76, 0x65, 0x6c, 0x44, 0x65, 0x73, 0x63, 0x52, 0x0e, 0x74, 0x65, 0x65, 0x70, 0x61,
	0x74, 0x74, 0x69, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x73, 0x12, 0x3f, 0x0a, 0x09, 0x61, 0x62, 0x5f,
	0x6c, 0x65, 0x76, 0x65, 0x6c, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x63,
	0x6f, 0x6d, 0x2e, 0x63, 0x77, 0x2e, 0x63, 0x68, 0x65, 0x73, 0x73, 0x2e, 0x70, 0x6c, 0x61, 0x74,
	0x66, 0x6f, 0x72, 0x6d, 0x2e, 0x41, 0x42, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x44, 0x65, 0x73, 0x63,
	0x52, 0x08, 0x61, 0x62, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x73, 0x12, 0x5a, 0x0a, 0x12, 0x73, 0x65,
	0x76, 0x65, 0x6e, 0x75, 0x70, 0x64, 0x6f, 0x77, 0x6e, 0x5f, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x73,
	0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x63, 0x77, 0x2e,
	0x63, 0x68, 0x65, 0x73, 0x73, 0x2e, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x2e, 0x53,
	0x65, 0x76, 0x65, 0x6e, 0x55, 0x70, 0x64, 0x6f, 0x77, 0x6e, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x44,
	0x65, 0x73, 0x63, 0x52, 0x11, 0x73, 0x65, 0x76, 0x65, 0x6e, 0x75, 0x70, 0x64, 0x6f, 0x77, 0x6e,
	0x4c, 0x65, 0x76, 0x65, 0x6c, 0x73, 0x12, 0x63, 0x0a, 0x15, 0x72, 0x61, 0x70, 0x69, 0x64, 0x74,
	0x65, 0x65, 0x6e, 0x70, 0x61, 0x74, 0x74, 0x69, 0x5f, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x73, 0x18,
	0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x63, 0x77, 0x2e, 0x63,
	0x68, 0x65, 0x73, 0x73, 0x2e, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x2e, 0x52, 0x61,
	0x70, 0x69, 0x64, 0x54, 0x65, 0x65, 0x6e, 0x70, 0x61, 0x74, 0x74, 0x69, 0x4c, 0x65, 0x76, 0x65,
	0x6c, 0x44, 0x65, 0x73, 0x63, 0x52, 0x14, 0x72, 0x61, 0x70, 0x69, 0x64, 0x74, 0x65, 0x65, 0x6e,
	0x70, 0x61, 0x74, 0x74, 0x69, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x73, 0x12, 0x5a, 0x0a, 0x12, 0x64,
	0x72, 0x61, 0x67, 0x6f, 0x6e, 0x74, 0x69, 0x67, 0x65, 0x72, 0x5f, 0x6c, 0x65, 0x76, 0x65, 0x6c,
	0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x63, 0x77,
	0x2e, 0x63, 0x68, 0x65, 0x73, 0x73, 0x2e, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x2e,
	0x44, 0x72, 0x61, 0x67, 0x6f, 0x6e, 0x54, 0x69, 0x67, 0x65, 0x72, 0x4c, 0x65, 0x76, 0x65, 0x6c,
	0x44, 0x65, 0x73, 0x63, 0x52, 0x11, 0x64, 0x72, 0x61, 0x67, 0x6f, 0x6e, 0x74, 0x69, 0x67, 0x65,
	0x72, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x73, 0x12, 0x51, 0x0a, 0x0f, 0x62, 0x6c, 0x61, 0x63, 0x6b,
	0x72, 0x65, 0x64, 0x5f, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b,
	0x32, 0x28, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x63, 0x77, 0x2e, 0x63, 0x68, 0x65, 0x73, 0x73, 0x2e,
	0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x2e, 0x42, 0x6c, 0x61, 0x63, 0x6b, 0x72, 0x65,
	0x64, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x44, 0x65, 0x73, 0x63, 0x52, 0x0e, 0x62, 0x6c, 0x61, 0x63,
	0x6b, 0x72, 0x65, 0x64, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x73, 0x12, 0x55, 0x0a, 0x12, 0x68, 0x6f,
	0x72, 0x73, 0x65, 0x72, 0x61, 0x63, 0x69, 0x6e, 0x67, 0x5f, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x73,
	0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x63, 0x77, 0x2e,
	0x63, 0x68, 0x65, 0x73, 0x73, 0x2e, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x2e, 0x48,
	0x6f, 0x72, 0x73, 0x65, 0x72, 0x61, 0x63, 0x69, 0x6e, 0x67, 0x44, 0x65, 0x73, 0x63, 0x52, 0x11,
	0x68, 0x6f, 0x72, 0x73, 0x65, 0x72, 0x61, 0x63, 0x69, 0x6e, 0x67, 0x4c, 0x65, 0x76, 0x65, 0x6c,
	0x73, 0x12, 0x3f, 0x0a, 0x09, 0x6a, 0x6d, 0x5f, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x73, 0x18, 0x0a,
	0x20, 0x03, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x63, 0x77, 0x2e, 0x63, 0x68,
	0x65, 0x73, 0x73, 0x2e, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x2e, 0x4a, 0x4d, 0x4c,
	0x65, 0x76, 0x65, 0x6c, 0x44, 0x65, 0x73, 0x63, 0x52, 0x08, 0x6a, 0x6d, 0x4c, 0x65, 0x76, 0x65,
	0x6c, 0x73, 0x12, 0x51, 0x0a, 0x0f, 0x62, 0x61, 0x63, 0x63, 0x61, 0x72, 0x61, 0x74, 0x5f, 0x6c,
	0x65, 0x76, 0x65, 0x6c, 0x73, 0x18, 0x0b, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x63, 0x6f,
	0x6d, 0x2e, 0x63, 0x77, 0x2e, 0x63, 0x68, 0x65, 0x73, 0x73, 0x2e, 0x70, 0x6c, 0x61, 0x74, 0x66,
	0x6f, 0x72, 0x6d, 0x2e, 0x42, 0x61, 0x63, 0x63, 0x61, 0x72, 0x61, 0x74, 0x4c, 0x65, 0x76, 0x65,
	0x6c, 0x44, 0x65, 0x73, 0x63, 0x52, 0x0e, 0x62, 0x61, 0x63, 0x63, 0x61, 0x72, 0x61, 0x74, 0x4c,
	0x65, 0x76, 0x65, 0x6c, 0x73, 0x22, 0x83, 0x01, 0x0a, 0x0c, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x52,
	0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e,
	0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x06, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3c,
	0x0a, 0x09, 0x67, 0x61, 0x6d, 0x65, 0x5f, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28,
	0x0e, 0x32, 0x1f, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x63, 0x77, 0x2e, 0x63, 0x68, 0x65, 0x73, 0x73,
	0x2e, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x2e, 0x47, 0x61, 0x6d, 0x65, 0x4b, 0x69,
	0x6e, 0x64, 0x52, 0x08, 0x67, 0x61, 0x6d, 0x65, 0x4b, 0x69, 0x6e, 0x64, 0x12, 0x1d, 0x0a, 0x0a,
	0x67, 0x61, 0x6d, 0x65, 0x5f, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d,
	0x52, 0x09, 0x67, 0x61, 0x6d, 0x65, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x22, 0x65, 0x0a, 0x0d, 0x4d,
	0x61, 0x74, 0x63, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x16, 0x0a, 0x06,
	0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x06, 0x72, 0x65,
	0x73, 0x75, 0x6c, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x6d, 0x61, 0x78, 0x5f, 0x74, 0x69, 0x6d, 0x65,
	0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x6d, 0x61, 0x78, 0x54, 0x69, 0x6d, 0x65, 0x12,
	0x21, 0x0a, 0x0c, 0x61, 0x76, 0x65, 0x72, 0x61, 0x67, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18,
	0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x61, 0x76, 0x65, 0x72, 0x61, 0x67, 0x65, 0x54, 0x69,
	0x6d, 0x65, 0x22, 0xbe, 0x01, 0x0a, 0x0f, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x4f, 0x4b, 0x52, 0x65,
	0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74,
	0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x1b,
	0x0a, 0x09, 0x67, 0x61, 0x6d, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28,
	0x0d, 0x52, 0x08, 0x67, 0x61, 0x6d, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x19, 0x0a, 0x08, 0x74,
	0x61, 0x62, 0x6c, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x74,
	0x61, 0x62, 0x6c, 0x65, 0x49, 0x64, 0x12, 0x3c, 0x0a, 0x09, 0x67, 0x61, 0x6d, 0x65, 0x5f, 0x6b,
	0x69, 0x6e, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1f, 0x2e, 0x63, 0x6f, 0x6d, 0x2e,
	0x63, 0x77, 0x2e, 0x63, 0x68, 0x65, 0x73, 0x73, 0x2e, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72,
	0x6d, 0x2e, 0x47, 0x61, 0x6d, 0x65, 0x4b, 0x69, 0x6e, 0x64, 0x52, 0x08, 0x67, 0x61, 0x6d, 0x65,
	0x4b, 0x69, 0x6e, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x67, 0x61, 0x6d, 0x65, 0x5f, 0x6c, 0x65, 0x76,
	0x65, 0x6c, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x09, 0x67, 0x61, 0x6d, 0x65, 0x4c, 0x65,
	0x76, 0x65, 0x6c, 0x22, 0x6f, 0x0a, 0x10, 0x45, 0x6e, 0x74, 0x65, 0x72, 0x47, 0x61, 0x6d, 0x65,
	0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x3c, 0x0a, 0x09, 0x67, 0x61, 0x6d, 0x65, 0x5f,
	0x6b, 0x69, 0x6e, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1f, 0x2e, 0x63, 0x6f, 0x6d,
	0x2e, 0x63, 0x77, 0x2e, 0x63, 0x68, 0x65, 0x73, 0x73, 0x2e, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f,
	0x72, 0x6d, 0x2e, 0x47, 0x61, 0x6d, 0x65, 0x4b, 0x69, 0x6e, 0x64, 0x52, 0x08, 0x67, 0x61, 0x6d,
	0x65, 0x4b, 0x69, 0x6e, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x67, 0x61, 0x6d, 0x65, 0x5f, 0x6c, 0x65,
	0x76, 0x65, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x09, 0x67, 0x61, 0x6d, 0x65, 0x4c,
	0x65, 0x76, 0x65, 0x6c, 0x2a, 0xa3, 0x03, 0x0a, 0x0a, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x54,
	0x79, 0x70, 0x65, 0x12, 0x17, 0x0a, 0x13, 0x53, 0x45, 0x52, 0x56, 0x45, 0x52, 0x5f, 0x54, 0x50,
	0x59, 0x45, 0x5f, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x10, 0x00, 0x12, 0x18, 0x0a, 0x13,
	0x53, 0x45, 0x52, 0x56, 0x45, 0x52, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x47, 0x41, 0x54, 0x45,
	0x57, 0x41, 0x59, 0x10, 0xe8, 0x07, 0x12, 0x17, 0x0a, 0x12, 0x53, 0x45, 0x52, 0x56, 0x45, 0x52,
	0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x43, 0x4f, 0x4d, 0x4d, 0x4f, 0x4e, 0x10, 0xcc, 0x08, 0x12,
	0x16, 0x0a, 0x11, 0x53, 0x45, 0x52, 0x56, 0x45, 0x52, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4d,
	0x41, 0x54, 0x43, 0x48, 0x10, 0xcd, 0x08, 0x12, 0x13, 0x0a, 0x0e, 0x53, 0x45, 0x52, 0x56, 0x45,
	0x52, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x46, 0x54, 0x10, 0xce, 0x08, 0x12, 0x13, 0x0a, 0x0e,
	0x53, 0x45, 0x52, 0x56, 0x45, 0x52, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x42, 0x41, 0x10, 0xd2,
	0x0f, 0x12, 0x17, 0x0a, 0x12, 0x53, 0x45, 0x52, 0x56, 0x45, 0x52, 0x5f, 0x54, 0x59, 0x50, 0x45,
	0x5f, 0x52, 0x55, 0x4d, 0x4d, 0x59, 0x5f, 0x10, 0xb8, 0x17, 0x12, 0x1a, 0x0a, 0x15, 0x53, 0x45,
	0x52, 0x56, 0x45, 0x52, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x54, 0x45, 0x45, 0x50, 0x41, 0x54,
	0x54, 0x49, 0x5f, 0x10, 0xa0, 0x1f, 0x12, 0x14, 0x0a, 0x0f, 0x53, 0x45, 0x52, 0x56, 0x45, 0x52,
	0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x41, 0x42, 0x5f, 0x10, 0x88, 0x27, 0x12, 0x15, 0x0a, 0x10,
	0x53, 0x45, 0x52, 0x56, 0x45, 0x52, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x37, 0x55, 0x44, 0x5f,
	0x10, 0xf0, 0x2e, 0x12, 0x19, 0x0a, 0x14, 0x53, 0x45, 0x52, 0x56, 0x45, 0x52, 0x5f, 0x54, 0x59,
	0x50, 0x45, 0x5f, 0x52, 0x41, 0x50, 0x49, 0x44, 0x54, 0x50, 0x5f, 0x10, 0xd8, 0x36, 0x12, 0x1d,
	0x0a, 0x18, 0x53, 0x45, 0x52, 0x56, 0x45, 0x52, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x44, 0x52,
	0x41, 0x47, 0x4f, 0x4e, 0x54, 0x49, 0x47, 0x45, 0x52, 0x5f, 0x10, 0xc0, 0x3e, 0x12, 0x1a, 0x0a,
	0x15, 0x53, 0x45, 0x52, 0x56, 0x45, 0x52, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x42, 0x4c, 0x41,
	0x43, 0x4b, 0x52, 0x45, 0x44, 0x5f, 0x10, 0xa8, 0x46, 0x12, 0x1d, 0x0a, 0x18, 0x53, 0x45, 0x52,
	0x56, 0x45, 0x52, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x48, 0x4f, 0x52, 0x53, 0x45, 0x52, 0x41,
	0x43, 0x49, 0x4e, 0x47, 0x5f, 0x10, 0x90, 0x4e, 0x12, 0x14, 0x0a, 0x0f, 0x53, 0x45, 0x52, 0x56,
	0x45, 0x52, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4a, 0x4d, 0x5f, 0x10, 0xf8, 0x55, 0x12, 0x1a,
	0x0a, 0x15, 0x53, 0x45, 0x52, 0x56, 0x45, 0x52, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x42, 0x41,
	0x43, 0x43, 0x41, 0x52, 0x41, 0x54, 0x5f, 0x10, 0xe0, 0x5d, 0x2a, 0xd6, 0x02, 0x0a, 0x10, 0x53,
	0x65, 0x72, 0x76, 0x65, 0x72, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x43, 0x6d, 0x64, 0x12,
	0x17, 0x0a, 0x13, 0x43, 0x4d, 0x44, 0x5f, 0x47, 0x41, 0x54, 0x45, 0x57, 0x41, 0x59, 0x5f, 0x49,
	0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x10, 0x00, 0x12, 0x19, 0x0a, 0x15, 0x43, 0x4d, 0x44, 0x5f,
	0x47, 0x41, 0x54, 0x45, 0x57, 0x41, 0x59, 0x5f, 0x4c, 0x4f, 0x47, 0x49, 0x4e, 0x5f, 0x52, 0x45,
	0x51, 0x10, 0x01, 0x12, 0x1a, 0x0a, 0x16, 0x43, 0x4d, 0x44, 0x5f, 0x47, 0x41, 0x54, 0x45, 0x57,
	0x41, 0x59, 0x5f, 0x4c, 0x4f, 0x47, 0x49, 0x4e, 0x5f, 0x52, 0x45, 0x53, 0x50, 0x10, 0x02, 0x12,
	0x1a, 0x0a, 0x16, 0x43, 0x4d, 0x44, 0x5f, 0x47, 0x41, 0x54, 0x45, 0x57, 0x41, 0x59, 0x5f, 0x4c,
	0x4f, 0x47, 0x4f, 0x55, 0x54, 0x5f, 0x52, 0x45, 0x51, 0x10, 0x03, 0x12, 0x1b, 0x0a, 0x17, 0x43,
	0x4d, 0x44, 0x5f, 0x47, 0x41, 0x54, 0x45, 0x57, 0x41, 0x59, 0x5f, 0x4c, 0x4f, 0x47, 0x4f, 0x55,
	0x54, 0x5f, 0x52, 0x45, 0x53, 0x50, 0x10, 0x04, 0x12, 0x1e, 0x0a, 0x1a, 0x43, 0x4d, 0x44, 0x5f,
	0x47, 0x41, 0x54, 0x45, 0x57, 0x41, 0x59, 0x5f, 0x44, 0x49, 0x53, 0x43, 0x4f, 0x4e, 0x4e, 0x45,
	0x43, 0x54, 0x5f, 0x52, 0x45, 0x51, 0x10, 0x05, 0x12, 0x1f, 0x0a, 0x1b, 0x43, 0x4d, 0x44, 0x5f,
	0x47, 0x41, 0x54, 0x45, 0x57, 0x41, 0x59, 0x5f, 0x44, 0x49, 0x53, 0x43, 0x4f, 0x4e, 0x4e, 0x45,
	0x43, 0x54, 0x5f, 0x52, 0x45, 0x53, 0x50, 0x10, 0x06, 0x12, 0x20, 0x0a, 0x1c, 0x43, 0x4d, 0x44,
	0x5f, 0x47, 0x41, 0x54, 0x45, 0x57, 0x41, 0x59, 0x5f, 0x52, 0x45, 0x50, 0x45, 0x41, 0x54, 0x5f,
	0x4c, 0x4f, 0x47, 0x49, 0x4e, 0x5f, 0x52, 0x45, 0x51, 0x10, 0x07, 0x12, 0x21, 0x0a, 0x1d, 0x43,
	0x4d, 0x44, 0x5f, 0x47, 0x41, 0x54, 0x45, 0x57, 0x41, 0x59, 0x5f, 0x52, 0x45, 0x50, 0x45, 0x41,
	0x54, 0x5f, 0x4c, 0x4f, 0x47, 0x49, 0x4e, 0x5f, 0x52, 0x45, 0x53, 0x50, 0x10, 0x08, 0x12, 0x18,
	0x0a, 0x14, 0x43, 0x4d, 0x44, 0x5f, 0x47, 0x41, 0x54, 0x45, 0x57, 0x41, 0x59, 0x5f, 0x50, 0x49,
	0x4e, 0x47, 0x5f, 0x52, 0x45, 0x51, 0x10, 0x09, 0x12, 0x19, 0x0a, 0x15, 0x43, 0x4d, 0x44, 0x5f,
	0x47, 0x41, 0x54, 0x45, 0x57, 0x41, 0x59, 0x5f, 0x50, 0x49, 0x4e, 0x47, 0x5f, 0x52, 0x45, 0x53,
	0x50, 0x10, 0x0a, 0x2a, 0xb9, 0x03, 0x0a, 0x0f, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x43, 0x6f,
	0x6d, 0x6d, 0x6f, 0x6e, 0x43, 0x6d, 0x64, 0x12, 0x16, 0x0a, 0x12, 0x43, 0x4d, 0x44, 0x5f, 0x43,
	0x4f, 0x4d, 0x4d, 0x4f, 0x4e, 0x5f, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x10, 0x00, 0x12,
	0x0c, 0x0a, 0x08, 0x43, 0x4d, 0x44, 0x5f, 0x4e, 0x41, 0x5f, 0x31, 0x10, 0x01, 0x12, 0x1a, 0x0a,
	0x16, 0x43, 0x4d, 0x44, 0x5f, 0x46, 0x52, 0x45, 0x45, 0x5a, 0x45, 0x5f, 0x50, 0x4c, 0x41, 0x59,
	0x45, 0x52, 0x5f, 0x52, 0x45, 0x53, 0x50, 0x10, 0x02, 0x12, 0x1e, 0x0a, 0x1a, 0x43, 0x4d, 0x44,
	0x5f, 0x47, 0x45, 0x54, 0x5f, 0x50, 0x4c, 0x41, 0x59, 0x45, 0x52, 0x5f, 0x42, 0x41, 0x4c, 0x41,
	0x4e, 0x43, 0x45, 0x5f, 0x52, 0x45, 0x51, 0x10, 0x03, 0x12, 0x1f, 0x0a, 0x1b, 0x43, 0x4d, 0x44,
	0x5f, 0x47, 0x45, 0x54, 0x5f, 0x50, 0x4c, 0x41, 0x59, 0x45, 0x52, 0x5f, 0x42, 0x41, 0x4c, 0x41,
	0x4e, 0x43, 0x45, 0x5f, 0x52, 0x45, 0x53, 0x50, 0x10, 0x04, 0x12, 0x0c, 0x0a, 0x08, 0x43, 0x4d,
	0x44, 0x5f, 0x4e, 0x41, 0x5f, 0x35, 0x10, 0x05, 0x12, 0x1f, 0x0a, 0x1b, 0x43, 0x4d, 0x44, 0x5f,
	0x53, 0x59, 0x53, 0x4d, 0x45, 0x53, 0x53, 0x41, 0x47, 0x45, 0x5f, 0x54, 0x4f, 0x5f, 0x55, 0x53,
	0x45, 0x52, 0x5f, 0x52, 0x45, 0x53, 0x50, 0x10, 0x06, 0x12, 0x0c, 0x0a, 0x08, 0x43, 0x4d, 0x44,
	0x5f, 0x4e, 0x41, 0x5f, 0x37, 0x10, 0x07, 0x12, 0x1e, 0x0a, 0x1a, 0x43, 0x4d, 0x44, 0x5f, 0x50,
	0x48, 0x50, 0x5f, 0x32, 0x5f, 0x55, 0x53, 0x45, 0x52, 0x5f, 0x43, 0x4f, 0x4d, 0x4d, 0x4f, 0x4e,
	0x5f, 0x52, 0x45, 0x53, 0x50, 0x10, 0x08, 0x12, 0x1a, 0x0a, 0x16, 0x43, 0x4d, 0x44, 0x5f, 0x47,
	0x45, 0x54, 0x5f, 0x55, 0x53, 0x45, 0x52, 0x5f, 0x41, 0x54, 0x54, 0x52, 0x49, 0x5f, 0x52, 0x45,
	0x51, 0x10, 0x09, 0x12, 0x1b, 0x0a, 0x17, 0x43, 0x4d, 0x44, 0x5f, 0x47, 0x45, 0x54, 0x5f, 0x55,
	0x53, 0x45, 0x52, 0x5f, 0x41, 0x54, 0x54, 0x52, 0x49, 0x5f, 0x52, 0x45, 0x53, 0x50, 0x10, 0x0a,
	0x12, 0x1d, 0x0a, 0x19, 0x43, 0x4d, 0x44, 0x5f, 0x55, 0x50, 0x44, 0x41, 0x54, 0x45, 0x5f, 0x55,
	0x53, 0x45, 0x52, 0x5f, 0x41, 0x54, 0x54, 0x52, 0x49, 0x5f, 0x52, 0x45, 0x51, 0x10, 0x0b, 0x12,
	0x1e, 0x0a, 0x1a, 0x43, 0x4d, 0x44, 0x5f, 0x55, 0x50, 0x44, 0x41, 0x54, 0x45, 0x5f, 0x55, 0x53,
	0x45, 0x52, 0x5f, 0x41, 0x54, 0x54, 0x52, 0x49, 0x5f, 0x52, 0x45, 0x53, 0x50, 0x10, 0x0c, 0x12,
	0x15, 0x0a, 0x11, 0x43, 0x4d, 0x44, 0x5f, 0x47, 0x45, 0x54, 0x5f, 0x42, 0x4f, 0x4e, 0x55, 0x53,
	0x5f, 0x52, 0x45, 0x51, 0x10, 0x0d, 0x12, 0x16, 0x0a, 0x12, 0x43, 0x4d, 0x44, 0x5f, 0x47, 0x45,
	0x54, 0x5f, 0x42, 0x4f, 0x4e, 0x55, 0x53, 0x5f, 0x52, 0x45, 0x53, 0x50, 0x10, 0x0e, 0x12, 0x0e,
	0x0a, 0x0a, 0x43, 0x4d, 0x44, 0x5f, 0x42, 0x53, 0x5f, 0x52, 0x45, 0x51, 0x10, 0x0f, 0x12, 0x0f,
	0x0a, 0x0b, 0x43, 0x4d, 0x44, 0x5f, 0x42, 0x53, 0x5f, 0x52, 0x45, 0x53, 0x50, 0x10, 0x10, 0x2a,
	0x3d, 0x0a, 0x0c, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x63, 0x79, 0x4b, 0x69, 0x6e, 0x64, 0x12,
	0x0e, 0x0a, 0x0a, 0x43, 0x4b, 0x5f, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x10, 0x00, 0x12,
	0x0c, 0x0a, 0x08, 0x43, 0x4b, 0x5f, 0x4d, 0x6f, 0x6e, 0x65, 0x79, 0x10, 0x01, 0x12, 0x0f, 0x0a,
	0x0b, 0x43, 0x4b, 0x5f, 0x50, 0x72, 0x61, 0x63, 0x74, 0x69, 0x63, 0x65, 0x10, 0x02, 0x2a, 0x80,
	0x05, 0x0a, 0x0c, 0x43, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x5f, 0x53, 0x5f, 0x43, 0x6d, 0x64, 0x12,
	0x11, 0x0a, 0x0d, 0x43, 0x4d, 0x44, 0x5f, 0x53, 0x5f, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44,
	0x10, 0x00, 0x12, 0x0e, 0x0a, 0x0a, 0x43, 0x4d, 0x44, 0x5f, 0x53, 0x5f, 0x50, 0x49, 0x4e, 0x47,
	0x10, 0x01, 0x12, 0x0e, 0x0a, 0x0a, 0x43, 0x4d, 0x44, 0x5f, 0x53, 0x5f, 0x50, 0x4f, 0x4e, 0x47,
	0x10, 0x02, 0x12, 0x16, 0x0a, 0x12, 0x43, 0x4d, 0x44, 0x5f, 0x53, 0x5f, 0x52, 0x55, 0x4d, 0x4d,
	0x59, 0x5f, 0x42, 0x53, 0x5f, 0x52, 0x45, 0x51, 0x10, 0x03, 0x12, 0x17, 0x0a, 0x13, 0x43, 0x4d,
	0x44, 0x5f, 0x53, 0x5f, 0x52, 0x55, 0x4d, 0x4d, 0x59, 0x5f, 0x42, 0x53, 0x5f, 0x52, 0x45, 0x53,
	0x50, 0x10, 0x04, 0x12, 0x1a, 0x0a, 0x16, 0x43, 0x4d, 0x44, 0x5f, 0x53, 0x5f, 0x54, 0x45, 0x45,
	0x4e, 0x50, 0x41, 0x54, 0x54, 0x49, 0x5f, 0x42, 0x53, 0x5f, 0x52, 0x45, 0x51, 0x10, 0x05, 0x12,
	0x1b, 0x0a, 0x17, 0x43, 0x4d, 0x44, 0x5f, 0x53, 0x5f, 0x54, 0x45, 0x45, 0x4e, 0x50, 0x41, 0x54,
	0x54, 0x49, 0x5f, 0x42, 0x53, 0x5f, 0x52, 0x45, 0x53, 0x50, 0x10, 0x06, 0x12, 0x13, 0x0a, 0x0f,
	0x43, 0x4d, 0x44, 0x5f, 0x53, 0x5f, 0x41, 0x42, 0x5f, 0x42, 0x53, 0x5f, 0x52, 0x45, 0x51, 0x10,
	0x07, 0x12, 0x14, 0x0a, 0x10, 0x43, 0x4d, 0x44, 0x5f, 0x53, 0x5f, 0x41, 0x42, 0x5f, 0x42, 0x53,
	0x5f, 0x52, 0x45, 0x53, 0x50, 0x10, 0x08, 0x12, 0x13, 0x0a, 0x0f, 0x43, 0x4d, 0x44, 0x5f, 0x53,
	0x5f, 0x46, 0x54, 0x5f, 0x42, 0x53, 0x5f, 0x52, 0x45, 0x51, 0x10, 0x09, 0x12, 0x14, 0x0a, 0x10,
	0x43, 0x4d, 0x44, 0x5f, 0x53, 0x5f, 0x46, 0x54, 0x5f, 0x42, 0x53, 0x5f, 0x52, 0x45, 0x53, 0x50,
	0x10, 0x0a, 0x12, 0x1c, 0x0a, 0x18, 0x43, 0x4d, 0x44, 0x5f, 0x53, 0x5f, 0x53, 0x45, 0x56, 0x45,
	0x4e, 0x55, 0x50, 0x44, 0x4f, 0x57, 0x4e, 0x5f, 0x42, 0x53, 0x5f, 0x52, 0x45, 0x51, 0x10, 0x0b,
	0x12, 0x1d, 0x0a, 0x19, 0x43, 0x4d, 0x44, 0x5f, 0x53, 0x5f, 0x53, 0x45, 0x56, 0x45, 0x4e, 0x55,
	0x50, 0x44, 0x4f, 0x57, 0x4e, 0x5f, 0x42, 0x53, 0x5f, 0x52, 0x45, 0x53, 0x50, 0x10, 0x0c, 0x12,
	0x1c, 0x0a, 0x18, 0x43, 0x4d, 0x44, 0x5f, 0x53, 0x5f, 0x44, 0x52, 0x41, 0x47, 0x4f, 0x4e, 0x54,
	0x49, 0x47, 0x45, 0x52, 0x5f, 0x42, 0x53, 0x5f, 0x52, 0x45, 0x51, 0x10, 0x0d, 0x12, 0x1d, 0x0a,
	0x19, 0x43, 0x4d, 0x44, 0x5f, 0x53, 0x5f, 0x44, 0x52, 0x41, 0x47, 0x4f, 0x4e, 0x54, 0x49, 0x47,
	0x45, 0x52, 0x5f, 0x42, 0x53, 0x5f, 0x52, 0x45, 0x53, 0x50, 0x10, 0x0e, 0x12, 0x18, 0x0a, 0x14,
	0x43, 0x4d, 0x44, 0x5f, 0x53, 0x5f, 0x52, 0x41, 0x50, 0x49, 0x44, 0x54, 0x50, 0x5f, 0x42, 0x53,
	0x5f, 0x52, 0x45, 0x51, 0x10, 0x0f, 0x12, 0x19, 0x0a, 0x15, 0x43, 0x4d, 0x44, 0x5f, 0x53, 0x5f,
	0x52, 0x41, 0x50, 0x49, 0x44, 0x54, 0x50, 0x5f, 0x42, 0x53, 0x5f, 0x52, 0x45, 0x53, 0x50, 0x10,
	0x10, 0x12, 0x19, 0x0a, 0x15, 0x43, 0x4d, 0x44, 0x5f, 0x53, 0x5f, 0x42, 0x4c, 0x41, 0x43, 0x4b,
	0x52, 0x45, 0x44, 0x5f, 0x42, 0x53, 0x5f, 0x52, 0x45, 0x51, 0x10, 0x11, 0x12, 0x1a, 0x0a, 0x16,
	0x43, 0x4d, 0x44, 0x5f, 0x53, 0x5f, 0x42, 0x4c, 0x41, 0x43, 0x4b, 0x52, 0x45, 0x44, 0x5f, 0x42,
	0x53, 0x5f, 0x52, 0x45, 0x53, 0x50, 0x10, 0x12, 0x12, 0x1c, 0x0a, 0x18, 0x43, 0x4d, 0x44, 0x5f,
	0x53, 0x5f, 0x48, 0x4f, 0x52, 0x53, 0x45, 0x52, 0x41, 0x43, 0x49, 0x4e, 0x47, 0x5f, 0x42, 0x53,
	0x5f, 0x52, 0x45, 0x51, 0x10, 0x13, 0x12, 0x1d, 0x0a, 0x19, 0x43, 0x4d, 0x44, 0x5f, 0x53, 0x5f,
	0x48, 0x4f, 0x52, 0x53, 0x45, 0x52, 0x41, 0x43, 0x49, 0x4e, 0x47, 0x5f, 0x42, 0x53, 0x5f, 0x52,
	0x45, 0x53, 0x50, 0x10, 0x14, 0x12, 0x13, 0x0a, 0x0f, 0x43, 0x4d, 0x44, 0x5f, 0x53, 0x5f, 0x4a,
	0x4d, 0x5f, 0x42, 0x53, 0x5f, 0x52, 0x45, 0x51, 0x10, 0x15, 0x12, 0x14, 0x0a, 0x10, 0x43, 0x4d,
	0x44, 0x5f, 0x53, 0x5f, 0x4a, 0x4d, 0x5f, 0x42, 0x53, 0x5f, 0x52, 0x45, 0x53, 0x50, 0x10, 0x16,
	0x12, 0x16, 0x0a, 0x12, 0x43, 0x4d, 0x44, 0x5f, 0x53, 0x5f, 0x42, 0x41, 0x43, 0x43, 0x41, 0x52,
	0x41, 0x54, 0x5f, 0x52, 0x45, 0x51, 0x10, 0x17, 0x12, 0x17, 0x0a, 0x13, 0x43, 0x4d, 0x44, 0x5f,
	0x53, 0x5f, 0x42, 0x41, 0x43, 0x43, 0x41, 0x52, 0x41, 0x54, 0x5f, 0x52, 0x45, 0x53, 0x50, 0x10,
	0x18, 0x2a, 0x90, 0x02, 0x0a, 0x0e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x4d, 0x61, 0x74, 0x63,
	0x68, 0x43, 0x6d, 0x64, 0x12, 0x15, 0x0a, 0x11, 0x43, 0x4d, 0x44, 0x5f, 0x4d, 0x41, 0x54, 0x43,
	0x48, 0x5f, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x10, 0x00, 0x12, 0x19, 0x0a, 0x15, 0x43,
	0x4d, 0x44, 0x5f, 0x47, 0x45, 0x54, 0x5f, 0x47, 0x41, 0x4d, 0x45, 0x5f, 0x4b, 0x49, 0x4e, 0x44,
	0x5f, 0x52, 0x45, 0x51, 0x10, 0x01, 0x12, 0x1a, 0x0a, 0x16, 0x43, 0x4d, 0x44, 0x5f, 0x47, 0x45,
	0x54, 0x5f, 0x47, 0x41, 0x4d, 0x45, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x52, 0x45, 0x53, 0x50,
	0x10, 0x02, 0x12, 0x15, 0x0a, 0x11, 0x43, 0x4d, 0x44, 0x5f, 0x47, 0x45, 0x54, 0x5f, 0x52, 0x4f,
	0x4f, 0x4d, 0x53, 0x5f, 0x52, 0x45, 0x51, 0x10, 0x03, 0x12, 0x16, 0x0a, 0x12, 0x43, 0x4d, 0x44,
	0x5f, 0x47, 0x45, 0x54, 0x5f, 0x52, 0x4f, 0x4f, 0x4d, 0x53, 0x5f, 0x52, 0x45, 0x53, 0x50, 0x10,
	0x04, 0x12, 0x11, 0x0a, 0x0d, 0x43, 0x4d, 0x44, 0x5f, 0x4d, 0x41, 0x54, 0x43, 0x48, 0x5f, 0x52,
	0x45, 0x51, 0x10, 0x05, 0x12, 0x12, 0x0a, 0x0e, 0x43, 0x4d, 0x44, 0x5f, 0x4d, 0x41, 0x54, 0x43,
	0x48, 0x5f, 0x52, 0x45, 0x53, 0x50, 0x10, 0x06, 0x12, 0x12, 0x0a, 0x0e, 0x43, 0x4d, 0x44, 0x5f,
	0x4d, 0x41, 0x54, 0x43, 0x48, 0x5f, 0x4e, 0x41, 0x5f, 0x37, 0x10, 0x07, 0x12, 0x15, 0x0a, 0x11,
	0x43, 0x4d, 0x44, 0x5f, 0x4d, 0x41, 0x54, 0x43, 0x48, 0x5f, 0x4f, 0x4b, 0x5f, 0x52, 0x45, 0x53,
	0x50, 0x10, 0x08, 0x12, 0x16, 0x0a, 0x12, 0x43, 0x4d, 0x44, 0x5f, 0x45, 0x4e, 0x54, 0x45, 0x52,
	0x5f, 0x47, 0x41, 0x4d, 0x45, 0x5f, 0x52, 0x45, 0x51, 0x10, 0x09, 0x12, 0x17, 0x0a, 0x13, 0x43,
	0x4d, 0x44, 0x5f, 0x45, 0x4e, 0x54, 0x45, 0x52, 0x5f, 0x47, 0x41, 0x4d, 0x45, 0x5f, 0x52, 0x45,
	0x53, 0x50, 0x10, 0x0a, 0x2a, 0xc7, 0x02, 0x0a, 0x08, 0x47, 0x61, 0x6d, 0x65, 0x4b, 0x69, 0x6e,
	0x64, 0x12, 0x0b, 0x0a, 0x07, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x10, 0x00, 0x12, 0x13,
	0x0a, 0x0f, 0x47, 0x41, 0x4d, 0x45, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x52, 0x75, 0x6d, 0x6d,
	0x79, 0x10, 0x01, 0x12, 0x18, 0x0a, 0x14, 0x47, 0x41, 0x4d, 0x45, 0x5f, 0x4b, 0x49, 0x4e, 0x44,
	0x5f, 0x52, 0x75, 0x6d, 0x6d, 0x79, 0x5f, 0x70, 0x6f, 0x6f, 0x6c, 0x10, 0x02, 0x12, 0x16, 0x0a,
	0x12, 0x47, 0x41, 0x4d, 0x45, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x52, 0x75, 0x6d, 0x6d, 0x79,
	0x5f, 0x31, 0x30, 0x10, 0x03, 0x12, 0x16, 0x0a, 0x12, 0x47, 0x41, 0x4d, 0x45, 0x5f, 0x4b, 0x49,
	0x4e, 0x44, 0x5f, 0x54, 0x45, 0x45, 0x50, 0x41, 0x54, 0x54, 0x49, 0x10, 0x04, 0x12, 0x10, 0x0a,
	0x0c, 0x47, 0x41, 0x4d, 0x45, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x41, 0x42, 0x10, 0x05, 0x12,
	0x15, 0x0a, 0x11, 0x47, 0x41, 0x4d, 0x45, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x53, 0x65, 0x76,
	0x65, 0x6e, 0x55, 0x44, 0x10, 0x06, 0x12, 0x1c, 0x0a, 0x18, 0x47, 0x41, 0x4d, 0x45, 0x5f, 0x4b,
	0x49, 0x4e, 0x44, 0x5f, 0x52, 0x61, 0x70, 0x69, 0x64, 0x54, 0x65, 0x65, 0x6e, 0x61, 0x70, 0x74,
	0x74, 0x69, 0x10, 0x07, 0x12, 0x19, 0x0a, 0x15, 0x47, 0x41, 0x4d, 0x45, 0x5f, 0x4b, 0x49, 0x4e,
	0x44, 0x5f, 0x44, 0x72, 0x61, 0x67, 0x6f, 0x6e, 0x54, 0x69, 0x67, 0x65, 0x72, 0x10, 0x08, 0x12,
	0x16, 0x0a, 0x12, 0x47, 0x41, 0x4d, 0x45, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x42, 0x6c, 0x61,
	0x63, 0x6b, 0x52, 0x65, 0x64, 0x10, 0x09, 0x12, 0x19, 0x0a, 0x15, 0x47, 0x41, 0x4d, 0x45, 0x5f,
	0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x48, 0x6f, 0x72, 0x73, 0x65, 0x52, 0x61, 0x63, 0x69, 0x6e, 0x67,
	0x10, 0x0a, 0x12, 0x10, 0x0a, 0x0c, 0x47, 0x41, 0x4d, 0x45, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f,
	0x4a, 0x4d, 0x10, 0x0b, 0x12, 0x16, 0x0a, 0x12, 0x47, 0x41, 0x4d, 0x45, 0x5f, 0x4b, 0x49, 0x4e,
	0x44, 0x5f, 0x42, 0x41, 0x43, 0x43, 0x41, 0x52, 0x41, 0x54, 0x10, 0x0c, 0x12, 0x10, 0x0a, 0x0c,
	0x47, 0x41, 0x4d, 0x45, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x46, 0x54, 0x10, 0x14, 0x42, 0x19,
	0x5a, 0x17, 0x2e, 0x2f, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x77, 0x2f, 0x63, 0x68, 0x65, 0x73, 0x73,
	0x2f, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f,
	0x33,
}

var (
	file_platform_proto_rawDescOnce sync.Once
	file_platform_proto_rawDescData = file_platform_proto_rawDesc
)

func file_platform_proto_rawDescGZIP() []byte {
	file_platform_proto_rawDescOnce.Do(func() {
		file_platform_proto_rawDescData = protoimpl.X.CompressGZIP(file_platform_proto_rawDescData)
	})
	return file_platform_proto_rawDescData
}

var file_platform_proto_enumTypes = make([]protoimpl.EnumInfo, 7)
var file_platform_proto_msgTypes = make([]protoimpl.MessageInfo, 33)
var file_platform_proto_goTypes = []interface{}{
	(ServerType)(0),                   // 0: com.cw.chess.platform.ServerType
	(ServerGatewayCmd)(0),             // 1: com.cw.chess.platform.ServerGatewayCmd
	(ServerCommonCmd)(0),              // 2: com.cw.chess.platform.ServerCommonCmd
	(CurrencyKind)(0),                 // 3: com.cw.chess.platform.CurrencyKind
	(Common_S_Cmd)(0),                 // 4: com.cw.chess.platform.Common_S_Cmd
	(ServerMatchCmd)(0),               // 5: com.cw.chess.platform.ServerMatchCmd
	(GameKind)(0),                     // 6: com.cw.chess.platform.GameKind
	(*GameUser)(nil),                  // 7: com.cw.chess.platform.GameUser
	(*CommonResponse)(nil),            // 8: com.cw.chess.platform.CommonResponse
	(*LoginRequest)(nil),              // 9: com.cw.chess.platform.LoginRequest
	(*LoginResponse)(nil),             // 10: com.cw.chess.platform.LoginResponse
	(*GetPlayerBalanceResponse)(nil),  // 11: com.cw.chess.platform.GetPlayerBalanceResponse
	(*MessageToUserResp)(nil),         // 12: com.cw.chess.platform.MessageToUserResp
	(*UserAttri)(nil),                 // 13: com.cw.chess.platform.UserAttri
	(*MSG_GET_USER_ATTRI_REQ)(nil),    // 14: com.cw.chess.platform.MSG_GET_USER_ATTRI_REQ
	(*MSG_GET_USER_ATTRI_RESP)(nil),   // 15: com.cw.chess.platform.MSG_GET_USER_ATTRI_RESP
	(*MSG_UPDATE_USER_ATTRI_REQ)(nil), // 16: com.cw.chess.platform.MSG_UPDATE_USER_ATTRI_REQ
	(*MSG_GET_BONUS_RESP)(nil),        // 17: com.cw.chess.platform.MSG_GET_BONUS_RESP
	(*BS_RECHARGE)(nil),               // 18: com.cw.chess.platform.BS_RECHARGE
	(*BS_GAME)(nil),                   // 19: com.cw.chess.platform.BS_GAME
	(*MSG_BS_DATA)(nil),               // 20: com.cw.chess.platform.MSG_BS_DATA
	(*MSG_MSG_QUE_DATA)(nil),          // 21: com.cw.chess.platform.MSG_MSG_QUE_DATA
	(*MSG_MSG_QUE)(nil),               // 22: com.cw.chess.platform.MSG_MSG_QUE
	(*GameLevelDesc)(nil),             // 23: com.cw.chess.platform.GameLevelDesc
	(*RummyLevelDesc)(nil),            // 24: com.cw.chess.platform.RummyLevelDesc
	(*TeepattiLevelDesc)(nil),         // 25: com.cw.chess.platform.TeepattiLevelDesc
	(*ABLevelDesc)(nil),               // 26: com.cw.chess.platform.ABLevelDesc
	(*SevenUpdownLevelDesc)(nil),      // 27: com.cw.chess.platform.SevenUpdownLevelDesc
	(*RapidTeenpattiLevelDesc)(nil),   // 28: com.cw.chess.platform.RapidTeenpattiLevelDesc
	(*DragonTigerLevelDesc)(nil),      // 29: com.cw.chess.platform.DragonTigerLevelDesc
	(*BlackredLevelDesc)(nil),         // 30: com.cw.chess.platform.BlackredLevelDesc
	(*HorseracingDesc)(nil),           // 31: com.cw.chess.platform.HorseracingDesc
	(*JMLevelDesc)(nil),               // 32: com.cw.chess.platform.JMLevelDesc
	(*BaccaratLevelDesc)(nil),         // 33: com.cw.chess.platform.BaccaratLevelDesc
	(*GameKindRequest)(nil),           // 34: com.cw.chess.platform.GameKindRequest
	(*GameKindResponse)(nil),          // 35: com.cw.chess.platform.GameKindResponse
	(*MatchRequest)(nil),              // 36: com.cw.chess.platform.MatchRequest
	(*MatchResponse)(nil),             // 37: com.cw.chess.platform.MatchResponse
	(*MatchOKResponse)(nil),           // 38: com.cw.chess.platform.MatchOKResponse
	(*EnterGameRequest)(nil),          // 39: com.cw.chess.platform.EnterGameRequest
}
var file_platform_proto_depIdxs = []int32{
	3,  // 0: com.cw.chess.platform.GetPlayerBalanceResponse.game_currency:type_name -> com.cw.chess.platform.CurrencyKind
	13, // 1: com.cw.chess.platform.MSG_GET_USER_ATTRI_RESP.user_attris:type_name -> com.cw.chess.platform.UserAttri
	13, // 2: com.cw.chess.platform.MSG_UPDATE_USER_ATTRI_REQ.user_attri:type_name -> com.cw.chess.platform.UserAttri
	18, // 3: com.cw.chess.platform.MSG_BS_DATA.msg_recharge:type_name -> com.cw.chess.platform.BS_RECHARGE
	19, // 4: com.cw.chess.platform.MSG_BS_DATA.msg_game:type_name -> com.cw.chess.platform.BS_GAME
	21, // 5: com.cw.chess.platform.MSG_MSG_QUE.data_list:type_name -> com.cw.chess.platform.MSG_MSG_QUE_DATA
	3,  // 6: com.cw.chess.platform.GameLevelDesc.currency_kind:type_name -> com.cw.chess.platform.CurrencyKind
	23, // 7: com.cw.chess.platform.RummyLevelDesc.game_level:type_name -> com.cw.chess.platform.GameLevelDesc
	23, // 8: com.cw.chess.platform.TeepattiLevelDesc.game_level:type_name -> com.cw.chess.platform.GameLevelDesc
	23, // 9: com.cw.chess.platform.ABLevelDesc.game_level:type_name -> com.cw.chess.platform.GameLevelDesc
	23, // 10: com.cw.chess.platform.SevenUpdownLevelDesc.game_level:type_name -> com.cw.chess.platform.GameLevelDesc
	23, // 11: com.cw.chess.platform.RapidTeenpattiLevelDesc.game_level:type_name -> com.cw.chess.platform.GameLevelDesc
	23, // 12: com.cw.chess.platform.DragonTigerLevelDesc.game_level:type_name -> com.cw.chess.platform.GameLevelDesc
	23, // 13: com.cw.chess.platform.BlackredLevelDesc.game_level:type_name -> com.cw.chess.platform.GameLevelDesc
	23, // 14: com.cw.chess.platform.HorseracingDesc.game_level:type_name -> com.cw.chess.platform.GameLevelDesc
	23, // 15: com.cw.chess.platform.JMLevelDesc.game_level:type_name -> com.cw.chess.platform.GameLevelDesc
	23, // 16: com.cw.chess.platform.BaccaratLevelDesc.game_level:type_name -> com.cw.chess.platform.GameLevelDesc
	6,  // 17: com.cw.chess.platform.GameKindRequest.game_kind:type_name -> com.cw.chess.platform.GameKind
	6,  // 18: com.cw.chess.platform.GameKindResponse.game_kind:type_name -> com.cw.chess.platform.GameKind
	24, // 19: com.cw.chess.platform.GameKindResponse.rummy_levels:type_name -> com.cw.chess.platform.RummyLevelDesc
	25, // 20: com.cw.chess.platform.GameKindResponse.teepatti_levels:type_name -> com.cw.chess.platform.TeepattiLevelDesc
	26, // 21: com.cw.chess.platform.GameKindResponse.ab_levels:type_name -> com.cw.chess.platform.ABLevelDesc
	27, // 22: com.cw.chess.platform.GameKindResponse.sevenupdown_levels:type_name -> com.cw.chess.platform.SevenUpdownLevelDesc
	28, // 23: com.cw.chess.platform.GameKindResponse.rapidteenpatti_levels:type_name -> com.cw.chess.platform.RapidTeenpattiLevelDesc
	29, // 24: com.cw.chess.platform.GameKindResponse.dragontiger_levels:type_name -> com.cw.chess.platform.DragonTigerLevelDesc
	30, // 25: com.cw.chess.platform.GameKindResponse.blackred_levels:type_name -> com.cw.chess.platform.BlackredLevelDesc
	31, // 26: com.cw.chess.platform.GameKindResponse.horseracing_levels:type_name -> com.cw.chess.platform.HorseracingDesc
	32, // 27: com.cw.chess.platform.GameKindResponse.jm_levels:type_name -> com.cw.chess.platform.JMLevelDesc
	33, // 28: com.cw.chess.platform.GameKindResponse.baccarat_levels:type_name -> com.cw.chess.platform.BaccaratLevelDesc
	6,  // 29: com.cw.chess.platform.MatchRequest.game_kind:type_name -> com.cw.chess.platform.GameKind
	6,  // 30: com.cw.chess.platform.MatchOKResponse.game_kind:type_name -> com.cw.chess.platform.GameKind
	6,  // 31: com.cw.chess.platform.EnterGameRequest.game_kind:type_name -> com.cw.chess.platform.GameKind
	32, // [32:32] is the sub-list for method output_type
	32, // [32:32] is the sub-list for method input_type
	32, // [32:32] is the sub-list for extension type_name
	32, // [32:32] is the sub-list for extension extendee
	0,  // [0:32] is the sub-list for field type_name
}

func init() { file_platform_proto_init() }
func file_platform_proto_init() {
	if File_platform_proto != nil {
		return
	}
	if !protoimpl.UnsafeEnabled {
		file_platform_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*GameUser); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_platform_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*CommonResponse); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_platform_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*LoginRequest); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_platform_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*LoginResponse); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_platform_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*GetPlayerBalanceResponse); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_platform_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*MessageToUserResp); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_platform_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*UserAttri); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_platform_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*MSG_GET_USER_ATTRI_REQ); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_platform_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*MSG_GET_USER_ATTRI_RESP); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_platform_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*MSG_UPDATE_USER_ATTRI_REQ); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_platform_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*MSG_GET_BONUS_RESP); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_platform_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*BS_RECHARGE); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_platform_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*BS_GAME); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_platform_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*MSG_BS_DATA); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_platform_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*MSG_MSG_QUE_DATA); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_platform_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*MSG_MSG_QUE); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_platform_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*GameLevelDesc); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_platform_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*RummyLevelDesc); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_platform_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*TeepattiLevelDesc); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_platform_proto_msgTypes[19].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*ABLevelDesc); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_platform_proto_msgTypes[20].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*SevenUpdownLevelDesc); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_platform_proto_msgTypes[21].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*RapidTeenpattiLevelDesc); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_platform_proto_msgTypes[22].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*DragonTigerLevelDesc); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_platform_proto_msgTypes[23].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*BlackredLevelDesc); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_platform_proto_msgTypes[24].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*HorseracingDesc); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_platform_proto_msgTypes[25].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*JMLevelDesc); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_platform_proto_msgTypes[26].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*BaccaratLevelDesc); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_platform_proto_msgTypes[27].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*GameKindRequest); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_platform_proto_msgTypes[28].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*GameKindResponse); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_platform_proto_msgTypes[29].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*MatchRequest); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_platform_proto_msgTypes[30].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*MatchResponse); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_platform_proto_msgTypes[31].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*MatchOKResponse); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_platform_proto_msgTypes[32].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*EnterGameRequest); 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_platform_proto_rawDesc,
			NumEnums:      7,
			NumMessages:   33,
			NumExtensions: 0,
			NumServices:   0,
		},
		GoTypes:           file_platform_proto_goTypes,
		DependencyIndexes: file_platform_proto_depIdxs,
		EnumInfos:         file_platform_proto_enumTypes,
		MessageInfos:      file_platform_proto_msgTypes,
	}.Build()
	File_platform_proto = out.File
	file_platform_proto_rawDesc = nil
	file_platform_proto_goTypes = nil
	file_platform_proto_depIdxs = nil
}

impl:

package impl
 
import (
		"github.com/gorilla/websocket"
		"sync"
		"errors"
		"fmt"
		)
 
type Connection struct{
	wsConnect *websocket.Conn
	inChan chan []byte
	outChan chan []byte
	closeChan chan byte
 
	mutex sync.Mutex  // 对closeChan关闭上锁
	isClosed bool  // 防止closeChan被关闭多次
}
 
func InitConnection(wsConn *websocket.Conn)(conn *Connection ,err error){
	conn = &Connection{
		wsConnect:wsConn,
		inChan: make(chan []byte,1000),
		outChan: make(chan []byte,1000),
		closeChan: make(chan byte,1),
 
	}
	// 启动读协程
	go conn.readLoop();
	// 启动写协程
	go conn.writeLoop();
	return
}
 
func (conn *Connection)ReadMessage()(data []byte , err error){
	
	select{
	case data = <- conn.inChan:
	case <- conn.closeChan:
		err = errors.New("connection is closeed")
	}
	return 
}
 
func (conn *Connection)WriteMessage(data []byte)(err error){
	
	select{
	case conn.outChan <- data:
	case <- conn.closeChan:
		err = errors.New("connection is closeed")
	}
	return 
}
 
func (conn *Connection)Close(){
	// 线程安全,可多次调用
	conn.wsConnect.Close()
	// 利用标记,让closeChan只关闭一次
	conn.mutex.Lock()
	if !conn.isClosed {
		close(conn.closeChan)
		conn.isClosed = true 
	}
	conn.mutex.Unlock()
}
 
// 内部实现
func (conn *Connection)readLoop(){
	var(
		data []byte
		err error
		)
	for{
		_, data , err = conn.wsConnect.ReadMessage(); 
		if err != nil{
			goto ERR
		}
		fmt.Println("读取的数据:",data)
//阻塞在这里,等待inChan有空闲位置
		select{
			case conn.inChan <- data:
			case <- conn.closeChan:		// closeChan 感知 conn断开
				goto ERR
		}
		
	}
 
	ERR:
		conn.Close()
}
 
func (conn *Connection)writeLoop(){
	var(
		data []byte
		err error
		)
 
	for{
		select{
			case data= <- conn.outChan:
			case <- conn.closeChan:
				goto ERR
		}
		//发二进制数据
		if err = conn.wsConnect.WriteMessage(websocket.BinaryMessage , data); err != nil{
			goto ERR
		}
	}
 
	ERR:
		conn.Close()
 
}

proto:

syntax = "proto3";

option go_package = "./com/cw/chess/platform";

package com.cw.chess.platform;

// 用户数据
message GameUser{
	uint32 uid = 1;			// 用户id
	uint32 real_user = 2;	// 0:真实用户;1:机器人
	uint32 coin	= 3;		// 用户的金币:此值不一定会填写,根据游戏类型决定
	string user_nick = 4;	// 用户的昵称
	string user_head = 5;	// 用户的头像
}

// 通用消息
message CommonResponse{
	uint32 result = 1;				// 0:成功
}

/*静态服务定义:这里定义的静态服务,如果是具体游戏,则是动态值*/
enum ServerType
{
	SERVER_TPYE_INVALID						= 0;		// 无效 
	SERVER_TYPE_GATEWAY						= 1000;		// 网关服务
	SERVER_TYPE_COMMON						= 1100;		// 通用服务
	SERVER_TYPE_MATCH						= 1101;		// 匹配服务
	SERVER_TYPE_FT							= 1102;		// Fantasy Time
	SERVER_TYPE_BA							= 2002;		// 扣费服务(不直接对外)
	SERVER_TYPE_RUMMY_						= 3000;		// rummy游戏服务(注:不要直接使用,实际会是3000/3001/3002等等,会在匹配逻辑完成后通知客户端,这里只是标注起始)
	SERVER_TYPE_TEEPATTI_					= 4000;		// teepatti游戏服务(注:同上)
	SERVER_TYPE_AB_							= 5000;		// AB游戏(注:同上)
	SERVER_TYPE_7UD_						= 6000;		// 7UD(注:同上)
	SERVER_TYPE_RAPIDTP_					= 7000;		// rapid teenaptti(注:同上)
	SERVER_TYPE_DRAGONTIGER_				= 8000;		// 龙虎(注:同上)
	SERVER_TYPE_BLACKRED_					= 9000;		// 黑红梅方
	SERVER_TYPE_HORSERACING_				= 10000;	// 赛马
	SERVER_TYPE_JM_							= 11000;	// Jhandi Munda
	SERVER_TYPE_BACCARAT_					= 12000;	// baccarat
}

/***************************************网关消息开始*******************************************/
enum ServerGatewayCmd{
	CMD_GATEWAY_INVALID					= 0;			// 无效网关消息 
	CMD_GATEWAY_LOGIN_REQ				= 1;			// 登录请求:LoginRequest
	CMD_GATEWAY_LOGIN_RESP				= 2;			// 登录返回:LoginResponse
	CMD_GATEWAY_LOGOUT_REQ				= 3;			// 请求注销
	CMD_GATEWAY_LOGOUT_RESP				= 4;			// 返回注销
	CMD_GATEWAY_DISCONNECT_REQ 			= 5;			// 请求断开
	CMD_GATEWAY_DISCONNECT_RESP 		= 6;			// 返回断开 
	CMD_GATEWAY_REPEAT_LOGIN_REQ		= 7;			// 请求重复登录
	CMD_GATEWAY_REPEAT_LOGIN_RESP		= 8;			// 返回重复登录 
	CMD_GATEWAY_PING_REQ				= 9;			// 请求心跳 
	CMD_GATEWAY_PING_RESP				= 10;			// 返回心跳 
}

// 登录请求 :这个登录请求的command可能有多个,但是返回取都是一样的
message LoginRequest{
  uint32 user_id = 1;		// UID
  string token = 2;			// Token
}

// 登录返回 
message LoginResponse{
  uint32 result = 1;		// 0 成功;1 userId错误(用户不存在)
  uint32 user_id = 2;		// UID:这个地方必定和请求中的uid一致,但是为了方便客户端异步处理,把UID返回了
}
/****************************************网关消息结束************************************************/


/****************************************通用平台类消息开始**********************************************/
enum ServerCommonCmd{
	CMD_COMMON_INVALID					= 0;			// 无效
	CMD_NA_1							= 1;			// NA
	CMD_FREEZE_PLAYER_RESP				= 2;			// 账户被冻结
	CMD_GET_PLAYER_BALANCE_REQ			= 3;			// 请求金钱:NULL
	CMD_GET_PLAYER_BALANCE_RESP			= 4;			// 返回金钱:GetPlayerBalanceResponse
	CMD_NA_5							= 5;			// NA
	CMD_SYSMESSAGE_TO_USER_RESP			= 6;			// 系统消息:MessageToUserResp
	CMD_NA_7							= 7;
	CMD_PHP_2_USER_COMMON_RESP			= 8;			// 这个是转发PHP到客户端的协议:对应的结构PHP_2_USER_DATA_REQ是在web_msg_define.proto中定义的,消息中是嵌套结构,嵌套的协议定义由客户端和PHP自行商定
	CMD_GET_USER_ATTRI_REQ				= 9;			// 获取用户属性 MSG_GET_USER_ATTRI_REQ
	CMD_GET_USER_ATTRI_RESP				= 10;			// 获取用户属性 MSG_GET_USER_ATTRI_RESP
	CMD_UPDATE_USER_ATTRI_REQ			= 11;			// 更新用户属性 MSG_UPDATE_USER_ATTRI_REQ
	CMD_UPDATE_USER_ATTRI_RESP			= 12;			// 更新用户属性 CommonResponse
	CMD_GET_BONUS_REQ					= 13;			// NULL
	CMD_GET_BONUS_RESP					= 14;			// MSG_GET_BONUS_RESP
	CMD_BS_REQ							= 15;           // 跑马灯
	CMD_BS_RESP							= 16;			// MSG_MSG_QUE
}

enum CurrencyKind{
	CK_INVALID = 0;
	CK_Money = 1;		// 真金
	CK_Practice = 2;	// 训练
}

// 获取用户余额返回 
message GetPlayerBalanceResponse{
  uint32 result = 1;				// 是否取到了值, 0 表示取到了值, 1 表示没有取到  
  uint32 balance = 2;				// 存储账户余额 
  uint32 balance_wins = 3;			// 可提现账户余额
  uint32 partices = 4;				// 练习币余额
  CurrencyKind game_currency = 5;	// (建议使用:因为不管怎么样,这个结构会返回所有的数据,但到底显示是真金还是训练币,由其他逻辑保证)
}

// 系统消息
message MessageToUserResp{
	uint32 lastTime = 1;	// 持续时间,单位:秒,最大值2小时=2*60*60
	string context = 2;		// 内容:消息内容
}

message UserAttri{
	uint32 user_id = 1;
	string nick = 2;
	string head = 3;
}

message MSG_GET_USER_ATTRI_REQ{
	repeated uint32 user_ids = 1;	// 最多50个
}

message MSG_GET_USER_ATTRI_RESP{
	repeated UserAttri user_attris = 1;
}

message MSG_UPDATE_USER_ATTRI_REQ{
	UserAttri user_attri = 1;	// 更新的属性,注意:只能更新自己的,UserAttri中的user_id可以不填
}

message MSG_GET_BONUS_RESP{
	uint32 bonus = 1;
}

// 任意用户充值达到 Rs.1000(配置项)将进行广播
message BS_RECHARGE{
	uint32 recharge = 1;		// 1:充值;2:提现
	uint32 currency_value = 2;	// 金额
}
// Wow! Player ***1234 just won Rs.xxx in Rummy/Teen Patti/Andar Bahar.
message BS_GAME{
	uint32 game_type = 1;		// 1:rummy;4:teenpatti;5:Andar Bahar
	uint32 currency_value = 2;	// 金额
	uint32 parameter_1 = 3;
	uint32 parameter_2 = 4;
	uint32 parameter_3 = 5;
}
message MSG_BS_DATA{
	uint32 user_id = 1;
	uint32 user_nick = 2;
	uint32 bs_type = 3;
	BS_RECHARGE msg_recharge = 4;
	BS_GAME msg_game = 5;
	uint32 time_stamp = 6;		// 时间戳(客户端不需要使用该值)
}

message MSG_MSG_QUE_DATA{
	//Wow! Player ***1234 just won <color=#00ff00>Rs.xxx</c> in <color=#0fffff>Rummy</color>
	//Play <color=#00ff00>***1234</c> add cash <color=#00ff00>Rs.xxx</c>
	string msg_content = 1;
}

message MSG_MSG_QUE{
	repeated MSG_MSG_QUE_DATA data_list = 1;
}


/*以下部分为内网使用,通用服务器内网处理,目前主要是处理跑马灯的功能,其中服务号必须为SERVER_TYPE_COMMON,以免和web服务分开*/
enum Common_S_Cmd{
	CMD_S_INVALID				= 0;
	CMD_S_PING					= 1;
	CMD_S_PONG					= 2;
	CMD_S_RUMMY_BS_REQ			= 3;	// MSG_BS_DATA
	CMD_S_RUMMY_BS_RESP			= 4;	// CommonResponse
	CMD_S_TEENPATTI_BS_REQ		= 5;	// MSG_BS_DATA
	CMD_S_TEENPATTI_BS_RESP		= 6;	// CommonResponse
	CMD_S_AB_BS_REQ				= 7;	// MSG_BS_DATA
	CMD_S_AB_BS_RESP			= 8;	// CommonResponse
	CMD_S_FT_BS_REQ				= 9;	// MSG_BS_DATA
	CMD_S_FT_BS_RESP			= 10;	// CommonResponse
	CMD_S_SEVENUPDOWN_BS_REQ	= 11;	// 
	CMD_S_SEVENUPDOWN_BS_RESP	= 12;	// 
	CMD_S_DRAGONTIGER_BS_REQ	= 13;	// 
	CMD_S_DRAGONTIGER_BS_RESP	= 14;
	CMD_S_RAPIDTP_BS_REQ		= 15;	// 
	CMD_S_RAPIDTP_BS_RESP		= 16;
	CMD_S_BLACKRED_BS_REQ		= 17;
	CMD_S_BLACKRED_BS_RESP		= 18;
	CMD_S_HORSERACING_BS_REQ	= 19;
	CMD_S_HORSERACING_BS_RESP	= 20;
	CMD_S_JM_BS_REQ 			= 21;
	CMD_S_JM_BS_RESP			= 22;
	CMD_S_BACCARAT_REQ 			= 23;
	CMD_S_BACCARAT_RESP			= 24;
}
/****************************************通用平台类消息结束**********************************************/





/*************************************匹配服务类消息开始**********************************************/
// 客户端请求定义
enum ServerMatchCmd{
	CMD_MATCH_INVALID					= 0;			// 无效
	CMD_GET_GAME_KIND_REQ				= 1;			// 请求游戏种类:GameKindRequest
	CMD_GET_GAME_KIND_RESP				= 2;			// 返回游戏种类:GameKindResponse
	CMD_GET_ROOMS_REQ					= 3;			// 获取所有游戏类型:由于我们是匹配机制,这个暂时不实现
	CMD_GET_ROOMS_RESP					= 4;			// 
	CMD_MATCH_REQ						= 5;			// 请求rummy\teenpatti匹配:MatchRequest
	CMD_MATCH_RESP						= 6;			// 返回rummy\teenpatti匹配:MatchResponse(这里只是告诉客户端收到了匹配申请)
	CMD_MATCH_NA_7						= 7;
	CMD_MATCH_OK_RESP					= 8;			// 通知客户端匹配成功:MatchOKResponse
	CMD_ENTER_GAME_REQ					= 9;			// 请求非匹配类游戏直接进入:目前支持AB/7UD:EnterGameRequest
	CMD_ENTER_GAME_RESP					= 10;			// 请求非匹配类游戏直接进入:MatchOKResponse
}


/* 游戏支持的种类 */
enum GameKind{
	INVALID = 0;
	GAME_KIND_Rummy = 1;			// rummy
	GAME_KIND_Rummy_pool = 2;		// rummy_pool
	GAME_KIND_Rummy_10 = 3;			// rummy_10
	GAME_KIND_TEEPATTI = 4;			// teepatti
	GAME_KIND_AB = 5;				// Andar Bahar
	GAME_KIND_SevenUD = 6;			// seven up down
	GAME_KIND_RapidTeenaptti = 7;	// rapid teenpatti
	GAME_KIND_DragonTiger = 8;		// DragonTiger
	GAME_KIND_BlackRed = 9;			// Black Red
	GAME_KIND_HorseRacing = 10;		// 赛马
	GAME_KIND_JM = 11;				// Jhandi Munda
	GAME_KIND_BACCARAT = 12;		// baccarat
	GAME_KIND_FT = 20;				// fantasy time
}

// 游戏级别的基础定义
message GameLevelDesc{
	uint32 level_id = 1;			// 级别ID
	CurrencyKind currency_kind = 2;	// 真金还是训练(这个逻辑客户端要判定) 
	uint32 currency_limit = 3;		// 进入限制(这个逻辑客户端不需要判定,只显示,服务器会下发,免得以后要修改逻辑)
	string level_name = 4;			// 级别名字,例如(中级房)
	uint32 user_count = 5;			// 这个级别有多少个用户在玩
	uint32 tax_permillage = 6;		// 抽水比率(千分比)
	uint32 game_id = 7;
}

// rummy每一个级别的数据描叙
message RummyLevelDesc
{
	GameLevelDesc game_level = 1;	// 游戏通用描叙
	uint32 rummy_players_size = 2;	// 一个桌子支持几个玩家,可能是2/6
	uint32 score_value = 3;			// rummy一张牌的分数,后续计算全部根据这个值来
	uint32 times_fee_ratio = 4;		// rummy的台费系数
	uint32 fantasytime = 5;			// 是否支持ft,0:不支持,1:支持
}

// teepatti每一个级别的数据描叙
message TeepattiLevelDesc
{
	GameLevelDesc game_level = 1;	// 游戏通用描叙
	uint32 blind = 2;				// teepatti是按照盲注的倍数来计算分数
	uint32 single_max_bet = 3;		// 单个用户最大封顶值
	uint32 table_max_bet = 4;		// 桌子最大封顶值
	uint32 times_fee_ratio = 5;		// teenpatti的台费系数
	uint32 fantasytime = 6;			// 是否支持ft,0:不支持,1:支持
}

// AB每一个级别的数据描叙
message ABLevelDesc
{
	GameLevelDesc game_level = 1;	// 游戏通用描叙
	uint32 bet_min = 2;				// 最小下注
	uint32 bet_max = 3;				// 最大下注
	uint32 AB_players_size = 4;		// 一个桌子支持几个玩家,通常是400
	uint32 chip_templete = 5;
}

// 7updown每一个级别的数据描叙
message SevenUpdownLevelDesc
{
	GameLevelDesc game_level = 1;	// 游戏通用描叙
	uint32 bet_min = 2;				// 最小下注
	uint32 bet_max = 3;				// 最大下注
	uint32 SD_players_size = 4;		// 一个桌子支持几个玩家,通常是400
	uint32 chip_templete = 5;
	uint32 bet_min1 = 6;
	uint32 bet_max1 = 7;
	uint32 bet_min2 = 8;
	uint32 bet_max2 = 9;
	uint32 bet_min0 = 10;
	uint32 bet_max0 = 11;
}

// rapid teenpatti每一个级别的数据描叙
message RapidTeenpattiLevelDesc
{
	GameLevelDesc game_level = 1;	// 游戏通用描叙
	uint32 blind = 2;				// 盲注
}

// DragonTiger每一个级别的数据描叙
message DragonTigerLevelDesc
{
	GameLevelDesc game_level = 1;	// 游戏通用描叙
	uint32 bet_min = 2;	
	uint32 bet_max = 3;	
	uint32 SD_players_size = 4;
	uint32 chip_templete = 5;
	uint32 bet_min1 = 6;
	uint32 bet_max1 = 7;
	uint32 bet_min2 = 8;
	uint32 bet_max2 = 9;
	uint32 bet_min0 = 10;
	uint32 bet_max0 = 11;
}

// 红黑每一个级别的数据描叙
message BlackredLevelDesc
{
	GameLevelDesc game_level = 1;	// 游戏通用描叙
	uint32 bet_min = 2;	
	uint32 bet_max = 3;	
	uint32 SD_players_size = 4;
	uint32 chip_templete = 5;
}

// 赛马每一个级别的数据描叙
message HorseracingDesc
{
	GameLevelDesc game_level = 1;	// 游戏通用描叙
	uint32 SD_players_size = 2;
	uint32 chip_templete = 3;
	uint32 o_expected_value = 4;	// 胜利期望,百分制,例如85,代表85%
	uint32 bet_min = 5;
	uint32 bet_max = 6;
}

// Jhandi Munda每一个级别的数据描叙
message JMLevelDesc
{
	GameLevelDesc game_level = 1;	// 游戏通用描叙
	uint32 bet_min = 2;	
	uint32 bet_max = 3;	
	uint32 SD_players_size = 4;
	uint32 chip_templete = 5;
}

// Baccarat每一个级别的数据描叙
message BaccaratLevelDesc
{
	GameLevelDesc game_level = 1;	// 游戏通用描叙
	uint32 bet_min = 2;	
	uint32 bet_max = 3;	
	uint32 SD_players_size = 4;
}

// 获取游戏level信息
message GameKindRequest{
	GameKind game_kind = 1;				// 请求获取的游戏对应的数据,如果填写INVALID,会返回所有支持的游戏
}
message GameKindResponse{		
	repeated GameKind game_kind = 1;							// 游戏类型的通用描叙
	repeated RummyLevelDesc rummy_levels = 2;					// rummy的级别描叙
	repeated TeepattiLevelDesc teepatti_levels = 3;				// teepatii的级别描叙
	repeated ABLevelDesc ab_levels = 4;							// AB的级别描叙
	repeated SevenUpdownLevelDesc sevenupdown_levels = 5;		// SevenUpDown
	repeated RapidTeenpattiLevelDesc rapidteenpatti_levels = 6;	// rapid teenpatti的级别描叙
	repeated DragonTigerLevelDesc dragontiger_levels = 7;		// 龙虎级别描叙
	repeated BlackredLevelDesc blackred_levels = 8;				// 红黑的级别描叙
	repeated HorseracingDesc horseracing_levels = 9;			// 赛马的级别描叙
	repeated JMLevelDesc jm_levels = 10;						// Jhandi Munda的级别描述 
	repeated BaccaratLevelDesc baccarat_levels = 11;			// baccarat级别描叙
}



// 进行匹配
message MatchRequest{
	uint32 action = 1;			// 0:请求匹配;1:取消匹配
	/*
	如果是取消,则后续参数也需要填写,以防止未来可以同时匹配多个游戏而只取消其中某一个;
	只有确实取消了,消息才会返回1,防止已经匹配好了,但是再发取消匹配的情况
	如果取消失败,会返回102,客户端可以解除匹配状态
	*/
	GameKind game_kind = 2;
	uint32 game_level = 3;
}

// 匹配通知
message MatchResponse{
	uint32 result = 1;			// 0:成功申请匹配;1:成功取消匹配;100:余额不够;101:目前已经在匹配队列中,不能重复匹配;102:不在匹配队列中,无法取消
	uint32 max_time = 2;		// 最大匹配时间:单位秒
	uint32 average_time = 3;	// 平均匹配时间:单位秒
}

// 匹配成功通知
message MatchOKResponse{
	uint32 result = 1;				// 0:成功:100:用户余额不够;101:申请的游戏已经过期;102:账户被限制,不能匹配;103:服务器正在维护中:105:人数太多
	uint32 game_type = 2;			// 这个值就是动态servertype,后续我们就正式开始游戏了
	uint32 table_id = 3;			// 分配在哪个桌子上
	GameKind game_kind = 4;			// 以下字段和请求一致,方便客户端处理
	uint32 game_level = 5;			// 游戏级别ID
}

// 请求直接进入游戏
message EnterGameRequest{
	GameKind game_kind = 1;
	uint32 game_level = 2;
}

/*************************************匹配服务类消息结束**********************************************/

  网络协议 最新文章
使用Easyswoole 搭建简单的Websoket服务
常见的数据通信方式有哪些?
Openssl 1024bit RSA算法---公私钥获取和处
HTTPS协议的密钥交换流程
《小白WEB安全入门》03. 漏洞篇
HttpRunner4.x 安装与使用
2021-07-04
手写RPC学习笔记
K8S高可用版本部署
mySQL计算IP地址范围
上一篇文章      下一篇文章      查看所有文章
加:2021-08-28 09:42:41  更:2021-08-28 09:43:32 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/25 21:33:26-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码