2 Commits 1bf3a1693c ... 2184ba38ca

Autor SHA1 Mensagem Data
  Changpeng Duan 2184ba38ca grpc fun 4 anos atrás
  Changpeng Duan 7604058a10 grpc fun 4 anos atrás

+ 1 - 0
package.json

@@ -10,6 +10,7 @@
     "core-js": "^3.6.5",
     "echarts": "^4.8.0",
     "element-ui": "^2.13.2",
+    "grpc-web": "^1.2.1",
     "mockjs": "^1.1.0",
     "moment": "^2.27.0",
     "nprogress": "^0.2.0",

+ 10 - 0
src/Mock/index.js

@@ -255,6 +255,16 @@ let getNavListQuery = function () {
                         clmcode: "record",
                         clmname: "在线上课",
                         clmurl: "/record",
+                    }, {
+                        clmid: "/videoClass",
+                        clmcode: "videoClass",
+                        clmname: "视频上课",
+                        clmurl: "/videoClass",
+                    }, {
+                        clmid: "/grpcDemo",
+                        clmcode: "grpcDemo",
+                        clmname: "grpcDemo",
+                        clmurl: "/grpcDemo",
                     }
                 ]
             }, {

+ 69 - 15
src/components/Headside.vue

@@ -24,14 +24,13 @@
         >
       </ul>
       <div class="tabs">
-        <el-tabs v-model="editableTabsValue" type="card" editable @edit="handleTabsEdit">
+        <el-tabs v-model="editableTabsValue" type="card" editable @edit="handleTabsEdit" @tab-remove="remove">
           <el-tab-pane
               :key="item.name"
               v-for="(item, index) in editableTabs"
               :label="item.title"
               :name="item.name"
           >
-            {{ item.content }}
           </el-tab-pane>
         </el-tabs>
       </div>
@@ -61,23 +60,38 @@ export default {
       userLevelText: "",
       current: globalcurrentWeek(),
       // tabs
-      editableTabsValue: '2',
-      editableTabs: [{
-        title: 'Tab 1',
-        name: '1',
-        content: 'Tab 1 content'
-      }, {
-        title: 'Tab 2',
-        name: '2',
-        content: 'Tab 2 content'
-      }],
+      editableTabsValue: '',
+      editableTabs: [],
       tabIndex: 2
     };
   },
+  props: ['tableTabs'],
+  watch: {
+    tableTabs: {
+      handler(newName, oldName) {
+        let that = this;
+        console.log('newName', newName);
+        that.editableTabs = newName;
+      },
+      deep: true,
+      immediate: true
+    }
+  },
   mounted() {
     this.getManagerSelfQuery();
   },
   methods: {
+    remove(p) {
+      let that = this;
+      if (p == 1) {
+        let firstPage = {
+          name: '1',
+          title: '系统首页',
+        };
+        that.editableTabs.push(firstPage);
+        that.$message.error('最后一页咯');
+      }
+    },
     //            隐藏左侧和显示
     left_hide: function () {
       let that = this;
@@ -242,7 +256,7 @@ export default {
         this.editableTabsValue = activeName;
         this.editableTabs = tabs.filter(tab => tab.name !== targetName);
       }
-    }
+    },
   },
   components: {},
 };
@@ -286,7 +300,6 @@ li {
     top: 1px;
     z-index: 5;
   }
-
 }
 
 
@@ -328,7 +341,7 @@ li {
 .left_show_icon {
   width: 20px;
   height: 20px;
-  margin-top: 8px;
+  margin-top: 25px;
   float: left;
   margin-left: 15px;
   cursor: pointer;
@@ -399,6 +412,47 @@ li {
   background-color: #E38F00;
   cursor: pointer;
 }
+
+.tabs {
+  width: 90%;
+  height: 35px;
+  margin: 0 auto;
+  display: block;
+  margin-top: 40px;
+  cursor: pointer;
+  color: white;
+}
+
+/deep/ .el-tabs__new-tab {
+  display: none;
+}
+
+/deep/ .el-tabs__nav-wrap {
+  left: 0;
+  float: left;
+}
+
+/deep/ .el-tabs__item {
+  height: 34px;
+  color: white;
+  line-height: 34px;
+}
+
+/deep/ .el-tabs--card > .el-tabs__header {
+  width: 100%;
+  overflow: hidden;
+  display: block;
+  border-color: #0063c9;
+  margin: 0;
+  padding: 0;
+
+  .el-tabs__nav {
+    border-color: #0063c9;
+    background-color: #3699FF;
+    border-radius: 0;
+  }
+}
+
 @media (min-width: 960px) and (max-width: 1367px) {
   #headside {
     height: 40px;

+ 63 - 14
src/components/Navside.vue

@@ -1,8 +1,10 @@
 <template>
-  <div class="navSide">
-    <img class="logo" src="../assets/img/nav/logo.png"/>
+  <div :class="NavsideClass">
+    <div class="logoContainer">
+      <img class="logo" src="../assets/img/nav/logo.png"/>
+    </div>
     <el-menu default-active="1" class="el-menu-vertical-demo" @open="handleOpen" @close="handleClose" router
-             :collapse="isCollapse">
+             :collapse="isCollapse" @select="selectMenu">
       <el-submenu :index="nav.clmid" v-for="nav in navs">
         <template slot="title">
           <i :class="nav.icon"></i>
@@ -25,23 +27,48 @@ export default {
   data() {
     return {
       navs: [],
-      NavsideClass: 'Navside',
+      NavsideClass: 'NavsideShort',
     };
   },
   props: ['isCollapse'],
+  watch: {
+    isCollapse: {
+      handler(newName, oldName) {
+        let that = this;
+        if (newName) {
+          that.NavsideClass = 'NavsideShort'
+        } else {
+          that.NavsideClass = 'navSide'
+        }
+      },
+      deep: true,
+      immediate: true
+    }
+  },
   mounted() {
     this.userLevelDeafult = this.$route.meta.clmid;
-
-    if (document.body.clientWidth < 1024) {
-      this.NavsideClass = 'NavsideShort'
-    } else {
-      this.NavsideClass = 'Navside'
-    }
     this.getTableQuery();
   },
   methods: {
+    selectMenu(i, t, c) {
+      // todo 拿不到二级的结果
+      let thatNum = parseInt(t[0]);
+      let thisNum = parseInt(t[0]) - 1;
+      if (t[0] == 1) {
+        // 重复的默认就不要加了
+        return false
+      }
+      let res = {
+        title: c.$route.meta.title,
+        clmurl: c.$route.meta.path,
+        name: thatNum.toString()
+      }
+      console.log('res', res);
+      this.$emit('refreshList', res);
+    },
     handleOpen(key, keyPath) {
       console.log(key, keyPath);
+
     },
     handleClose(key, keyPath) {
       console.log(key, keyPath);
@@ -65,6 +92,20 @@ export default {
 </script>
 <style lang="scss" scoped>
 .navSide {
+  position: absolute;
+  top: 0;
+  left: 0;
+  width: 260px;
+  height: 100%;
+  background: white;
+  box-shadow: #2c2e2f;
+
+  /deep/ .el-menu-vertical-demo {
+    width: 100%;
+  }
+}
+
+.NavsideShort {
   position: absolute;
   top: 0;
   left: 0;
@@ -72,6 +113,16 @@ export default {
   height: 100%;
   background: white;
   box-shadow: #2c2e2f;
+
+  /deep/ .el-menu-vertical-demo {
+    width: 72px;
+  }
+}
+
+.logoContainer {
+  width: 100%;
+  height: 72px;
+  background-color: #3699FF;
 }
 
 .logo {
@@ -80,12 +131,10 @@ export default {
   box-shadow: #2c2e2f;
 }
 
-/deep/ .el-menu-vertical-demo {
-  width: 72px;
-}
 
 /deep/ .el-submenu__title:hover {
-  background-color: #0063c9;
+  background-color: #3699FF;
+  color: #fff;
 
   i {
     color: #fff;

+ 2 - 0
src/grpc/gen.bat

@@ -0,0 +1,2 @@
+protoc -I . im.proto --grpc-web_out=import_style=commonjs,mode=grpcwebtext:.
+protoc -I . im.proto --js_out=import_style=commonjs:.

+ 309 - 0
src/grpc/im.proto

@@ -0,0 +1,309 @@
+syntax = "proto3";
+
+option go_package = ".;im";
+
+package im;
+
+
+enum ErrorCode{
+  OK = 0;
+  PARAM = 4001;
+  Exist = 4002;
+  Token = 4003;
+}
+
+// metadata: 综合管理系统前端调用需要字段 token 用作登录验证;子系统调用需要字段 sys_token 用作系统验证
+service Api {
+  rpc SignUpUserCode (SignUpRequest) returns (SignUpReply) {}
+  rpc SignUpPhone (SignUpRequest) returns (SignUpReply) {}
+
+  rpc SignInUserCode (SignInPasswordRequest) returns (TokenParam)  {}
+  rpc SignInWithPhonePassword (SignInPasswordRequest) returns (TokenParam)  {}
+
+  // ---子系统专用---
+
+  // 检查token有效性
+  rpc SubSessionCheck (TokenParam) returns (SessionCheckReply)  {}
+  // 检查token所属用户是否拥有调用service权限
+  rpc SubPermissionCheck (PermissionCheck) returns (SessionCheckReply)  {}
+  // 登出传入token
+  rpc SubSignOut (TokenParam) returns (DefaultReply)  {}
+  // 批量保存service
+  rpc SubServiceSaveList (SaveServiceListRequest) returns (DefaultReply)  {}
+
+  // ---子系统专用---
+
+  // 用户列表
+  rpc UserList (UserListRequest) returns (UserListReply)  {}
+  // 单个用户信息详情
+  rpc UserGetInfo (UserGetInfoRequest) returns (UserInfo)  {}
+  // 用户添加多个角色
+  rpc UserAddRoles(UserRolesRequest) returns (DefaultReply)  {}
+  // 用户移除多个角色
+  rpc UserRemoveRoles(UserRolesRequest) returns (DefaultReply)  {}
+  // 用户获取栏目列表
+  rpc UserGetColumnList(UserGetColumnListRequest) returns (UserGetColumnListReply)  {}
+  // 创建角色
+  rpc RoleCreate(CreateRoleRequest) returns (DefaultReply)  {}
+  // 角色列表
+  rpc RoleList(RoleListRequest) returns (RoleListReply)  {}
+  // 角色编辑
+  rpc RoleEdit(Role) returns (DefaultReply)  {}
+  // 角色添加多个service权限
+  rpc RoleAddPermissions(RolePermissionRequest) returns (DefaultReply)  {}
+  // 角色移除多个service权限
+  rpc RoleRemovePermissions(RolePermissionRequest) returns (DefaultReply)  {}
+
+  // service权限列表
+  rpc ServiceList(ServiceListRequest) returns (ServiceListReply)  {}
+  // 移除service
+  rpc ServiceRemoveList(ServiceRemoveRequest) returns (DefaultReply)  {}
+
+  rpc ShopCreate (CreateShopRequest) returns (CreateReply)  {}
+  rpc ShopList (ShopListRequest) returns (ShopListReply)  {}
+  rpc SystemAddShop (SystemAddShopRequest) returns (DefaultReply)  {}
+  rpc SystemAddUser (SystemAddUserRequest) returns (DefaultReply)  {}
+  // ---总后台专用API---
+
+  rpc IMSystemCreate (CreateSystemRequest) returns (TokenParam)  {}
+  rpc IMSignOut (DefaultRequest) returns (DefaultReply)  {}
+  rpc IMSelfInfo (DefaultRequest) returns (UserInfo)  {}
+  rpc IMMessageRcv (DefaultRequest) returns (stream Message)  {}
+
+  // ---总后台专用API---
+}
+message DefaultRequest{
+}
+message TokenParam{
+  string token = 1;
+}
+
+message DefaultReply{}
+
+message SignUpReply{
+  int64 userId = 1;
+}
+
+message SignInPasswordRequest {
+  string auth = 1;
+  string password = 2;
+  int64 sysId = 3;
+  //session有效期,单位:秒
+  int64 expirationSec = 4;
+}
+
+enum Status{
+  Null = 0;
+  Ban = 1;
+  On = 2;
+  Delete = 9;
+}
+
+message SignUpRequest {
+  string userCode = 1 ;
+  string name = 2 ;
+  string email = 3 ;
+  string phone = 4 ;
+  string wxOpenId = 5;
+  string qq = 6;
+  string password = 7;
+  string question = 8;
+  string answer = 9;
+  string memo = 10;
+}
+
+message UserInfo {
+  int64  id = 1 ;
+  string userCode = 2 ;
+  string name = 3 ;
+  string email = 4 ;
+  string phone = 5 ;
+  string qq = 7;
+  string memo = 11;
+  Status status = 12;
+}
+
+message CreateReply{
+  int64 id = 1;
+}
+
+message PermissionCheck {
+  string token = 1;
+  // service全路径,区分大小写,如User/List
+  string servicePath = 2;
+}
+
+
+message SessionCheckReply {
+  int64 userId = 1;
+}
+
+message Service {
+  string path = 1;
+  string memo = 2;
+}
+
+message SaveServiceListRequest{
+  repeated Service list = 1;
+}
+
+message CreateSystemRequest{
+  string fullName = 1;
+  string shortname = 2;
+  string sysUrl = 3;
+  string memo = 4;
+}
+
+message UserGetColumnListRequest{
+  int64 userId = 1;
+  // 最顶层为0
+  int32 parentId = 2;
+  // 仅综合管理后台调用有效
+  int64 sysId = 3;
+}
+
+message Column{
+  string name = 1;
+  string url = 2;
+  string code = 3;
+  // 顺序
+  int32 sn = 4;
+  Status status = 5;
+  bool navShow = 6;
+  int64 id = 7;
+}
+
+message UserGetColumnListReply{
+  repeated Column list = 1;
+}
+
+message CreateRoleRequest{
+  string name = 1;
+  string memo = 2;
+}
+
+message Role {
+  int64  id = 1;
+  string name = 2;
+  string memo = 3;
+  Status status = 4;
+  string systemName = 5;
+}
+
+message RoleListRequest{
+  int64 userId = 1;
+  int64 sysId = 2;
+}
+
+message UserListRequest{
+  // 0为全部
+  int64 roleId = 1;
+  Status status = 2;
+  // 模糊查询
+  string name = 3;
+  int64 lcstypeid = 4;
+  // 仅总后台请求时有效
+  int64 sysId = 5;
+}
+
+message UserListReply{
+  repeated UserInfo list = 1;
+}
+
+message UserGetInfoRequest{
+  int64 userId = 1;
+}
+message UserRolesRequest{
+  int64 userId = 1;
+  repeated int64 roleIdList = 2;
+}
+
+message RoleListReply {
+  repeated Role list = 1;
+}
+
+message RolePermissionRequest{
+  int64 roleId = 1;
+  repeated string servicePath = 2;
+}
+
+message ServiceListRequest{
+  // 仅总系统有效
+  int64 sysId = 1;
+}
+
+message ServiceListReply{
+  repeated Service list = 1;
+}
+
+message ServiceRemoveRequest{
+  repeated string pathList = 1;
+}
+
+message CreateShopRequest{
+  string name = 1;
+  string key = 2;
+  //上级商家Id
+  int64  sId = 3;
+  string addr = 4;
+  string phone = 5;
+  string contacts = 6;
+  int64 createUser = 7;
+}
+
+message ShopListRequest{
+  // 子系统调用时,0:展示所有商家,大于0则展示本系统商家
+  int64 sysId = 1;
+  // 模糊查询
+  string name = 2;
+  // Status_Null查询全部
+  Status status = 3;
+  //上级商家Id, -1 时查询全部
+  int64 sId = 4;
+}
+
+message ShopInfo{
+  int64 shopId = 1;
+  string name = 2;
+  int64 sId = 3;
+  string addr = 4;
+  string phone = 5;
+  string contacts = 6;
+  Status status = 7;
+  int64 created_at = 8;
+  int64 created_user = 9;
+  int64 updated_at = 10;
+  int64 updated_user = 11;
+}
+
+message ShopListReply{
+  repeated ShopInfo list = 1;
+}
+
+message SystemAddShopRequest{
+  // 仅总后台调用有效
+  int64 sysId = 1;
+  int64 shopId = 2;
+}
+
+
+message SystemAddUserRequest{
+  // 仅总后台调用有效
+  int64 sysId = 1;
+  int64 userId = 2;
+}
+
+message Message{
+  int64 id = 1;
+  string title = 2;
+  string content = 3;
+  enum Level{
+    Null = 0;
+    Normal = 1;
+    Warn = 2;
+    Error = 3;
+  }
+
+  Level level = 4;
+  int64 createAt = 5;
+}

+ 2308 - 0
src/grpc/im_grpc_web_pb.js

@@ -0,0 +1,2308 @@
+/**
+ * @fileoverview gRPC-Web generated client stub for im
+ * @enhanceable
+ * @public
+ */
+
+// GENERATED CODE -- DO NOT EDIT!
+
+
+/* eslint-disable */
+// @ts-nocheck
+
+
+const grpc = {};
+grpc.web = require('grpc-web');
+
+const proto = {};
+proto.im = require('./im_pb.js');
+
+/**
+ * @param {string} hostname
+ * @param {?Object} credentials
+ * @param {?Object} options
+ * @constructor
+ * @struct
+ * @final
+ */
+proto.im.ApiClient =
+    function (hostname, credentials, options) {
+        if (!options) options = {};
+        options['format'] = 'text';
+
+        /**
+         * @private @const {!grpc.web.GrpcWebClientBase} The client
+         */
+        this.client_ = new grpc.web.GrpcWebClientBase(options);
+
+        /**
+         * @private @const {string} The hostname
+         */
+        this.hostname_ = hostname;
+
+    };
+
+
+/**
+ * @param {string} hostname
+ * @param {?Object} credentials
+ * @param {?Object} options
+ * @constructor
+ * @struct
+ * @final
+ */
+proto.im.ApiPromiseClient =
+    function (hostname, credentials, options) {
+        if (!options) options = {};
+        options['format'] = 'text';
+
+        /**
+         * @private @const {!grpc.web.GrpcWebClientBase} The client
+         */
+        this.client_ = new grpc.web.GrpcWebClientBase(options);
+
+        /**
+         * @private @const {string} The hostname
+         */
+        this.hostname_ = hostname;
+
+    };
+
+
+/**
+ * @const
+ * @type {!grpc.web.MethodDescriptor<
+ *   !proto.im.SignUpRequest,
+ *   !proto.im.SignUpReply>}
+ */
+const methodDescriptor_Api_SignUpUserCode = new grpc.web.MethodDescriptor(
+    '/im.Api/SignUpUserCode',
+    grpc.web.MethodType.UNARY,
+    proto.im.SignUpRequest,
+    proto.im.SignUpReply,
+    /**
+     * @param {!proto.im.SignUpRequest} request
+     * @return {!Uint8Array}
+     */
+    function (request) {
+        return request.serializeBinary();
+    },
+    proto.im.SignUpReply.deserializeBinary
+);
+
+
+/**
+ * @const
+ * @type {!grpc.web.AbstractClientBase.MethodInfo<
+ *   !proto.im.SignUpRequest,
+ *   !proto.im.SignUpReply>}
+ */
+const methodInfo_Api_SignUpUserCode = new grpc.web.AbstractClientBase.MethodInfo(
+    proto.im.SignUpReply,
+    /**
+     * @param {!proto.im.SignUpRequest} request
+     * @return {!Uint8Array}
+     */
+    function (request) {
+        return request.serializeBinary();
+    },
+    proto.im.SignUpReply.deserializeBinary
+);
+
+
+/**
+ * @param {!proto.im.SignUpRequest} request The
+ *     request proto
+ * @param {?Object<string, string>} metadata User defined
+ *     call metadata
+ * @param {function(?grpc.web.Error, ?proto.im.SignUpReply)}
+ *     callback The callback function(error, response)
+ * @return {!grpc.web.ClientReadableStream<!proto.im.SignUpReply>|undefined}
+ *     The XHR Node Readable Stream
+ */
+proto.im.ApiClient.prototype.signUpUserCode =
+    function (request, metadata, callback) {
+        return this.client_.rpcCall(this.hostname_ +
+            '/im.Api/SignUpUserCode',
+            request,
+            metadata || {},
+            methodDescriptor_Api_SignUpUserCode,
+            callback);
+    };
+
+
+/**
+ * @param {!proto.im.SignUpRequest} request The
+ *     request proto
+ * @param {?Object<string, string>} metadata User defined
+ *     call metadata
+ * @return {!Promise<!proto.im.SignUpReply>}
+ *     Promise that resolves to the response
+ */
+proto.im.ApiPromiseClient.prototype.signUpUserCode =
+    function (request, metadata) {
+        return this.client_.unaryCall(this.hostname_ +
+            '/im.Api/SignUpUserCode',
+            request,
+            metadata || {},
+            methodDescriptor_Api_SignUpUserCode);
+    };
+
+
+/**
+ * @const
+ * @type {!grpc.web.MethodDescriptor<
+ *   !proto.im.SignUpRequest,
+ *   !proto.im.SignUpReply>}
+ */
+const methodDescriptor_Api_SignUpPhone = new grpc.web.MethodDescriptor(
+    '/im.Api/SignUpPhone',
+    grpc.web.MethodType.UNARY,
+    proto.im.SignUpRequest,
+    proto.im.SignUpReply,
+    /**
+     * @param {!proto.im.SignUpRequest} request
+     * @return {!Uint8Array}
+     */
+    function (request) {
+        return request.serializeBinary();
+    },
+    proto.im.SignUpReply.deserializeBinary
+);
+
+
+/**
+ * @const
+ * @type {!grpc.web.AbstractClientBase.MethodInfo<
+ *   !proto.im.SignUpRequest,
+ *   !proto.im.SignUpReply>}
+ */
+const methodInfo_Api_SignUpPhone = new grpc.web.AbstractClientBase.MethodInfo(
+    proto.im.SignUpReply,
+    /**
+     * @param {!proto.im.SignUpRequest} request
+     * @return {!Uint8Array}
+     */
+    function (request) {
+        return request.serializeBinary();
+    },
+    proto.im.SignUpReply.deserializeBinary
+);
+
+
+/**
+ * @param {!proto.im.SignUpRequest} request The
+ *     request proto
+ * @param {?Object<string, string>} metadata User defined
+ *     call metadata
+ * @param {function(?grpc.web.Error, ?proto.im.SignUpReply)}
+ *     callback The callback function(error, response)
+ * @return {!grpc.web.ClientReadableStream<!proto.im.SignUpReply>|undefined}
+ *     The XHR Node Readable Stream
+ */
+proto.im.ApiClient.prototype.signUpPhone =
+    function (request, metadata, callback) {
+        return this.client_.rpcCall(this.hostname_ +
+            '/im.Api/SignUpPhone',
+            request,
+            metadata || {},
+            methodDescriptor_Api_SignUpPhone,
+            callback);
+    };
+
+
+/**
+ * @param {!proto.im.SignUpRequest} request The
+ *     request proto
+ * @param {?Object<string, string>} metadata User defined
+ *     call metadata
+ * @return {!Promise<!proto.im.SignUpReply>}
+ *     Promise that resolves to the response
+ */
+proto.im.ApiPromiseClient.prototype.signUpPhone =
+    function (request, metadata) {
+        return this.client_.unaryCall(this.hostname_ +
+            '/im.Api/SignUpPhone',
+            request,
+            metadata || {},
+            methodDescriptor_Api_SignUpPhone);
+    };
+
+
+/**
+ * @const
+ * @type {!grpc.web.MethodDescriptor<
+ *   !proto.im.SignInPasswordRequest,
+ *   !proto.im.TokenParam>}
+ */
+const methodDescriptor_Api_SignInUserCode = new grpc.web.MethodDescriptor(
+    '/im.Api/SignInUserCode',
+    grpc.web.MethodType.UNARY,
+    proto.im.SignInPasswordRequest,
+    proto.im.TokenParam,
+    /**
+     * @param {!proto.im.SignInPasswordRequest} request
+     * @return {!Uint8Array}
+     */
+    function (request) {
+        return request.serializeBinary();
+    },
+    proto.im.TokenParam.deserializeBinary
+);
+
+
+/**
+ * @const
+ * @type {!grpc.web.AbstractClientBase.MethodInfo<
+ *   !proto.im.SignInPasswordRequest,
+ *   !proto.im.TokenParam>}
+ */
+const methodInfo_Api_SignInUserCode = new grpc.web.AbstractClientBase.MethodInfo(
+    proto.im.TokenParam,
+    /**
+     * @param {!proto.im.SignInPasswordRequest} request
+     * @return {!Uint8Array}
+     */
+    function (request) {
+        return request.serializeBinary();
+    },
+    proto.im.TokenParam.deserializeBinary
+);
+
+
+/**
+ * @param {!proto.im.SignInPasswordRequest} request The
+ *     request proto
+ * @param {?Object<string, string>} metadata User defined
+ *     call metadata
+ * @param {function(?grpc.web.Error, ?proto.im.TokenParam)}
+ *     callback The callback function(error, response)
+ * @return {!grpc.web.ClientReadableStream<!proto.im.TokenParam>|undefined}
+ *     The XHR Node Readable Stream
+ */
+proto.im.ApiClient.prototype.signInUserCode =
+    function (request, metadata, callback) {
+        return this.client_.rpcCall(this.hostname_ +
+            '/im.Api/SignInUserCode',
+            request,
+            metadata || {},
+            methodDescriptor_Api_SignInUserCode,
+            callback);
+    };
+
+
+/**
+ * @param {!proto.im.SignInPasswordRequest} request The
+ *     request proto
+ * @param {?Object<string, string>} metadata User defined
+ *     call metadata
+ * @return {!Promise<!proto.im.TokenParam>}
+ *     Promise that resolves to the response
+ */
+proto.im.ApiPromiseClient.prototype.signInUserCode =
+    function (request, metadata) {
+        return this.client_.unaryCall(this.hostname_ +
+            '/im.Api/SignInUserCode',
+            request,
+            metadata || {},
+            methodDescriptor_Api_SignInUserCode);
+    };
+
+
+/**
+ * @const
+ * @type {!grpc.web.MethodDescriptor<
+ *   !proto.im.SignInPasswordRequest,
+ *   !proto.im.TokenParam>}
+ */
+const methodDescriptor_Api_SignInWithPhonePassword = new grpc.web.MethodDescriptor(
+    '/im.Api/SignInWithPhonePassword',
+    grpc.web.MethodType.UNARY,
+    proto.im.SignInPasswordRequest,
+    proto.im.TokenParam,
+    /**
+     * @param {!proto.im.SignInPasswordRequest} request
+     * @return {!Uint8Array}
+     */
+    function (request) {
+        return request.serializeBinary();
+    },
+    proto.im.TokenParam.deserializeBinary
+);
+
+
+/**
+ * @const
+ * @type {!grpc.web.AbstractClientBase.MethodInfo<
+ *   !proto.im.SignInPasswordRequest,
+ *   !proto.im.TokenParam>}
+ */
+const methodInfo_Api_SignInWithPhonePassword = new grpc.web.AbstractClientBase.MethodInfo(
+    proto.im.TokenParam,
+    /**
+     * @param {!proto.im.SignInPasswordRequest} request
+     * @return {!Uint8Array}
+     */
+    function (request) {
+        return request.serializeBinary();
+    },
+    proto.im.TokenParam.deserializeBinary
+);
+
+
+/**
+ * @param {!proto.im.SignInPasswordRequest} request The
+ *     request proto
+ * @param {?Object<string, string>} metadata User defined
+ *     call metadata
+ * @param {function(?grpc.web.Error, ?proto.im.TokenParam)}
+ *     callback The callback function(error, response)
+ * @return {!grpc.web.ClientReadableStream<!proto.im.TokenParam>|undefined}
+ *     The XHR Node Readable Stream
+ */
+proto.im.ApiClient.prototype.signInWithPhonePassword =
+    function (request, metadata, callback) {
+        return this.client_.rpcCall(this.hostname_ +
+            '/im.Api/SignInWithPhonePassword',
+            request,
+            metadata || {},
+            methodDescriptor_Api_SignInWithPhonePassword,
+            callback);
+    };
+
+
+/**
+ * @param {!proto.im.SignInPasswordRequest} request The
+ *     request proto
+ * @param {?Object<string, string>} metadata User defined
+ *     call metadata
+ * @return {!Promise<!proto.im.TokenParam>}
+ *     Promise that resolves to the response
+ */
+proto.im.ApiPromiseClient.prototype.signInWithPhonePassword =
+    function (request, metadata) {
+        return this.client_.unaryCall(this.hostname_ +
+            '/im.Api/SignInWithPhonePassword',
+            request,
+            metadata || {},
+            methodDescriptor_Api_SignInWithPhonePassword);
+    };
+
+
+/**
+ * @const
+ * @type {!grpc.web.MethodDescriptor<
+ *   !proto.im.TokenParam,
+ *   !proto.im.SessionCheckReply>}
+ */
+const methodDescriptor_Api_SubSessionCheck = new grpc.web.MethodDescriptor(
+    '/im.Api/SubSessionCheck',
+    grpc.web.MethodType.UNARY,
+    proto.im.TokenParam,
+    proto.im.SessionCheckReply,
+    /**
+     * @param {!proto.im.TokenParam} request
+     * @return {!Uint8Array}
+     */
+    function (request) {
+        return request.serializeBinary();
+    },
+    proto.im.SessionCheckReply.deserializeBinary
+);
+
+
+/**
+ * @const
+ * @type {!grpc.web.AbstractClientBase.MethodInfo<
+ *   !proto.im.TokenParam,
+ *   !proto.im.SessionCheckReply>}
+ */
+const methodInfo_Api_SubSessionCheck = new grpc.web.AbstractClientBase.MethodInfo(
+    proto.im.SessionCheckReply,
+    /**
+     * @param {!proto.im.TokenParam} request
+     * @return {!Uint8Array}
+     */
+    function (request) {
+        return request.serializeBinary();
+    },
+    proto.im.SessionCheckReply.deserializeBinary
+);
+
+
+/**
+ * @param {!proto.im.TokenParam} request The
+ *     request proto
+ * @param {?Object<string, string>} metadata User defined
+ *     call metadata
+ * @param {function(?grpc.web.Error, ?proto.im.SessionCheckReply)}
+ *     callback The callback function(error, response)
+ * @return {!grpc.web.ClientReadableStream<!proto.im.SessionCheckReply>|undefined}
+ *     The XHR Node Readable Stream
+ */
+proto.im.ApiClient.prototype.subSessionCheck =
+    function (request, metadata, callback) {
+        return this.client_.rpcCall(this.hostname_ +
+            '/im.Api/SubSessionCheck',
+            request,
+            metadata || {},
+            methodDescriptor_Api_SubSessionCheck,
+            callback);
+    };
+
+
+/**
+ * @param {!proto.im.TokenParam} request The
+ *     request proto
+ * @param {?Object<string, string>} metadata User defined
+ *     call metadata
+ * @return {!Promise<!proto.im.SessionCheckReply>}
+ *     Promise that resolves to the response
+ */
+proto.im.ApiPromiseClient.prototype.subSessionCheck =
+    function (request, metadata) {
+        return this.client_.unaryCall(this.hostname_ +
+            '/im.Api/SubSessionCheck',
+            request,
+            metadata || {},
+            methodDescriptor_Api_SubSessionCheck);
+    };
+
+
+/**
+ * @const
+ * @type {!grpc.web.MethodDescriptor<
+ *   !proto.im.PermissionCheck,
+ *   !proto.im.SessionCheckReply>}
+ */
+const methodDescriptor_Api_SubPermissionCheck = new grpc.web.MethodDescriptor(
+    '/im.Api/SubPermissionCheck',
+    grpc.web.MethodType.UNARY,
+    proto.im.PermissionCheck,
+    proto.im.SessionCheckReply,
+    /**
+     * @param {!proto.im.PermissionCheck} request
+     * @return {!Uint8Array}
+     */
+    function (request) {
+        return request.serializeBinary();
+    },
+    proto.im.SessionCheckReply.deserializeBinary
+);
+
+
+/**
+ * @const
+ * @type {!grpc.web.AbstractClientBase.MethodInfo<
+ *   !proto.im.PermissionCheck,
+ *   !proto.im.SessionCheckReply>}
+ */
+const methodInfo_Api_SubPermissionCheck = new grpc.web.AbstractClientBase.MethodInfo(
+    proto.im.SessionCheckReply,
+    /**
+     * @param {!proto.im.PermissionCheck} request
+     * @return {!Uint8Array}
+     */
+    function (request) {
+        return request.serializeBinary();
+    },
+    proto.im.SessionCheckReply.deserializeBinary
+);
+
+
+/**
+ * @param {!proto.im.PermissionCheck} request The
+ *     request proto
+ * @param {?Object<string, string>} metadata User defined
+ *     call metadata
+ * @param {function(?grpc.web.Error, ?proto.im.SessionCheckReply)}
+ *     callback The callback function(error, response)
+ * @return {!grpc.web.ClientReadableStream<!proto.im.SessionCheckReply>|undefined}
+ *     The XHR Node Readable Stream
+ */
+proto.im.ApiClient.prototype.subPermissionCheck =
+    function (request, metadata, callback) {
+        return this.client_.rpcCall(this.hostname_ +
+            '/im.Api/SubPermissionCheck',
+            request,
+            metadata || {},
+            methodDescriptor_Api_SubPermissionCheck,
+            callback);
+    };
+
+
+/**
+ * @param {!proto.im.PermissionCheck} request The
+ *     request proto
+ * @param {?Object<string, string>} metadata User defined
+ *     call metadata
+ * @return {!Promise<!proto.im.SessionCheckReply>}
+ *     Promise that resolves to the response
+ */
+proto.im.ApiPromiseClient.prototype.subPermissionCheck =
+    function (request, metadata) {
+        return this.client_.unaryCall(this.hostname_ +
+            '/im.Api/SubPermissionCheck',
+            request,
+            metadata || {},
+            methodDescriptor_Api_SubPermissionCheck);
+    };
+
+
+/**
+ * @const
+ * @type {!grpc.web.MethodDescriptor<
+ *   !proto.im.TokenParam,
+ *   !proto.im.DefaultReply>}
+ */
+const methodDescriptor_Api_SubSignOut = new grpc.web.MethodDescriptor(
+    '/im.Api/SubSignOut',
+    grpc.web.MethodType.UNARY,
+    proto.im.TokenParam,
+    proto.im.DefaultReply,
+    /**
+     * @param {!proto.im.TokenParam} request
+     * @return {!Uint8Array}
+     */
+    function (request) {
+        return request.serializeBinary();
+    },
+    proto.im.DefaultReply.deserializeBinary
+);
+
+
+/**
+ * @const
+ * @type {!grpc.web.AbstractClientBase.MethodInfo<
+ *   !proto.im.TokenParam,
+ *   !proto.im.DefaultReply>}
+ */
+const methodInfo_Api_SubSignOut = new grpc.web.AbstractClientBase.MethodInfo(
+    proto.im.DefaultReply,
+    /**
+     * @param {!proto.im.TokenParam} request
+     * @return {!Uint8Array}
+     */
+    function (request) {
+        return request.serializeBinary();
+    },
+    proto.im.DefaultReply.deserializeBinary
+);
+
+
+/**
+ * @param {!proto.im.TokenParam} request The
+ *     request proto
+ * @param {?Object<string, string>} metadata User defined
+ *     call metadata
+ * @param {function(?grpc.web.Error, ?proto.im.DefaultReply)}
+ *     callback The callback function(error, response)
+ * @return {!grpc.web.ClientReadableStream<!proto.im.DefaultReply>|undefined}
+ *     The XHR Node Readable Stream
+ */
+proto.im.ApiClient.prototype.subSignOut =
+    function (request, metadata, callback) {
+        return this.client_.rpcCall(this.hostname_ +
+            '/im.Api/SubSignOut',
+            request,
+            metadata || {},
+            methodDescriptor_Api_SubSignOut,
+            callback);
+    };
+
+
+/**
+ * @param {!proto.im.TokenParam} request The
+ *     request proto
+ * @param {?Object<string, string>} metadata User defined
+ *     call metadata
+ * @return {!Promise<!proto.im.DefaultReply>}
+ *     Promise that resolves to the response
+ */
+proto.im.ApiPromiseClient.prototype.subSignOut =
+    function (request, metadata) {
+        return this.client_.unaryCall(this.hostname_ +
+            '/im.Api/SubSignOut',
+            request,
+            metadata || {},
+            methodDescriptor_Api_SubSignOut);
+    };
+
+
+/**
+ * @const
+ * @type {!grpc.web.MethodDescriptor<
+ *   !proto.im.SaveServiceListRequest,
+ *   !proto.im.DefaultReply>}
+ */
+const methodDescriptor_Api_SubServiceSaveList = new grpc.web.MethodDescriptor(
+    '/im.Api/SubServiceSaveList',
+    grpc.web.MethodType.UNARY,
+    proto.im.SaveServiceListRequest,
+    proto.im.DefaultReply,
+    /**
+     * @param {!proto.im.SaveServiceListRequest} request
+     * @return {!Uint8Array}
+     */
+    function (request) {
+        return request.serializeBinary();
+    },
+    proto.im.DefaultReply.deserializeBinary
+);
+
+
+/**
+ * @const
+ * @type {!grpc.web.AbstractClientBase.MethodInfo<
+ *   !proto.im.SaveServiceListRequest,
+ *   !proto.im.DefaultReply>}
+ */
+const methodInfo_Api_SubServiceSaveList = new grpc.web.AbstractClientBase.MethodInfo(
+    proto.im.DefaultReply,
+    /**
+     * @param {!proto.im.SaveServiceListRequest} request
+     * @return {!Uint8Array}
+     */
+    function (request) {
+        return request.serializeBinary();
+    },
+    proto.im.DefaultReply.deserializeBinary
+);
+
+
+/**
+ * @param {!proto.im.SaveServiceListRequest} request The
+ *     request proto
+ * @param {?Object<string, string>} metadata User defined
+ *     call metadata
+ * @param {function(?grpc.web.Error, ?proto.im.DefaultReply)}
+ *     callback The callback function(error, response)
+ * @return {!grpc.web.ClientReadableStream<!proto.im.DefaultReply>|undefined}
+ *     The XHR Node Readable Stream
+ */
+proto.im.ApiClient.prototype.subServiceSaveList =
+    function (request, metadata, callback) {
+        return this.client_.rpcCall(this.hostname_ +
+            '/im.Api/SubServiceSaveList',
+            request,
+            metadata || {},
+            methodDescriptor_Api_SubServiceSaveList,
+            callback);
+    };
+
+
+/**
+ * @param {!proto.im.SaveServiceListRequest} request The
+ *     request proto
+ * @param {?Object<string, string>} metadata User defined
+ *     call metadata
+ * @return {!Promise<!proto.im.DefaultReply>}
+ *     Promise that resolves to the response
+ */
+proto.im.ApiPromiseClient.prototype.subServiceSaveList =
+    function (request, metadata) {
+        return this.client_.unaryCall(this.hostname_ +
+            '/im.Api/SubServiceSaveList',
+            request,
+            metadata || {},
+            methodDescriptor_Api_SubServiceSaveList);
+    };
+
+
+/**
+ * @const
+ * @type {!grpc.web.MethodDescriptor<
+ *   !proto.im.UserListRequest,
+ *   !proto.im.UserListReply>}
+ */
+const methodDescriptor_Api_UserList = new grpc.web.MethodDescriptor(
+    '/im.Api/UserList',
+    grpc.web.MethodType.UNARY,
+    proto.im.UserListRequest,
+    proto.im.UserListReply,
+    /**
+     * @param {!proto.im.UserListRequest} request
+     * @return {!Uint8Array}
+     */
+    function (request) {
+        return request.serializeBinary();
+    },
+    proto.im.UserListReply.deserializeBinary
+);
+
+
+/**
+ * @const
+ * @type {!grpc.web.AbstractClientBase.MethodInfo<
+ *   !proto.im.UserListRequest,
+ *   !proto.im.UserListReply>}
+ */
+const methodInfo_Api_UserList = new grpc.web.AbstractClientBase.MethodInfo(
+    proto.im.UserListReply,
+    /**
+     * @param {!proto.im.UserListRequest} request
+     * @return {!Uint8Array}
+     */
+    function (request) {
+        return request.serializeBinary();
+    },
+    proto.im.UserListReply.deserializeBinary
+);
+
+
+/**
+ * @param {!proto.im.UserListRequest} request The
+ *     request proto
+ * @param {?Object<string, string>} metadata User defined
+ *     call metadata
+ * @param {function(?grpc.web.Error, ?proto.im.UserListReply)}
+ *     callback The callback function(error, response)
+ * @return {!grpc.web.ClientReadableStream<!proto.im.UserListReply>|undefined}
+ *     The XHR Node Readable Stream
+ */
+proto.im.ApiClient.prototype.userList =
+    function (request, metadata, callback) {
+        return this.client_.rpcCall(this.hostname_ +
+            '/im.Api/UserList',
+            request,
+            metadata || {},
+            methodDescriptor_Api_UserList,
+            callback);
+    };
+
+
+/**
+ * @param {!proto.im.UserListRequest} request The
+ *     request proto
+ * @param {?Object<string, string>} metadata User defined
+ *     call metadata
+ * @return {!Promise<!proto.im.UserListReply>}
+ *     Promise that resolves to the response
+ */
+proto.im.ApiPromiseClient.prototype.userList =
+    function (request, metadata) {
+        return this.client_.unaryCall(this.hostname_ +
+            '/im.Api/UserList',
+            request,
+            metadata || {},
+            methodDescriptor_Api_UserList);
+    };
+
+
+/**
+ * @const
+ * @type {!grpc.web.MethodDescriptor<
+ *   !proto.im.UserGetInfoRequest,
+ *   !proto.im.UserInfo>}
+ */
+const methodDescriptor_Api_UserGetInfo = new grpc.web.MethodDescriptor(
+    '/im.Api/UserGetInfo',
+    grpc.web.MethodType.UNARY,
+    proto.im.UserGetInfoRequest,
+    proto.im.UserInfo,
+    /**
+     * @param {!proto.im.UserGetInfoRequest} request
+     * @return {!Uint8Array}
+     */
+    function (request) {
+        return request.serializeBinary();
+    },
+    proto.im.UserInfo.deserializeBinary
+);
+
+
+/**
+ * @const
+ * @type {!grpc.web.AbstractClientBase.MethodInfo<
+ *   !proto.im.UserGetInfoRequest,
+ *   !proto.im.UserInfo>}
+ */
+const methodInfo_Api_UserGetInfo = new grpc.web.AbstractClientBase.MethodInfo(
+    proto.im.UserInfo,
+    /**
+     * @param {!proto.im.UserGetInfoRequest} request
+     * @return {!Uint8Array}
+     */
+    function (request) {
+        return request.serializeBinary();
+    },
+    proto.im.UserInfo.deserializeBinary
+);
+
+
+/**
+ * @param {!proto.im.UserGetInfoRequest} request The
+ *     request proto
+ * @param {?Object<string, string>} metadata User defined
+ *     call metadata
+ * @param {function(?grpc.web.Error, ?proto.im.UserInfo)}
+ *     callback The callback function(error, response)
+ * @return {!grpc.web.ClientReadableStream<!proto.im.UserInfo>|undefined}
+ *     The XHR Node Readable Stream
+ */
+proto.im.ApiClient.prototype.userGetInfo =
+    function (request, metadata, callback) {
+        return this.client_.rpcCall(this.hostname_ +
+            '/im.Api/UserGetInfo',
+            request,
+            metadata || {},
+            methodDescriptor_Api_UserGetInfo,
+            callback);
+    };
+
+
+/**
+ * @param {!proto.im.UserGetInfoRequest} request The
+ *     request proto
+ * @param {?Object<string, string>} metadata User defined
+ *     call metadata
+ * @return {!Promise<!proto.im.UserInfo>}
+ *     Promise that resolves to the response
+ */
+proto.im.ApiPromiseClient.prototype.userGetInfo =
+    function (request, metadata) {
+        return this.client_.unaryCall(this.hostname_ +
+            '/im.Api/UserGetInfo',
+            request,
+            metadata || {},
+            methodDescriptor_Api_UserGetInfo);
+    };
+
+
+/**
+ * @const
+ * @type {!grpc.web.MethodDescriptor<
+ *   !proto.im.UserRolesRequest,
+ *   !proto.im.DefaultReply>}
+ */
+const methodDescriptor_Api_UserAddRoles = new grpc.web.MethodDescriptor(
+    '/im.Api/UserAddRoles',
+    grpc.web.MethodType.UNARY,
+    proto.im.UserRolesRequest,
+    proto.im.DefaultReply,
+    /**
+     * @param {!proto.im.UserRolesRequest} request
+     * @return {!Uint8Array}
+     */
+    function (request) {
+        return request.serializeBinary();
+    },
+    proto.im.DefaultReply.deserializeBinary
+);
+
+
+/**
+ * @const
+ * @type {!grpc.web.AbstractClientBase.MethodInfo<
+ *   !proto.im.UserRolesRequest,
+ *   !proto.im.DefaultReply>}
+ */
+const methodInfo_Api_UserAddRoles = new grpc.web.AbstractClientBase.MethodInfo(
+    proto.im.DefaultReply,
+    /**
+     * @param {!proto.im.UserRolesRequest} request
+     * @return {!Uint8Array}
+     */
+    function (request) {
+        return request.serializeBinary();
+    },
+    proto.im.DefaultReply.deserializeBinary
+);
+
+
+/**
+ * @param {!proto.im.UserRolesRequest} request The
+ *     request proto
+ * @param {?Object<string, string>} metadata User defined
+ *     call metadata
+ * @param {function(?grpc.web.Error, ?proto.im.DefaultReply)}
+ *     callback The callback function(error, response)
+ * @return {!grpc.web.ClientReadableStream<!proto.im.DefaultReply>|undefined}
+ *     The XHR Node Readable Stream
+ */
+proto.im.ApiClient.prototype.userAddRoles =
+    function (request, metadata, callback) {
+        return this.client_.rpcCall(this.hostname_ +
+            '/im.Api/UserAddRoles',
+            request,
+            metadata || {},
+            methodDescriptor_Api_UserAddRoles,
+            callback);
+    };
+
+
+/**
+ * @param {!proto.im.UserRolesRequest} request The
+ *     request proto
+ * @param {?Object<string, string>} metadata User defined
+ *     call metadata
+ * @return {!Promise<!proto.im.DefaultReply>}
+ *     Promise that resolves to the response
+ */
+proto.im.ApiPromiseClient.prototype.userAddRoles =
+    function (request, metadata) {
+        return this.client_.unaryCall(this.hostname_ +
+            '/im.Api/UserAddRoles',
+            request,
+            metadata || {},
+            methodDescriptor_Api_UserAddRoles);
+    };
+
+
+/**
+ * @const
+ * @type {!grpc.web.MethodDescriptor<
+ *   !proto.im.UserRolesRequest,
+ *   !proto.im.DefaultReply>}
+ */
+const methodDescriptor_Api_UserRemoveRoles = new grpc.web.MethodDescriptor(
+    '/im.Api/UserRemoveRoles',
+    grpc.web.MethodType.UNARY,
+    proto.im.UserRolesRequest,
+    proto.im.DefaultReply,
+    /**
+     * @param {!proto.im.UserRolesRequest} request
+     * @return {!Uint8Array}
+     */
+    function (request) {
+        return request.serializeBinary();
+    },
+    proto.im.DefaultReply.deserializeBinary
+);
+
+
+/**
+ * @const
+ * @type {!grpc.web.AbstractClientBase.MethodInfo<
+ *   !proto.im.UserRolesRequest,
+ *   !proto.im.DefaultReply>}
+ */
+const methodInfo_Api_UserRemoveRoles = new grpc.web.AbstractClientBase.MethodInfo(
+    proto.im.DefaultReply,
+    /**
+     * @param {!proto.im.UserRolesRequest} request
+     * @return {!Uint8Array}
+     */
+    function (request) {
+        return request.serializeBinary();
+    },
+    proto.im.DefaultReply.deserializeBinary
+);
+
+
+/**
+ * @param {!proto.im.UserRolesRequest} request The
+ *     request proto
+ * @param {?Object<string, string>} metadata User defined
+ *     call metadata
+ * @param {function(?grpc.web.Error, ?proto.im.DefaultReply)}
+ *     callback The callback function(error, response)
+ * @return {!grpc.web.ClientReadableStream<!proto.im.DefaultReply>|undefined}
+ *     The XHR Node Readable Stream
+ */
+proto.im.ApiClient.prototype.userRemoveRoles =
+    function (request, metadata, callback) {
+        return this.client_.rpcCall(this.hostname_ +
+            '/im.Api/UserRemoveRoles',
+            request,
+            metadata || {},
+            methodDescriptor_Api_UserRemoveRoles,
+            callback);
+    };
+
+
+/**
+ * @param {!proto.im.UserRolesRequest} request The
+ *     request proto
+ * @param {?Object<string, string>} metadata User defined
+ *     call metadata
+ * @return {!Promise<!proto.im.DefaultReply>}
+ *     Promise that resolves to the response
+ */
+proto.im.ApiPromiseClient.prototype.userRemoveRoles =
+    function (request, metadata) {
+        return this.client_.unaryCall(this.hostname_ +
+            '/im.Api/UserRemoveRoles',
+            request,
+            metadata || {},
+            methodDescriptor_Api_UserRemoveRoles);
+    };
+
+
+/**
+ * @const
+ * @type {!grpc.web.MethodDescriptor<
+ *   !proto.im.UserGetColumnListRequest,
+ *   !proto.im.UserGetColumnListReply>}
+ */
+const methodDescriptor_Api_UserGetColumnList = new grpc.web.MethodDescriptor(
+    '/im.Api/UserGetColumnList',
+    grpc.web.MethodType.UNARY,
+    proto.im.UserGetColumnListRequest,
+    proto.im.UserGetColumnListReply,
+    /**
+     * @param {!proto.im.UserGetColumnListRequest} request
+     * @return {!Uint8Array}
+     */
+    function (request) {
+        return request.serializeBinary();
+    },
+    proto.im.UserGetColumnListReply.deserializeBinary
+);
+
+
+/**
+ * @const
+ * @type {!grpc.web.AbstractClientBase.MethodInfo<
+ *   !proto.im.UserGetColumnListRequest,
+ *   !proto.im.UserGetColumnListReply>}
+ */
+const methodInfo_Api_UserGetColumnList = new grpc.web.AbstractClientBase.MethodInfo(
+    proto.im.UserGetColumnListReply,
+    /**
+     * @param {!proto.im.UserGetColumnListRequest} request
+     * @return {!Uint8Array}
+     */
+    function (request) {
+        return request.serializeBinary();
+    },
+    proto.im.UserGetColumnListReply.deserializeBinary
+);
+
+
+/**
+ * @param {!proto.im.UserGetColumnListRequest} request The
+ *     request proto
+ * @param {?Object<string, string>} metadata User defined
+ *     call metadata
+ * @param {function(?grpc.web.Error, ?proto.im.UserGetColumnListReply)}
+ *     callback The callback function(error, response)
+ * @return {!grpc.web.ClientReadableStream<!proto.im.UserGetColumnListReply>|undefined}
+ *     The XHR Node Readable Stream
+ */
+proto.im.ApiClient.prototype.userGetColumnList =
+    function (request, metadata, callback) {
+        return this.client_.rpcCall(this.hostname_ +
+            '/im.Api/UserGetColumnList',
+            request,
+            metadata || {},
+            methodDescriptor_Api_UserGetColumnList,
+            callback);
+    };
+
+
+/**
+ * @param {!proto.im.UserGetColumnListRequest} request The
+ *     request proto
+ * @param {?Object<string, string>} metadata User defined
+ *     call metadata
+ * @return {!Promise<!proto.im.UserGetColumnListReply>}
+ *     Promise that resolves to the response
+ */
+proto.im.ApiPromiseClient.prototype.userGetColumnList =
+    function (request, metadata) {
+        return this.client_.unaryCall(this.hostname_ +
+            '/im.Api/UserGetColumnList',
+            request,
+            metadata || {},
+            methodDescriptor_Api_UserGetColumnList);
+    };
+
+
+/**
+ * @const
+ * @type {!grpc.web.MethodDescriptor<
+ *   !proto.im.CreateRoleRequest,
+ *   !proto.im.DefaultReply>}
+ */
+const methodDescriptor_Api_RoleCreate = new grpc.web.MethodDescriptor(
+    '/im.Api/RoleCreate',
+    grpc.web.MethodType.UNARY,
+    proto.im.CreateRoleRequest,
+    proto.im.DefaultReply,
+    /**
+     * @param {!proto.im.CreateRoleRequest} request
+     * @return {!Uint8Array}
+     */
+    function (request) {
+        return request.serializeBinary();
+    },
+    proto.im.DefaultReply.deserializeBinary
+);
+
+
+/**
+ * @const
+ * @type {!grpc.web.AbstractClientBase.MethodInfo<
+ *   !proto.im.CreateRoleRequest,
+ *   !proto.im.DefaultReply>}
+ */
+const methodInfo_Api_RoleCreate = new grpc.web.AbstractClientBase.MethodInfo(
+    proto.im.DefaultReply,
+    /**
+     * @param {!proto.im.CreateRoleRequest} request
+     * @return {!Uint8Array}
+     */
+    function (request) {
+        return request.serializeBinary();
+    },
+    proto.im.DefaultReply.deserializeBinary
+);
+
+
+/**
+ * @param {!proto.im.CreateRoleRequest} request The
+ *     request proto
+ * @param {?Object<string, string>} metadata User defined
+ *     call metadata
+ * @param {function(?grpc.web.Error, ?proto.im.DefaultReply)}
+ *     callback The callback function(error, response)
+ * @return {!grpc.web.ClientReadableStream<!proto.im.DefaultReply>|undefined}
+ *     The XHR Node Readable Stream
+ */
+proto.im.ApiClient.prototype.roleCreate =
+    function (request, metadata, callback) {
+        return this.client_.rpcCall(this.hostname_ +
+            '/im.Api/RoleCreate',
+            request,
+            metadata || {},
+            methodDescriptor_Api_RoleCreate,
+            callback);
+    };
+
+
+/**
+ * @param {!proto.im.CreateRoleRequest} request The
+ *     request proto
+ * @param {?Object<string, string>} metadata User defined
+ *     call metadata
+ * @return {!Promise<!proto.im.DefaultReply>}
+ *     Promise that resolves to the response
+ */
+proto.im.ApiPromiseClient.prototype.roleCreate =
+    function (request, metadata) {
+        return this.client_.unaryCall(this.hostname_ +
+            '/im.Api/RoleCreate',
+            request,
+            metadata || {},
+            methodDescriptor_Api_RoleCreate);
+    };
+
+
+/**
+ * @const
+ * @type {!grpc.web.MethodDescriptor<
+ *   !proto.im.RoleListRequest,
+ *   !proto.im.RoleListReply>}
+ */
+const methodDescriptor_Api_RoleList = new grpc.web.MethodDescriptor(
+    '/im.Api/RoleList',
+    grpc.web.MethodType.UNARY,
+    proto.im.RoleListRequest,
+    proto.im.RoleListReply,
+    /**
+     * @param {!proto.im.RoleListRequest} request
+     * @return {!Uint8Array}
+     */
+    function (request) {
+        return request.serializeBinary();
+    },
+    proto.im.RoleListReply.deserializeBinary
+);
+
+
+/**
+ * @const
+ * @type {!grpc.web.AbstractClientBase.MethodInfo<
+ *   !proto.im.RoleListRequest,
+ *   !proto.im.RoleListReply>}
+ */
+const methodInfo_Api_RoleList = new grpc.web.AbstractClientBase.MethodInfo(
+    proto.im.RoleListReply,
+    /**
+     * @param {!proto.im.RoleListRequest} request
+     * @return {!Uint8Array}
+     */
+    function (request) {
+        return request.serializeBinary();
+    },
+    proto.im.RoleListReply.deserializeBinary
+);
+
+
+/**
+ * @param {!proto.im.RoleListRequest} request The
+ *     request proto
+ * @param {?Object<string, string>} metadata User defined
+ *     call metadata
+ * @param {function(?grpc.web.Error, ?proto.im.RoleListReply)}
+ *     callback The callback function(error, response)
+ * @return {!grpc.web.ClientReadableStream<!proto.im.RoleListReply>|undefined}
+ *     The XHR Node Readable Stream
+ */
+proto.im.ApiClient.prototype.roleList =
+    function (request, metadata, callback) {
+        return this.client_.rpcCall(this.hostname_ +
+            '/im.Api/RoleList',
+            request,
+            metadata || {},
+            methodDescriptor_Api_RoleList,
+            callback);
+    };
+
+
+/**
+ * @param {!proto.im.RoleListRequest} request The
+ *     request proto
+ * @param {?Object<string, string>} metadata User defined
+ *     call metadata
+ * @return {!Promise<!proto.im.RoleListReply>}
+ *     Promise that resolves to the response
+ */
+proto.im.ApiPromiseClient.prototype.roleList =
+    function (request, metadata) {
+        return this.client_.unaryCall(this.hostname_ +
+            '/im.Api/RoleList',
+            request,
+            metadata || {},
+            methodDescriptor_Api_RoleList);
+    };
+
+
+/**
+ * @const
+ * @type {!grpc.web.MethodDescriptor<
+ *   !proto.im.Role,
+ *   !proto.im.DefaultReply>}
+ */
+const methodDescriptor_Api_RoleEdit = new grpc.web.MethodDescriptor(
+    '/im.Api/RoleEdit',
+    grpc.web.MethodType.UNARY,
+    proto.im.Role,
+    proto.im.DefaultReply,
+    /**
+     * @param {!proto.im.Role} request
+     * @return {!Uint8Array}
+     */
+    function (request) {
+        return request.serializeBinary();
+    },
+    proto.im.DefaultReply.deserializeBinary
+);
+
+
+/**
+ * @const
+ * @type {!grpc.web.AbstractClientBase.MethodInfo<
+ *   !proto.im.Role,
+ *   !proto.im.DefaultReply>}
+ */
+const methodInfo_Api_RoleEdit = new grpc.web.AbstractClientBase.MethodInfo(
+    proto.im.DefaultReply,
+    /**
+     * @param {!proto.im.Role} request
+     * @return {!Uint8Array}
+     */
+    function (request) {
+        return request.serializeBinary();
+    },
+    proto.im.DefaultReply.deserializeBinary
+);
+
+
+/**
+ * @param {!proto.im.Role} request The
+ *     request proto
+ * @param {?Object<string, string>} metadata User defined
+ *     call metadata
+ * @param {function(?grpc.web.Error, ?proto.im.DefaultReply)}
+ *     callback The callback function(error, response)
+ * @return {!grpc.web.ClientReadableStream<!proto.im.DefaultReply>|undefined}
+ *     The XHR Node Readable Stream
+ */
+proto.im.ApiClient.prototype.roleEdit =
+    function (request, metadata, callback) {
+        return this.client_.rpcCall(this.hostname_ +
+            '/im.Api/RoleEdit',
+            request,
+            metadata || {},
+            methodDescriptor_Api_RoleEdit,
+            callback);
+    };
+
+
+/**
+ * @param {!proto.im.Role} request The
+ *     request proto
+ * @param {?Object<string, string>} metadata User defined
+ *     call metadata
+ * @return {!Promise<!proto.im.DefaultReply>}
+ *     Promise that resolves to the response
+ */
+proto.im.ApiPromiseClient.prototype.roleEdit =
+    function (request, metadata) {
+        return this.client_.unaryCall(this.hostname_ +
+            '/im.Api/RoleEdit',
+            request,
+            metadata || {},
+            methodDescriptor_Api_RoleEdit);
+    };
+
+
+/**
+ * @const
+ * @type {!grpc.web.MethodDescriptor<
+ *   !proto.im.RolePermissionRequest,
+ *   !proto.im.DefaultReply>}
+ */
+const methodDescriptor_Api_RoleAddPermissions = new grpc.web.MethodDescriptor(
+    '/im.Api/RoleAddPermissions',
+    grpc.web.MethodType.UNARY,
+    proto.im.RolePermissionRequest,
+    proto.im.DefaultReply,
+    /**
+     * @param {!proto.im.RolePermissionRequest} request
+     * @return {!Uint8Array}
+     */
+    function (request) {
+        return request.serializeBinary();
+    },
+    proto.im.DefaultReply.deserializeBinary
+);
+
+
+/**
+ * @const
+ * @type {!grpc.web.AbstractClientBase.MethodInfo<
+ *   !proto.im.RolePermissionRequest,
+ *   !proto.im.DefaultReply>}
+ */
+const methodInfo_Api_RoleAddPermissions = new grpc.web.AbstractClientBase.MethodInfo(
+    proto.im.DefaultReply,
+    /**
+     * @param {!proto.im.RolePermissionRequest} request
+     * @return {!Uint8Array}
+     */
+    function (request) {
+        return request.serializeBinary();
+    },
+    proto.im.DefaultReply.deserializeBinary
+);
+
+
+/**
+ * @param {!proto.im.RolePermissionRequest} request The
+ *     request proto
+ * @param {?Object<string, string>} metadata User defined
+ *     call metadata
+ * @param {function(?grpc.web.Error, ?proto.im.DefaultReply)}
+ *     callback The callback function(error, response)
+ * @return {!grpc.web.ClientReadableStream<!proto.im.DefaultReply>|undefined}
+ *     The XHR Node Readable Stream
+ */
+proto.im.ApiClient.prototype.roleAddPermissions =
+    function (request, metadata, callback) {
+        return this.client_.rpcCall(this.hostname_ +
+            '/im.Api/RoleAddPermissions',
+            request,
+            metadata || {},
+            methodDescriptor_Api_RoleAddPermissions,
+            callback);
+    };
+
+
+/**
+ * @param {!proto.im.RolePermissionRequest} request The
+ *     request proto
+ * @param {?Object<string, string>} metadata User defined
+ *     call metadata
+ * @return {!Promise<!proto.im.DefaultReply>}
+ *     Promise that resolves to the response
+ */
+proto.im.ApiPromiseClient.prototype.roleAddPermissions =
+    function (request, metadata) {
+        return this.client_.unaryCall(this.hostname_ +
+            '/im.Api/RoleAddPermissions',
+            request,
+            metadata || {},
+            methodDescriptor_Api_RoleAddPermissions);
+    };
+
+
+/**
+ * @const
+ * @type {!grpc.web.MethodDescriptor<
+ *   !proto.im.RolePermissionRequest,
+ *   !proto.im.DefaultReply>}
+ */
+const methodDescriptor_Api_RoleRemovePermissions = new grpc.web.MethodDescriptor(
+    '/im.Api/RoleRemovePermissions',
+    grpc.web.MethodType.UNARY,
+    proto.im.RolePermissionRequest,
+    proto.im.DefaultReply,
+    /**
+     * @param {!proto.im.RolePermissionRequest} request
+     * @return {!Uint8Array}
+     */
+    function (request) {
+        return request.serializeBinary();
+    },
+    proto.im.DefaultReply.deserializeBinary
+);
+
+
+/**
+ * @const
+ * @type {!grpc.web.AbstractClientBase.MethodInfo<
+ *   !proto.im.RolePermissionRequest,
+ *   !proto.im.DefaultReply>}
+ */
+const methodInfo_Api_RoleRemovePermissions = new grpc.web.AbstractClientBase.MethodInfo(
+    proto.im.DefaultReply,
+    /**
+     * @param {!proto.im.RolePermissionRequest} request
+     * @return {!Uint8Array}
+     */
+    function (request) {
+        return request.serializeBinary();
+    },
+    proto.im.DefaultReply.deserializeBinary
+);
+
+
+/**
+ * @param {!proto.im.RolePermissionRequest} request The
+ *     request proto
+ * @param {?Object<string, string>} metadata User defined
+ *     call metadata
+ * @param {function(?grpc.web.Error, ?proto.im.DefaultReply)}
+ *     callback The callback function(error, response)
+ * @return {!grpc.web.ClientReadableStream<!proto.im.DefaultReply>|undefined}
+ *     The XHR Node Readable Stream
+ */
+proto.im.ApiClient.prototype.roleRemovePermissions =
+    function (request, metadata, callback) {
+        return this.client_.rpcCall(this.hostname_ +
+            '/im.Api/RoleRemovePermissions',
+            request,
+            metadata || {},
+            methodDescriptor_Api_RoleRemovePermissions,
+            callback);
+    };
+
+
+/**
+ * @param {!proto.im.RolePermissionRequest} request The
+ *     request proto
+ * @param {?Object<string, string>} metadata User defined
+ *     call metadata
+ * @return {!Promise<!proto.im.DefaultReply>}
+ *     Promise that resolves to the response
+ */
+proto.im.ApiPromiseClient.prototype.roleRemovePermissions =
+    function (request, metadata) {
+        return this.client_.unaryCall(this.hostname_ +
+            '/im.Api/RoleRemovePermissions',
+            request,
+            metadata || {},
+            methodDescriptor_Api_RoleRemovePermissions);
+    };
+
+
+/**
+ * @const
+ * @type {!grpc.web.MethodDescriptor<
+ *   !proto.im.ServiceListRequest,
+ *   !proto.im.ServiceListReply>}
+ */
+const methodDescriptor_Api_ServiceList = new grpc.web.MethodDescriptor(
+    '/im.Api/ServiceList',
+    grpc.web.MethodType.UNARY,
+    proto.im.ServiceListRequest,
+    proto.im.ServiceListReply,
+    /**
+     * @param {!proto.im.ServiceListRequest} request
+     * @return {!Uint8Array}
+     */
+    function (request) {
+        return request.serializeBinary();
+    },
+    proto.im.ServiceListReply.deserializeBinary
+);
+
+
+/**
+ * @const
+ * @type {!grpc.web.AbstractClientBase.MethodInfo<
+ *   !proto.im.ServiceListRequest,
+ *   !proto.im.ServiceListReply>}
+ */
+const methodInfo_Api_ServiceList = new grpc.web.AbstractClientBase.MethodInfo(
+    proto.im.ServiceListReply,
+    /**
+     * @param {!proto.im.ServiceListRequest} request
+     * @return {!Uint8Array}
+     */
+    function (request) {
+        return request.serializeBinary();
+    },
+    proto.im.ServiceListReply.deserializeBinary
+);
+
+
+/**
+ * @param {!proto.im.ServiceListRequest} request The
+ *     request proto
+ * @param {?Object<string, string>} metadata User defined
+ *     call metadata
+ * @param {function(?grpc.web.Error, ?proto.im.ServiceListReply)}
+ *     callback The callback function(error, response)
+ * @return {!grpc.web.ClientReadableStream<!proto.im.ServiceListReply>|undefined}
+ *     The XHR Node Readable Stream
+ */
+proto.im.ApiClient.prototype.serviceList =
+    function (request, metadata, callback) {
+        return this.client_.rpcCall(this.hostname_ +
+            '/im.Api/ServiceList',
+            request,
+            metadata || {},
+            methodDescriptor_Api_ServiceList,
+            callback);
+    };
+
+
+/**
+ * @param {!proto.im.ServiceListRequest} request The
+ *     request proto
+ * @param {?Object<string, string>} metadata User defined
+ *     call metadata
+ * @return {!Promise<!proto.im.ServiceListReply>}
+ *     Promise that resolves to the response
+ */
+proto.im.ApiPromiseClient.prototype.serviceList =
+    function (request, metadata) {
+        return this.client_.unaryCall(this.hostname_ +
+            '/im.Api/ServiceList',
+            request,
+            metadata || {},
+            methodDescriptor_Api_ServiceList);
+    };
+
+
+/**
+ * @const
+ * @type {!grpc.web.MethodDescriptor<
+ *   !proto.im.ServiceRemoveRequest,
+ *   !proto.im.DefaultReply>}
+ */
+const methodDescriptor_Api_ServiceRemoveList = new grpc.web.MethodDescriptor(
+    '/im.Api/ServiceRemoveList',
+    grpc.web.MethodType.UNARY,
+    proto.im.ServiceRemoveRequest,
+    proto.im.DefaultReply,
+    /**
+     * @param {!proto.im.ServiceRemoveRequest} request
+     * @return {!Uint8Array}
+     */
+    function (request) {
+        return request.serializeBinary();
+    },
+    proto.im.DefaultReply.deserializeBinary
+);
+
+
+/**
+ * @const
+ * @type {!grpc.web.AbstractClientBase.MethodInfo<
+ *   !proto.im.ServiceRemoveRequest,
+ *   !proto.im.DefaultReply>}
+ */
+const methodInfo_Api_ServiceRemoveList = new grpc.web.AbstractClientBase.MethodInfo(
+    proto.im.DefaultReply,
+    /**
+     * @param {!proto.im.ServiceRemoveRequest} request
+     * @return {!Uint8Array}
+     */
+    function (request) {
+        return request.serializeBinary();
+    },
+    proto.im.DefaultReply.deserializeBinary
+);
+
+
+/**
+ * @param {!proto.im.ServiceRemoveRequest} request The
+ *     request proto
+ * @param {?Object<string, string>} metadata User defined
+ *     call metadata
+ * @param {function(?grpc.web.Error, ?proto.im.DefaultReply)}
+ *     callback The callback function(error, response)
+ * @return {!grpc.web.ClientReadableStream<!proto.im.DefaultReply>|undefined}
+ *     The XHR Node Readable Stream
+ */
+proto.im.ApiClient.prototype.serviceRemoveList =
+    function (request, metadata, callback) {
+        return this.client_.rpcCall(this.hostname_ +
+            '/im.Api/ServiceRemoveList',
+            request,
+            metadata || {},
+            methodDescriptor_Api_ServiceRemoveList,
+            callback);
+    };
+
+
+/**
+ * @param {!proto.im.ServiceRemoveRequest} request The
+ *     request proto
+ * @param {?Object<string, string>} metadata User defined
+ *     call metadata
+ * @return {!Promise<!proto.im.DefaultReply>}
+ *     Promise that resolves to the response
+ */
+proto.im.ApiPromiseClient.prototype.serviceRemoveList =
+    function (request, metadata) {
+        return this.client_.unaryCall(this.hostname_ +
+            '/im.Api/ServiceRemoveList',
+            request,
+            metadata || {},
+            methodDescriptor_Api_ServiceRemoveList);
+    };
+
+
+/**
+ * @const
+ * @type {!grpc.web.MethodDescriptor<
+ *   !proto.im.CreateShopRequest,
+ *   !proto.im.CreateReply>}
+ */
+const methodDescriptor_Api_ShopCreate = new grpc.web.MethodDescriptor(
+    '/im.Api/ShopCreate',
+    grpc.web.MethodType.UNARY,
+    proto.im.CreateShopRequest,
+    proto.im.CreateReply,
+    /**
+     * @param {!proto.im.CreateShopRequest} request
+     * @return {!Uint8Array}
+     */
+    function (request) {
+        return request.serializeBinary();
+    },
+    proto.im.CreateReply.deserializeBinary
+);
+
+
+/**
+ * @const
+ * @type {!grpc.web.AbstractClientBase.MethodInfo<
+ *   !proto.im.CreateShopRequest,
+ *   !proto.im.CreateReply>}
+ */
+const methodInfo_Api_ShopCreate = new grpc.web.AbstractClientBase.MethodInfo(
+    proto.im.CreateReply,
+    /**
+     * @param {!proto.im.CreateShopRequest} request
+     * @return {!Uint8Array}
+     */
+    function (request) {
+        return request.serializeBinary();
+    },
+    proto.im.CreateReply.deserializeBinary
+);
+
+
+/**
+ * @param {!proto.im.CreateShopRequest} request The
+ *     request proto
+ * @param {?Object<string, string>} metadata User defined
+ *     call metadata
+ * @param {function(?grpc.web.Error, ?proto.im.CreateReply)}
+ *     callback The callback function(error, response)
+ * @return {!grpc.web.ClientReadableStream<!proto.im.CreateReply>|undefined}
+ *     The XHR Node Readable Stream
+ */
+proto.im.ApiClient.prototype.shopCreate =
+    function (request, metadata, callback) {
+        return this.client_.rpcCall(this.hostname_ +
+            '/im.Api/ShopCreate',
+            request,
+            metadata || {},
+            methodDescriptor_Api_ShopCreate,
+            callback);
+    };
+
+
+/**
+ * @param {!proto.im.CreateShopRequest} request The
+ *     request proto
+ * @param {?Object<string, string>} metadata User defined
+ *     call metadata
+ * @return {!Promise<!proto.im.CreateReply>}
+ *     Promise that resolves to the response
+ */
+proto.im.ApiPromiseClient.prototype.shopCreate =
+    function (request, metadata) {
+        return this.client_.unaryCall(this.hostname_ +
+            '/im.Api/ShopCreate',
+            request,
+            metadata || {},
+            methodDescriptor_Api_ShopCreate);
+    };
+
+
+/**
+ * @const
+ * @type {!grpc.web.MethodDescriptor<
+ *   !proto.im.ShopListRequest,
+ *   !proto.im.ShopListReply>}
+ */
+const methodDescriptor_Api_ShopList = new grpc.web.MethodDescriptor(
+    '/im.Api/ShopList',
+    grpc.web.MethodType.UNARY,
+    proto.im.ShopListRequest,
+    proto.im.ShopListReply,
+    /**
+     * @param {!proto.im.ShopListRequest} request
+     * @return {!Uint8Array}
+     */
+    function (request) {
+        return request.serializeBinary();
+    },
+    proto.im.ShopListReply.deserializeBinary
+);
+
+
+/**
+ * @const
+ * @type {!grpc.web.AbstractClientBase.MethodInfo<
+ *   !proto.im.ShopListRequest,
+ *   !proto.im.ShopListReply>}
+ */
+const methodInfo_Api_ShopList = new grpc.web.AbstractClientBase.MethodInfo(
+    proto.im.ShopListReply,
+    /**
+     * @param {!proto.im.ShopListRequest} request
+     * @return {!Uint8Array}
+     */
+    function (request) {
+        return request.serializeBinary();
+    },
+    proto.im.ShopListReply.deserializeBinary
+);
+
+
+/**
+ * @param {!proto.im.ShopListRequest} request The
+ *     request proto
+ * @param {?Object<string, string>} metadata User defined
+ *     call metadata
+ * @param {function(?grpc.web.Error, ?proto.im.ShopListReply)}
+ *     callback The callback function(error, response)
+ * @return {!grpc.web.ClientReadableStream<!proto.im.ShopListReply>|undefined}
+ *     The XHR Node Readable Stream
+ */
+proto.im.ApiClient.prototype.shopList =
+    function (request, metadata, callback) {
+        return this.client_.rpcCall(this.hostname_ +
+            '/im.Api/ShopList',
+            request,
+            metadata || {},
+            methodDescriptor_Api_ShopList,
+            callback);
+    };
+
+
+/**
+ * @param {!proto.im.ShopListRequest} request The
+ *     request proto
+ * @param {?Object<string, string>} metadata User defined
+ *     call metadata
+ * @return {!Promise<!proto.im.ShopListReply>}
+ *     Promise that resolves to the response
+ */
+proto.im.ApiPromiseClient.prototype.shopList =
+    function (request, metadata) {
+        return this.client_.unaryCall(this.hostname_ +
+            '/im.Api/ShopList',
+            request,
+            metadata || {},
+            methodDescriptor_Api_ShopList);
+    };
+
+
+/**
+ * @const
+ * @type {!grpc.web.MethodDescriptor<
+ *   !proto.im.SystemAddShopRequest,
+ *   !proto.im.DefaultReply>}
+ */
+const methodDescriptor_Api_SystemAddShop = new grpc.web.MethodDescriptor(
+    '/im.Api/SystemAddShop',
+    grpc.web.MethodType.UNARY,
+    proto.im.SystemAddShopRequest,
+    proto.im.DefaultReply,
+    /**
+     * @param {!proto.im.SystemAddShopRequest} request
+     * @return {!Uint8Array}
+     */
+    function (request) {
+        return request.serializeBinary();
+    },
+    proto.im.DefaultReply.deserializeBinary
+);
+
+
+/**
+ * @const
+ * @type {!grpc.web.AbstractClientBase.MethodInfo<
+ *   !proto.im.SystemAddShopRequest,
+ *   !proto.im.DefaultReply>}
+ */
+const methodInfo_Api_SystemAddShop = new grpc.web.AbstractClientBase.MethodInfo(
+    proto.im.DefaultReply,
+    /**
+     * @param {!proto.im.SystemAddShopRequest} request
+     * @return {!Uint8Array}
+     */
+    function (request) {
+        return request.serializeBinary();
+    },
+    proto.im.DefaultReply.deserializeBinary
+);
+
+
+/**
+ * @param {!proto.im.SystemAddShopRequest} request The
+ *     request proto
+ * @param {?Object<string, string>} metadata User defined
+ *     call metadata
+ * @param {function(?grpc.web.Error, ?proto.im.DefaultReply)}
+ *     callback The callback function(error, response)
+ * @return {!grpc.web.ClientReadableStream<!proto.im.DefaultReply>|undefined}
+ *     The XHR Node Readable Stream
+ */
+proto.im.ApiClient.prototype.systemAddShop =
+    function (request, metadata, callback) {
+        return this.client_.rpcCall(this.hostname_ +
+            '/im.Api/SystemAddShop',
+            request,
+            metadata || {},
+            methodDescriptor_Api_SystemAddShop,
+            callback);
+    };
+
+
+/**
+ * @param {!proto.im.SystemAddShopRequest} request The
+ *     request proto
+ * @param {?Object<string, string>} metadata User defined
+ *     call metadata
+ * @return {!Promise<!proto.im.DefaultReply>}
+ *     Promise that resolves to the response
+ */
+proto.im.ApiPromiseClient.prototype.systemAddShop =
+    function (request, metadata) {
+        return this.client_.unaryCall(this.hostname_ +
+            '/im.Api/SystemAddShop',
+            request,
+            metadata || {},
+            methodDescriptor_Api_SystemAddShop);
+    };
+
+
+/**
+ * @const
+ * @type {!grpc.web.MethodDescriptor<
+ *   !proto.im.SystemAddUserRequest,
+ *   !proto.im.DefaultReply>}
+ */
+const methodDescriptor_Api_SystemAddUser = new grpc.web.MethodDescriptor(
+    '/im.Api/SystemAddUser',
+    grpc.web.MethodType.UNARY,
+    proto.im.SystemAddUserRequest,
+    proto.im.DefaultReply,
+    /**
+     * @param {!proto.im.SystemAddUserRequest} request
+     * @return {!Uint8Array}
+     */
+    function (request) {
+        return request.serializeBinary();
+    },
+    proto.im.DefaultReply.deserializeBinary
+);
+
+
+/**
+ * @const
+ * @type {!grpc.web.AbstractClientBase.MethodInfo<
+ *   !proto.im.SystemAddUserRequest,
+ *   !proto.im.DefaultReply>}
+ */
+const methodInfo_Api_SystemAddUser = new grpc.web.AbstractClientBase.MethodInfo(
+    proto.im.DefaultReply,
+    /**
+     * @param {!proto.im.SystemAddUserRequest} request
+     * @return {!Uint8Array}
+     */
+    function (request) {
+        return request.serializeBinary();
+    },
+    proto.im.DefaultReply.deserializeBinary
+);
+
+
+/**
+ * @param {!proto.im.SystemAddUserRequest} request The
+ *     request proto
+ * @param {?Object<string, string>} metadata User defined
+ *     call metadata
+ * @param {function(?grpc.web.Error, ?proto.im.DefaultReply)}
+ *     callback The callback function(error, response)
+ * @return {!grpc.web.ClientReadableStream<!proto.im.DefaultReply>|undefined}
+ *     The XHR Node Readable Stream
+ */
+proto.im.ApiClient.prototype.systemAddUser =
+    function (request, metadata, callback) {
+        return this.client_.rpcCall(this.hostname_ +
+            '/im.Api/SystemAddUser',
+            request,
+            metadata || {},
+            methodDescriptor_Api_SystemAddUser,
+            callback);
+    };
+
+
+/**
+ * @param {!proto.im.SystemAddUserRequest} request The
+ *     request proto
+ * @param {?Object<string, string>} metadata User defined
+ *     call metadata
+ * @return {!Promise<!proto.im.DefaultReply>}
+ *     Promise that resolves to the response
+ */
+proto.im.ApiPromiseClient.prototype.systemAddUser =
+    function (request, metadata) {
+        return this.client_.unaryCall(this.hostname_ +
+            '/im.Api/SystemAddUser',
+            request,
+            metadata || {},
+            methodDescriptor_Api_SystemAddUser);
+    };
+
+
+/**
+ * @const
+ * @type {!grpc.web.MethodDescriptor<
+ *   !proto.im.CreateSystemRequest,
+ *   !proto.im.TokenParam>}
+ */
+const methodDescriptor_Api_IMSystemCreate = new grpc.web.MethodDescriptor(
+    '/im.Api/IMSystemCreate',
+    grpc.web.MethodType.UNARY,
+    proto.im.CreateSystemRequest,
+    proto.im.TokenParam,
+    /**
+     * @param {!proto.im.CreateSystemRequest} request
+     * @return {!Uint8Array}
+     */
+    function (request) {
+        return request.serializeBinary();
+    },
+    proto.im.TokenParam.deserializeBinary
+);
+
+
+/**
+ * @const
+ * @type {!grpc.web.AbstractClientBase.MethodInfo<
+ *   !proto.im.CreateSystemRequest,
+ *   !proto.im.TokenParam>}
+ */
+const methodInfo_Api_IMSystemCreate = new grpc.web.AbstractClientBase.MethodInfo(
+    proto.im.TokenParam,
+    /**
+     * @param {!proto.im.CreateSystemRequest} request
+     * @return {!Uint8Array}
+     */
+    function (request) {
+        return request.serializeBinary();
+    },
+    proto.im.TokenParam.deserializeBinary
+);
+
+
+/**
+ * @param {!proto.im.CreateSystemRequest} request The
+ *     request proto
+ * @param {?Object<string, string>} metadata User defined
+ *     call metadata
+ * @param {function(?grpc.web.Error, ?proto.im.TokenParam)}
+ *     callback The callback function(error, response)
+ * @return {!grpc.web.ClientReadableStream<!proto.im.TokenParam>|undefined}
+ *     The XHR Node Readable Stream
+ */
+proto.im.ApiClient.prototype.iMSystemCreate =
+    function (request, metadata, callback) {
+        return this.client_.rpcCall(this.hostname_ +
+            '/im.Api/IMSystemCreate',
+            request,
+            metadata || {},
+            methodDescriptor_Api_IMSystemCreate,
+            callback);
+    };
+
+
+/**
+ * @param {!proto.im.CreateSystemRequest} request The
+ *     request proto
+ * @param {?Object<string, string>} metadata User defined
+ *     call metadata
+ * @return {!Promise<!proto.im.TokenParam>}
+ *     Promise that resolves to the response
+ */
+proto.im.ApiPromiseClient.prototype.iMSystemCreate =
+    function (request, metadata) {
+        return this.client_.unaryCall(this.hostname_ +
+            '/im.Api/IMSystemCreate',
+            request,
+            metadata || {},
+            methodDescriptor_Api_IMSystemCreate);
+    };
+
+
+/**
+ * @const
+ * @type {!grpc.web.MethodDescriptor<
+ *   !proto.im.DefaultRequest,
+ *   !proto.im.DefaultReply>}
+ */
+const methodDescriptor_Api_IMSignOut = new grpc.web.MethodDescriptor(
+    '/im.Api/IMSignOut',
+    grpc.web.MethodType.UNARY,
+    proto.im.DefaultRequest,
+    proto.im.DefaultReply,
+    /**
+     * @param {!proto.im.DefaultRequest} request
+     * @return {!Uint8Array}
+     */
+    function (request) {
+        return request.serializeBinary();
+    },
+    proto.im.DefaultReply.deserializeBinary
+);
+
+
+/**
+ * @const
+ * @type {!grpc.web.AbstractClientBase.MethodInfo<
+ *   !proto.im.DefaultRequest,
+ *   !proto.im.DefaultReply>}
+ */
+const methodInfo_Api_IMSignOut = new grpc.web.AbstractClientBase.MethodInfo(
+    proto.im.DefaultReply,
+    /**
+     * @param {!proto.im.DefaultRequest} request
+     * @return {!Uint8Array}
+     */
+    function (request) {
+        return request.serializeBinary();
+    },
+    proto.im.DefaultReply.deserializeBinary
+);
+
+
+/**
+ * @param {!proto.im.DefaultRequest} request The
+ *     request proto
+ * @param {?Object<string, string>} metadata User defined
+ *     call metadata
+ * @param {function(?grpc.web.Error, ?proto.im.DefaultReply)}
+ *     callback The callback function(error, response)
+ * @return {!grpc.web.ClientReadableStream<!proto.im.DefaultReply>|undefined}
+ *     The XHR Node Readable Stream
+ */
+proto.im.ApiClient.prototype.iMSignOut =
+    function (request, metadata, callback) {
+        return this.client_.rpcCall(this.hostname_ +
+            '/im.Api/IMSignOut',
+            request,
+            metadata || {},
+            methodDescriptor_Api_IMSignOut,
+            callback);
+    };
+
+
+/**
+ * @param {!proto.im.DefaultRequest} request The
+ *     request proto
+ * @param {?Object<string, string>} metadata User defined
+ *     call metadata
+ * @return {!Promise<!proto.im.DefaultReply>}
+ *     Promise that resolves to the response
+ */
+proto.im.ApiPromiseClient.prototype.iMSignOut =
+    function (request, metadata) {
+        return this.client_.unaryCall(this.hostname_ +
+            '/im.Api/IMSignOut',
+            request,
+            metadata || {},
+            methodDescriptor_Api_IMSignOut);
+    };
+
+
+/**
+ * @const
+ * @type {!grpc.web.MethodDescriptor<
+ *   !proto.im.DefaultRequest,
+ *   !proto.im.UserInfo>}
+ */
+const methodDescriptor_Api_IMSelfInfo = new grpc.web.MethodDescriptor(
+    '/im.Api/IMSelfInfo',
+    grpc.web.MethodType.UNARY,
+    proto.im.DefaultRequest,
+    proto.im.UserInfo,
+    /**
+     * @param {!proto.im.DefaultRequest} request
+     * @return {!Uint8Array}
+     */
+    function (request) {
+        return request.serializeBinary();
+    },
+    proto.im.UserInfo.deserializeBinary
+);
+
+
+/**
+ * @const
+ * @type {!grpc.web.AbstractClientBase.MethodInfo<
+ *   !proto.im.DefaultRequest,
+ *   !proto.im.UserInfo>}
+ */
+const methodInfo_Api_IMSelfInfo = new grpc.web.AbstractClientBase.MethodInfo(
+    proto.im.UserInfo,
+    /**
+     * @param {!proto.im.DefaultRequest} request
+     * @return {!Uint8Array}
+     */
+    function (request) {
+        return request.serializeBinary();
+    },
+    proto.im.UserInfo.deserializeBinary
+);
+
+
+/**
+ * @param {!proto.im.DefaultRequest} request The
+ *     request proto
+ * @param {?Object<string, string>} metadata User defined
+ *     call metadata
+ * @param {function(?grpc.web.Error, ?proto.im.UserInfo)}
+ *     callback The callback function(error, response)
+ * @return {!grpc.web.ClientReadableStream<!proto.im.UserInfo>|undefined}
+ *     The XHR Node Readable Stream
+ */
+proto.im.ApiClient.prototype.iMSelfInfo =
+    function (request, metadata, callback) {
+        return this.client_.rpcCall(this.hostname_ +
+            '/im.Api/IMSelfInfo',
+            request,
+            metadata || {},
+            methodDescriptor_Api_IMSelfInfo,
+            callback);
+    };
+
+
+/**
+ * @param {!proto.im.DefaultRequest} request The
+ *     request proto
+ * @param {?Object<string, string>} metadata User defined
+ *     call metadata
+ * @return {!Promise<!proto.im.UserInfo>}
+ *     Promise that resolves to the response
+ */
+proto.im.ApiPromiseClient.prototype.iMSelfInfo =
+    function (request, metadata) {
+        return this.client_.unaryCall(this.hostname_ +
+            '/im.Api/IMSelfInfo',
+            request,
+            metadata || {},
+            methodDescriptor_Api_IMSelfInfo);
+    };
+
+
+/**
+ * @const
+ * @type {!grpc.web.MethodDescriptor<
+ *   !proto.im.DefaultRequest,
+ *   !proto.im.Message>}
+ */
+const methodDescriptor_Api_IMMessageRcv = new grpc.web.MethodDescriptor(
+    '/im.Api/IMMessageRcv',
+    grpc.web.MethodType.SERVER_STREAMING,
+    proto.im.DefaultRequest,
+    proto.im.Message,
+    /**
+     * @param {!proto.im.DefaultRequest} request
+     * @return {!Uint8Array}
+     */
+    function (request) {
+        return request.serializeBinary();
+    },
+    proto.im.Message.deserializeBinary
+);
+
+
+/**
+ * @const
+ * @type {!grpc.web.AbstractClientBase.MethodInfo<
+ *   !proto.im.DefaultRequest,
+ *   !proto.im.Message>}
+ */
+const methodInfo_Api_IMMessageRcv = new grpc.web.AbstractClientBase.MethodInfo(
+    proto.im.Message,
+    /**
+     * @param {!proto.im.DefaultRequest} request
+     * @return {!Uint8Array}
+     */
+    function (request) {
+        return request.serializeBinary();
+    },
+    proto.im.Message.deserializeBinary
+);
+
+
+/**
+ * @param {!proto.im.DefaultRequest} request The request proto
+ * @param {?Object<string, string>} metadata User defined
+ *     call metadata
+ * @return {!grpc.web.ClientReadableStream<!proto.im.Message>}
+ *     The XHR Node Readable Stream
+ */
+proto.im.ApiClient.prototype.iMMessageRcv =
+    function (request, metadata) {
+        return this.client_.serverStreaming(this.hostname_ +
+            '/im.Api/IMMessageRcv',
+            request,
+            metadata || {},
+            methodDescriptor_Api_IMMessageRcv);
+    };
+
+
+/**
+ * @param {!proto.im.DefaultRequest} request The request proto
+ * @param {?Object<string, string>} metadata User defined
+ *     call metadata
+ * @return {!grpc.web.ClientReadableStream<!proto.im.Message>}
+ *     The XHR Node Readable Stream
+ */
+proto.im.ApiPromiseClient.prototype.iMMessageRcv =
+    function (request, metadata) {
+        return this.client_.serverStreaming(this.hostname_ +
+            '/im.Api/IMMessageRcv',
+            request,
+            metadata || {},
+            methodDescriptor_Api_IMMessageRcv);
+    };
+
+
+module.exports = proto.im;
+

+ 7545 - 0
src/grpc/im_pb.js

@@ -0,0 +1,7545 @@
+// source: im.proto
+/**
+ * @fileoverview
+ * @enhanceable
+ * @suppress {missingRequire} reports error on implicit type usages.
+ * @suppress {messageConventions} JS Compiler reports an error if a variable or
+ *     field starts with 'MSG_' and isn't a translatable message.
+ * @public
+ */
+// GENERATED CODE -- DO NOT EDIT!
+/* eslint-disable */
+// @ts-nocheck
+
+var jspb = require('google-protobuf');
+var goog = jspb;
+var global = Function('return this')();
+
+goog.exportSymbol('proto.im.Column', null, global);
+goog.exportSymbol('proto.im.CreateReply', null, global);
+goog.exportSymbol('proto.im.CreateRoleRequest', null, global);
+goog.exportSymbol('proto.im.CreateShopRequest', null, global);
+goog.exportSymbol('proto.im.CreateSystemRequest', null, global);
+goog.exportSymbol('proto.im.DefaultReply', null, global);
+goog.exportSymbol('proto.im.DefaultRequest', null, global);
+goog.exportSymbol('proto.im.ErrorCode', null, global);
+goog.exportSymbol('proto.im.Message', null, global);
+goog.exportSymbol('proto.im.Message.Level', null, global);
+goog.exportSymbol('proto.im.PermissionCheck', null, global);
+goog.exportSymbol('proto.im.Role', null, global);
+goog.exportSymbol('proto.im.RoleListReply', null, global);
+goog.exportSymbol('proto.im.RoleListRequest', null, global);
+goog.exportSymbol('proto.im.RolePermissionRequest', null, global);
+goog.exportSymbol('proto.im.SaveServiceListRequest', null, global);
+goog.exportSymbol('proto.im.Service', null, global);
+goog.exportSymbol('proto.im.ServiceListReply', null, global);
+goog.exportSymbol('proto.im.ServiceListRequest', null, global);
+goog.exportSymbol('proto.im.ServiceRemoveRequest', null, global);
+goog.exportSymbol('proto.im.SessionCheckReply', null, global);
+goog.exportSymbol('proto.im.ShopInfo', null, global);
+goog.exportSymbol('proto.im.ShopListReply', null, global);
+goog.exportSymbol('proto.im.ShopListRequest', null, global);
+goog.exportSymbol('proto.im.SignInPasswordRequest', null, global);
+goog.exportSymbol('proto.im.SignUpReply', null, global);
+goog.exportSymbol('proto.im.SignUpRequest', null, global);
+goog.exportSymbol('proto.im.Status', null, global);
+goog.exportSymbol('proto.im.SystemAddShopRequest', null, global);
+goog.exportSymbol('proto.im.SystemAddUserRequest', null, global);
+goog.exportSymbol('proto.im.TokenParam', null, global);
+goog.exportSymbol('proto.im.UserGetColumnListReply', null, global);
+goog.exportSymbol('proto.im.UserGetColumnListRequest', null, global);
+goog.exportSymbol('proto.im.UserGetInfoRequest', null, global);
+goog.exportSymbol('proto.im.UserInfo', null, global);
+goog.exportSymbol('proto.im.UserListReply', null, global);
+goog.exportSymbol('proto.im.UserListRequest', null, global);
+goog.exportSymbol('proto.im.UserRolesRequest', null, global);
+/**
+ * Generated by JsPbCodeGenerator.
+ * @param {Array=} opt_data Optional initial data array, typically from a
+ * server response, or constructed directly in Javascript. The array is used
+ * in place and becomes part of the constructed object. It is not cloned.
+ * If no data is provided, the constructed object will be empty, but still
+ * valid.
+ * @extends {jspb.Message}
+ * @constructor
+ */
+proto.im.DefaultRequest = function (opt_data) {
+    jspb.Message.initialize(this, opt_data, 0, -1, null, null);
+};
+goog.inherits(proto.im.DefaultRequest, jspb.Message);
+if (goog.DEBUG && !COMPILED) {
+    /**
+     * @public
+     * @override
+     */
+    proto.im.DefaultRequest.displayName = 'proto.im.DefaultRequest';
+}
+/**
+ * Generated by JsPbCodeGenerator.
+ * @param {Array=} opt_data Optional initial data array, typically from a
+ * server response, or constructed directly in Javascript. The array is used
+ * in place and becomes part of the constructed object. It is not cloned.
+ * If no data is provided, the constructed object will be empty, but still
+ * valid.
+ * @extends {jspb.Message}
+ * @constructor
+ */
+proto.im.TokenParam = function (opt_data) {
+    jspb.Message.initialize(this, opt_data, 0, -1, null, null);
+};
+goog.inherits(proto.im.TokenParam, jspb.Message);
+if (goog.DEBUG && !COMPILED) {
+    /**
+     * @public
+     * @override
+     */
+    proto.im.TokenParam.displayName = 'proto.im.TokenParam';
+}
+/**
+ * Generated by JsPbCodeGenerator.
+ * @param {Array=} opt_data Optional initial data array, typically from a
+ * server response, or constructed directly in Javascript. The array is used
+ * in place and becomes part of the constructed object. It is not cloned.
+ * If no data is provided, the constructed object will be empty, but still
+ * valid.
+ * @extends {jspb.Message}
+ * @constructor
+ */
+proto.im.DefaultReply = function (opt_data) {
+    jspb.Message.initialize(this, opt_data, 0, -1, null, null);
+};
+goog.inherits(proto.im.DefaultReply, jspb.Message);
+if (goog.DEBUG && !COMPILED) {
+    /**
+     * @public
+     * @override
+     */
+    proto.im.DefaultReply.displayName = 'proto.im.DefaultReply';
+}
+/**
+ * Generated by JsPbCodeGenerator.
+ * @param {Array=} opt_data Optional initial data array, typically from a
+ * server response, or constructed directly in Javascript. The array is used
+ * in place and becomes part of the constructed object. It is not cloned.
+ * If no data is provided, the constructed object will be empty, but still
+ * valid.
+ * @extends {jspb.Message}
+ * @constructor
+ */
+proto.im.SignUpReply = function (opt_data) {
+    jspb.Message.initialize(this, opt_data, 0, -1, null, null);
+};
+goog.inherits(proto.im.SignUpReply, jspb.Message);
+if (goog.DEBUG && !COMPILED) {
+    /**
+     * @public
+     * @override
+     */
+    proto.im.SignUpReply.displayName = 'proto.im.SignUpReply';
+}
+/**
+ * Generated by JsPbCodeGenerator.
+ * @param {Array=} opt_data Optional initial data array, typically from a
+ * server response, or constructed directly in Javascript. The array is used
+ * in place and becomes part of the constructed object. It is not cloned.
+ * If no data is provided, the constructed object will be empty, but still
+ * valid.
+ * @extends {jspb.Message}
+ * @constructor
+ */
+proto.im.SignInPasswordRequest = function (opt_data) {
+    jspb.Message.initialize(this, opt_data, 0, -1, null, null);
+};
+goog.inherits(proto.im.SignInPasswordRequest, jspb.Message);
+if (goog.DEBUG && !COMPILED) {
+    /**
+     * @public
+     * @override
+     */
+    proto.im.SignInPasswordRequest.displayName = 'proto.im.SignInPasswordRequest';
+}
+/**
+ * Generated by JsPbCodeGenerator.
+ * @param {Array=} opt_data Optional initial data array, typically from a
+ * server response, or constructed directly in Javascript. The array is used
+ * in place and becomes part of the constructed object. It is not cloned.
+ * If no data is provided, the constructed object will be empty, but still
+ * valid.
+ * @extends {jspb.Message}
+ * @constructor
+ */
+proto.im.SignUpRequest = function (opt_data) {
+    jspb.Message.initialize(this, opt_data, 0, -1, null, null);
+};
+goog.inherits(proto.im.SignUpRequest, jspb.Message);
+if (goog.DEBUG && !COMPILED) {
+    /**
+     * @public
+     * @override
+     */
+    proto.im.SignUpRequest.displayName = 'proto.im.SignUpRequest';
+}
+/**
+ * Generated by JsPbCodeGenerator.
+ * @param {Array=} opt_data Optional initial data array, typically from a
+ * server response, or constructed directly in Javascript. The array is used
+ * in place and becomes part of the constructed object. It is not cloned.
+ * If no data is provided, the constructed object will be empty, but still
+ * valid.
+ * @extends {jspb.Message}
+ * @constructor
+ */
+proto.im.UserInfo = function (opt_data) {
+    jspb.Message.initialize(this, opt_data, 0, -1, null, null);
+};
+goog.inherits(proto.im.UserInfo, jspb.Message);
+if (goog.DEBUG && !COMPILED) {
+    /**
+     * @public
+     * @override
+     */
+    proto.im.UserInfo.displayName = 'proto.im.UserInfo';
+}
+/**
+ * Generated by JsPbCodeGenerator.
+ * @param {Array=} opt_data Optional initial data array, typically from a
+ * server response, or constructed directly in Javascript. The array is used
+ * in place and becomes part of the constructed object. It is not cloned.
+ * If no data is provided, the constructed object will be empty, but still
+ * valid.
+ * @extends {jspb.Message}
+ * @constructor
+ */
+proto.im.CreateReply = function (opt_data) {
+    jspb.Message.initialize(this, opt_data, 0, -1, null, null);
+};
+goog.inherits(proto.im.CreateReply, jspb.Message);
+if (goog.DEBUG && !COMPILED) {
+    /**
+     * @public
+     * @override
+     */
+    proto.im.CreateReply.displayName = 'proto.im.CreateReply';
+}
+/**
+ * Generated by JsPbCodeGenerator.
+ * @param {Array=} opt_data Optional initial data array, typically from a
+ * server response, or constructed directly in Javascript. The array is used
+ * in place and becomes part of the constructed object. It is not cloned.
+ * If no data is provided, the constructed object will be empty, but still
+ * valid.
+ * @extends {jspb.Message}
+ * @constructor
+ */
+proto.im.PermissionCheck = function (opt_data) {
+    jspb.Message.initialize(this, opt_data, 0, -1, null, null);
+};
+goog.inherits(proto.im.PermissionCheck, jspb.Message);
+if (goog.DEBUG && !COMPILED) {
+    /**
+     * @public
+     * @override
+     */
+    proto.im.PermissionCheck.displayName = 'proto.im.PermissionCheck';
+}
+/**
+ * Generated by JsPbCodeGenerator.
+ * @param {Array=} opt_data Optional initial data array, typically from a
+ * server response, or constructed directly in Javascript. The array is used
+ * in place and becomes part of the constructed object. It is not cloned.
+ * If no data is provided, the constructed object will be empty, but still
+ * valid.
+ * @extends {jspb.Message}
+ * @constructor
+ */
+proto.im.SessionCheckReply = function (opt_data) {
+    jspb.Message.initialize(this, opt_data, 0, -1, null, null);
+};
+goog.inherits(proto.im.SessionCheckReply, jspb.Message);
+if (goog.DEBUG && !COMPILED) {
+    /**
+     * @public
+     * @override
+     */
+    proto.im.SessionCheckReply.displayName = 'proto.im.SessionCheckReply';
+}
+/**
+ * Generated by JsPbCodeGenerator.
+ * @param {Array=} opt_data Optional initial data array, typically from a
+ * server response, or constructed directly in Javascript. The array is used
+ * in place and becomes part of the constructed object. It is not cloned.
+ * If no data is provided, the constructed object will be empty, but still
+ * valid.
+ * @extends {jspb.Message}
+ * @constructor
+ */
+proto.im.Service = function (opt_data) {
+    jspb.Message.initialize(this, opt_data, 0, -1, null, null);
+};
+goog.inherits(proto.im.Service, jspb.Message);
+if (goog.DEBUG && !COMPILED) {
+    /**
+     * @public
+     * @override
+     */
+    proto.im.Service.displayName = 'proto.im.Service';
+}
+/**
+ * Generated by JsPbCodeGenerator.
+ * @param {Array=} opt_data Optional initial data array, typically from a
+ * server response, or constructed directly in Javascript. The array is used
+ * in place and becomes part of the constructed object. It is not cloned.
+ * If no data is provided, the constructed object will be empty, but still
+ * valid.
+ * @extends {jspb.Message}
+ * @constructor
+ */
+proto.im.SaveServiceListRequest = function (opt_data) {
+    jspb.Message.initialize(this, opt_data, 0, -1, proto.im.SaveServiceListRequest.repeatedFields_, null);
+};
+goog.inherits(proto.im.SaveServiceListRequest, jspb.Message);
+if (goog.DEBUG && !COMPILED) {
+    /**
+     * @public
+     * @override
+     */
+    proto.im.SaveServiceListRequest.displayName = 'proto.im.SaveServiceListRequest';
+}
+/**
+ * Generated by JsPbCodeGenerator.
+ * @param {Array=} opt_data Optional initial data array, typically from a
+ * server response, or constructed directly in Javascript. The array is used
+ * in place and becomes part of the constructed object. It is not cloned.
+ * If no data is provided, the constructed object will be empty, but still
+ * valid.
+ * @extends {jspb.Message}
+ * @constructor
+ */
+proto.im.CreateSystemRequest = function (opt_data) {
+    jspb.Message.initialize(this, opt_data, 0, -1, null, null);
+};
+goog.inherits(proto.im.CreateSystemRequest, jspb.Message);
+if (goog.DEBUG && !COMPILED) {
+    /**
+     * @public
+     * @override
+     */
+    proto.im.CreateSystemRequest.displayName = 'proto.im.CreateSystemRequest';
+}
+/**
+ * Generated by JsPbCodeGenerator.
+ * @param {Array=} opt_data Optional initial data array, typically from a
+ * server response, or constructed directly in Javascript. The array is used
+ * in place and becomes part of the constructed object. It is not cloned.
+ * If no data is provided, the constructed object will be empty, but still
+ * valid.
+ * @extends {jspb.Message}
+ * @constructor
+ */
+proto.im.UserGetColumnListRequest = function (opt_data) {
+    jspb.Message.initialize(this, opt_data, 0, -1, null, null);
+};
+goog.inherits(proto.im.UserGetColumnListRequest, jspb.Message);
+if (goog.DEBUG && !COMPILED) {
+    /**
+     * @public
+     * @override
+     */
+    proto.im.UserGetColumnListRequest.displayName = 'proto.im.UserGetColumnListRequest';
+}
+/**
+ * Generated by JsPbCodeGenerator.
+ * @param {Array=} opt_data Optional initial data array, typically from a
+ * server response, or constructed directly in Javascript. The array is used
+ * in place and becomes part of the constructed object. It is not cloned.
+ * If no data is provided, the constructed object will be empty, but still
+ * valid.
+ * @extends {jspb.Message}
+ * @constructor
+ */
+proto.im.Column = function (opt_data) {
+    jspb.Message.initialize(this, opt_data, 0, -1, null, null);
+};
+goog.inherits(proto.im.Column, jspb.Message);
+if (goog.DEBUG && !COMPILED) {
+    /**
+     * @public
+     * @override
+     */
+    proto.im.Column.displayName = 'proto.im.Column';
+}
+/**
+ * Generated by JsPbCodeGenerator.
+ * @param {Array=} opt_data Optional initial data array, typically from a
+ * server response, or constructed directly in Javascript. The array is used
+ * in place and becomes part of the constructed object. It is not cloned.
+ * If no data is provided, the constructed object will be empty, but still
+ * valid.
+ * @extends {jspb.Message}
+ * @constructor
+ */
+proto.im.UserGetColumnListReply = function (opt_data) {
+    jspb.Message.initialize(this, opt_data, 0, -1, proto.im.UserGetColumnListReply.repeatedFields_, null);
+};
+goog.inherits(proto.im.UserGetColumnListReply, jspb.Message);
+if (goog.DEBUG && !COMPILED) {
+    /**
+     * @public
+     * @override
+     */
+    proto.im.UserGetColumnListReply.displayName = 'proto.im.UserGetColumnListReply';
+}
+/**
+ * Generated by JsPbCodeGenerator.
+ * @param {Array=} opt_data Optional initial data array, typically from a
+ * server response, or constructed directly in Javascript. The array is used
+ * in place and becomes part of the constructed object. It is not cloned.
+ * If no data is provided, the constructed object will be empty, but still
+ * valid.
+ * @extends {jspb.Message}
+ * @constructor
+ */
+proto.im.CreateRoleRequest = function (opt_data) {
+    jspb.Message.initialize(this, opt_data, 0, -1, null, null);
+};
+goog.inherits(proto.im.CreateRoleRequest, jspb.Message);
+if (goog.DEBUG && !COMPILED) {
+    /**
+     * @public
+     * @override
+     */
+    proto.im.CreateRoleRequest.displayName = 'proto.im.CreateRoleRequest';
+}
+/**
+ * Generated by JsPbCodeGenerator.
+ * @param {Array=} opt_data Optional initial data array, typically from a
+ * server response, or constructed directly in Javascript. The array is used
+ * in place and becomes part of the constructed object. It is not cloned.
+ * If no data is provided, the constructed object will be empty, but still
+ * valid.
+ * @extends {jspb.Message}
+ * @constructor
+ */
+proto.im.Role = function (opt_data) {
+    jspb.Message.initialize(this, opt_data, 0, -1, null, null);
+};
+goog.inherits(proto.im.Role, jspb.Message);
+if (goog.DEBUG && !COMPILED) {
+    /**
+     * @public
+     * @override
+     */
+    proto.im.Role.displayName = 'proto.im.Role';
+}
+/**
+ * Generated by JsPbCodeGenerator.
+ * @param {Array=} opt_data Optional initial data array, typically from a
+ * server response, or constructed directly in Javascript. The array is used
+ * in place and becomes part of the constructed object. It is not cloned.
+ * If no data is provided, the constructed object will be empty, but still
+ * valid.
+ * @extends {jspb.Message}
+ * @constructor
+ */
+proto.im.RoleListRequest = function (opt_data) {
+    jspb.Message.initialize(this, opt_data, 0, -1, null, null);
+};
+goog.inherits(proto.im.RoleListRequest, jspb.Message);
+if (goog.DEBUG && !COMPILED) {
+    /**
+     * @public
+     * @override
+     */
+    proto.im.RoleListRequest.displayName = 'proto.im.RoleListRequest';
+}
+/**
+ * Generated by JsPbCodeGenerator.
+ * @param {Array=} opt_data Optional initial data array, typically from a
+ * server response, or constructed directly in Javascript. The array is used
+ * in place and becomes part of the constructed object. It is not cloned.
+ * If no data is provided, the constructed object will be empty, but still
+ * valid.
+ * @extends {jspb.Message}
+ * @constructor
+ */
+proto.im.UserListRequest = function (opt_data) {
+    jspb.Message.initialize(this, opt_data, 0, -1, null, null);
+};
+goog.inherits(proto.im.UserListRequest, jspb.Message);
+if (goog.DEBUG && !COMPILED) {
+    /**
+     * @public
+     * @override
+     */
+    proto.im.UserListRequest.displayName = 'proto.im.UserListRequest';
+}
+/**
+ * Generated by JsPbCodeGenerator.
+ * @param {Array=} opt_data Optional initial data array, typically from a
+ * server response, or constructed directly in Javascript. The array is used
+ * in place and becomes part of the constructed object. It is not cloned.
+ * If no data is provided, the constructed object will be empty, but still
+ * valid.
+ * @extends {jspb.Message}
+ * @constructor
+ */
+proto.im.UserListReply = function (opt_data) {
+    jspb.Message.initialize(this, opt_data, 0, -1, proto.im.UserListReply.repeatedFields_, null);
+};
+goog.inherits(proto.im.UserListReply, jspb.Message);
+if (goog.DEBUG && !COMPILED) {
+    /**
+     * @public
+     * @override
+     */
+    proto.im.UserListReply.displayName = 'proto.im.UserListReply';
+}
+/**
+ * Generated by JsPbCodeGenerator.
+ * @param {Array=} opt_data Optional initial data array, typically from a
+ * server response, or constructed directly in Javascript. The array is used
+ * in place and becomes part of the constructed object. It is not cloned.
+ * If no data is provided, the constructed object will be empty, but still
+ * valid.
+ * @extends {jspb.Message}
+ * @constructor
+ */
+proto.im.UserGetInfoRequest = function (opt_data) {
+    jspb.Message.initialize(this, opt_data, 0, -1, null, null);
+};
+goog.inherits(proto.im.UserGetInfoRequest, jspb.Message);
+if (goog.DEBUG && !COMPILED) {
+    /**
+     * @public
+     * @override
+     */
+    proto.im.UserGetInfoRequest.displayName = 'proto.im.UserGetInfoRequest';
+}
+/**
+ * Generated by JsPbCodeGenerator.
+ * @param {Array=} opt_data Optional initial data array, typically from a
+ * server response, or constructed directly in Javascript. The array is used
+ * in place and becomes part of the constructed object. It is not cloned.
+ * If no data is provided, the constructed object will be empty, but still
+ * valid.
+ * @extends {jspb.Message}
+ * @constructor
+ */
+proto.im.UserRolesRequest = function (opt_data) {
+    jspb.Message.initialize(this, opt_data, 0, -1, proto.im.UserRolesRequest.repeatedFields_, null);
+};
+goog.inherits(proto.im.UserRolesRequest, jspb.Message);
+if (goog.DEBUG && !COMPILED) {
+    /**
+     * @public
+     * @override
+     */
+    proto.im.UserRolesRequest.displayName = 'proto.im.UserRolesRequest';
+}
+/**
+ * Generated by JsPbCodeGenerator.
+ * @param {Array=} opt_data Optional initial data array, typically from a
+ * server response, or constructed directly in Javascript. The array is used
+ * in place and becomes part of the constructed object. It is not cloned.
+ * If no data is provided, the constructed object will be empty, but still
+ * valid.
+ * @extends {jspb.Message}
+ * @constructor
+ */
+proto.im.RoleListReply = function (opt_data) {
+    jspb.Message.initialize(this, opt_data, 0, -1, proto.im.RoleListReply.repeatedFields_, null);
+};
+goog.inherits(proto.im.RoleListReply, jspb.Message);
+if (goog.DEBUG && !COMPILED) {
+    /**
+     * @public
+     * @override
+     */
+    proto.im.RoleListReply.displayName = 'proto.im.RoleListReply';
+}
+/**
+ * Generated by JsPbCodeGenerator.
+ * @param {Array=} opt_data Optional initial data array, typically from a
+ * server response, or constructed directly in Javascript. The array is used
+ * in place and becomes part of the constructed object. It is not cloned.
+ * If no data is provided, the constructed object will be empty, but still
+ * valid.
+ * @extends {jspb.Message}
+ * @constructor
+ */
+proto.im.RolePermissionRequest = function (opt_data) {
+    jspb.Message.initialize(this, opt_data, 0, -1, proto.im.RolePermissionRequest.repeatedFields_, null);
+};
+goog.inherits(proto.im.RolePermissionRequest, jspb.Message);
+if (goog.DEBUG && !COMPILED) {
+    /**
+     * @public
+     * @override
+     */
+    proto.im.RolePermissionRequest.displayName = 'proto.im.RolePermissionRequest';
+}
+/**
+ * Generated by JsPbCodeGenerator.
+ * @param {Array=} opt_data Optional initial data array, typically from a
+ * server response, or constructed directly in Javascript. The array is used
+ * in place and becomes part of the constructed object. It is not cloned.
+ * If no data is provided, the constructed object will be empty, but still
+ * valid.
+ * @extends {jspb.Message}
+ * @constructor
+ */
+proto.im.ServiceListRequest = function (opt_data) {
+    jspb.Message.initialize(this, opt_data, 0, -1, null, null);
+};
+goog.inherits(proto.im.ServiceListRequest, jspb.Message);
+if (goog.DEBUG && !COMPILED) {
+    /**
+     * @public
+     * @override
+     */
+    proto.im.ServiceListRequest.displayName = 'proto.im.ServiceListRequest';
+}
+/**
+ * Generated by JsPbCodeGenerator.
+ * @param {Array=} opt_data Optional initial data array, typically from a
+ * server response, or constructed directly in Javascript. The array is used
+ * in place and becomes part of the constructed object. It is not cloned.
+ * If no data is provided, the constructed object will be empty, but still
+ * valid.
+ * @extends {jspb.Message}
+ * @constructor
+ */
+proto.im.ServiceListReply = function (opt_data) {
+    jspb.Message.initialize(this, opt_data, 0, -1, proto.im.ServiceListReply.repeatedFields_, null);
+};
+goog.inherits(proto.im.ServiceListReply, jspb.Message);
+if (goog.DEBUG && !COMPILED) {
+    /**
+     * @public
+     * @override
+     */
+    proto.im.ServiceListReply.displayName = 'proto.im.ServiceListReply';
+}
+/**
+ * Generated by JsPbCodeGenerator.
+ * @param {Array=} opt_data Optional initial data array, typically from a
+ * server response, or constructed directly in Javascript. The array is used
+ * in place and becomes part of the constructed object. It is not cloned.
+ * If no data is provided, the constructed object will be empty, but still
+ * valid.
+ * @extends {jspb.Message}
+ * @constructor
+ */
+proto.im.ServiceRemoveRequest = function (opt_data) {
+    jspb.Message.initialize(this, opt_data, 0, -1, proto.im.ServiceRemoveRequest.repeatedFields_, null);
+};
+goog.inherits(proto.im.ServiceRemoveRequest, jspb.Message);
+if (goog.DEBUG && !COMPILED) {
+    /**
+     * @public
+     * @override
+     */
+    proto.im.ServiceRemoveRequest.displayName = 'proto.im.ServiceRemoveRequest';
+}
+/**
+ * Generated by JsPbCodeGenerator.
+ * @param {Array=} opt_data Optional initial data array, typically from a
+ * server response, or constructed directly in Javascript. The array is used
+ * in place and becomes part of the constructed object. It is not cloned.
+ * If no data is provided, the constructed object will be empty, but still
+ * valid.
+ * @extends {jspb.Message}
+ * @constructor
+ */
+proto.im.CreateShopRequest = function (opt_data) {
+    jspb.Message.initialize(this, opt_data, 0, -1, null, null);
+};
+goog.inherits(proto.im.CreateShopRequest, jspb.Message);
+if (goog.DEBUG && !COMPILED) {
+    /**
+     * @public
+     * @override
+     */
+    proto.im.CreateShopRequest.displayName = 'proto.im.CreateShopRequest';
+}
+/**
+ * Generated by JsPbCodeGenerator.
+ * @param {Array=} opt_data Optional initial data array, typically from a
+ * server response, or constructed directly in Javascript. The array is used
+ * in place and becomes part of the constructed object. It is not cloned.
+ * If no data is provided, the constructed object will be empty, but still
+ * valid.
+ * @extends {jspb.Message}
+ * @constructor
+ */
+proto.im.ShopListRequest = function (opt_data) {
+    jspb.Message.initialize(this, opt_data, 0, -1, null, null);
+};
+goog.inherits(proto.im.ShopListRequest, jspb.Message);
+if (goog.DEBUG && !COMPILED) {
+    /**
+     * @public
+     * @override
+     */
+    proto.im.ShopListRequest.displayName = 'proto.im.ShopListRequest';
+}
+/**
+ * Generated by JsPbCodeGenerator.
+ * @param {Array=} opt_data Optional initial data array, typically from a
+ * server response, or constructed directly in Javascript. The array is used
+ * in place and becomes part of the constructed object. It is not cloned.
+ * If no data is provided, the constructed object will be empty, but still
+ * valid.
+ * @extends {jspb.Message}
+ * @constructor
+ */
+proto.im.ShopInfo = function (opt_data) {
+    jspb.Message.initialize(this, opt_data, 0, -1, null, null);
+};
+goog.inherits(proto.im.ShopInfo, jspb.Message);
+if (goog.DEBUG && !COMPILED) {
+    /**
+     * @public
+     * @override
+     */
+    proto.im.ShopInfo.displayName = 'proto.im.ShopInfo';
+}
+/**
+ * Generated by JsPbCodeGenerator.
+ * @param {Array=} opt_data Optional initial data array, typically from a
+ * server response, or constructed directly in Javascript. The array is used
+ * in place and becomes part of the constructed object. It is not cloned.
+ * If no data is provided, the constructed object will be empty, but still
+ * valid.
+ * @extends {jspb.Message}
+ * @constructor
+ */
+proto.im.ShopListReply = function (opt_data) {
+    jspb.Message.initialize(this, opt_data, 0, -1, proto.im.ShopListReply.repeatedFields_, null);
+};
+goog.inherits(proto.im.ShopListReply, jspb.Message);
+if (goog.DEBUG && !COMPILED) {
+    /**
+     * @public
+     * @override
+     */
+    proto.im.ShopListReply.displayName = 'proto.im.ShopListReply';
+}
+/**
+ * Generated by JsPbCodeGenerator.
+ * @param {Array=} opt_data Optional initial data array, typically from a
+ * server response, or constructed directly in Javascript. The array is used
+ * in place and becomes part of the constructed object. It is not cloned.
+ * If no data is provided, the constructed object will be empty, but still
+ * valid.
+ * @extends {jspb.Message}
+ * @constructor
+ */
+proto.im.SystemAddShopRequest = function (opt_data) {
+    jspb.Message.initialize(this, opt_data, 0, -1, null, null);
+};
+goog.inherits(proto.im.SystemAddShopRequest, jspb.Message);
+if (goog.DEBUG && !COMPILED) {
+    /**
+     * @public
+     * @override
+     */
+    proto.im.SystemAddShopRequest.displayName = 'proto.im.SystemAddShopRequest';
+}
+/**
+ * Generated by JsPbCodeGenerator.
+ * @param {Array=} opt_data Optional initial data array, typically from a
+ * server response, or constructed directly in Javascript. The array is used
+ * in place and becomes part of the constructed object. It is not cloned.
+ * If no data is provided, the constructed object will be empty, but still
+ * valid.
+ * @extends {jspb.Message}
+ * @constructor
+ */
+proto.im.SystemAddUserRequest = function (opt_data) {
+    jspb.Message.initialize(this, opt_data, 0, -1, null, null);
+};
+goog.inherits(proto.im.SystemAddUserRequest, jspb.Message);
+if (goog.DEBUG && !COMPILED) {
+    /**
+     * @public
+     * @override
+     */
+    proto.im.SystemAddUserRequest.displayName = 'proto.im.SystemAddUserRequest';
+}
+/**
+ * Generated by JsPbCodeGenerator.
+ * @param {Array=} opt_data Optional initial data array, typically from a
+ * server response, or constructed directly in Javascript. The array is used
+ * in place and becomes part of the constructed object. It is not cloned.
+ * If no data is provided, the constructed object will be empty, but still
+ * valid.
+ * @extends {jspb.Message}
+ * @constructor
+ */
+proto.im.Message = function (opt_data) {
+    jspb.Message.initialize(this, opt_data, 0, -1, null, null);
+};
+goog.inherits(proto.im.Message, jspb.Message);
+if (goog.DEBUG && !COMPILED) {
+    /**
+     * @public
+     * @override
+     */
+    proto.im.Message.displayName = 'proto.im.Message';
+}
+
+
+if (jspb.Message.GENERATE_TO_OBJECT) {
+    /**
+     * Creates an object representation of this proto.
+     * Field names that are reserved in JavaScript and will be renamed to pb_name.
+     * Optional fields that are not set will be set to undefined.
+     * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default.
+     * For the list of reserved names please see:
+     *     net/proto2/compiler/js/internal/generator.cc#kKeyword.
+     * @param {boolean=} opt_includeInstance Deprecated. whether to include the
+     *     JSPB instance for transitional soy proto support:
+     *     http://goto/soy-param-migration
+     * @return {!Object}
+     */
+    proto.im.DefaultRequest.prototype.toObject = function (opt_includeInstance) {
+        return proto.im.DefaultRequest.toObject(opt_includeInstance, this);
+    };
+
+
+    /**
+     * Static version of the {@see toObject} method.
+     * @param {boolean|undefined} includeInstance Deprecated. Whether to include
+     *     the JSPB instance for transitional soy proto support:
+     *     http://goto/soy-param-migration
+     * @param {!proto.im.DefaultRequest} msg The msg instance to transform.
+     * @return {!Object}
+     * @suppress {unusedLocalVariables} f is only used for nested messages
+     */
+    proto.im.DefaultRequest.toObject = function (includeInstance, msg) {
+        var f, obj = {};
+
+        if (includeInstance) {
+            obj.$jspbMessageInstance = msg;
+        }
+        return obj;
+    };
+}
+
+
+/**
+ * Deserializes binary data (in protobuf wire format).
+ * @param {jspb.ByteSource} bytes The bytes to deserialize.
+ * @return {!proto.im.DefaultRequest}
+ */
+proto.im.DefaultRequest.deserializeBinary = function (bytes) {
+    var reader = new jspb.BinaryReader(bytes);
+    var msg = new proto.im.DefaultRequest;
+    return proto.im.DefaultRequest.deserializeBinaryFromReader(msg, reader);
+};
+
+
+/**
+ * Deserializes binary data (in protobuf wire format) from the
+ * given reader into the given message object.
+ * @param {!proto.im.DefaultRequest} msg The message object to deserialize into.
+ * @param {!jspb.BinaryReader} reader The BinaryReader to use.
+ * @return {!proto.im.DefaultRequest}
+ */
+proto.im.DefaultRequest.deserializeBinaryFromReader = function (msg, reader) {
+    while (reader.nextField()) {
+        if (reader.isEndGroup()) {
+            break;
+        }
+        var field = reader.getFieldNumber();
+        switch (field) {
+            default:
+                reader.skipField();
+                break;
+        }
+    }
+    return msg;
+};
+
+
+/**
+ * Serializes the message to binary data (in protobuf wire format).
+ * @return {!Uint8Array}
+ */
+proto.im.DefaultRequest.prototype.serializeBinary = function () {
+    var writer = new jspb.BinaryWriter();
+    proto.im.DefaultRequest.serializeBinaryToWriter(this, writer);
+    return writer.getResultBuffer();
+};
+
+
+/**
+ * Serializes the given message to binary data (in protobuf wire
+ * format), writing to the given BinaryWriter.
+ * @param {!proto.im.DefaultRequest} message
+ * @param {!jspb.BinaryWriter} writer
+ * @suppress {unusedLocalVariables} f is only used for nested messages
+ */
+proto.im.DefaultRequest.serializeBinaryToWriter = function (message, writer) {
+    var f = undefined;
+};
+
+
+if (jspb.Message.GENERATE_TO_OBJECT) {
+    /**
+     * Creates an object representation of this proto.
+     * Field names that are reserved in JavaScript and will be renamed to pb_name.
+     * Optional fields that are not set will be set to undefined.
+     * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default.
+     * For the list of reserved names please see:
+     *     net/proto2/compiler/js/internal/generator.cc#kKeyword.
+     * @param {boolean=} opt_includeInstance Deprecated. whether to include the
+     *     JSPB instance for transitional soy proto support:
+     *     http://goto/soy-param-migration
+     * @return {!Object}
+     */
+    proto.im.TokenParam.prototype.toObject = function (opt_includeInstance) {
+        return proto.im.TokenParam.toObject(opt_includeInstance, this);
+    };
+
+
+    /**
+     * Static version of the {@see toObject} method.
+     * @param {boolean|undefined} includeInstance Deprecated. Whether to include
+     *     the JSPB instance for transitional soy proto support:
+     *     http://goto/soy-param-migration
+     * @param {!proto.im.TokenParam} msg The msg instance to transform.
+     * @return {!Object}
+     * @suppress {unusedLocalVariables} f is only used for nested messages
+     */
+    proto.im.TokenParam.toObject = function (includeInstance, msg) {
+        var f, obj = {
+            token: jspb.Message.getFieldWithDefault(msg, 1, "")
+        };
+
+        if (includeInstance) {
+            obj.$jspbMessageInstance = msg;
+        }
+        return obj;
+    };
+}
+
+
+/**
+ * Deserializes binary data (in protobuf wire format).
+ * @param {jspb.ByteSource} bytes The bytes to deserialize.
+ * @return {!proto.im.TokenParam}
+ */
+proto.im.TokenParam.deserializeBinary = function (bytes) {
+    var reader = new jspb.BinaryReader(bytes);
+    var msg = new proto.im.TokenParam;
+    return proto.im.TokenParam.deserializeBinaryFromReader(msg, reader);
+};
+
+
+/**
+ * Deserializes binary data (in protobuf wire format) from the
+ * given reader into the given message object.
+ * @param {!proto.im.TokenParam} msg The message object to deserialize into.
+ * @param {!jspb.BinaryReader} reader The BinaryReader to use.
+ * @return {!proto.im.TokenParam}
+ */
+proto.im.TokenParam.deserializeBinaryFromReader = function (msg, reader) {
+    while (reader.nextField()) {
+        if (reader.isEndGroup()) {
+            break;
+        }
+        var field = reader.getFieldNumber();
+        switch (field) {
+            case 1:
+                var value = /** @type {string} */ (reader.readString());
+                msg.setToken(value);
+                break;
+            default:
+                reader.skipField();
+                break;
+        }
+    }
+    return msg;
+};
+
+
+/**
+ * Serializes the message to binary data (in protobuf wire format).
+ * @return {!Uint8Array}
+ */
+proto.im.TokenParam.prototype.serializeBinary = function () {
+    var writer = new jspb.BinaryWriter();
+    proto.im.TokenParam.serializeBinaryToWriter(this, writer);
+    return writer.getResultBuffer();
+};
+
+
+/**
+ * Serializes the given message to binary data (in protobuf wire
+ * format), writing to the given BinaryWriter.
+ * @param {!proto.im.TokenParam} message
+ * @param {!jspb.BinaryWriter} writer
+ * @suppress {unusedLocalVariables} f is only used for nested messages
+ */
+proto.im.TokenParam.serializeBinaryToWriter = function (message, writer) {
+    var f = undefined;
+    f = message.getToken();
+    if (f.length > 0) {
+        writer.writeString(
+            1,
+            f
+        );
+    }
+};
+
+
+/**
+ * optional string token = 1;
+ * @return {string}
+ */
+proto.im.TokenParam.prototype.getToken = function () {
+    return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, ""));
+};
+
+
+/**
+ * @param {string} value
+ * @return {!proto.im.TokenParam} returns this
+ */
+proto.im.TokenParam.prototype.setToken = function (value) {
+    return jspb.Message.setProto3StringField(this, 1, value);
+};
+
+
+if (jspb.Message.GENERATE_TO_OBJECT) {
+    /**
+     * Creates an object representation of this proto.
+     * Field names that are reserved in JavaScript and will be renamed to pb_name.
+     * Optional fields that are not set will be set to undefined.
+     * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default.
+     * For the list of reserved names please see:
+     *     net/proto2/compiler/js/internal/generator.cc#kKeyword.
+     * @param {boolean=} opt_includeInstance Deprecated. whether to include the
+     *     JSPB instance for transitional soy proto support:
+     *     http://goto/soy-param-migration
+     * @return {!Object}
+     */
+    proto.im.DefaultReply.prototype.toObject = function (opt_includeInstance) {
+        return proto.im.DefaultReply.toObject(opt_includeInstance, this);
+    };
+
+
+    /**
+     * Static version of the {@see toObject} method.
+     * @param {boolean|undefined} includeInstance Deprecated. Whether to include
+     *     the JSPB instance for transitional soy proto support:
+     *     http://goto/soy-param-migration
+     * @param {!proto.im.DefaultReply} msg The msg instance to transform.
+     * @return {!Object}
+     * @suppress {unusedLocalVariables} f is only used for nested messages
+     */
+    proto.im.DefaultReply.toObject = function (includeInstance, msg) {
+        var f, obj = {};
+
+        if (includeInstance) {
+            obj.$jspbMessageInstance = msg;
+        }
+        return obj;
+    };
+}
+
+
+/**
+ * Deserializes binary data (in protobuf wire format).
+ * @param {jspb.ByteSource} bytes The bytes to deserialize.
+ * @return {!proto.im.DefaultReply}
+ */
+proto.im.DefaultReply.deserializeBinary = function (bytes) {
+    var reader = new jspb.BinaryReader(bytes);
+    var msg = new proto.im.DefaultReply;
+    return proto.im.DefaultReply.deserializeBinaryFromReader(msg, reader);
+};
+
+
+/**
+ * Deserializes binary data (in protobuf wire format) from the
+ * given reader into the given message object.
+ * @param {!proto.im.DefaultReply} msg The message object to deserialize into.
+ * @param {!jspb.BinaryReader} reader The BinaryReader to use.
+ * @return {!proto.im.DefaultReply}
+ */
+proto.im.DefaultReply.deserializeBinaryFromReader = function (msg, reader) {
+    while (reader.nextField()) {
+        if (reader.isEndGroup()) {
+            break;
+        }
+        var field = reader.getFieldNumber();
+        switch (field) {
+            default:
+                reader.skipField();
+                break;
+        }
+    }
+    return msg;
+};
+
+
+/**
+ * Serializes the message to binary data (in protobuf wire format).
+ * @return {!Uint8Array}
+ */
+proto.im.DefaultReply.prototype.serializeBinary = function () {
+    var writer = new jspb.BinaryWriter();
+    proto.im.DefaultReply.serializeBinaryToWriter(this, writer);
+    return writer.getResultBuffer();
+};
+
+
+/**
+ * Serializes the given message to binary data (in protobuf wire
+ * format), writing to the given BinaryWriter.
+ * @param {!proto.im.DefaultReply} message
+ * @param {!jspb.BinaryWriter} writer
+ * @suppress {unusedLocalVariables} f is only used for nested messages
+ */
+proto.im.DefaultReply.serializeBinaryToWriter = function (message, writer) {
+    var f = undefined;
+};
+
+
+if (jspb.Message.GENERATE_TO_OBJECT) {
+    /**
+     * Creates an object representation of this proto.
+     * Field names that are reserved in JavaScript and will be renamed to pb_name.
+     * Optional fields that are not set will be set to undefined.
+     * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default.
+     * For the list of reserved names please see:
+     *     net/proto2/compiler/js/internal/generator.cc#kKeyword.
+     * @param {boolean=} opt_includeInstance Deprecated. whether to include the
+     *     JSPB instance for transitional soy proto support:
+     *     http://goto/soy-param-migration
+     * @return {!Object}
+     */
+    proto.im.SignUpReply.prototype.toObject = function (opt_includeInstance) {
+        return proto.im.SignUpReply.toObject(opt_includeInstance, this);
+    };
+
+
+    /**
+     * Static version of the {@see toObject} method.
+     * @param {boolean|undefined} includeInstance Deprecated. Whether to include
+     *     the JSPB instance for transitional soy proto support:
+     *     http://goto/soy-param-migration
+     * @param {!proto.im.SignUpReply} msg The msg instance to transform.
+     * @return {!Object}
+     * @suppress {unusedLocalVariables} f is only used for nested messages
+     */
+    proto.im.SignUpReply.toObject = function (includeInstance, msg) {
+        var f, obj = {
+            userid: jspb.Message.getFieldWithDefault(msg, 1, 0)
+        };
+
+        if (includeInstance) {
+            obj.$jspbMessageInstance = msg;
+        }
+        return obj;
+    };
+}
+
+
+/**
+ * Deserializes binary data (in protobuf wire format).
+ * @param {jspb.ByteSource} bytes The bytes to deserialize.
+ * @return {!proto.im.SignUpReply}
+ */
+proto.im.SignUpReply.deserializeBinary = function (bytes) {
+    var reader = new jspb.BinaryReader(bytes);
+    var msg = new proto.im.SignUpReply;
+    return proto.im.SignUpReply.deserializeBinaryFromReader(msg, reader);
+};
+
+
+/**
+ * Deserializes binary data (in protobuf wire format) from the
+ * given reader into the given message object.
+ * @param {!proto.im.SignUpReply} msg The message object to deserialize into.
+ * @param {!jspb.BinaryReader} reader The BinaryReader to use.
+ * @return {!proto.im.SignUpReply}
+ */
+proto.im.SignUpReply.deserializeBinaryFromReader = function (msg, reader) {
+    while (reader.nextField()) {
+        if (reader.isEndGroup()) {
+            break;
+        }
+        var field = reader.getFieldNumber();
+        switch (field) {
+            case 1:
+                var value = /** @type {number} */ (reader.readInt64());
+                msg.setUserid(value);
+                break;
+            default:
+                reader.skipField();
+                break;
+        }
+    }
+    return msg;
+};
+
+
+/**
+ * Serializes the message to binary data (in protobuf wire format).
+ * @return {!Uint8Array}
+ */
+proto.im.SignUpReply.prototype.serializeBinary = function () {
+    var writer = new jspb.BinaryWriter();
+    proto.im.SignUpReply.serializeBinaryToWriter(this, writer);
+    return writer.getResultBuffer();
+};
+
+
+/**
+ * Serializes the given message to binary data (in protobuf wire
+ * format), writing to the given BinaryWriter.
+ * @param {!proto.im.SignUpReply} message
+ * @param {!jspb.BinaryWriter} writer
+ * @suppress {unusedLocalVariables} f is only used for nested messages
+ */
+proto.im.SignUpReply.serializeBinaryToWriter = function (message, writer) {
+    var f = undefined;
+    f = message.getUserid();
+    if (f !== 0) {
+        writer.writeInt64(
+            1,
+            f
+        );
+    }
+};
+
+
+/**
+ * optional int64 userId = 1;
+ * @return {number}
+ */
+proto.im.SignUpReply.prototype.getUserid = function () {
+    return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 1, 0));
+};
+
+
+/**
+ * @param {number} value
+ * @return {!proto.im.SignUpReply} returns this
+ */
+proto.im.SignUpReply.prototype.setUserid = function (value) {
+    return jspb.Message.setProto3IntField(this, 1, value);
+};
+
+
+if (jspb.Message.GENERATE_TO_OBJECT) {
+    /**
+     * Creates an object representation of this proto.
+     * Field names that are reserved in JavaScript and will be renamed to pb_name.
+     * Optional fields that are not set will be set to undefined.
+     * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default.
+     * For the list of reserved names please see:
+     *     net/proto2/compiler/js/internal/generator.cc#kKeyword.
+     * @param {boolean=} opt_includeInstance Deprecated. whether to include the
+     *     JSPB instance for transitional soy proto support:
+     *     http://goto/soy-param-migration
+     * @return {!Object}
+     */
+    proto.im.SignInPasswordRequest.prototype.toObject = function (opt_includeInstance) {
+        return proto.im.SignInPasswordRequest.toObject(opt_includeInstance, this);
+    };
+
+
+    /**
+     * Static version of the {@see toObject} method.
+     * @param {boolean|undefined} includeInstance Deprecated. Whether to include
+     *     the JSPB instance for transitional soy proto support:
+     *     http://goto/soy-param-migration
+     * @param {!proto.im.SignInPasswordRequest} msg The msg instance to transform.
+     * @return {!Object}
+     * @suppress {unusedLocalVariables} f is only used for nested messages
+     */
+    proto.im.SignInPasswordRequest.toObject = function (includeInstance, msg) {
+        var f, obj = {
+            auth: jspb.Message.getFieldWithDefault(msg, 1, ""),
+            password: jspb.Message.getFieldWithDefault(msg, 2, ""),
+            sysid: jspb.Message.getFieldWithDefault(msg, 3, 0),
+            expirationsec: jspb.Message.getFieldWithDefault(msg, 4, 0)
+        };
+
+        if (includeInstance) {
+            obj.$jspbMessageInstance = msg;
+        }
+        return obj;
+    };
+}
+
+
+/**
+ * Deserializes binary data (in protobuf wire format).
+ * @param {jspb.ByteSource} bytes The bytes to deserialize.
+ * @return {!proto.im.SignInPasswordRequest}
+ */
+proto.im.SignInPasswordRequest.deserializeBinary = function (bytes) {
+    var reader = new jspb.BinaryReader(bytes);
+    var msg = new proto.im.SignInPasswordRequest;
+    return proto.im.SignInPasswordRequest.deserializeBinaryFromReader(msg, reader);
+};
+
+
+/**
+ * Deserializes binary data (in protobuf wire format) from the
+ * given reader into the given message object.
+ * @param {!proto.im.SignInPasswordRequest} msg The message object to deserialize into.
+ * @param {!jspb.BinaryReader} reader The BinaryReader to use.
+ * @return {!proto.im.SignInPasswordRequest}
+ */
+proto.im.SignInPasswordRequest.deserializeBinaryFromReader = function (msg, reader) {
+    while (reader.nextField()) {
+        if (reader.isEndGroup()) {
+            break;
+        }
+        var field = reader.getFieldNumber();
+        switch (field) {
+            case 1:
+                var value = /** @type {string} */ (reader.readString());
+                msg.setAuth(value);
+                break;
+            case 2:
+                var value = /** @type {string} */ (reader.readString());
+                msg.setPassword(value);
+                break;
+            case 3:
+                var value = /** @type {number} */ (reader.readInt64());
+                msg.setSysid(value);
+                break;
+            case 4:
+                var value = /** @type {number} */ (reader.readInt64());
+                msg.setExpirationsec(value);
+                break;
+            default:
+                reader.skipField();
+                break;
+        }
+    }
+    return msg;
+};
+
+
+/**
+ * Serializes the message to binary data (in protobuf wire format).
+ * @return {!Uint8Array}
+ */
+proto.im.SignInPasswordRequest.prototype.serializeBinary = function () {
+    var writer = new jspb.BinaryWriter();
+    proto.im.SignInPasswordRequest.serializeBinaryToWriter(this, writer);
+    return writer.getResultBuffer();
+};
+
+
+/**
+ * Serializes the given message to binary data (in protobuf wire
+ * format), writing to the given BinaryWriter.
+ * @param {!proto.im.SignInPasswordRequest} message
+ * @param {!jspb.BinaryWriter} writer
+ * @suppress {unusedLocalVariables} f is only used for nested messages
+ */
+proto.im.SignInPasswordRequest.serializeBinaryToWriter = function (message, writer) {
+    var f = undefined;
+    f = message.getAuth();
+    if (f.length > 0) {
+        writer.writeString(
+            1,
+            f
+        );
+    }
+    f = message.getPassword();
+    if (f.length > 0) {
+        writer.writeString(
+            2,
+            f
+        );
+    }
+    f = message.getSysid();
+    if (f !== 0) {
+        writer.writeInt64(
+            3,
+            f
+        );
+    }
+    f = message.getExpirationsec();
+    if (f !== 0) {
+        writer.writeInt64(
+            4,
+            f
+        );
+    }
+};
+
+
+/**
+ * optional string auth = 1;
+ * @return {string}
+ */
+proto.im.SignInPasswordRequest.prototype.getAuth = function () {
+    return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, ""));
+};
+
+
+/**
+ * @param {string} value
+ * @return {!proto.im.SignInPasswordRequest} returns this
+ */
+proto.im.SignInPasswordRequest.prototype.setAuth = function (value) {
+    return jspb.Message.setProto3StringField(this, 1, value);
+};
+
+
+/**
+ * optional string password = 2;
+ * @return {string}
+ */
+proto.im.SignInPasswordRequest.prototype.getPassword = function () {
+    return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 2, ""));
+};
+
+
+/**
+ * @param {string} value
+ * @return {!proto.im.SignInPasswordRequest} returns this
+ */
+proto.im.SignInPasswordRequest.prototype.setPassword = function (value) {
+    return jspb.Message.setProto3StringField(this, 2, value);
+};
+
+
+/**
+ * optional int64 sysId = 3;
+ * @return {number}
+ */
+proto.im.SignInPasswordRequest.prototype.getSysid = function () {
+    return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 3, 0));
+};
+
+
+/**
+ * @param {number} value
+ * @return {!proto.im.SignInPasswordRequest} returns this
+ */
+proto.im.SignInPasswordRequest.prototype.setSysid = function (value) {
+    return jspb.Message.setProto3IntField(this, 3, value);
+};
+
+
+/**
+ * optional int64 expirationSec = 4;
+ * @return {number}
+ */
+proto.im.SignInPasswordRequest.prototype.getExpirationsec = function () {
+    return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 4, 0));
+};
+
+
+/**
+ * @param {number} value
+ * @return {!proto.im.SignInPasswordRequest} returns this
+ */
+proto.im.SignInPasswordRequest.prototype.setExpirationsec = function (value) {
+    return jspb.Message.setProto3IntField(this, 4, value);
+};
+
+
+if (jspb.Message.GENERATE_TO_OBJECT) {
+    /**
+     * Creates an object representation of this proto.
+     * Field names that are reserved in JavaScript and will be renamed to pb_name.
+     * Optional fields that are not set will be set to undefined.
+     * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default.
+     * For the list of reserved names please see:
+     *     net/proto2/compiler/js/internal/generator.cc#kKeyword.
+     * @param {boolean=} opt_includeInstance Deprecated. whether to include the
+     *     JSPB instance for transitional soy proto support:
+     *     http://goto/soy-param-migration
+     * @return {!Object}
+     */
+    proto.im.SignUpRequest.prototype.toObject = function (opt_includeInstance) {
+        return proto.im.SignUpRequest.toObject(opt_includeInstance, this);
+    };
+
+
+    /**
+     * Static version of the {@see toObject} method.
+     * @param {boolean|undefined} includeInstance Deprecated. Whether to include
+     *     the JSPB instance for transitional soy proto support:
+     *     http://goto/soy-param-migration
+     * @param {!proto.im.SignUpRequest} msg The msg instance to transform.
+     * @return {!Object}
+     * @suppress {unusedLocalVariables} f is only used for nested messages
+     */
+    proto.im.SignUpRequest.toObject = function (includeInstance, msg) {
+        var f, obj = {
+            usercode: jspb.Message.getFieldWithDefault(msg, 1, ""),
+            name: jspb.Message.getFieldWithDefault(msg, 2, ""),
+            email: jspb.Message.getFieldWithDefault(msg, 3, ""),
+            phone: jspb.Message.getFieldWithDefault(msg, 4, ""),
+            wxopenid: jspb.Message.getFieldWithDefault(msg, 5, ""),
+            qq: jspb.Message.getFieldWithDefault(msg, 6, ""),
+            password: jspb.Message.getFieldWithDefault(msg, 7, ""),
+            question: jspb.Message.getFieldWithDefault(msg, 8, ""),
+            answer: jspb.Message.getFieldWithDefault(msg, 9, ""),
+            memo: jspb.Message.getFieldWithDefault(msg, 10, "")
+        };
+
+        if (includeInstance) {
+            obj.$jspbMessageInstance = msg;
+        }
+        return obj;
+    };
+}
+
+
+/**
+ * Deserializes binary data (in protobuf wire format).
+ * @param {jspb.ByteSource} bytes The bytes to deserialize.
+ * @return {!proto.im.SignUpRequest}
+ */
+proto.im.SignUpRequest.deserializeBinary = function (bytes) {
+    var reader = new jspb.BinaryReader(bytes);
+    var msg = new proto.im.SignUpRequest;
+    return proto.im.SignUpRequest.deserializeBinaryFromReader(msg, reader);
+};
+
+
+/**
+ * Deserializes binary data (in protobuf wire format) from the
+ * given reader into the given message object.
+ * @param {!proto.im.SignUpRequest} msg The message object to deserialize into.
+ * @param {!jspb.BinaryReader} reader The BinaryReader to use.
+ * @return {!proto.im.SignUpRequest}
+ */
+proto.im.SignUpRequest.deserializeBinaryFromReader = function (msg, reader) {
+    while (reader.nextField()) {
+        if (reader.isEndGroup()) {
+            break;
+        }
+        var field = reader.getFieldNumber();
+        switch (field) {
+            case 1:
+                var value = /** @type {string} */ (reader.readString());
+                msg.setUsercode(value);
+                break;
+            case 2:
+                var value = /** @type {string} */ (reader.readString());
+                msg.setName(value);
+                break;
+            case 3:
+                var value = /** @type {string} */ (reader.readString());
+                msg.setEmail(value);
+                break;
+            case 4:
+                var value = /** @type {string} */ (reader.readString());
+                msg.setPhone(value);
+                break;
+            case 5:
+                var value = /** @type {string} */ (reader.readString());
+                msg.setWxopenid(value);
+                break;
+            case 6:
+                var value = /** @type {string} */ (reader.readString());
+                msg.setQq(value);
+                break;
+            case 7:
+                var value = /** @type {string} */ (reader.readString());
+                msg.setPassword(value);
+                break;
+            case 8:
+                var value = /** @type {string} */ (reader.readString());
+                msg.setQuestion(value);
+                break;
+            case 9:
+                var value = /** @type {string} */ (reader.readString());
+                msg.setAnswer(value);
+                break;
+            case 10:
+                var value = /** @type {string} */ (reader.readString());
+                msg.setMemo(value);
+                break;
+            default:
+                reader.skipField();
+                break;
+        }
+    }
+    return msg;
+};
+
+
+/**
+ * Serializes the message to binary data (in protobuf wire format).
+ * @return {!Uint8Array}
+ */
+proto.im.SignUpRequest.prototype.serializeBinary = function () {
+    var writer = new jspb.BinaryWriter();
+    proto.im.SignUpRequest.serializeBinaryToWriter(this, writer);
+    return writer.getResultBuffer();
+};
+
+
+/**
+ * Serializes the given message to binary data (in protobuf wire
+ * format), writing to the given BinaryWriter.
+ * @param {!proto.im.SignUpRequest} message
+ * @param {!jspb.BinaryWriter} writer
+ * @suppress {unusedLocalVariables} f is only used for nested messages
+ */
+proto.im.SignUpRequest.serializeBinaryToWriter = function (message, writer) {
+    var f = undefined;
+    f = message.getUsercode();
+    if (f.length > 0) {
+        writer.writeString(
+            1,
+            f
+        );
+    }
+    f = message.getName();
+    if (f.length > 0) {
+        writer.writeString(
+            2,
+            f
+        );
+    }
+    f = message.getEmail();
+    if (f.length > 0) {
+        writer.writeString(
+            3,
+            f
+        );
+    }
+    f = message.getPhone();
+    if (f.length > 0) {
+        writer.writeString(
+            4,
+            f
+        );
+    }
+    f = message.getWxopenid();
+    if (f.length > 0) {
+        writer.writeString(
+            5,
+            f
+        );
+    }
+    f = message.getQq();
+    if (f.length > 0) {
+        writer.writeString(
+            6,
+            f
+        );
+    }
+    f = message.getPassword();
+    if (f.length > 0) {
+        writer.writeString(
+            7,
+            f
+        );
+    }
+    f = message.getQuestion();
+    if (f.length > 0) {
+        writer.writeString(
+            8,
+            f
+        );
+    }
+    f = message.getAnswer();
+    if (f.length > 0) {
+        writer.writeString(
+            9,
+            f
+        );
+    }
+    f = message.getMemo();
+    if (f.length > 0) {
+        writer.writeString(
+            10,
+            f
+        );
+    }
+};
+
+
+/**
+ * optional string userCode = 1;
+ * @return {string}
+ */
+proto.im.SignUpRequest.prototype.getUsercode = function () {
+    return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, ""));
+};
+
+
+/**
+ * @param {string} value
+ * @return {!proto.im.SignUpRequest} returns this
+ */
+proto.im.SignUpRequest.prototype.setUsercode = function (value) {
+    return jspb.Message.setProto3StringField(this, 1, value);
+};
+
+
+/**
+ * optional string name = 2;
+ * @return {string}
+ */
+proto.im.SignUpRequest.prototype.getName = function () {
+    return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 2, ""));
+};
+
+
+/**
+ * @param {string} value
+ * @return {!proto.im.SignUpRequest} returns this
+ */
+proto.im.SignUpRequest.prototype.setName = function (value) {
+    return jspb.Message.setProto3StringField(this, 2, value);
+};
+
+
+/**
+ * optional string email = 3;
+ * @return {string}
+ */
+proto.im.SignUpRequest.prototype.getEmail = function () {
+    return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 3, ""));
+};
+
+
+/**
+ * @param {string} value
+ * @return {!proto.im.SignUpRequest} returns this
+ */
+proto.im.SignUpRequest.prototype.setEmail = function (value) {
+    return jspb.Message.setProto3StringField(this, 3, value);
+};
+
+
+/**
+ * optional string phone = 4;
+ * @return {string}
+ */
+proto.im.SignUpRequest.prototype.getPhone = function () {
+    return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 4, ""));
+};
+
+
+/**
+ * @param {string} value
+ * @return {!proto.im.SignUpRequest} returns this
+ */
+proto.im.SignUpRequest.prototype.setPhone = function (value) {
+    return jspb.Message.setProto3StringField(this, 4, value);
+};
+
+
+/**
+ * optional string wxOpenId = 5;
+ * @return {string}
+ */
+proto.im.SignUpRequest.prototype.getWxopenid = function () {
+    return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 5, ""));
+};
+
+
+/**
+ * @param {string} value
+ * @return {!proto.im.SignUpRequest} returns this
+ */
+proto.im.SignUpRequest.prototype.setWxopenid = function (value) {
+    return jspb.Message.setProto3StringField(this, 5, value);
+};
+
+
+/**
+ * optional string qq = 6;
+ * @return {string}
+ */
+proto.im.SignUpRequest.prototype.getQq = function () {
+    return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 6, ""));
+};
+
+
+/**
+ * @param {string} value
+ * @return {!proto.im.SignUpRequest} returns this
+ */
+proto.im.SignUpRequest.prototype.setQq = function (value) {
+    return jspb.Message.setProto3StringField(this, 6, value);
+};
+
+
+/**
+ * optional string password = 7;
+ * @return {string}
+ */
+proto.im.SignUpRequest.prototype.getPassword = function () {
+    return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 7, ""));
+};
+
+
+/**
+ * @param {string} value
+ * @return {!proto.im.SignUpRequest} returns this
+ */
+proto.im.SignUpRequest.prototype.setPassword = function (value) {
+    return jspb.Message.setProto3StringField(this, 7, value);
+};
+
+
+/**
+ * optional string question = 8;
+ * @return {string}
+ */
+proto.im.SignUpRequest.prototype.getQuestion = function () {
+    return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 8, ""));
+};
+
+
+/**
+ * @param {string} value
+ * @return {!proto.im.SignUpRequest} returns this
+ */
+proto.im.SignUpRequest.prototype.setQuestion = function (value) {
+    return jspb.Message.setProto3StringField(this, 8, value);
+};
+
+
+/**
+ * optional string answer = 9;
+ * @return {string}
+ */
+proto.im.SignUpRequest.prototype.getAnswer = function () {
+    return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 9, ""));
+};
+
+
+/**
+ * @param {string} value
+ * @return {!proto.im.SignUpRequest} returns this
+ */
+proto.im.SignUpRequest.prototype.setAnswer = function (value) {
+    return jspb.Message.setProto3StringField(this, 9, value);
+};
+
+
+/**
+ * optional string memo = 10;
+ * @return {string}
+ */
+proto.im.SignUpRequest.prototype.getMemo = function () {
+    return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 10, ""));
+};
+
+
+/**
+ * @param {string} value
+ * @return {!proto.im.SignUpRequest} returns this
+ */
+proto.im.SignUpRequest.prototype.setMemo = function (value) {
+    return jspb.Message.setProto3StringField(this, 10, value);
+};
+
+
+if (jspb.Message.GENERATE_TO_OBJECT) {
+    /**
+     * Creates an object representation of this proto.
+     * Field names that are reserved in JavaScript and will be renamed to pb_name.
+     * Optional fields that are not set will be set to undefined.
+     * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default.
+     * For the list of reserved names please see:
+     *     net/proto2/compiler/js/internal/generator.cc#kKeyword.
+     * @param {boolean=} opt_includeInstance Deprecated. whether to include the
+     *     JSPB instance for transitional soy proto support:
+     *     http://goto/soy-param-migration
+     * @return {!Object}
+     */
+    proto.im.UserInfo.prototype.toObject = function (opt_includeInstance) {
+        return proto.im.UserInfo.toObject(opt_includeInstance, this);
+    };
+
+
+    /**
+     * Static version of the {@see toObject} method.
+     * @param {boolean|undefined} includeInstance Deprecated. Whether to include
+     *     the JSPB instance for transitional soy proto support:
+     *     http://goto/soy-param-migration
+     * @param {!proto.im.UserInfo} msg The msg instance to transform.
+     * @return {!Object}
+     * @suppress {unusedLocalVariables} f is only used for nested messages
+     */
+    proto.im.UserInfo.toObject = function (includeInstance, msg) {
+        var f, obj = {
+            id: jspb.Message.getFieldWithDefault(msg, 1, 0),
+            usercode: jspb.Message.getFieldWithDefault(msg, 2, ""),
+            name: jspb.Message.getFieldWithDefault(msg, 3, ""),
+            email: jspb.Message.getFieldWithDefault(msg, 4, ""),
+            phone: jspb.Message.getFieldWithDefault(msg, 5, ""),
+            qq: jspb.Message.getFieldWithDefault(msg, 7, ""),
+            memo: jspb.Message.getFieldWithDefault(msg, 11, ""),
+            status: jspb.Message.getFieldWithDefault(msg, 12, 0)
+        };
+
+        if (includeInstance) {
+            obj.$jspbMessageInstance = msg;
+        }
+        return obj;
+    };
+}
+
+
+/**
+ * Deserializes binary data (in protobuf wire format).
+ * @param {jspb.ByteSource} bytes The bytes to deserialize.
+ * @return {!proto.im.UserInfo}
+ */
+proto.im.UserInfo.deserializeBinary = function (bytes) {
+    var reader = new jspb.BinaryReader(bytes);
+    var msg = new proto.im.UserInfo;
+    return proto.im.UserInfo.deserializeBinaryFromReader(msg, reader);
+};
+
+
+/**
+ * Deserializes binary data (in protobuf wire format) from the
+ * given reader into the given message object.
+ * @param {!proto.im.UserInfo} msg The message object to deserialize into.
+ * @param {!jspb.BinaryReader} reader The BinaryReader to use.
+ * @return {!proto.im.UserInfo}
+ */
+proto.im.UserInfo.deserializeBinaryFromReader = function (msg, reader) {
+    while (reader.nextField()) {
+        if (reader.isEndGroup()) {
+            break;
+        }
+        var field = reader.getFieldNumber();
+        switch (field) {
+            case 1:
+                var value = /** @type {number} */ (reader.readInt64());
+                msg.setId(value);
+                break;
+            case 2:
+                var value = /** @type {string} */ (reader.readString());
+                msg.setUsercode(value);
+                break;
+            case 3:
+                var value = /** @type {string} */ (reader.readString());
+                msg.setName(value);
+                break;
+            case 4:
+                var value = /** @type {string} */ (reader.readString());
+                msg.setEmail(value);
+                break;
+            case 5:
+                var value = /** @type {string} */ (reader.readString());
+                msg.setPhone(value);
+                break;
+            case 7:
+                var value = /** @type {string} */ (reader.readString());
+                msg.setQq(value);
+                break;
+            case 11:
+                var value = /** @type {string} */ (reader.readString());
+                msg.setMemo(value);
+                break;
+            case 12:
+                var value = /** @type {!proto.im.Status} */ (reader.readEnum());
+                msg.setStatus(value);
+                break;
+            default:
+                reader.skipField();
+                break;
+        }
+    }
+    return msg;
+};
+
+
+/**
+ * Serializes the message to binary data (in protobuf wire format).
+ * @return {!Uint8Array}
+ */
+proto.im.UserInfo.prototype.serializeBinary = function () {
+    var writer = new jspb.BinaryWriter();
+    proto.im.UserInfo.serializeBinaryToWriter(this, writer);
+    return writer.getResultBuffer();
+};
+
+
+/**
+ * Serializes the given message to binary data (in protobuf wire
+ * format), writing to the given BinaryWriter.
+ * @param {!proto.im.UserInfo} message
+ * @param {!jspb.BinaryWriter} writer
+ * @suppress {unusedLocalVariables} f is only used for nested messages
+ */
+proto.im.UserInfo.serializeBinaryToWriter = function (message, writer) {
+    var f = undefined;
+    f = message.getId();
+    if (f !== 0) {
+        writer.writeInt64(
+            1,
+            f
+        );
+    }
+    f = message.getUsercode();
+    if (f.length > 0) {
+        writer.writeString(
+            2,
+            f
+        );
+    }
+    f = message.getName();
+    if (f.length > 0) {
+        writer.writeString(
+            3,
+            f
+        );
+    }
+    f = message.getEmail();
+    if (f.length > 0) {
+        writer.writeString(
+            4,
+            f
+        );
+    }
+    f = message.getPhone();
+    if (f.length > 0) {
+        writer.writeString(
+            5,
+            f
+        );
+    }
+    f = message.getQq();
+    if (f.length > 0) {
+        writer.writeString(
+            7,
+            f
+        );
+    }
+    f = message.getMemo();
+    if (f.length > 0) {
+        writer.writeString(
+            11,
+            f
+        );
+    }
+    f = message.getStatus();
+    if (f !== 0.0) {
+        writer.writeEnum(
+            12,
+            f
+        );
+    }
+};
+
+
+/**
+ * optional int64 id = 1;
+ * @return {number}
+ */
+proto.im.UserInfo.prototype.getId = function () {
+    return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 1, 0));
+};
+
+
+/**
+ * @param {number} value
+ * @return {!proto.im.UserInfo} returns this
+ */
+proto.im.UserInfo.prototype.setId = function (value) {
+    return jspb.Message.setProto3IntField(this, 1, value);
+};
+
+
+/**
+ * optional string userCode = 2;
+ * @return {string}
+ */
+proto.im.UserInfo.prototype.getUsercode = function () {
+    return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 2, ""));
+};
+
+
+/**
+ * @param {string} value
+ * @return {!proto.im.UserInfo} returns this
+ */
+proto.im.UserInfo.prototype.setUsercode = function (value) {
+    return jspb.Message.setProto3StringField(this, 2, value);
+};
+
+
+/**
+ * optional string name = 3;
+ * @return {string}
+ */
+proto.im.UserInfo.prototype.getName = function () {
+    return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 3, ""));
+};
+
+
+/**
+ * @param {string} value
+ * @return {!proto.im.UserInfo} returns this
+ */
+proto.im.UserInfo.prototype.setName = function (value) {
+    return jspb.Message.setProto3StringField(this, 3, value);
+};
+
+
+/**
+ * optional string email = 4;
+ * @return {string}
+ */
+proto.im.UserInfo.prototype.getEmail = function () {
+    return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 4, ""));
+};
+
+
+/**
+ * @param {string} value
+ * @return {!proto.im.UserInfo} returns this
+ */
+proto.im.UserInfo.prototype.setEmail = function (value) {
+    return jspb.Message.setProto3StringField(this, 4, value);
+};
+
+
+/**
+ * optional string phone = 5;
+ * @return {string}
+ */
+proto.im.UserInfo.prototype.getPhone = function () {
+    return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 5, ""));
+};
+
+
+/**
+ * @param {string} value
+ * @return {!proto.im.UserInfo} returns this
+ */
+proto.im.UserInfo.prototype.setPhone = function (value) {
+    return jspb.Message.setProto3StringField(this, 5, value);
+};
+
+
+/**
+ * optional string qq = 7;
+ * @return {string}
+ */
+proto.im.UserInfo.prototype.getQq = function () {
+    return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 7, ""));
+};
+
+
+/**
+ * @param {string} value
+ * @return {!proto.im.UserInfo} returns this
+ */
+proto.im.UserInfo.prototype.setQq = function (value) {
+    return jspb.Message.setProto3StringField(this, 7, value);
+};
+
+
+/**
+ * optional string memo = 11;
+ * @return {string}
+ */
+proto.im.UserInfo.prototype.getMemo = function () {
+    return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 11, ""));
+};
+
+
+/**
+ * @param {string} value
+ * @return {!proto.im.UserInfo} returns this
+ */
+proto.im.UserInfo.prototype.setMemo = function (value) {
+    return jspb.Message.setProto3StringField(this, 11, value);
+};
+
+
+/**
+ * optional Status status = 12;
+ * @return {!proto.im.Status}
+ */
+proto.im.UserInfo.prototype.getStatus = function () {
+    return /** @type {!proto.im.Status} */ (jspb.Message.getFieldWithDefault(this, 12, 0));
+};
+
+
+/**
+ * @param {!proto.im.Status} value
+ * @return {!proto.im.UserInfo} returns this
+ */
+proto.im.UserInfo.prototype.setStatus = function (value) {
+    return jspb.Message.setProto3EnumField(this, 12, value);
+};
+
+
+if (jspb.Message.GENERATE_TO_OBJECT) {
+    /**
+     * Creates an object representation of this proto.
+     * Field names that are reserved in JavaScript and will be renamed to pb_name.
+     * Optional fields that are not set will be set to undefined.
+     * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default.
+     * For the list of reserved names please see:
+     *     net/proto2/compiler/js/internal/generator.cc#kKeyword.
+     * @param {boolean=} opt_includeInstance Deprecated. whether to include the
+     *     JSPB instance for transitional soy proto support:
+     *     http://goto/soy-param-migration
+     * @return {!Object}
+     */
+    proto.im.CreateReply.prototype.toObject = function (opt_includeInstance) {
+        return proto.im.CreateReply.toObject(opt_includeInstance, this);
+    };
+
+
+    /**
+     * Static version of the {@see toObject} method.
+     * @param {boolean|undefined} includeInstance Deprecated. Whether to include
+     *     the JSPB instance for transitional soy proto support:
+     *     http://goto/soy-param-migration
+     * @param {!proto.im.CreateReply} msg The msg instance to transform.
+     * @return {!Object}
+     * @suppress {unusedLocalVariables} f is only used for nested messages
+     */
+    proto.im.CreateReply.toObject = function (includeInstance, msg) {
+        var f, obj = {
+            id: jspb.Message.getFieldWithDefault(msg, 1, 0)
+        };
+
+        if (includeInstance) {
+            obj.$jspbMessageInstance = msg;
+        }
+        return obj;
+    };
+}
+
+
+/**
+ * Deserializes binary data (in protobuf wire format).
+ * @param {jspb.ByteSource} bytes The bytes to deserialize.
+ * @return {!proto.im.CreateReply}
+ */
+proto.im.CreateReply.deserializeBinary = function (bytes) {
+    var reader = new jspb.BinaryReader(bytes);
+    var msg = new proto.im.CreateReply;
+    return proto.im.CreateReply.deserializeBinaryFromReader(msg, reader);
+};
+
+
+/**
+ * Deserializes binary data (in protobuf wire format) from the
+ * given reader into the given message object.
+ * @param {!proto.im.CreateReply} msg The message object to deserialize into.
+ * @param {!jspb.BinaryReader} reader The BinaryReader to use.
+ * @return {!proto.im.CreateReply}
+ */
+proto.im.CreateReply.deserializeBinaryFromReader = function (msg, reader) {
+    while (reader.nextField()) {
+        if (reader.isEndGroup()) {
+            break;
+        }
+        var field = reader.getFieldNumber();
+        switch (field) {
+            case 1:
+                var value = /** @type {number} */ (reader.readInt64());
+                msg.setId(value);
+                break;
+            default:
+                reader.skipField();
+                break;
+        }
+    }
+    return msg;
+};
+
+
+/**
+ * Serializes the message to binary data (in protobuf wire format).
+ * @return {!Uint8Array}
+ */
+proto.im.CreateReply.prototype.serializeBinary = function () {
+    var writer = new jspb.BinaryWriter();
+    proto.im.CreateReply.serializeBinaryToWriter(this, writer);
+    return writer.getResultBuffer();
+};
+
+
+/**
+ * Serializes the given message to binary data (in protobuf wire
+ * format), writing to the given BinaryWriter.
+ * @param {!proto.im.CreateReply} message
+ * @param {!jspb.BinaryWriter} writer
+ * @suppress {unusedLocalVariables} f is only used for nested messages
+ */
+proto.im.CreateReply.serializeBinaryToWriter = function (message, writer) {
+    var f = undefined;
+    f = message.getId();
+    if (f !== 0) {
+        writer.writeInt64(
+            1,
+            f
+        );
+    }
+};
+
+
+/**
+ * optional int64 id = 1;
+ * @return {number}
+ */
+proto.im.CreateReply.prototype.getId = function () {
+    return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 1, 0));
+};
+
+
+/**
+ * @param {number} value
+ * @return {!proto.im.CreateReply} returns this
+ */
+proto.im.CreateReply.prototype.setId = function (value) {
+    return jspb.Message.setProto3IntField(this, 1, value);
+};
+
+
+if (jspb.Message.GENERATE_TO_OBJECT) {
+    /**
+     * Creates an object representation of this proto.
+     * Field names that are reserved in JavaScript and will be renamed to pb_name.
+     * Optional fields that are not set will be set to undefined.
+     * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default.
+     * For the list of reserved names please see:
+     *     net/proto2/compiler/js/internal/generator.cc#kKeyword.
+     * @param {boolean=} opt_includeInstance Deprecated. whether to include the
+     *     JSPB instance for transitional soy proto support:
+     *     http://goto/soy-param-migration
+     * @return {!Object}
+     */
+    proto.im.PermissionCheck.prototype.toObject = function (opt_includeInstance) {
+        return proto.im.PermissionCheck.toObject(opt_includeInstance, this);
+    };
+
+
+    /**
+     * Static version of the {@see toObject} method.
+     * @param {boolean|undefined} includeInstance Deprecated. Whether to include
+     *     the JSPB instance for transitional soy proto support:
+     *     http://goto/soy-param-migration
+     * @param {!proto.im.PermissionCheck} msg The msg instance to transform.
+     * @return {!Object}
+     * @suppress {unusedLocalVariables} f is only used for nested messages
+     */
+    proto.im.PermissionCheck.toObject = function (includeInstance, msg) {
+        var f, obj = {
+            token: jspb.Message.getFieldWithDefault(msg, 1, ""),
+            servicepath: jspb.Message.getFieldWithDefault(msg, 2, "")
+        };
+
+        if (includeInstance) {
+            obj.$jspbMessageInstance = msg;
+        }
+        return obj;
+    };
+}
+
+
+/**
+ * Deserializes binary data (in protobuf wire format).
+ * @param {jspb.ByteSource} bytes The bytes to deserialize.
+ * @return {!proto.im.PermissionCheck}
+ */
+proto.im.PermissionCheck.deserializeBinary = function (bytes) {
+    var reader = new jspb.BinaryReader(bytes);
+    var msg = new proto.im.PermissionCheck;
+    return proto.im.PermissionCheck.deserializeBinaryFromReader(msg, reader);
+};
+
+
+/**
+ * Deserializes binary data (in protobuf wire format) from the
+ * given reader into the given message object.
+ * @param {!proto.im.PermissionCheck} msg The message object to deserialize into.
+ * @param {!jspb.BinaryReader} reader The BinaryReader to use.
+ * @return {!proto.im.PermissionCheck}
+ */
+proto.im.PermissionCheck.deserializeBinaryFromReader = function (msg, reader) {
+    while (reader.nextField()) {
+        if (reader.isEndGroup()) {
+            break;
+        }
+        var field = reader.getFieldNumber();
+        switch (field) {
+            case 1:
+                var value = /** @type {string} */ (reader.readString());
+                msg.setToken(value);
+                break;
+            case 2:
+                var value = /** @type {string} */ (reader.readString());
+                msg.setServicepath(value);
+                break;
+            default:
+                reader.skipField();
+                break;
+        }
+    }
+    return msg;
+};
+
+
+/**
+ * Serializes the message to binary data (in protobuf wire format).
+ * @return {!Uint8Array}
+ */
+proto.im.PermissionCheck.prototype.serializeBinary = function () {
+    var writer = new jspb.BinaryWriter();
+    proto.im.PermissionCheck.serializeBinaryToWriter(this, writer);
+    return writer.getResultBuffer();
+};
+
+
+/**
+ * Serializes the given message to binary data (in protobuf wire
+ * format), writing to the given BinaryWriter.
+ * @param {!proto.im.PermissionCheck} message
+ * @param {!jspb.BinaryWriter} writer
+ * @suppress {unusedLocalVariables} f is only used for nested messages
+ */
+proto.im.PermissionCheck.serializeBinaryToWriter = function (message, writer) {
+    var f = undefined;
+    f = message.getToken();
+    if (f.length > 0) {
+        writer.writeString(
+            1,
+            f
+        );
+    }
+    f = message.getServicepath();
+    if (f.length > 0) {
+        writer.writeString(
+            2,
+            f
+        );
+    }
+};
+
+
+/**
+ * optional string token = 1;
+ * @return {string}
+ */
+proto.im.PermissionCheck.prototype.getToken = function () {
+    return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, ""));
+};
+
+
+/**
+ * @param {string} value
+ * @return {!proto.im.PermissionCheck} returns this
+ */
+proto.im.PermissionCheck.prototype.setToken = function (value) {
+    return jspb.Message.setProto3StringField(this, 1, value);
+};
+
+
+/**
+ * optional string servicePath = 2;
+ * @return {string}
+ */
+proto.im.PermissionCheck.prototype.getServicepath = function () {
+    return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 2, ""));
+};
+
+
+/**
+ * @param {string} value
+ * @return {!proto.im.PermissionCheck} returns this
+ */
+proto.im.PermissionCheck.prototype.setServicepath = function (value) {
+    return jspb.Message.setProto3StringField(this, 2, value);
+};
+
+
+if (jspb.Message.GENERATE_TO_OBJECT) {
+    /**
+     * Creates an object representation of this proto.
+     * Field names that are reserved in JavaScript and will be renamed to pb_name.
+     * Optional fields that are not set will be set to undefined.
+     * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default.
+     * For the list of reserved names please see:
+     *     net/proto2/compiler/js/internal/generator.cc#kKeyword.
+     * @param {boolean=} opt_includeInstance Deprecated. whether to include the
+     *     JSPB instance for transitional soy proto support:
+     *     http://goto/soy-param-migration
+     * @return {!Object}
+     */
+    proto.im.SessionCheckReply.prototype.toObject = function (opt_includeInstance) {
+        return proto.im.SessionCheckReply.toObject(opt_includeInstance, this);
+    };
+
+
+    /**
+     * Static version of the {@see toObject} method.
+     * @param {boolean|undefined} includeInstance Deprecated. Whether to include
+     *     the JSPB instance for transitional soy proto support:
+     *     http://goto/soy-param-migration
+     * @param {!proto.im.SessionCheckReply} msg The msg instance to transform.
+     * @return {!Object}
+     * @suppress {unusedLocalVariables} f is only used for nested messages
+     */
+    proto.im.SessionCheckReply.toObject = function (includeInstance, msg) {
+        var f, obj = {
+            userid: jspb.Message.getFieldWithDefault(msg, 1, 0)
+        };
+
+        if (includeInstance) {
+            obj.$jspbMessageInstance = msg;
+        }
+        return obj;
+    };
+}
+
+
+/**
+ * Deserializes binary data (in protobuf wire format).
+ * @param {jspb.ByteSource} bytes The bytes to deserialize.
+ * @return {!proto.im.SessionCheckReply}
+ */
+proto.im.SessionCheckReply.deserializeBinary = function (bytes) {
+    var reader = new jspb.BinaryReader(bytes);
+    var msg = new proto.im.SessionCheckReply;
+    return proto.im.SessionCheckReply.deserializeBinaryFromReader(msg, reader);
+};
+
+
+/**
+ * Deserializes binary data (in protobuf wire format) from the
+ * given reader into the given message object.
+ * @param {!proto.im.SessionCheckReply} msg The message object to deserialize into.
+ * @param {!jspb.BinaryReader} reader The BinaryReader to use.
+ * @return {!proto.im.SessionCheckReply}
+ */
+proto.im.SessionCheckReply.deserializeBinaryFromReader = function (msg, reader) {
+    while (reader.nextField()) {
+        if (reader.isEndGroup()) {
+            break;
+        }
+        var field = reader.getFieldNumber();
+        switch (field) {
+            case 1:
+                var value = /** @type {number} */ (reader.readInt64());
+                msg.setUserid(value);
+                break;
+            default:
+                reader.skipField();
+                break;
+        }
+    }
+    return msg;
+};
+
+
+/**
+ * Serializes the message to binary data (in protobuf wire format).
+ * @return {!Uint8Array}
+ */
+proto.im.SessionCheckReply.prototype.serializeBinary = function () {
+    var writer = new jspb.BinaryWriter();
+    proto.im.SessionCheckReply.serializeBinaryToWriter(this, writer);
+    return writer.getResultBuffer();
+};
+
+
+/**
+ * Serializes the given message to binary data (in protobuf wire
+ * format), writing to the given BinaryWriter.
+ * @param {!proto.im.SessionCheckReply} message
+ * @param {!jspb.BinaryWriter} writer
+ * @suppress {unusedLocalVariables} f is only used for nested messages
+ */
+proto.im.SessionCheckReply.serializeBinaryToWriter = function (message, writer) {
+    var f = undefined;
+    f = message.getUserid();
+    if (f !== 0) {
+        writer.writeInt64(
+            1,
+            f
+        );
+    }
+};
+
+
+/**
+ * optional int64 userId = 1;
+ * @return {number}
+ */
+proto.im.SessionCheckReply.prototype.getUserid = function () {
+    return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 1, 0));
+};
+
+
+/**
+ * @param {number} value
+ * @return {!proto.im.SessionCheckReply} returns this
+ */
+proto.im.SessionCheckReply.prototype.setUserid = function (value) {
+    return jspb.Message.setProto3IntField(this, 1, value);
+};
+
+
+if (jspb.Message.GENERATE_TO_OBJECT) {
+    /**
+     * Creates an object representation of this proto.
+     * Field names that are reserved in JavaScript and will be renamed to pb_name.
+     * Optional fields that are not set will be set to undefined.
+     * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default.
+     * For the list of reserved names please see:
+     *     net/proto2/compiler/js/internal/generator.cc#kKeyword.
+     * @param {boolean=} opt_includeInstance Deprecated. whether to include the
+     *     JSPB instance for transitional soy proto support:
+     *     http://goto/soy-param-migration
+     * @return {!Object}
+     */
+    proto.im.Service.prototype.toObject = function (opt_includeInstance) {
+        return proto.im.Service.toObject(opt_includeInstance, this);
+    };
+
+
+    /**
+     * Static version of the {@see toObject} method.
+     * @param {boolean|undefined} includeInstance Deprecated. Whether to include
+     *     the JSPB instance for transitional soy proto support:
+     *     http://goto/soy-param-migration
+     * @param {!proto.im.Service} msg The msg instance to transform.
+     * @return {!Object}
+     * @suppress {unusedLocalVariables} f is only used for nested messages
+     */
+    proto.im.Service.toObject = function (includeInstance, msg) {
+        var f, obj = {
+            path: jspb.Message.getFieldWithDefault(msg, 1, ""),
+            memo: jspb.Message.getFieldWithDefault(msg, 2, "")
+        };
+
+        if (includeInstance) {
+            obj.$jspbMessageInstance = msg;
+        }
+        return obj;
+    };
+}
+
+
+/**
+ * Deserializes binary data (in protobuf wire format).
+ * @param {jspb.ByteSource} bytes The bytes to deserialize.
+ * @return {!proto.im.Service}
+ */
+proto.im.Service.deserializeBinary = function (bytes) {
+    var reader = new jspb.BinaryReader(bytes);
+    var msg = new proto.im.Service;
+    return proto.im.Service.deserializeBinaryFromReader(msg, reader);
+};
+
+
+/**
+ * Deserializes binary data (in protobuf wire format) from the
+ * given reader into the given message object.
+ * @param {!proto.im.Service} msg The message object to deserialize into.
+ * @param {!jspb.BinaryReader} reader The BinaryReader to use.
+ * @return {!proto.im.Service}
+ */
+proto.im.Service.deserializeBinaryFromReader = function (msg, reader) {
+    while (reader.nextField()) {
+        if (reader.isEndGroup()) {
+            break;
+        }
+        var field = reader.getFieldNumber();
+        switch (field) {
+            case 1:
+                var value = /** @type {string} */ (reader.readString());
+                msg.setPath(value);
+                break;
+            case 2:
+                var value = /** @type {string} */ (reader.readString());
+                msg.setMemo(value);
+                break;
+            default:
+                reader.skipField();
+                break;
+        }
+    }
+    return msg;
+};
+
+
+/**
+ * Serializes the message to binary data (in protobuf wire format).
+ * @return {!Uint8Array}
+ */
+proto.im.Service.prototype.serializeBinary = function () {
+    var writer = new jspb.BinaryWriter();
+    proto.im.Service.serializeBinaryToWriter(this, writer);
+    return writer.getResultBuffer();
+};
+
+
+/**
+ * Serializes the given message to binary data (in protobuf wire
+ * format), writing to the given BinaryWriter.
+ * @param {!proto.im.Service} message
+ * @param {!jspb.BinaryWriter} writer
+ * @suppress {unusedLocalVariables} f is only used for nested messages
+ */
+proto.im.Service.serializeBinaryToWriter = function (message, writer) {
+    var f = undefined;
+    f = message.getPath();
+    if (f.length > 0) {
+        writer.writeString(
+            1,
+            f
+        );
+    }
+    f = message.getMemo();
+    if (f.length > 0) {
+        writer.writeString(
+            2,
+            f
+        );
+    }
+};
+
+
+/**
+ * optional string path = 1;
+ * @return {string}
+ */
+proto.im.Service.prototype.getPath = function () {
+    return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, ""));
+};
+
+
+/**
+ * @param {string} value
+ * @return {!proto.im.Service} returns this
+ */
+proto.im.Service.prototype.setPath = function (value) {
+    return jspb.Message.setProto3StringField(this, 1, value);
+};
+
+
+/**
+ * optional string memo = 2;
+ * @return {string}
+ */
+proto.im.Service.prototype.getMemo = function () {
+    return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 2, ""));
+};
+
+
+/**
+ * @param {string} value
+ * @return {!proto.im.Service} returns this
+ */
+proto.im.Service.prototype.setMemo = function (value) {
+    return jspb.Message.setProto3StringField(this, 2, value);
+};
+
+
+/**
+ * List of repeated fields within this message type.
+ * @private {!Array<number>}
+ * @const
+ */
+proto.im.SaveServiceListRequest.repeatedFields_ = [1];
+
+
+if (jspb.Message.GENERATE_TO_OBJECT) {
+    /**
+     * Creates an object representation of this proto.
+     * Field names that are reserved in JavaScript and will be renamed to pb_name.
+     * Optional fields that are not set will be set to undefined.
+     * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default.
+     * For the list of reserved names please see:
+     *     net/proto2/compiler/js/internal/generator.cc#kKeyword.
+     * @param {boolean=} opt_includeInstance Deprecated. whether to include the
+     *     JSPB instance for transitional soy proto support:
+     *     http://goto/soy-param-migration
+     * @return {!Object}
+     */
+    proto.im.SaveServiceListRequest.prototype.toObject = function (opt_includeInstance) {
+        return proto.im.SaveServiceListRequest.toObject(opt_includeInstance, this);
+    };
+
+
+    /**
+     * Static version of the {@see toObject} method.
+     * @param {boolean|undefined} includeInstance Deprecated. Whether to include
+     *     the JSPB instance for transitional soy proto support:
+     *     http://goto/soy-param-migration
+     * @param {!proto.im.SaveServiceListRequest} msg The msg instance to transform.
+     * @return {!Object}
+     * @suppress {unusedLocalVariables} f is only used for nested messages
+     */
+    proto.im.SaveServiceListRequest.toObject = function (includeInstance, msg) {
+        var f, obj = {
+            listList: jspb.Message.toObjectList(msg.getListList(),
+                proto.im.Service.toObject, includeInstance)
+        };
+
+        if (includeInstance) {
+            obj.$jspbMessageInstance = msg;
+        }
+        return obj;
+    };
+}
+
+
+/**
+ * Deserializes binary data (in protobuf wire format).
+ * @param {jspb.ByteSource} bytes The bytes to deserialize.
+ * @return {!proto.im.SaveServiceListRequest}
+ */
+proto.im.SaveServiceListRequest.deserializeBinary = function (bytes) {
+    var reader = new jspb.BinaryReader(bytes);
+    var msg = new proto.im.SaveServiceListRequest;
+    return proto.im.SaveServiceListRequest.deserializeBinaryFromReader(msg, reader);
+};
+
+
+/**
+ * Deserializes binary data (in protobuf wire format) from the
+ * given reader into the given message object.
+ * @param {!proto.im.SaveServiceListRequest} msg The message object to deserialize into.
+ * @param {!jspb.BinaryReader} reader The BinaryReader to use.
+ * @return {!proto.im.SaveServiceListRequest}
+ */
+proto.im.SaveServiceListRequest.deserializeBinaryFromReader = function (msg, reader) {
+    while (reader.nextField()) {
+        if (reader.isEndGroup()) {
+            break;
+        }
+        var field = reader.getFieldNumber();
+        switch (field) {
+            case 1:
+                var value = new proto.im.Service;
+                reader.readMessage(value, proto.im.Service.deserializeBinaryFromReader);
+                msg.addList(value);
+                break;
+            default:
+                reader.skipField();
+                break;
+        }
+    }
+    return msg;
+};
+
+
+/**
+ * Serializes the message to binary data (in protobuf wire format).
+ * @return {!Uint8Array}
+ */
+proto.im.SaveServiceListRequest.prototype.serializeBinary = function () {
+    var writer = new jspb.BinaryWriter();
+    proto.im.SaveServiceListRequest.serializeBinaryToWriter(this, writer);
+    return writer.getResultBuffer();
+};
+
+
+/**
+ * Serializes the given message to binary data (in protobuf wire
+ * format), writing to the given BinaryWriter.
+ * @param {!proto.im.SaveServiceListRequest} message
+ * @param {!jspb.BinaryWriter} writer
+ * @suppress {unusedLocalVariables} f is only used for nested messages
+ */
+proto.im.SaveServiceListRequest.serializeBinaryToWriter = function (message, writer) {
+    var f = undefined;
+    f = message.getListList();
+    if (f.length > 0) {
+        writer.writeRepeatedMessage(
+            1,
+            f,
+            proto.im.Service.serializeBinaryToWriter
+        );
+    }
+};
+
+
+/**
+ * repeated Service list = 1;
+ * @return {!Array<!proto.im.Service>}
+ */
+proto.im.SaveServiceListRequest.prototype.getListList = function () {
+    return /** @type{!Array<!proto.im.Service>} */ (
+        jspb.Message.getRepeatedWrapperField(this, proto.im.Service, 1));
+};
+
+
+/**
+ * @param {!Array<!proto.im.Service>} value
+ * @return {!proto.im.SaveServiceListRequest} returns this
+ */
+proto.im.SaveServiceListRequest.prototype.setListList = function (value) {
+    return jspb.Message.setRepeatedWrapperField(this, 1, value);
+};
+
+
+/**
+ * @param {!proto.im.Service=} opt_value
+ * @param {number=} opt_index
+ * @return {!proto.im.Service}
+ */
+proto.im.SaveServiceListRequest.prototype.addList = function (opt_value, opt_index) {
+    return jspb.Message.addToRepeatedWrapperField(this, 1, opt_value, proto.im.Service, opt_index);
+};
+
+
+/**
+ * Clears the list making it empty but non-null.
+ * @return {!proto.im.SaveServiceListRequest} returns this
+ */
+proto.im.SaveServiceListRequest.prototype.clearListList = function () {
+    return this.setListList([]);
+};
+
+
+if (jspb.Message.GENERATE_TO_OBJECT) {
+    /**
+     * Creates an object representation of this proto.
+     * Field names that are reserved in JavaScript and will be renamed to pb_name.
+     * Optional fields that are not set will be set to undefined.
+     * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default.
+     * For the list of reserved names please see:
+     *     net/proto2/compiler/js/internal/generator.cc#kKeyword.
+     * @param {boolean=} opt_includeInstance Deprecated. whether to include the
+     *     JSPB instance for transitional soy proto support:
+     *     http://goto/soy-param-migration
+     * @return {!Object}
+     */
+    proto.im.CreateSystemRequest.prototype.toObject = function (opt_includeInstance) {
+        return proto.im.CreateSystemRequest.toObject(opt_includeInstance, this);
+    };
+
+
+    /**
+     * Static version of the {@see toObject} method.
+     * @param {boolean|undefined} includeInstance Deprecated. Whether to include
+     *     the JSPB instance for transitional soy proto support:
+     *     http://goto/soy-param-migration
+     * @param {!proto.im.CreateSystemRequest} msg The msg instance to transform.
+     * @return {!Object}
+     * @suppress {unusedLocalVariables} f is only used for nested messages
+     */
+    proto.im.CreateSystemRequest.toObject = function (includeInstance, msg) {
+        var f, obj = {
+            fullname: jspb.Message.getFieldWithDefault(msg, 1, ""),
+            shortname: jspb.Message.getFieldWithDefault(msg, 2, ""),
+            sysurl: jspb.Message.getFieldWithDefault(msg, 3, ""),
+            memo: jspb.Message.getFieldWithDefault(msg, 4, "")
+        };
+
+        if (includeInstance) {
+            obj.$jspbMessageInstance = msg;
+        }
+        return obj;
+    };
+}
+
+
+/**
+ * Deserializes binary data (in protobuf wire format).
+ * @param {jspb.ByteSource} bytes The bytes to deserialize.
+ * @return {!proto.im.CreateSystemRequest}
+ */
+proto.im.CreateSystemRequest.deserializeBinary = function (bytes) {
+    var reader = new jspb.BinaryReader(bytes);
+    var msg = new proto.im.CreateSystemRequest;
+    return proto.im.CreateSystemRequest.deserializeBinaryFromReader(msg, reader);
+};
+
+
+/**
+ * Deserializes binary data (in protobuf wire format) from the
+ * given reader into the given message object.
+ * @param {!proto.im.CreateSystemRequest} msg The message object to deserialize into.
+ * @param {!jspb.BinaryReader} reader The BinaryReader to use.
+ * @return {!proto.im.CreateSystemRequest}
+ */
+proto.im.CreateSystemRequest.deserializeBinaryFromReader = function (msg, reader) {
+    while (reader.nextField()) {
+        if (reader.isEndGroup()) {
+            break;
+        }
+        var field = reader.getFieldNumber();
+        switch (field) {
+            case 1:
+                var value = /** @type {string} */ (reader.readString());
+                msg.setFullname(value);
+                break;
+            case 2:
+                var value = /** @type {string} */ (reader.readString());
+                msg.setShortname(value);
+                break;
+            case 3:
+                var value = /** @type {string} */ (reader.readString());
+                msg.setSysurl(value);
+                break;
+            case 4:
+                var value = /** @type {string} */ (reader.readString());
+                msg.setMemo(value);
+                break;
+            default:
+                reader.skipField();
+                break;
+        }
+    }
+    return msg;
+};
+
+
+/**
+ * Serializes the message to binary data (in protobuf wire format).
+ * @return {!Uint8Array}
+ */
+proto.im.CreateSystemRequest.prototype.serializeBinary = function () {
+    var writer = new jspb.BinaryWriter();
+    proto.im.CreateSystemRequest.serializeBinaryToWriter(this, writer);
+    return writer.getResultBuffer();
+};
+
+
+/**
+ * Serializes the given message to binary data (in protobuf wire
+ * format), writing to the given BinaryWriter.
+ * @param {!proto.im.CreateSystemRequest} message
+ * @param {!jspb.BinaryWriter} writer
+ * @suppress {unusedLocalVariables} f is only used for nested messages
+ */
+proto.im.CreateSystemRequest.serializeBinaryToWriter = function (message, writer) {
+    var f = undefined;
+    f = message.getFullname();
+    if (f.length > 0) {
+        writer.writeString(
+            1,
+            f
+        );
+    }
+    f = message.getShortname();
+    if (f.length > 0) {
+        writer.writeString(
+            2,
+            f
+        );
+    }
+    f = message.getSysurl();
+    if (f.length > 0) {
+        writer.writeString(
+            3,
+            f
+        );
+    }
+    f = message.getMemo();
+    if (f.length > 0) {
+        writer.writeString(
+            4,
+            f
+        );
+    }
+};
+
+
+/**
+ * optional string fullName = 1;
+ * @return {string}
+ */
+proto.im.CreateSystemRequest.prototype.getFullname = function () {
+    return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, ""));
+};
+
+
+/**
+ * @param {string} value
+ * @return {!proto.im.CreateSystemRequest} returns this
+ */
+proto.im.CreateSystemRequest.prototype.setFullname = function (value) {
+    return jspb.Message.setProto3StringField(this, 1, value);
+};
+
+
+/**
+ * optional string shortname = 2;
+ * @return {string}
+ */
+proto.im.CreateSystemRequest.prototype.getShortname = function () {
+    return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 2, ""));
+};
+
+
+/**
+ * @param {string} value
+ * @return {!proto.im.CreateSystemRequest} returns this
+ */
+proto.im.CreateSystemRequest.prototype.setShortname = function (value) {
+    return jspb.Message.setProto3StringField(this, 2, value);
+};
+
+
+/**
+ * optional string sysUrl = 3;
+ * @return {string}
+ */
+proto.im.CreateSystemRequest.prototype.getSysurl = function () {
+    return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 3, ""));
+};
+
+
+/**
+ * @param {string} value
+ * @return {!proto.im.CreateSystemRequest} returns this
+ */
+proto.im.CreateSystemRequest.prototype.setSysurl = function (value) {
+    return jspb.Message.setProto3StringField(this, 3, value);
+};
+
+
+/**
+ * optional string memo = 4;
+ * @return {string}
+ */
+proto.im.CreateSystemRequest.prototype.getMemo = function () {
+    return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 4, ""));
+};
+
+
+/**
+ * @param {string} value
+ * @return {!proto.im.CreateSystemRequest} returns this
+ */
+proto.im.CreateSystemRequest.prototype.setMemo = function (value) {
+    return jspb.Message.setProto3StringField(this, 4, value);
+};
+
+
+if (jspb.Message.GENERATE_TO_OBJECT) {
+    /**
+     * Creates an object representation of this proto.
+     * Field names that are reserved in JavaScript and will be renamed to pb_name.
+     * Optional fields that are not set will be set to undefined.
+     * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default.
+     * For the list of reserved names please see:
+     *     net/proto2/compiler/js/internal/generator.cc#kKeyword.
+     * @param {boolean=} opt_includeInstance Deprecated. whether to include the
+     *     JSPB instance for transitional soy proto support:
+     *     http://goto/soy-param-migration
+     * @return {!Object}
+     */
+    proto.im.UserGetColumnListRequest.prototype.toObject = function (opt_includeInstance) {
+        return proto.im.UserGetColumnListRequest.toObject(opt_includeInstance, this);
+    };
+
+
+    /**
+     * Static version of the {@see toObject} method.
+     * @param {boolean|undefined} includeInstance Deprecated. Whether to include
+     *     the JSPB instance for transitional soy proto support:
+     *     http://goto/soy-param-migration
+     * @param {!proto.im.UserGetColumnListRequest} msg The msg instance to transform.
+     * @return {!Object}
+     * @suppress {unusedLocalVariables} f is only used for nested messages
+     */
+    proto.im.UserGetColumnListRequest.toObject = function (includeInstance, msg) {
+        var f, obj = {
+            userid: jspb.Message.getFieldWithDefault(msg, 1, 0),
+            parentid: jspb.Message.getFieldWithDefault(msg, 2, 0),
+            sysid: jspb.Message.getFieldWithDefault(msg, 3, 0)
+        };
+
+        if (includeInstance) {
+            obj.$jspbMessageInstance = msg;
+        }
+        return obj;
+    };
+}
+
+
+/**
+ * Deserializes binary data (in protobuf wire format).
+ * @param {jspb.ByteSource} bytes The bytes to deserialize.
+ * @return {!proto.im.UserGetColumnListRequest}
+ */
+proto.im.UserGetColumnListRequest.deserializeBinary = function (bytes) {
+    var reader = new jspb.BinaryReader(bytes);
+    var msg = new proto.im.UserGetColumnListRequest;
+    return proto.im.UserGetColumnListRequest.deserializeBinaryFromReader(msg, reader);
+};
+
+
+/**
+ * Deserializes binary data (in protobuf wire format) from the
+ * given reader into the given message object.
+ * @param {!proto.im.UserGetColumnListRequest} msg The message object to deserialize into.
+ * @param {!jspb.BinaryReader} reader The BinaryReader to use.
+ * @return {!proto.im.UserGetColumnListRequest}
+ */
+proto.im.UserGetColumnListRequest.deserializeBinaryFromReader = function (msg, reader) {
+    while (reader.nextField()) {
+        if (reader.isEndGroup()) {
+            break;
+        }
+        var field = reader.getFieldNumber();
+        switch (field) {
+            case 1:
+                var value = /** @type {number} */ (reader.readInt64());
+                msg.setUserid(value);
+                break;
+            case 2:
+                var value = /** @type {number} */ (reader.readInt32());
+                msg.setParentid(value);
+                break;
+            case 3:
+                var value = /** @type {number} */ (reader.readInt64());
+                msg.setSysid(value);
+                break;
+            default:
+                reader.skipField();
+                break;
+        }
+    }
+    return msg;
+};
+
+
+/**
+ * Serializes the message to binary data (in protobuf wire format).
+ * @return {!Uint8Array}
+ */
+proto.im.UserGetColumnListRequest.prototype.serializeBinary = function () {
+    var writer = new jspb.BinaryWriter();
+    proto.im.UserGetColumnListRequest.serializeBinaryToWriter(this, writer);
+    return writer.getResultBuffer();
+};
+
+
+/**
+ * Serializes the given message to binary data (in protobuf wire
+ * format), writing to the given BinaryWriter.
+ * @param {!proto.im.UserGetColumnListRequest} message
+ * @param {!jspb.BinaryWriter} writer
+ * @suppress {unusedLocalVariables} f is only used for nested messages
+ */
+proto.im.UserGetColumnListRequest.serializeBinaryToWriter = function (message, writer) {
+    var f = undefined;
+    f = message.getUserid();
+    if (f !== 0) {
+        writer.writeInt64(
+            1,
+            f
+        );
+    }
+    f = message.getParentid();
+    if (f !== 0) {
+        writer.writeInt32(
+            2,
+            f
+        );
+    }
+    f = message.getSysid();
+    if (f !== 0) {
+        writer.writeInt64(
+            3,
+            f
+        );
+    }
+};
+
+
+/**
+ * optional int64 userId = 1;
+ * @return {number}
+ */
+proto.im.UserGetColumnListRequest.prototype.getUserid = function () {
+    return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 1, 0));
+};
+
+
+/**
+ * @param {number} value
+ * @return {!proto.im.UserGetColumnListRequest} returns this
+ */
+proto.im.UserGetColumnListRequest.prototype.setUserid = function (value) {
+    return jspb.Message.setProto3IntField(this, 1, value);
+};
+
+
+/**
+ * optional int32 parentId = 2;
+ * @return {number}
+ */
+proto.im.UserGetColumnListRequest.prototype.getParentid = function () {
+    return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 2, 0));
+};
+
+
+/**
+ * @param {number} value
+ * @return {!proto.im.UserGetColumnListRequest} returns this
+ */
+proto.im.UserGetColumnListRequest.prototype.setParentid = function (value) {
+    return jspb.Message.setProto3IntField(this, 2, value);
+};
+
+
+/**
+ * optional int64 sysId = 3;
+ * @return {number}
+ */
+proto.im.UserGetColumnListRequest.prototype.getSysid = function () {
+    return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 3, 0));
+};
+
+
+/**
+ * @param {number} value
+ * @return {!proto.im.UserGetColumnListRequest} returns this
+ */
+proto.im.UserGetColumnListRequest.prototype.setSysid = function (value) {
+    return jspb.Message.setProto3IntField(this, 3, value);
+};
+
+
+if (jspb.Message.GENERATE_TO_OBJECT) {
+    /**
+     * Creates an object representation of this proto.
+     * Field names that are reserved in JavaScript and will be renamed to pb_name.
+     * Optional fields that are not set will be set to undefined.
+     * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default.
+     * For the list of reserved names please see:
+     *     net/proto2/compiler/js/internal/generator.cc#kKeyword.
+     * @param {boolean=} opt_includeInstance Deprecated. whether to include the
+     *     JSPB instance for transitional soy proto support:
+     *     http://goto/soy-param-migration
+     * @return {!Object}
+     */
+    proto.im.Column.prototype.toObject = function (opt_includeInstance) {
+        return proto.im.Column.toObject(opt_includeInstance, this);
+    };
+
+
+    /**
+     * Static version of the {@see toObject} method.
+     * @param {boolean|undefined} includeInstance Deprecated. Whether to include
+     *     the JSPB instance for transitional soy proto support:
+     *     http://goto/soy-param-migration
+     * @param {!proto.im.Column} msg The msg instance to transform.
+     * @return {!Object}
+     * @suppress {unusedLocalVariables} f is only used for nested messages
+     */
+    proto.im.Column.toObject = function (includeInstance, msg) {
+        var f, obj = {
+            name: jspb.Message.getFieldWithDefault(msg, 1, ""),
+            url: jspb.Message.getFieldWithDefault(msg, 2, ""),
+            code: jspb.Message.getFieldWithDefault(msg, 3, ""),
+            sn: jspb.Message.getFieldWithDefault(msg, 4, 0),
+            status: jspb.Message.getFieldWithDefault(msg, 5, 0),
+            navshow: jspb.Message.getBooleanFieldWithDefault(msg, 6, false),
+            id: jspb.Message.getFieldWithDefault(msg, 7, 0)
+        };
+
+        if (includeInstance) {
+            obj.$jspbMessageInstance = msg;
+        }
+        return obj;
+    };
+}
+
+
+/**
+ * Deserializes binary data (in protobuf wire format).
+ * @param {jspb.ByteSource} bytes The bytes to deserialize.
+ * @return {!proto.im.Column}
+ */
+proto.im.Column.deserializeBinary = function (bytes) {
+    var reader = new jspb.BinaryReader(bytes);
+    var msg = new proto.im.Column;
+    return proto.im.Column.deserializeBinaryFromReader(msg, reader);
+};
+
+
+/**
+ * Deserializes binary data (in protobuf wire format) from the
+ * given reader into the given message object.
+ * @param {!proto.im.Column} msg The message object to deserialize into.
+ * @param {!jspb.BinaryReader} reader The BinaryReader to use.
+ * @return {!proto.im.Column}
+ */
+proto.im.Column.deserializeBinaryFromReader = function (msg, reader) {
+    while (reader.nextField()) {
+        if (reader.isEndGroup()) {
+            break;
+        }
+        var field = reader.getFieldNumber();
+        switch (field) {
+            case 1:
+                var value = /** @type {string} */ (reader.readString());
+                msg.setName(value);
+                break;
+            case 2:
+                var value = /** @type {string} */ (reader.readString());
+                msg.setUrl(value);
+                break;
+            case 3:
+                var value = /** @type {string} */ (reader.readString());
+                msg.setCode(value);
+                break;
+            case 4:
+                var value = /** @type {number} */ (reader.readInt32());
+                msg.setSn(value);
+                break;
+            case 5:
+                var value = /** @type {!proto.im.Status} */ (reader.readEnum());
+                msg.setStatus(value);
+                break;
+            case 6:
+                var value = /** @type {boolean} */ (reader.readBool());
+                msg.setNavshow(value);
+                break;
+            case 7:
+                var value = /** @type {number} */ (reader.readInt64());
+                msg.setId(value);
+                break;
+            default:
+                reader.skipField();
+                break;
+        }
+    }
+    return msg;
+};
+
+
+/**
+ * Serializes the message to binary data (in protobuf wire format).
+ * @return {!Uint8Array}
+ */
+proto.im.Column.prototype.serializeBinary = function () {
+    var writer = new jspb.BinaryWriter();
+    proto.im.Column.serializeBinaryToWriter(this, writer);
+    return writer.getResultBuffer();
+};
+
+
+/**
+ * Serializes the given message to binary data (in protobuf wire
+ * format), writing to the given BinaryWriter.
+ * @param {!proto.im.Column} message
+ * @param {!jspb.BinaryWriter} writer
+ * @suppress {unusedLocalVariables} f is only used for nested messages
+ */
+proto.im.Column.serializeBinaryToWriter = function (message, writer) {
+    var f = undefined;
+    f = message.getName();
+    if (f.length > 0) {
+        writer.writeString(
+            1,
+            f
+        );
+    }
+    f = message.getUrl();
+    if (f.length > 0) {
+        writer.writeString(
+            2,
+            f
+        );
+    }
+    f = message.getCode();
+    if (f.length > 0) {
+        writer.writeString(
+            3,
+            f
+        );
+    }
+    f = message.getSn();
+    if (f !== 0) {
+        writer.writeInt32(
+            4,
+            f
+        );
+    }
+    f = message.getStatus();
+    if (f !== 0.0) {
+        writer.writeEnum(
+            5,
+            f
+        );
+    }
+    f = message.getNavshow();
+    if (f) {
+        writer.writeBool(
+            6,
+            f
+        );
+    }
+    f = message.getId();
+    if (f !== 0) {
+        writer.writeInt64(
+            7,
+            f
+        );
+    }
+};
+
+
+/**
+ * optional string name = 1;
+ * @return {string}
+ */
+proto.im.Column.prototype.getName = function () {
+    return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, ""));
+};
+
+
+/**
+ * @param {string} value
+ * @return {!proto.im.Column} returns this
+ */
+proto.im.Column.prototype.setName = function (value) {
+    return jspb.Message.setProto3StringField(this, 1, value);
+};
+
+
+/**
+ * optional string url = 2;
+ * @return {string}
+ */
+proto.im.Column.prototype.getUrl = function () {
+    return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 2, ""));
+};
+
+
+/**
+ * @param {string} value
+ * @return {!proto.im.Column} returns this
+ */
+proto.im.Column.prototype.setUrl = function (value) {
+    return jspb.Message.setProto3StringField(this, 2, value);
+};
+
+
+/**
+ * optional string code = 3;
+ * @return {string}
+ */
+proto.im.Column.prototype.getCode = function () {
+    return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 3, ""));
+};
+
+
+/**
+ * @param {string} value
+ * @return {!proto.im.Column} returns this
+ */
+proto.im.Column.prototype.setCode = function (value) {
+    return jspb.Message.setProto3StringField(this, 3, value);
+};
+
+
+/**
+ * optional int32 sn = 4;
+ * @return {number}
+ */
+proto.im.Column.prototype.getSn = function () {
+    return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 4, 0));
+};
+
+
+/**
+ * @param {number} value
+ * @return {!proto.im.Column} returns this
+ */
+proto.im.Column.prototype.setSn = function (value) {
+    return jspb.Message.setProto3IntField(this, 4, value);
+};
+
+
+/**
+ * optional Status status = 5;
+ * @return {!proto.im.Status}
+ */
+proto.im.Column.prototype.getStatus = function () {
+    return /** @type {!proto.im.Status} */ (jspb.Message.getFieldWithDefault(this, 5, 0));
+};
+
+
+/**
+ * @param {!proto.im.Status} value
+ * @return {!proto.im.Column} returns this
+ */
+proto.im.Column.prototype.setStatus = function (value) {
+    return jspb.Message.setProto3EnumField(this, 5, value);
+};
+
+
+/**
+ * optional bool navShow = 6;
+ * @return {boolean}
+ */
+proto.im.Column.prototype.getNavshow = function () {
+    return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 6, false));
+};
+
+
+/**
+ * @param {boolean} value
+ * @return {!proto.im.Column} returns this
+ */
+proto.im.Column.prototype.setNavshow = function (value) {
+    return jspb.Message.setProto3BooleanField(this, 6, value);
+};
+
+
+/**
+ * optional int64 id = 7;
+ * @return {number}
+ */
+proto.im.Column.prototype.getId = function () {
+    return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 7, 0));
+};
+
+
+/**
+ * @param {number} value
+ * @return {!proto.im.Column} returns this
+ */
+proto.im.Column.prototype.setId = function (value) {
+    return jspb.Message.setProto3IntField(this, 7, value);
+};
+
+
+/**
+ * List of repeated fields within this message type.
+ * @private {!Array<number>}
+ * @const
+ */
+proto.im.UserGetColumnListReply.repeatedFields_ = [1];
+
+
+if (jspb.Message.GENERATE_TO_OBJECT) {
+    /**
+     * Creates an object representation of this proto.
+     * Field names that are reserved in JavaScript and will be renamed to pb_name.
+     * Optional fields that are not set will be set to undefined.
+     * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default.
+     * For the list of reserved names please see:
+     *     net/proto2/compiler/js/internal/generator.cc#kKeyword.
+     * @param {boolean=} opt_includeInstance Deprecated. whether to include the
+     *     JSPB instance for transitional soy proto support:
+     *     http://goto/soy-param-migration
+     * @return {!Object}
+     */
+    proto.im.UserGetColumnListReply.prototype.toObject = function (opt_includeInstance) {
+        return proto.im.UserGetColumnListReply.toObject(opt_includeInstance, this);
+    };
+
+
+    /**
+     * Static version of the {@see toObject} method.
+     * @param {boolean|undefined} includeInstance Deprecated. Whether to include
+     *     the JSPB instance for transitional soy proto support:
+     *     http://goto/soy-param-migration
+     * @param {!proto.im.UserGetColumnListReply} msg The msg instance to transform.
+     * @return {!Object}
+     * @suppress {unusedLocalVariables} f is only used for nested messages
+     */
+    proto.im.UserGetColumnListReply.toObject = function (includeInstance, msg) {
+        var f, obj = {
+            listList: jspb.Message.toObjectList(msg.getListList(),
+                proto.im.Column.toObject, includeInstance)
+        };
+
+        if (includeInstance) {
+            obj.$jspbMessageInstance = msg;
+        }
+        return obj;
+    };
+}
+
+
+/**
+ * Deserializes binary data (in protobuf wire format).
+ * @param {jspb.ByteSource} bytes The bytes to deserialize.
+ * @return {!proto.im.UserGetColumnListReply}
+ */
+proto.im.UserGetColumnListReply.deserializeBinary = function (bytes) {
+    var reader = new jspb.BinaryReader(bytes);
+    var msg = new proto.im.UserGetColumnListReply;
+    return proto.im.UserGetColumnListReply.deserializeBinaryFromReader(msg, reader);
+};
+
+
+/**
+ * Deserializes binary data (in protobuf wire format) from the
+ * given reader into the given message object.
+ * @param {!proto.im.UserGetColumnListReply} msg The message object to deserialize into.
+ * @param {!jspb.BinaryReader} reader The BinaryReader to use.
+ * @return {!proto.im.UserGetColumnListReply}
+ */
+proto.im.UserGetColumnListReply.deserializeBinaryFromReader = function (msg, reader) {
+    while (reader.nextField()) {
+        if (reader.isEndGroup()) {
+            break;
+        }
+        var field = reader.getFieldNumber();
+        switch (field) {
+            case 1:
+                var value = new proto.im.Column;
+                reader.readMessage(value, proto.im.Column.deserializeBinaryFromReader);
+                msg.addList(value);
+                break;
+            default:
+                reader.skipField();
+                break;
+        }
+    }
+    return msg;
+};
+
+
+/**
+ * Serializes the message to binary data (in protobuf wire format).
+ * @return {!Uint8Array}
+ */
+proto.im.UserGetColumnListReply.prototype.serializeBinary = function () {
+    var writer = new jspb.BinaryWriter();
+    proto.im.UserGetColumnListReply.serializeBinaryToWriter(this, writer);
+    return writer.getResultBuffer();
+};
+
+
+/**
+ * Serializes the given message to binary data (in protobuf wire
+ * format), writing to the given BinaryWriter.
+ * @param {!proto.im.UserGetColumnListReply} message
+ * @param {!jspb.BinaryWriter} writer
+ * @suppress {unusedLocalVariables} f is only used for nested messages
+ */
+proto.im.UserGetColumnListReply.serializeBinaryToWriter = function (message, writer) {
+    var f = undefined;
+    f = message.getListList();
+    if (f.length > 0) {
+        writer.writeRepeatedMessage(
+            1,
+            f,
+            proto.im.Column.serializeBinaryToWriter
+        );
+    }
+};
+
+
+/**
+ * repeated Column list = 1;
+ * @return {!Array<!proto.im.Column>}
+ */
+proto.im.UserGetColumnListReply.prototype.getListList = function () {
+    return /** @type{!Array<!proto.im.Column>} */ (
+        jspb.Message.getRepeatedWrapperField(this, proto.im.Column, 1));
+};
+
+
+/**
+ * @param {!Array<!proto.im.Column>} value
+ * @return {!proto.im.UserGetColumnListReply} returns this
+ */
+proto.im.UserGetColumnListReply.prototype.setListList = function (value) {
+    return jspb.Message.setRepeatedWrapperField(this, 1, value);
+};
+
+
+/**
+ * @param {!proto.im.Column=} opt_value
+ * @param {number=} opt_index
+ * @return {!proto.im.Column}
+ */
+proto.im.UserGetColumnListReply.prototype.addList = function (opt_value, opt_index) {
+    return jspb.Message.addToRepeatedWrapperField(this, 1, opt_value, proto.im.Column, opt_index);
+};
+
+
+/**
+ * Clears the list making it empty but non-null.
+ * @return {!proto.im.UserGetColumnListReply} returns this
+ */
+proto.im.UserGetColumnListReply.prototype.clearListList = function () {
+    return this.setListList([]);
+};
+
+
+if (jspb.Message.GENERATE_TO_OBJECT) {
+    /**
+     * Creates an object representation of this proto.
+     * Field names that are reserved in JavaScript and will be renamed to pb_name.
+     * Optional fields that are not set will be set to undefined.
+     * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default.
+     * For the list of reserved names please see:
+     *     net/proto2/compiler/js/internal/generator.cc#kKeyword.
+     * @param {boolean=} opt_includeInstance Deprecated. whether to include the
+     *     JSPB instance for transitional soy proto support:
+     *     http://goto/soy-param-migration
+     * @return {!Object}
+     */
+    proto.im.CreateRoleRequest.prototype.toObject = function (opt_includeInstance) {
+        return proto.im.CreateRoleRequest.toObject(opt_includeInstance, this);
+    };
+
+
+    /**
+     * Static version of the {@see toObject} method.
+     * @param {boolean|undefined} includeInstance Deprecated. Whether to include
+     *     the JSPB instance for transitional soy proto support:
+     *     http://goto/soy-param-migration
+     * @param {!proto.im.CreateRoleRequest} msg The msg instance to transform.
+     * @return {!Object}
+     * @suppress {unusedLocalVariables} f is only used for nested messages
+     */
+    proto.im.CreateRoleRequest.toObject = function (includeInstance, msg) {
+        var f, obj = {
+            name: jspb.Message.getFieldWithDefault(msg, 1, ""),
+            memo: jspb.Message.getFieldWithDefault(msg, 2, "")
+        };
+
+        if (includeInstance) {
+            obj.$jspbMessageInstance = msg;
+        }
+        return obj;
+    };
+}
+
+
+/**
+ * Deserializes binary data (in protobuf wire format).
+ * @param {jspb.ByteSource} bytes The bytes to deserialize.
+ * @return {!proto.im.CreateRoleRequest}
+ */
+proto.im.CreateRoleRequest.deserializeBinary = function (bytes) {
+    var reader = new jspb.BinaryReader(bytes);
+    var msg = new proto.im.CreateRoleRequest;
+    return proto.im.CreateRoleRequest.deserializeBinaryFromReader(msg, reader);
+};
+
+
+/**
+ * Deserializes binary data (in protobuf wire format) from the
+ * given reader into the given message object.
+ * @param {!proto.im.CreateRoleRequest} msg The message object to deserialize into.
+ * @param {!jspb.BinaryReader} reader The BinaryReader to use.
+ * @return {!proto.im.CreateRoleRequest}
+ */
+proto.im.CreateRoleRequest.deserializeBinaryFromReader = function (msg, reader) {
+    while (reader.nextField()) {
+        if (reader.isEndGroup()) {
+            break;
+        }
+        var field = reader.getFieldNumber();
+        switch (field) {
+            case 1:
+                var value = /** @type {string} */ (reader.readString());
+                msg.setName(value);
+                break;
+            case 2:
+                var value = /** @type {string} */ (reader.readString());
+                msg.setMemo(value);
+                break;
+            default:
+                reader.skipField();
+                break;
+        }
+    }
+    return msg;
+};
+
+
+/**
+ * Serializes the message to binary data (in protobuf wire format).
+ * @return {!Uint8Array}
+ */
+proto.im.CreateRoleRequest.prototype.serializeBinary = function () {
+    var writer = new jspb.BinaryWriter();
+    proto.im.CreateRoleRequest.serializeBinaryToWriter(this, writer);
+    return writer.getResultBuffer();
+};
+
+
+/**
+ * Serializes the given message to binary data (in protobuf wire
+ * format), writing to the given BinaryWriter.
+ * @param {!proto.im.CreateRoleRequest} message
+ * @param {!jspb.BinaryWriter} writer
+ * @suppress {unusedLocalVariables} f is only used for nested messages
+ */
+proto.im.CreateRoleRequest.serializeBinaryToWriter = function (message, writer) {
+    var f = undefined;
+    f = message.getName();
+    if (f.length > 0) {
+        writer.writeString(
+            1,
+            f
+        );
+    }
+    f = message.getMemo();
+    if (f.length > 0) {
+        writer.writeString(
+            2,
+            f
+        );
+    }
+};
+
+
+/**
+ * optional string name = 1;
+ * @return {string}
+ */
+proto.im.CreateRoleRequest.prototype.getName = function () {
+    return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, ""));
+};
+
+
+/**
+ * @param {string} value
+ * @return {!proto.im.CreateRoleRequest} returns this
+ */
+proto.im.CreateRoleRequest.prototype.setName = function (value) {
+    return jspb.Message.setProto3StringField(this, 1, value);
+};
+
+
+/**
+ * optional string memo = 2;
+ * @return {string}
+ */
+proto.im.CreateRoleRequest.prototype.getMemo = function () {
+    return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 2, ""));
+};
+
+
+/**
+ * @param {string} value
+ * @return {!proto.im.CreateRoleRequest} returns this
+ */
+proto.im.CreateRoleRequest.prototype.setMemo = function (value) {
+    return jspb.Message.setProto3StringField(this, 2, value);
+};
+
+
+if (jspb.Message.GENERATE_TO_OBJECT) {
+    /**
+     * Creates an object representation of this proto.
+     * Field names that are reserved in JavaScript and will be renamed to pb_name.
+     * Optional fields that are not set will be set to undefined.
+     * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default.
+     * For the list of reserved names please see:
+     *     net/proto2/compiler/js/internal/generator.cc#kKeyword.
+     * @param {boolean=} opt_includeInstance Deprecated. whether to include the
+     *     JSPB instance for transitional soy proto support:
+     *     http://goto/soy-param-migration
+     * @return {!Object}
+     */
+    proto.im.Role.prototype.toObject = function (opt_includeInstance) {
+        return proto.im.Role.toObject(opt_includeInstance, this);
+    };
+
+
+    /**
+     * Static version of the {@see toObject} method.
+     * @param {boolean|undefined} includeInstance Deprecated. Whether to include
+     *     the JSPB instance for transitional soy proto support:
+     *     http://goto/soy-param-migration
+     * @param {!proto.im.Role} msg The msg instance to transform.
+     * @return {!Object}
+     * @suppress {unusedLocalVariables} f is only used for nested messages
+     */
+    proto.im.Role.toObject = function (includeInstance, msg) {
+        var f, obj = {
+            id: jspb.Message.getFieldWithDefault(msg, 1, 0),
+            name: jspb.Message.getFieldWithDefault(msg, 2, ""),
+            memo: jspb.Message.getFieldWithDefault(msg, 3, ""),
+            status: jspb.Message.getFieldWithDefault(msg, 4, 0),
+            systemname: jspb.Message.getFieldWithDefault(msg, 5, "")
+        };
+
+        if (includeInstance) {
+            obj.$jspbMessageInstance = msg;
+        }
+        return obj;
+    };
+}
+
+
+/**
+ * Deserializes binary data (in protobuf wire format).
+ * @param {jspb.ByteSource} bytes The bytes to deserialize.
+ * @return {!proto.im.Role}
+ */
+proto.im.Role.deserializeBinary = function (bytes) {
+    var reader = new jspb.BinaryReader(bytes);
+    var msg = new proto.im.Role;
+    return proto.im.Role.deserializeBinaryFromReader(msg, reader);
+};
+
+
+/**
+ * Deserializes binary data (in protobuf wire format) from the
+ * given reader into the given message object.
+ * @param {!proto.im.Role} msg The message object to deserialize into.
+ * @param {!jspb.BinaryReader} reader The BinaryReader to use.
+ * @return {!proto.im.Role}
+ */
+proto.im.Role.deserializeBinaryFromReader = function (msg, reader) {
+    while (reader.nextField()) {
+        if (reader.isEndGroup()) {
+            break;
+        }
+        var field = reader.getFieldNumber();
+        switch (field) {
+            case 1:
+                var value = /** @type {number} */ (reader.readInt64());
+                msg.setId(value);
+                break;
+            case 2:
+                var value = /** @type {string} */ (reader.readString());
+                msg.setName(value);
+                break;
+            case 3:
+                var value = /** @type {string} */ (reader.readString());
+                msg.setMemo(value);
+                break;
+            case 4:
+                var value = /** @type {!proto.im.Status} */ (reader.readEnum());
+                msg.setStatus(value);
+                break;
+            case 5:
+                var value = /** @type {string} */ (reader.readString());
+                msg.setSystemname(value);
+                break;
+            default:
+                reader.skipField();
+                break;
+        }
+    }
+    return msg;
+};
+
+
+/**
+ * Serializes the message to binary data (in protobuf wire format).
+ * @return {!Uint8Array}
+ */
+proto.im.Role.prototype.serializeBinary = function () {
+    var writer = new jspb.BinaryWriter();
+    proto.im.Role.serializeBinaryToWriter(this, writer);
+    return writer.getResultBuffer();
+};
+
+
+/**
+ * Serializes the given message to binary data (in protobuf wire
+ * format), writing to the given BinaryWriter.
+ * @param {!proto.im.Role} message
+ * @param {!jspb.BinaryWriter} writer
+ * @suppress {unusedLocalVariables} f is only used for nested messages
+ */
+proto.im.Role.serializeBinaryToWriter = function (message, writer) {
+    var f = undefined;
+    f = message.getId();
+    if (f !== 0) {
+        writer.writeInt64(
+            1,
+            f
+        );
+    }
+    f = message.getName();
+    if (f.length > 0) {
+        writer.writeString(
+            2,
+            f
+        );
+    }
+    f = message.getMemo();
+    if (f.length > 0) {
+        writer.writeString(
+            3,
+            f
+        );
+    }
+    f = message.getStatus();
+    if (f !== 0.0) {
+        writer.writeEnum(
+            4,
+            f
+        );
+    }
+    f = message.getSystemname();
+    if (f.length > 0) {
+        writer.writeString(
+            5,
+            f
+        );
+    }
+};
+
+
+/**
+ * optional int64 id = 1;
+ * @return {number}
+ */
+proto.im.Role.prototype.getId = function () {
+    return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 1, 0));
+};
+
+
+/**
+ * @param {number} value
+ * @return {!proto.im.Role} returns this
+ */
+proto.im.Role.prototype.setId = function (value) {
+    return jspb.Message.setProto3IntField(this, 1, value);
+};
+
+
+/**
+ * optional string name = 2;
+ * @return {string}
+ */
+proto.im.Role.prototype.getName = function () {
+    return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 2, ""));
+};
+
+
+/**
+ * @param {string} value
+ * @return {!proto.im.Role} returns this
+ */
+proto.im.Role.prototype.setName = function (value) {
+    return jspb.Message.setProto3StringField(this, 2, value);
+};
+
+
+/**
+ * optional string memo = 3;
+ * @return {string}
+ */
+proto.im.Role.prototype.getMemo = function () {
+    return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 3, ""));
+};
+
+
+/**
+ * @param {string} value
+ * @return {!proto.im.Role} returns this
+ */
+proto.im.Role.prototype.setMemo = function (value) {
+    return jspb.Message.setProto3StringField(this, 3, value);
+};
+
+
+/**
+ * optional Status status = 4;
+ * @return {!proto.im.Status}
+ */
+proto.im.Role.prototype.getStatus = function () {
+    return /** @type {!proto.im.Status} */ (jspb.Message.getFieldWithDefault(this, 4, 0));
+};
+
+
+/**
+ * @param {!proto.im.Status} value
+ * @return {!proto.im.Role} returns this
+ */
+proto.im.Role.prototype.setStatus = function (value) {
+    return jspb.Message.setProto3EnumField(this, 4, value);
+};
+
+
+/**
+ * optional string systemName = 5;
+ * @return {string}
+ */
+proto.im.Role.prototype.getSystemname = function () {
+    return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 5, ""));
+};
+
+
+/**
+ * @param {string} value
+ * @return {!proto.im.Role} returns this
+ */
+proto.im.Role.prototype.setSystemname = function (value) {
+    return jspb.Message.setProto3StringField(this, 5, value);
+};
+
+
+if (jspb.Message.GENERATE_TO_OBJECT) {
+    /**
+     * Creates an object representation of this proto.
+     * Field names that are reserved in JavaScript and will be renamed to pb_name.
+     * Optional fields that are not set will be set to undefined.
+     * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default.
+     * For the list of reserved names please see:
+     *     net/proto2/compiler/js/internal/generator.cc#kKeyword.
+     * @param {boolean=} opt_includeInstance Deprecated. whether to include the
+     *     JSPB instance for transitional soy proto support:
+     *     http://goto/soy-param-migration
+     * @return {!Object}
+     */
+    proto.im.RoleListRequest.prototype.toObject = function (opt_includeInstance) {
+        return proto.im.RoleListRequest.toObject(opt_includeInstance, this);
+    };
+
+
+    /**
+     * Static version of the {@see toObject} method.
+     * @param {boolean|undefined} includeInstance Deprecated. Whether to include
+     *     the JSPB instance for transitional soy proto support:
+     *     http://goto/soy-param-migration
+     * @param {!proto.im.RoleListRequest} msg The msg instance to transform.
+     * @return {!Object}
+     * @suppress {unusedLocalVariables} f is only used for nested messages
+     */
+    proto.im.RoleListRequest.toObject = function (includeInstance, msg) {
+        var f, obj = {
+            userid: jspb.Message.getFieldWithDefault(msg, 1, 0),
+            sysid: jspb.Message.getFieldWithDefault(msg, 2, 0)
+        };
+
+        if (includeInstance) {
+            obj.$jspbMessageInstance = msg;
+        }
+        return obj;
+    };
+}
+
+
+/**
+ * Deserializes binary data (in protobuf wire format).
+ * @param {jspb.ByteSource} bytes The bytes to deserialize.
+ * @return {!proto.im.RoleListRequest}
+ */
+proto.im.RoleListRequest.deserializeBinary = function (bytes) {
+    var reader = new jspb.BinaryReader(bytes);
+    var msg = new proto.im.RoleListRequest;
+    return proto.im.RoleListRequest.deserializeBinaryFromReader(msg, reader);
+};
+
+
+/**
+ * Deserializes binary data (in protobuf wire format) from the
+ * given reader into the given message object.
+ * @param {!proto.im.RoleListRequest} msg The message object to deserialize into.
+ * @param {!jspb.BinaryReader} reader The BinaryReader to use.
+ * @return {!proto.im.RoleListRequest}
+ */
+proto.im.RoleListRequest.deserializeBinaryFromReader = function (msg, reader) {
+    while (reader.nextField()) {
+        if (reader.isEndGroup()) {
+            break;
+        }
+        var field = reader.getFieldNumber();
+        switch (field) {
+            case 1:
+                var value = /** @type {number} */ (reader.readInt64());
+                msg.setUserid(value);
+                break;
+            case 2:
+                var value = /** @type {number} */ (reader.readInt64());
+                msg.setSysid(value);
+                break;
+            default:
+                reader.skipField();
+                break;
+        }
+    }
+    return msg;
+};
+
+
+/**
+ * Serializes the message to binary data (in protobuf wire format).
+ * @return {!Uint8Array}
+ */
+proto.im.RoleListRequest.prototype.serializeBinary = function () {
+    var writer = new jspb.BinaryWriter();
+    proto.im.RoleListRequest.serializeBinaryToWriter(this, writer);
+    return writer.getResultBuffer();
+};
+
+
+/**
+ * Serializes the given message to binary data (in protobuf wire
+ * format), writing to the given BinaryWriter.
+ * @param {!proto.im.RoleListRequest} message
+ * @param {!jspb.BinaryWriter} writer
+ * @suppress {unusedLocalVariables} f is only used for nested messages
+ */
+proto.im.RoleListRequest.serializeBinaryToWriter = function (message, writer) {
+    var f = undefined;
+    f = message.getUserid();
+    if (f !== 0) {
+        writer.writeInt64(
+            1,
+            f
+        );
+    }
+    f = message.getSysid();
+    if (f !== 0) {
+        writer.writeInt64(
+            2,
+            f
+        );
+    }
+};
+
+
+/**
+ * optional int64 userId = 1;
+ * @return {number}
+ */
+proto.im.RoleListRequest.prototype.getUserid = function () {
+    return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 1, 0));
+};
+
+
+/**
+ * @param {number} value
+ * @return {!proto.im.RoleListRequest} returns this
+ */
+proto.im.RoleListRequest.prototype.setUserid = function (value) {
+    return jspb.Message.setProto3IntField(this, 1, value);
+};
+
+
+/**
+ * optional int64 sysId = 2;
+ * @return {number}
+ */
+proto.im.RoleListRequest.prototype.getSysid = function () {
+    return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 2, 0));
+};
+
+
+/**
+ * @param {number} value
+ * @return {!proto.im.RoleListRequest} returns this
+ */
+proto.im.RoleListRequest.prototype.setSysid = function (value) {
+    return jspb.Message.setProto3IntField(this, 2, value);
+};
+
+
+if (jspb.Message.GENERATE_TO_OBJECT) {
+    /**
+     * Creates an object representation of this proto.
+     * Field names that are reserved in JavaScript and will be renamed to pb_name.
+     * Optional fields that are not set will be set to undefined.
+     * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default.
+     * For the list of reserved names please see:
+     *     net/proto2/compiler/js/internal/generator.cc#kKeyword.
+     * @param {boolean=} opt_includeInstance Deprecated. whether to include the
+     *     JSPB instance for transitional soy proto support:
+     *     http://goto/soy-param-migration
+     * @return {!Object}
+     */
+    proto.im.UserListRequest.prototype.toObject = function (opt_includeInstance) {
+        return proto.im.UserListRequest.toObject(opt_includeInstance, this);
+    };
+
+
+    /**
+     * Static version of the {@see toObject} method.
+     * @param {boolean|undefined} includeInstance Deprecated. Whether to include
+     *     the JSPB instance for transitional soy proto support:
+     *     http://goto/soy-param-migration
+     * @param {!proto.im.UserListRequest} msg The msg instance to transform.
+     * @return {!Object}
+     * @suppress {unusedLocalVariables} f is only used for nested messages
+     */
+    proto.im.UserListRequest.toObject = function (includeInstance, msg) {
+        var f, obj = {
+            roleid: jspb.Message.getFieldWithDefault(msg, 1, 0),
+            status: jspb.Message.getFieldWithDefault(msg, 2, 0),
+            name: jspb.Message.getFieldWithDefault(msg, 3, ""),
+            lcstypeid: jspb.Message.getFieldWithDefault(msg, 4, 0),
+            sysid: jspb.Message.getFieldWithDefault(msg, 5, 0)
+        };
+
+        if (includeInstance) {
+            obj.$jspbMessageInstance = msg;
+        }
+        return obj;
+    };
+}
+
+
+/**
+ * Deserializes binary data (in protobuf wire format).
+ * @param {jspb.ByteSource} bytes The bytes to deserialize.
+ * @return {!proto.im.UserListRequest}
+ */
+proto.im.UserListRequest.deserializeBinary = function (bytes) {
+    var reader = new jspb.BinaryReader(bytes);
+    var msg = new proto.im.UserListRequest;
+    return proto.im.UserListRequest.deserializeBinaryFromReader(msg, reader);
+};
+
+
+/**
+ * Deserializes binary data (in protobuf wire format) from the
+ * given reader into the given message object.
+ * @param {!proto.im.UserListRequest} msg The message object to deserialize into.
+ * @param {!jspb.BinaryReader} reader The BinaryReader to use.
+ * @return {!proto.im.UserListRequest}
+ */
+proto.im.UserListRequest.deserializeBinaryFromReader = function (msg, reader) {
+    while (reader.nextField()) {
+        if (reader.isEndGroup()) {
+            break;
+        }
+        var field = reader.getFieldNumber();
+        switch (field) {
+            case 1:
+                var value = /** @type {number} */ (reader.readInt64());
+                msg.setRoleid(value);
+                break;
+            case 2:
+                var value = /** @type {!proto.im.Status} */ (reader.readEnum());
+                msg.setStatus(value);
+                break;
+            case 3:
+                var value = /** @type {string} */ (reader.readString());
+                msg.setName(value);
+                break;
+            case 4:
+                var value = /** @type {number} */ (reader.readInt64());
+                msg.setLcstypeid(value);
+                break;
+            case 5:
+                var value = /** @type {number} */ (reader.readInt64());
+                msg.setSysid(value);
+                break;
+            default:
+                reader.skipField();
+                break;
+        }
+    }
+    return msg;
+};
+
+
+/**
+ * Serializes the message to binary data (in protobuf wire format).
+ * @return {!Uint8Array}
+ */
+proto.im.UserListRequest.prototype.serializeBinary = function () {
+    var writer = new jspb.BinaryWriter();
+    proto.im.UserListRequest.serializeBinaryToWriter(this, writer);
+    return writer.getResultBuffer();
+};
+
+
+/**
+ * Serializes the given message to binary data (in protobuf wire
+ * format), writing to the given BinaryWriter.
+ * @param {!proto.im.UserListRequest} message
+ * @param {!jspb.BinaryWriter} writer
+ * @suppress {unusedLocalVariables} f is only used for nested messages
+ */
+proto.im.UserListRequest.serializeBinaryToWriter = function (message, writer) {
+    var f = undefined;
+    f = message.getRoleid();
+    if (f !== 0) {
+        writer.writeInt64(
+            1,
+            f
+        );
+    }
+    f = message.getStatus();
+    if (f !== 0.0) {
+        writer.writeEnum(
+            2,
+            f
+        );
+    }
+    f = message.getName();
+    if (f.length > 0) {
+        writer.writeString(
+            3,
+            f
+        );
+    }
+    f = message.getLcstypeid();
+    if (f !== 0) {
+        writer.writeInt64(
+            4,
+            f
+        );
+    }
+    f = message.getSysid();
+    if (f !== 0) {
+        writer.writeInt64(
+            5,
+            f
+        );
+    }
+};
+
+
+/**
+ * optional int64 roleId = 1;
+ * @return {number}
+ */
+proto.im.UserListRequest.prototype.getRoleid = function () {
+    return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 1, 0));
+};
+
+
+/**
+ * @param {number} value
+ * @return {!proto.im.UserListRequest} returns this
+ */
+proto.im.UserListRequest.prototype.setRoleid = function (value) {
+    return jspb.Message.setProto3IntField(this, 1, value);
+};
+
+
+/**
+ * optional Status status = 2;
+ * @return {!proto.im.Status}
+ */
+proto.im.UserListRequest.prototype.getStatus = function () {
+    return /** @type {!proto.im.Status} */ (jspb.Message.getFieldWithDefault(this, 2, 0));
+};
+
+
+/**
+ * @param {!proto.im.Status} value
+ * @return {!proto.im.UserListRequest} returns this
+ */
+proto.im.UserListRequest.prototype.setStatus = function (value) {
+    return jspb.Message.setProto3EnumField(this, 2, value);
+};
+
+
+/**
+ * optional string name = 3;
+ * @return {string}
+ */
+proto.im.UserListRequest.prototype.getName = function () {
+    return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 3, ""));
+};
+
+
+/**
+ * @param {string} value
+ * @return {!proto.im.UserListRequest} returns this
+ */
+proto.im.UserListRequest.prototype.setName = function (value) {
+    return jspb.Message.setProto3StringField(this, 3, value);
+};
+
+
+/**
+ * optional int64 lcstypeid = 4;
+ * @return {number}
+ */
+proto.im.UserListRequest.prototype.getLcstypeid = function () {
+    return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 4, 0));
+};
+
+
+/**
+ * @param {number} value
+ * @return {!proto.im.UserListRequest} returns this
+ */
+proto.im.UserListRequest.prototype.setLcstypeid = function (value) {
+    return jspb.Message.setProto3IntField(this, 4, value);
+};
+
+
+/**
+ * optional int64 sysId = 5;
+ * @return {number}
+ */
+proto.im.UserListRequest.prototype.getSysid = function () {
+    return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 5, 0));
+};
+
+
+/**
+ * @param {number} value
+ * @return {!proto.im.UserListRequest} returns this
+ */
+proto.im.UserListRequest.prototype.setSysid = function (value) {
+    return jspb.Message.setProto3IntField(this, 5, value);
+};
+
+
+/**
+ * List of repeated fields within this message type.
+ * @private {!Array<number>}
+ * @const
+ */
+proto.im.UserListReply.repeatedFields_ = [1];
+
+
+if (jspb.Message.GENERATE_TO_OBJECT) {
+    /**
+     * Creates an object representation of this proto.
+     * Field names that are reserved in JavaScript and will be renamed to pb_name.
+     * Optional fields that are not set will be set to undefined.
+     * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default.
+     * For the list of reserved names please see:
+     *     net/proto2/compiler/js/internal/generator.cc#kKeyword.
+     * @param {boolean=} opt_includeInstance Deprecated. whether to include the
+     *     JSPB instance for transitional soy proto support:
+     *     http://goto/soy-param-migration
+     * @return {!Object}
+     */
+    proto.im.UserListReply.prototype.toObject = function (opt_includeInstance) {
+        return proto.im.UserListReply.toObject(opt_includeInstance, this);
+    };
+
+
+    /**
+     * Static version of the {@see toObject} method.
+     * @param {boolean|undefined} includeInstance Deprecated. Whether to include
+     *     the JSPB instance for transitional soy proto support:
+     *     http://goto/soy-param-migration
+     * @param {!proto.im.UserListReply} msg The msg instance to transform.
+     * @return {!Object}
+     * @suppress {unusedLocalVariables} f is only used for nested messages
+     */
+    proto.im.UserListReply.toObject = function (includeInstance, msg) {
+        var f, obj = {
+            listList: jspb.Message.toObjectList(msg.getListList(),
+                proto.im.UserInfo.toObject, includeInstance)
+        };
+
+        if (includeInstance) {
+            obj.$jspbMessageInstance = msg;
+        }
+        return obj;
+    };
+}
+
+
+/**
+ * Deserializes binary data (in protobuf wire format).
+ * @param {jspb.ByteSource} bytes The bytes to deserialize.
+ * @return {!proto.im.UserListReply}
+ */
+proto.im.UserListReply.deserializeBinary = function (bytes) {
+    var reader = new jspb.BinaryReader(bytes);
+    var msg = new proto.im.UserListReply;
+    return proto.im.UserListReply.deserializeBinaryFromReader(msg, reader);
+};
+
+
+/**
+ * Deserializes binary data (in protobuf wire format) from the
+ * given reader into the given message object.
+ * @param {!proto.im.UserListReply} msg The message object to deserialize into.
+ * @param {!jspb.BinaryReader} reader The BinaryReader to use.
+ * @return {!proto.im.UserListReply}
+ */
+proto.im.UserListReply.deserializeBinaryFromReader = function (msg, reader) {
+    while (reader.nextField()) {
+        if (reader.isEndGroup()) {
+            break;
+        }
+        var field = reader.getFieldNumber();
+        switch (field) {
+            case 1:
+                var value = new proto.im.UserInfo;
+                reader.readMessage(value, proto.im.UserInfo.deserializeBinaryFromReader);
+                msg.addList(value);
+                break;
+            default:
+                reader.skipField();
+                break;
+        }
+    }
+    return msg;
+};
+
+
+/**
+ * Serializes the message to binary data (in protobuf wire format).
+ * @return {!Uint8Array}
+ */
+proto.im.UserListReply.prototype.serializeBinary = function () {
+    var writer = new jspb.BinaryWriter();
+    proto.im.UserListReply.serializeBinaryToWriter(this, writer);
+    return writer.getResultBuffer();
+};
+
+
+/**
+ * Serializes the given message to binary data (in protobuf wire
+ * format), writing to the given BinaryWriter.
+ * @param {!proto.im.UserListReply} message
+ * @param {!jspb.BinaryWriter} writer
+ * @suppress {unusedLocalVariables} f is only used for nested messages
+ */
+proto.im.UserListReply.serializeBinaryToWriter = function (message, writer) {
+    var f = undefined;
+    f = message.getListList();
+    if (f.length > 0) {
+        writer.writeRepeatedMessage(
+            1,
+            f,
+            proto.im.UserInfo.serializeBinaryToWriter
+        );
+    }
+};
+
+
+/**
+ * repeated UserInfo list = 1;
+ * @return {!Array<!proto.im.UserInfo>}
+ */
+proto.im.UserListReply.prototype.getListList = function () {
+    return /** @type{!Array<!proto.im.UserInfo>} */ (
+        jspb.Message.getRepeatedWrapperField(this, proto.im.UserInfo, 1));
+};
+
+
+/**
+ * @param {!Array<!proto.im.UserInfo>} value
+ * @return {!proto.im.UserListReply} returns this
+ */
+proto.im.UserListReply.prototype.setListList = function (value) {
+    return jspb.Message.setRepeatedWrapperField(this, 1, value);
+};
+
+
+/**
+ * @param {!proto.im.UserInfo=} opt_value
+ * @param {number=} opt_index
+ * @return {!proto.im.UserInfo}
+ */
+proto.im.UserListReply.prototype.addList = function (opt_value, opt_index) {
+    return jspb.Message.addToRepeatedWrapperField(this, 1, opt_value, proto.im.UserInfo, opt_index);
+};
+
+
+/**
+ * Clears the list making it empty but non-null.
+ * @return {!proto.im.UserListReply} returns this
+ */
+proto.im.UserListReply.prototype.clearListList = function () {
+    return this.setListList([]);
+};
+
+
+if (jspb.Message.GENERATE_TO_OBJECT) {
+    /**
+     * Creates an object representation of this proto.
+     * Field names that are reserved in JavaScript and will be renamed to pb_name.
+     * Optional fields that are not set will be set to undefined.
+     * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default.
+     * For the list of reserved names please see:
+     *     net/proto2/compiler/js/internal/generator.cc#kKeyword.
+     * @param {boolean=} opt_includeInstance Deprecated. whether to include the
+     *     JSPB instance for transitional soy proto support:
+     *     http://goto/soy-param-migration
+     * @return {!Object}
+     */
+    proto.im.UserGetInfoRequest.prototype.toObject = function (opt_includeInstance) {
+        return proto.im.UserGetInfoRequest.toObject(opt_includeInstance, this);
+    };
+
+
+    /**
+     * Static version of the {@see toObject} method.
+     * @param {boolean|undefined} includeInstance Deprecated. Whether to include
+     *     the JSPB instance for transitional soy proto support:
+     *     http://goto/soy-param-migration
+     * @param {!proto.im.UserGetInfoRequest} msg The msg instance to transform.
+     * @return {!Object}
+     * @suppress {unusedLocalVariables} f is only used for nested messages
+     */
+    proto.im.UserGetInfoRequest.toObject = function (includeInstance, msg) {
+        var f, obj = {
+            userid: jspb.Message.getFieldWithDefault(msg, 1, 0)
+        };
+
+        if (includeInstance) {
+            obj.$jspbMessageInstance = msg;
+        }
+        return obj;
+    };
+}
+
+
+/**
+ * Deserializes binary data (in protobuf wire format).
+ * @param {jspb.ByteSource} bytes The bytes to deserialize.
+ * @return {!proto.im.UserGetInfoRequest}
+ */
+proto.im.UserGetInfoRequest.deserializeBinary = function (bytes) {
+    var reader = new jspb.BinaryReader(bytes);
+    var msg = new proto.im.UserGetInfoRequest;
+    return proto.im.UserGetInfoRequest.deserializeBinaryFromReader(msg, reader);
+};
+
+
+/**
+ * Deserializes binary data (in protobuf wire format) from the
+ * given reader into the given message object.
+ * @param {!proto.im.UserGetInfoRequest} msg The message object to deserialize into.
+ * @param {!jspb.BinaryReader} reader The BinaryReader to use.
+ * @return {!proto.im.UserGetInfoRequest}
+ */
+proto.im.UserGetInfoRequest.deserializeBinaryFromReader = function (msg, reader) {
+    while (reader.nextField()) {
+        if (reader.isEndGroup()) {
+            break;
+        }
+        var field = reader.getFieldNumber();
+        switch (field) {
+            case 1:
+                var value = /** @type {number} */ (reader.readInt64());
+                msg.setUserid(value);
+                break;
+            default:
+                reader.skipField();
+                break;
+        }
+    }
+    return msg;
+};
+
+
+/**
+ * Serializes the message to binary data (in protobuf wire format).
+ * @return {!Uint8Array}
+ */
+proto.im.UserGetInfoRequest.prototype.serializeBinary = function () {
+    var writer = new jspb.BinaryWriter();
+    proto.im.UserGetInfoRequest.serializeBinaryToWriter(this, writer);
+    return writer.getResultBuffer();
+};
+
+
+/**
+ * Serializes the given message to binary data (in protobuf wire
+ * format), writing to the given BinaryWriter.
+ * @param {!proto.im.UserGetInfoRequest} message
+ * @param {!jspb.BinaryWriter} writer
+ * @suppress {unusedLocalVariables} f is only used for nested messages
+ */
+proto.im.UserGetInfoRequest.serializeBinaryToWriter = function (message, writer) {
+    var f = undefined;
+    f = message.getUserid();
+    if (f !== 0) {
+        writer.writeInt64(
+            1,
+            f
+        );
+    }
+};
+
+
+/**
+ * optional int64 userId = 1;
+ * @return {number}
+ */
+proto.im.UserGetInfoRequest.prototype.getUserid = function () {
+    return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 1, 0));
+};
+
+
+/**
+ * @param {number} value
+ * @return {!proto.im.UserGetInfoRequest} returns this
+ */
+proto.im.UserGetInfoRequest.prototype.setUserid = function (value) {
+    return jspb.Message.setProto3IntField(this, 1, value);
+};
+
+
+/**
+ * List of repeated fields within this message type.
+ * @private {!Array<number>}
+ * @const
+ */
+proto.im.UserRolesRequest.repeatedFields_ = [2];
+
+
+if (jspb.Message.GENERATE_TO_OBJECT) {
+    /**
+     * Creates an object representation of this proto.
+     * Field names that are reserved in JavaScript and will be renamed to pb_name.
+     * Optional fields that are not set will be set to undefined.
+     * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default.
+     * For the list of reserved names please see:
+     *     net/proto2/compiler/js/internal/generator.cc#kKeyword.
+     * @param {boolean=} opt_includeInstance Deprecated. whether to include the
+     *     JSPB instance for transitional soy proto support:
+     *     http://goto/soy-param-migration
+     * @return {!Object}
+     */
+    proto.im.UserRolesRequest.prototype.toObject = function (opt_includeInstance) {
+        return proto.im.UserRolesRequest.toObject(opt_includeInstance, this);
+    };
+
+
+    /**
+     * Static version of the {@see toObject} method.
+     * @param {boolean|undefined} includeInstance Deprecated. Whether to include
+     *     the JSPB instance for transitional soy proto support:
+     *     http://goto/soy-param-migration
+     * @param {!proto.im.UserRolesRequest} msg The msg instance to transform.
+     * @return {!Object}
+     * @suppress {unusedLocalVariables} f is only used for nested messages
+     */
+    proto.im.UserRolesRequest.toObject = function (includeInstance, msg) {
+        var f, obj = {
+            userid: jspb.Message.getFieldWithDefault(msg, 1, 0),
+            roleidlistList: (f = jspb.Message.getRepeatedField(msg, 2)) == null ? undefined : f
+        };
+
+        if (includeInstance) {
+            obj.$jspbMessageInstance = msg;
+        }
+        return obj;
+    };
+}
+
+
+/**
+ * Deserializes binary data (in protobuf wire format).
+ * @param {jspb.ByteSource} bytes The bytes to deserialize.
+ * @return {!proto.im.UserRolesRequest}
+ */
+proto.im.UserRolesRequest.deserializeBinary = function (bytes) {
+    var reader = new jspb.BinaryReader(bytes);
+    var msg = new proto.im.UserRolesRequest;
+    return proto.im.UserRolesRequest.deserializeBinaryFromReader(msg, reader);
+};
+
+
+/**
+ * Deserializes binary data (in protobuf wire format) from the
+ * given reader into the given message object.
+ * @param {!proto.im.UserRolesRequest} msg The message object to deserialize into.
+ * @param {!jspb.BinaryReader} reader The BinaryReader to use.
+ * @return {!proto.im.UserRolesRequest}
+ */
+proto.im.UserRolesRequest.deserializeBinaryFromReader = function (msg, reader) {
+    while (reader.nextField()) {
+        if (reader.isEndGroup()) {
+            break;
+        }
+        var field = reader.getFieldNumber();
+        switch (field) {
+            case 1:
+                var value = /** @type {number} */ (reader.readInt64());
+                msg.setUserid(value);
+                break;
+            case 2:
+                var values = /** @type {!Array<number>} */ (reader.isDelimited() ? reader.readPackedInt64() : [reader.readInt64()]);
+                for (var i = 0; i < values.length; i++) {
+                    msg.addRoleidlist(values[i]);
+                }
+                break;
+            default:
+                reader.skipField();
+                break;
+        }
+    }
+    return msg;
+};
+
+
+/**
+ * Serializes the message to binary data (in protobuf wire format).
+ * @return {!Uint8Array}
+ */
+proto.im.UserRolesRequest.prototype.serializeBinary = function () {
+    var writer = new jspb.BinaryWriter();
+    proto.im.UserRolesRequest.serializeBinaryToWriter(this, writer);
+    return writer.getResultBuffer();
+};
+
+
+/**
+ * Serializes the given message to binary data (in protobuf wire
+ * format), writing to the given BinaryWriter.
+ * @param {!proto.im.UserRolesRequest} message
+ * @param {!jspb.BinaryWriter} writer
+ * @suppress {unusedLocalVariables} f is only used for nested messages
+ */
+proto.im.UserRolesRequest.serializeBinaryToWriter = function (message, writer) {
+    var f = undefined;
+    f = message.getUserid();
+    if (f !== 0) {
+        writer.writeInt64(
+            1,
+            f
+        );
+    }
+    f = message.getRoleidlistList();
+    if (f.length > 0) {
+        writer.writePackedInt64(
+            2,
+            f
+        );
+    }
+};
+
+
+/**
+ * optional int64 userId = 1;
+ * @return {number}
+ */
+proto.im.UserRolesRequest.prototype.getUserid = function () {
+    return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 1, 0));
+};
+
+
+/**
+ * @param {number} value
+ * @return {!proto.im.UserRolesRequest} returns this
+ */
+proto.im.UserRolesRequest.prototype.setUserid = function (value) {
+    return jspb.Message.setProto3IntField(this, 1, value);
+};
+
+
+/**
+ * repeated int64 roleIdList = 2;
+ * @return {!Array<number>}
+ */
+proto.im.UserRolesRequest.prototype.getRoleidlistList = function () {
+    return /** @type {!Array<number>} */ (jspb.Message.getRepeatedField(this, 2));
+};
+
+
+/**
+ * @param {!Array<number>} value
+ * @return {!proto.im.UserRolesRequest} returns this
+ */
+proto.im.UserRolesRequest.prototype.setRoleidlistList = function (value) {
+    return jspb.Message.setField(this, 2, value || []);
+};
+
+
+/**
+ * @param {number} value
+ * @param {number=} opt_index
+ * @return {!proto.im.UserRolesRequest} returns this
+ */
+proto.im.UserRolesRequest.prototype.addRoleidlist = function (value, opt_index) {
+    return jspb.Message.addToRepeatedField(this, 2, value, opt_index);
+};
+
+
+/**
+ * Clears the list making it empty but non-null.
+ * @return {!proto.im.UserRolesRequest} returns this
+ */
+proto.im.UserRolesRequest.prototype.clearRoleidlistList = function () {
+    return this.setRoleidlistList([]);
+};
+
+
+/**
+ * List of repeated fields within this message type.
+ * @private {!Array<number>}
+ * @const
+ */
+proto.im.RoleListReply.repeatedFields_ = [1];
+
+
+if (jspb.Message.GENERATE_TO_OBJECT) {
+    /**
+     * Creates an object representation of this proto.
+     * Field names that are reserved in JavaScript and will be renamed to pb_name.
+     * Optional fields that are not set will be set to undefined.
+     * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default.
+     * For the list of reserved names please see:
+     *     net/proto2/compiler/js/internal/generator.cc#kKeyword.
+     * @param {boolean=} opt_includeInstance Deprecated. whether to include the
+     *     JSPB instance for transitional soy proto support:
+     *     http://goto/soy-param-migration
+     * @return {!Object}
+     */
+    proto.im.RoleListReply.prototype.toObject = function (opt_includeInstance) {
+        return proto.im.RoleListReply.toObject(opt_includeInstance, this);
+    };
+
+
+    /**
+     * Static version of the {@see toObject} method.
+     * @param {boolean|undefined} includeInstance Deprecated. Whether to include
+     *     the JSPB instance for transitional soy proto support:
+     *     http://goto/soy-param-migration
+     * @param {!proto.im.RoleListReply} msg The msg instance to transform.
+     * @return {!Object}
+     * @suppress {unusedLocalVariables} f is only used for nested messages
+     */
+    proto.im.RoleListReply.toObject = function (includeInstance, msg) {
+        var f, obj = {
+            listList: jspb.Message.toObjectList(msg.getListList(),
+                proto.im.Role.toObject, includeInstance)
+        };
+
+        if (includeInstance) {
+            obj.$jspbMessageInstance = msg;
+        }
+        return obj;
+    };
+}
+
+
+/**
+ * Deserializes binary data (in protobuf wire format).
+ * @param {jspb.ByteSource} bytes The bytes to deserialize.
+ * @return {!proto.im.RoleListReply}
+ */
+proto.im.RoleListReply.deserializeBinary = function (bytes) {
+    var reader = new jspb.BinaryReader(bytes);
+    var msg = new proto.im.RoleListReply;
+    return proto.im.RoleListReply.deserializeBinaryFromReader(msg, reader);
+};
+
+
+/**
+ * Deserializes binary data (in protobuf wire format) from the
+ * given reader into the given message object.
+ * @param {!proto.im.RoleListReply} msg The message object to deserialize into.
+ * @param {!jspb.BinaryReader} reader The BinaryReader to use.
+ * @return {!proto.im.RoleListReply}
+ */
+proto.im.RoleListReply.deserializeBinaryFromReader = function (msg, reader) {
+    while (reader.nextField()) {
+        if (reader.isEndGroup()) {
+            break;
+        }
+        var field = reader.getFieldNumber();
+        switch (field) {
+            case 1:
+                var value = new proto.im.Role;
+                reader.readMessage(value, proto.im.Role.deserializeBinaryFromReader);
+                msg.addList(value);
+                break;
+            default:
+                reader.skipField();
+                break;
+        }
+    }
+    return msg;
+};
+
+
+/**
+ * Serializes the message to binary data (in protobuf wire format).
+ * @return {!Uint8Array}
+ */
+proto.im.RoleListReply.prototype.serializeBinary = function () {
+    var writer = new jspb.BinaryWriter();
+    proto.im.RoleListReply.serializeBinaryToWriter(this, writer);
+    return writer.getResultBuffer();
+};
+
+
+/**
+ * Serializes the given message to binary data (in protobuf wire
+ * format), writing to the given BinaryWriter.
+ * @param {!proto.im.RoleListReply} message
+ * @param {!jspb.BinaryWriter} writer
+ * @suppress {unusedLocalVariables} f is only used for nested messages
+ */
+proto.im.RoleListReply.serializeBinaryToWriter = function (message, writer) {
+    var f = undefined;
+    f = message.getListList();
+    if (f.length > 0) {
+        writer.writeRepeatedMessage(
+            1,
+            f,
+            proto.im.Role.serializeBinaryToWriter
+        );
+    }
+};
+
+
+/**
+ * repeated Role list = 1;
+ * @return {!Array<!proto.im.Role>}
+ */
+proto.im.RoleListReply.prototype.getListList = function () {
+    return /** @type{!Array<!proto.im.Role>} */ (
+        jspb.Message.getRepeatedWrapperField(this, proto.im.Role, 1));
+};
+
+
+/**
+ * @param {!Array<!proto.im.Role>} value
+ * @return {!proto.im.RoleListReply} returns this
+ */
+proto.im.RoleListReply.prototype.setListList = function (value) {
+    return jspb.Message.setRepeatedWrapperField(this, 1, value);
+};
+
+
+/**
+ * @param {!proto.im.Role=} opt_value
+ * @param {number=} opt_index
+ * @return {!proto.im.Role}
+ */
+proto.im.RoleListReply.prototype.addList = function (opt_value, opt_index) {
+    return jspb.Message.addToRepeatedWrapperField(this, 1, opt_value, proto.im.Role, opt_index);
+};
+
+
+/**
+ * Clears the list making it empty but non-null.
+ * @return {!proto.im.RoleListReply} returns this
+ */
+proto.im.RoleListReply.prototype.clearListList = function () {
+    return this.setListList([]);
+};
+
+
+/**
+ * List of repeated fields within this message type.
+ * @private {!Array<number>}
+ * @const
+ */
+proto.im.RolePermissionRequest.repeatedFields_ = [2];
+
+
+if (jspb.Message.GENERATE_TO_OBJECT) {
+    /**
+     * Creates an object representation of this proto.
+     * Field names that are reserved in JavaScript and will be renamed to pb_name.
+     * Optional fields that are not set will be set to undefined.
+     * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default.
+     * For the list of reserved names please see:
+     *     net/proto2/compiler/js/internal/generator.cc#kKeyword.
+     * @param {boolean=} opt_includeInstance Deprecated. whether to include the
+     *     JSPB instance for transitional soy proto support:
+     *     http://goto/soy-param-migration
+     * @return {!Object}
+     */
+    proto.im.RolePermissionRequest.prototype.toObject = function (opt_includeInstance) {
+        return proto.im.RolePermissionRequest.toObject(opt_includeInstance, this);
+    };
+
+
+    /**
+     * Static version of the {@see toObject} method.
+     * @param {boolean|undefined} includeInstance Deprecated. Whether to include
+     *     the JSPB instance for transitional soy proto support:
+     *     http://goto/soy-param-migration
+     * @param {!proto.im.RolePermissionRequest} msg The msg instance to transform.
+     * @return {!Object}
+     * @suppress {unusedLocalVariables} f is only used for nested messages
+     */
+    proto.im.RolePermissionRequest.toObject = function (includeInstance, msg) {
+        var f, obj = {
+            roleid: jspb.Message.getFieldWithDefault(msg, 1, 0),
+            servicepathList: (f = jspb.Message.getRepeatedField(msg, 2)) == null ? undefined : f
+        };
+
+        if (includeInstance) {
+            obj.$jspbMessageInstance = msg;
+        }
+        return obj;
+    };
+}
+
+
+/**
+ * Deserializes binary data (in protobuf wire format).
+ * @param {jspb.ByteSource} bytes The bytes to deserialize.
+ * @return {!proto.im.RolePermissionRequest}
+ */
+proto.im.RolePermissionRequest.deserializeBinary = function (bytes) {
+    var reader = new jspb.BinaryReader(bytes);
+    var msg = new proto.im.RolePermissionRequest;
+    return proto.im.RolePermissionRequest.deserializeBinaryFromReader(msg, reader);
+};
+
+
+/**
+ * Deserializes binary data (in protobuf wire format) from the
+ * given reader into the given message object.
+ * @param {!proto.im.RolePermissionRequest} msg The message object to deserialize into.
+ * @param {!jspb.BinaryReader} reader The BinaryReader to use.
+ * @return {!proto.im.RolePermissionRequest}
+ */
+proto.im.RolePermissionRequest.deserializeBinaryFromReader = function (msg, reader) {
+    while (reader.nextField()) {
+        if (reader.isEndGroup()) {
+            break;
+        }
+        var field = reader.getFieldNumber();
+        switch (field) {
+            case 1:
+                var value = /** @type {number} */ (reader.readInt64());
+                msg.setRoleid(value);
+                break;
+            case 2:
+                var value = /** @type {string} */ (reader.readString());
+                msg.addServicepath(value);
+                break;
+            default:
+                reader.skipField();
+                break;
+        }
+    }
+    return msg;
+};
+
+
+/**
+ * Serializes the message to binary data (in protobuf wire format).
+ * @return {!Uint8Array}
+ */
+proto.im.RolePermissionRequest.prototype.serializeBinary = function () {
+    var writer = new jspb.BinaryWriter();
+    proto.im.RolePermissionRequest.serializeBinaryToWriter(this, writer);
+    return writer.getResultBuffer();
+};
+
+
+/**
+ * Serializes the given message to binary data (in protobuf wire
+ * format), writing to the given BinaryWriter.
+ * @param {!proto.im.RolePermissionRequest} message
+ * @param {!jspb.BinaryWriter} writer
+ * @suppress {unusedLocalVariables} f is only used for nested messages
+ */
+proto.im.RolePermissionRequest.serializeBinaryToWriter = function (message, writer) {
+    var f = undefined;
+    f = message.getRoleid();
+    if (f !== 0) {
+        writer.writeInt64(
+            1,
+            f
+        );
+    }
+    f = message.getServicepathList();
+    if (f.length > 0) {
+        writer.writeRepeatedString(
+            2,
+            f
+        );
+    }
+};
+
+
+/**
+ * optional int64 roleId = 1;
+ * @return {number}
+ */
+proto.im.RolePermissionRequest.prototype.getRoleid = function () {
+    return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 1, 0));
+};
+
+
+/**
+ * @param {number} value
+ * @return {!proto.im.RolePermissionRequest} returns this
+ */
+proto.im.RolePermissionRequest.prototype.setRoleid = function (value) {
+    return jspb.Message.setProto3IntField(this, 1, value);
+};
+
+
+/**
+ * repeated string servicePath = 2;
+ * @return {!Array<string>}
+ */
+proto.im.RolePermissionRequest.prototype.getServicepathList = function () {
+    return /** @type {!Array<string>} */ (jspb.Message.getRepeatedField(this, 2));
+};
+
+
+/**
+ * @param {!Array<string>} value
+ * @return {!proto.im.RolePermissionRequest} returns this
+ */
+proto.im.RolePermissionRequest.prototype.setServicepathList = function (value) {
+    return jspb.Message.setField(this, 2, value || []);
+};
+
+
+/**
+ * @param {string} value
+ * @param {number=} opt_index
+ * @return {!proto.im.RolePermissionRequest} returns this
+ */
+proto.im.RolePermissionRequest.prototype.addServicepath = function (value, opt_index) {
+    return jspb.Message.addToRepeatedField(this, 2, value, opt_index);
+};
+
+
+/**
+ * Clears the list making it empty but non-null.
+ * @return {!proto.im.RolePermissionRequest} returns this
+ */
+proto.im.RolePermissionRequest.prototype.clearServicepathList = function () {
+    return this.setServicepathList([]);
+};
+
+
+if (jspb.Message.GENERATE_TO_OBJECT) {
+    /**
+     * Creates an object representation of this proto.
+     * Field names that are reserved in JavaScript and will be renamed to pb_name.
+     * Optional fields that are not set will be set to undefined.
+     * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default.
+     * For the list of reserved names please see:
+     *     net/proto2/compiler/js/internal/generator.cc#kKeyword.
+     * @param {boolean=} opt_includeInstance Deprecated. whether to include the
+     *     JSPB instance for transitional soy proto support:
+     *     http://goto/soy-param-migration
+     * @return {!Object}
+     */
+    proto.im.ServiceListRequest.prototype.toObject = function (opt_includeInstance) {
+        return proto.im.ServiceListRequest.toObject(opt_includeInstance, this);
+    };
+
+
+    /**
+     * Static version of the {@see toObject} method.
+     * @param {boolean|undefined} includeInstance Deprecated. Whether to include
+     *     the JSPB instance for transitional soy proto support:
+     *     http://goto/soy-param-migration
+     * @param {!proto.im.ServiceListRequest} msg The msg instance to transform.
+     * @return {!Object}
+     * @suppress {unusedLocalVariables} f is only used for nested messages
+     */
+    proto.im.ServiceListRequest.toObject = function (includeInstance, msg) {
+        var f, obj = {
+            sysid: jspb.Message.getFieldWithDefault(msg, 1, 0)
+        };
+
+        if (includeInstance) {
+            obj.$jspbMessageInstance = msg;
+        }
+        return obj;
+    };
+}
+
+
+/**
+ * Deserializes binary data (in protobuf wire format).
+ * @param {jspb.ByteSource} bytes The bytes to deserialize.
+ * @return {!proto.im.ServiceListRequest}
+ */
+proto.im.ServiceListRequest.deserializeBinary = function (bytes) {
+    var reader = new jspb.BinaryReader(bytes);
+    var msg = new proto.im.ServiceListRequest;
+    return proto.im.ServiceListRequest.deserializeBinaryFromReader(msg, reader);
+};
+
+
+/**
+ * Deserializes binary data (in protobuf wire format) from the
+ * given reader into the given message object.
+ * @param {!proto.im.ServiceListRequest} msg The message object to deserialize into.
+ * @param {!jspb.BinaryReader} reader The BinaryReader to use.
+ * @return {!proto.im.ServiceListRequest}
+ */
+proto.im.ServiceListRequest.deserializeBinaryFromReader = function (msg, reader) {
+    while (reader.nextField()) {
+        if (reader.isEndGroup()) {
+            break;
+        }
+        var field = reader.getFieldNumber();
+        switch (field) {
+            case 1:
+                var value = /** @type {number} */ (reader.readInt64());
+                msg.setSysid(value);
+                break;
+            default:
+                reader.skipField();
+                break;
+        }
+    }
+    return msg;
+};
+
+
+/**
+ * Serializes the message to binary data (in protobuf wire format).
+ * @return {!Uint8Array}
+ */
+proto.im.ServiceListRequest.prototype.serializeBinary = function () {
+    var writer = new jspb.BinaryWriter();
+    proto.im.ServiceListRequest.serializeBinaryToWriter(this, writer);
+    return writer.getResultBuffer();
+};
+
+
+/**
+ * Serializes the given message to binary data (in protobuf wire
+ * format), writing to the given BinaryWriter.
+ * @param {!proto.im.ServiceListRequest} message
+ * @param {!jspb.BinaryWriter} writer
+ * @suppress {unusedLocalVariables} f is only used for nested messages
+ */
+proto.im.ServiceListRequest.serializeBinaryToWriter = function (message, writer) {
+    var f = undefined;
+    f = message.getSysid();
+    if (f !== 0) {
+        writer.writeInt64(
+            1,
+            f
+        );
+    }
+};
+
+
+/**
+ * optional int64 sysId = 1;
+ * @return {number}
+ */
+proto.im.ServiceListRequest.prototype.getSysid = function () {
+    return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 1, 0));
+};
+
+
+/**
+ * @param {number} value
+ * @return {!proto.im.ServiceListRequest} returns this
+ */
+proto.im.ServiceListRequest.prototype.setSysid = function (value) {
+    return jspb.Message.setProto3IntField(this, 1, value);
+};
+
+
+/**
+ * List of repeated fields within this message type.
+ * @private {!Array<number>}
+ * @const
+ */
+proto.im.ServiceListReply.repeatedFields_ = [1];
+
+
+if (jspb.Message.GENERATE_TO_OBJECT) {
+    /**
+     * Creates an object representation of this proto.
+     * Field names that are reserved in JavaScript and will be renamed to pb_name.
+     * Optional fields that are not set will be set to undefined.
+     * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default.
+     * For the list of reserved names please see:
+     *     net/proto2/compiler/js/internal/generator.cc#kKeyword.
+     * @param {boolean=} opt_includeInstance Deprecated. whether to include the
+     *     JSPB instance for transitional soy proto support:
+     *     http://goto/soy-param-migration
+     * @return {!Object}
+     */
+    proto.im.ServiceListReply.prototype.toObject = function (opt_includeInstance) {
+        return proto.im.ServiceListReply.toObject(opt_includeInstance, this);
+    };
+
+
+    /**
+     * Static version of the {@see toObject} method.
+     * @param {boolean|undefined} includeInstance Deprecated. Whether to include
+     *     the JSPB instance for transitional soy proto support:
+     *     http://goto/soy-param-migration
+     * @param {!proto.im.ServiceListReply} msg The msg instance to transform.
+     * @return {!Object}
+     * @suppress {unusedLocalVariables} f is only used for nested messages
+     */
+    proto.im.ServiceListReply.toObject = function (includeInstance, msg) {
+        var f, obj = {
+            listList: jspb.Message.toObjectList(msg.getListList(),
+                proto.im.Service.toObject, includeInstance)
+        };
+
+        if (includeInstance) {
+            obj.$jspbMessageInstance = msg;
+        }
+        return obj;
+    };
+}
+
+
+/**
+ * Deserializes binary data (in protobuf wire format).
+ * @param {jspb.ByteSource} bytes The bytes to deserialize.
+ * @return {!proto.im.ServiceListReply}
+ */
+proto.im.ServiceListReply.deserializeBinary = function (bytes) {
+    var reader = new jspb.BinaryReader(bytes);
+    var msg = new proto.im.ServiceListReply;
+    return proto.im.ServiceListReply.deserializeBinaryFromReader(msg, reader);
+};
+
+
+/**
+ * Deserializes binary data (in protobuf wire format) from the
+ * given reader into the given message object.
+ * @param {!proto.im.ServiceListReply} msg The message object to deserialize into.
+ * @param {!jspb.BinaryReader} reader The BinaryReader to use.
+ * @return {!proto.im.ServiceListReply}
+ */
+proto.im.ServiceListReply.deserializeBinaryFromReader = function (msg, reader) {
+    while (reader.nextField()) {
+        if (reader.isEndGroup()) {
+            break;
+        }
+        var field = reader.getFieldNumber();
+        switch (field) {
+            case 1:
+                var value = new proto.im.Service;
+                reader.readMessage(value, proto.im.Service.deserializeBinaryFromReader);
+                msg.addList(value);
+                break;
+            default:
+                reader.skipField();
+                break;
+        }
+    }
+    return msg;
+};
+
+
+/**
+ * Serializes the message to binary data (in protobuf wire format).
+ * @return {!Uint8Array}
+ */
+proto.im.ServiceListReply.prototype.serializeBinary = function () {
+    var writer = new jspb.BinaryWriter();
+    proto.im.ServiceListReply.serializeBinaryToWriter(this, writer);
+    return writer.getResultBuffer();
+};
+
+
+/**
+ * Serializes the given message to binary data (in protobuf wire
+ * format), writing to the given BinaryWriter.
+ * @param {!proto.im.ServiceListReply} message
+ * @param {!jspb.BinaryWriter} writer
+ * @suppress {unusedLocalVariables} f is only used for nested messages
+ */
+proto.im.ServiceListReply.serializeBinaryToWriter = function (message, writer) {
+    var f = undefined;
+    f = message.getListList();
+    if (f.length > 0) {
+        writer.writeRepeatedMessage(
+            1,
+            f,
+            proto.im.Service.serializeBinaryToWriter
+        );
+    }
+};
+
+
+/**
+ * repeated Service list = 1;
+ * @return {!Array<!proto.im.Service>}
+ */
+proto.im.ServiceListReply.prototype.getListList = function () {
+    return /** @type{!Array<!proto.im.Service>} */ (
+        jspb.Message.getRepeatedWrapperField(this, proto.im.Service, 1));
+};
+
+
+/**
+ * @param {!Array<!proto.im.Service>} value
+ * @return {!proto.im.ServiceListReply} returns this
+ */
+proto.im.ServiceListReply.prototype.setListList = function (value) {
+    return jspb.Message.setRepeatedWrapperField(this, 1, value);
+};
+
+
+/**
+ * @param {!proto.im.Service=} opt_value
+ * @param {number=} opt_index
+ * @return {!proto.im.Service}
+ */
+proto.im.ServiceListReply.prototype.addList = function (opt_value, opt_index) {
+    return jspb.Message.addToRepeatedWrapperField(this, 1, opt_value, proto.im.Service, opt_index);
+};
+
+
+/**
+ * Clears the list making it empty but non-null.
+ * @return {!proto.im.ServiceListReply} returns this
+ */
+proto.im.ServiceListReply.prototype.clearListList = function () {
+    return this.setListList([]);
+};
+
+
+/**
+ * List of repeated fields within this message type.
+ * @private {!Array<number>}
+ * @const
+ */
+proto.im.ServiceRemoveRequest.repeatedFields_ = [1];
+
+
+if (jspb.Message.GENERATE_TO_OBJECT) {
+    /**
+     * Creates an object representation of this proto.
+     * Field names that are reserved in JavaScript and will be renamed to pb_name.
+     * Optional fields that are not set will be set to undefined.
+     * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default.
+     * For the list of reserved names please see:
+     *     net/proto2/compiler/js/internal/generator.cc#kKeyword.
+     * @param {boolean=} opt_includeInstance Deprecated. whether to include the
+     *     JSPB instance for transitional soy proto support:
+     *     http://goto/soy-param-migration
+     * @return {!Object}
+     */
+    proto.im.ServiceRemoveRequest.prototype.toObject = function (opt_includeInstance) {
+        return proto.im.ServiceRemoveRequest.toObject(opt_includeInstance, this);
+    };
+
+
+    /**
+     * Static version of the {@see toObject} method.
+     * @param {boolean|undefined} includeInstance Deprecated. Whether to include
+     *     the JSPB instance for transitional soy proto support:
+     *     http://goto/soy-param-migration
+     * @param {!proto.im.ServiceRemoveRequest} msg The msg instance to transform.
+     * @return {!Object}
+     * @suppress {unusedLocalVariables} f is only used for nested messages
+     */
+    proto.im.ServiceRemoveRequest.toObject = function (includeInstance, msg) {
+        var f, obj = {
+            pathlistList: (f = jspb.Message.getRepeatedField(msg, 1)) == null ? undefined : f
+        };
+
+        if (includeInstance) {
+            obj.$jspbMessageInstance = msg;
+        }
+        return obj;
+    };
+}
+
+
+/**
+ * Deserializes binary data (in protobuf wire format).
+ * @param {jspb.ByteSource} bytes The bytes to deserialize.
+ * @return {!proto.im.ServiceRemoveRequest}
+ */
+proto.im.ServiceRemoveRequest.deserializeBinary = function (bytes) {
+    var reader = new jspb.BinaryReader(bytes);
+    var msg = new proto.im.ServiceRemoveRequest;
+    return proto.im.ServiceRemoveRequest.deserializeBinaryFromReader(msg, reader);
+};
+
+
+/**
+ * Deserializes binary data (in protobuf wire format) from the
+ * given reader into the given message object.
+ * @param {!proto.im.ServiceRemoveRequest} msg The message object to deserialize into.
+ * @param {!jspb.BinaryReader} reader The BinaryReader to use.
+ * @return {!proto.im.ServiceRemoveRequest}
+ */
+proto.im.ServiceRemoveRequest.deserializeBinaryFromReader = function (msg, reader) {
+    while (reader.nextField()) {
+        if (reader.isEndGroup()) {
+            break;
+        }
+        var field = reader.getFieldNumber();
+        switch (field) {
+            case 1:
+                var value = /** @type {string} */ (reader.readString());
+                msg.addPathlist(value);
+                break;
+            default:
+                reader.skipField();
+                break;
+        }
+    }
+    return msg;
+};
+
+
+/**
+ * Serializes the message to binary data (in protobuf wire format).
+ * @return {!Uint8Array}
+ */
+proto.im.ServiceRemoveRequest.prototype.serializeBinary = function () {
+    var writer = new jspb.BinaryWriter();
+    proto.im.ServiceRemoveRequest.serializeBinaryToWriter(this, writer);
+    return writer.getResultBuffer();
+};
+
+
+/**
+ * Serializes the given message to binary data (in protobuf wire
+ * format), writing to the given BinaryWriter.
+ * @param {!proto.im.ServiceRemoveRequest} message
+ * @param {!jspb.BinaryWriter} writer
+ * @suppress {unusedLocalVariables} f is only used for nested messages
+ */
+proto.im.ServiceRemoveRequest.serializeBinaryToWriter = function (message, writer) {
+    var f = undefined;
+    f = message.getPathlistList();
+    if (f.length > 0) {
+        writer.writeRepeatedString(
+            1,
+            f
+        );
+    }
+};
+
+
+/**
+ * repeated string pathList = 1;
+ * @return {!Array<string>}
+ */
+proto.im.ServiceRemoveRequest.prototype.getPathlistList = function () {
+    return /** @type {!Array<string>} */ (jspb.Message.getRepeatedField(this, 1));
+};
+
+
+/**
+ * @param {!Array<string>} value
+ * @return {!proto.im.ServiceRemoveRequest} returns this
+ */
+proto.im.ServiceRemoveRequest.prototype.setPathlistList = function (value) {
+    return jspb.Message.setField(this, 1, value || []);
+};
+
+
+/**
+ * @param {string} value
+ * @param {number=} opt_index
+ * @return {!proto.im.ServiceRemoveRequest} returns this
+ */
+proto.im.ServiceRemoveRequest.prototype.addPathlist = function (value, opt_index) {
+    return jspb.Message.addToRepeatedField(this, 1, value, opt_index);
+};
+
+
+/**
+ * Clears the list making it empty but non-null.
+ * @return {!proto.im.ServiceRemoveRequest} returns this
+ */
+proto.im.ServiceRemoveRequest.prototype.clearPathlistList = function () {
+    return this.setPathlistList([]);
+};
+
+
+if (jspb.Message.GENERATE_TO_OBJECT) {
+    /**
+     * Creates an object representation of this proto.
+     * Field names that are reserved in JavaScript and will be renamed to pb_name.
+     * Optional fields that are not set will be set to undefined.
+     * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default.
+     * For the list of reserved names please see:
+     *     net/proto2/compiler/js/internal/generator.cc#kKeyword.
+     * @param {boolean=} opt_includeInstance Deprecated. whether to include the
+     *     JSPB instance for transitional soy proto support:
+     *     http://goto/soy-param-migration
+     * @return {!Object}
+     */
+    proto.im.CreateShopRequest.prototype.toObject = function (opt_includeInstance) {
+        return proto.im.CreateShopRequest.toObject(opt_includeInstance, this);
+    };
+
+
+    /**
+     * Static version of the {@see toObject} method.
+     * @param {boolean|undefined} includeInstance Deprecated. Whether to include
+     *     the JSPB instance for transitional soy proto support:
+     *     http://goto/soy-param-migration
+     * @param {!proto.im.CreateShopRequest} msg The msg instance to transform.
+     * @return {!Object}
+     * @suppress {unusedLocalVariables} f is only used for nested messages
+     */
+    proto.im.CreateShopRequest.toObject = function (includeInstance, msg) {
+        var f, obj = {
+            name: jspb.Message.getFieldWithDefault(msg, 1, ""),
+            key: jspb.Message.getFieldWithDefault(msg, 2, ""),
+            sid: jspb.Message.getFieldWithDefault(msg, 3, 0),
+            addr: jspb.Message.getFieldWithDefault(msg, 4, ""),
+            phone: jspb.Message.getFieldWithDefault(msg, 5, ""),
+            contacts: jspb.Message.getFieldWithDefault(msg, 6, ""),
+            createuser: jspb.Message.getFieldWithDefault(msg, 7, 0)
+        };
+
+        if (includeInstance) {
+            obj.$jspbMessageInstance = msg;
+        }
+        return obj;
+    };
+}
+
+
+/**
+ * Deserializes binary data (in protobuf wire format).
+ * @param {jspb.ByteSource} bytes The bytes to deserialize.
+ * @return {!proto.im.CreateShopRequest}
+ */
+proto.im.CreateShopRequest.deserializeBinary = function (bytes) {
+    var reader = new jspb.BinaryReader(bytes);
+    var msg = new proto.im.CreateShopRequest;
+    return proto.im.CreateShopRequest.deserializeBinaryFromReader(msg, reader);
+};
+
+
+/**
+ * Deserializes binary data (in protobuf wire format) from the
+ * given reader into the given message object.
+ * @param {!proto.im.CreateShopRequest} msg The message object to deserialize into.
+ * @param {!jspb.BinaryReader} reader The BinaryReader to use.
+ * @return {!proto.im.CreateShopRequest}
+ */
+proto.im.CreateShopRequest.deserializeBinaryFromReader = function (msg, reader) {
+    while (reader.nextField()) {
+        if (reader.isEndGroup()) {
+            break;
+        }
+        var field = reader.getFieldNumber();
+        switch (field) {
+            case 1:
+                var value = /** @type {string} */ (reader.readString());
+                msg.setName(value);
+                break;
+            case 2:
+                var value = /** @type {string} */ (reader.readString());
+                msg.setKey(value);
+                break;
+            case 3:
+                var value = /** @type {number} */ (reader.readInt64());
+                msg.setSid(value);
+                break;
+            case 4:
+                var value = /** @type {string} */ (reader.readString());
+                msg.setAddr(value);
+                break;
+            case 5:
+                var value = /** @type {string} */ (reader.readString());
+                msg.setPhone(value);
+                break;
+            case 6:
+                var value = /** @type {string} */ (reader.readString());
+                msg.setContacts(value);
+                break;
+            case 7:
+                var value = /** @type {number} */ (reader.readInt64());
+                msg.setCreateuser(value);
+                break;
+            default:
+                reader.skipField();
+                break;
+        }
+    }
+    return msg;
+};
+
+
+/**
+ * Serializes the message to binary data (in protobuf wire format).
+ * @return {!Uint8Array}
+ */
+proto.im.CreateShopRequest.prototype.serializeBinary = function () {
+    var writer = new jspb.BinaryWriter();
+    proto.im.CreateShopRequest.serializeBinaryToWriter(this, writer);
+    return writer.getResultBuffer();
+};
+
+
+/**
+ * Serializes the given message to binary data (in protobuf wire
+ * format), writing to the given BinaryWriter.
+ * @param {!proto.im.CreateShopRequest} message
+ * @param {!jspb.BinaryWriter} writer
+ * @suppress {unusedLocalVariables} f is only used for nested messages
+ */
+proto.im.CreateShopRequest.serializeBinaryToWriter = function (message, writer) {
+    var f = undefined;
+    f = message.getName();
+    if (f.length > 0) {
+        writer.writeString(
+            1,
+            f
+        );
+    }
+    f = message.getKey();
+    if (f.length > 0) {
+        writer.writeString(
+            2,
+            f
+        );
+    }
+    f = message.getSid();
+    if (f !== 0) {
+        writer.writeInt64(
+            3,
+            f
+        );
+    }
+    f = message.getAddr();
+    if (f.length > 0) {
+        writer.writeString(
+            4,
+            f
+        );
+    }
+    f = message.getPhone();
+    if (f.length > 0) {
+        writer.writeString(
+            5,
+            f
+        );
+    }
+    f = message.getContacts();
+    if (f.length > 0) {
+        writer.writeString(
+            6,
+            f
+        );
+    }
+    f = message.getCreateuser();
+    if (f !== 0) {
+        writer.writeInt64(
+            7,
+            f
+        );
+    }
+};
+
+
+/**
+ * optional string name = 1;
+ * @return {string}
+ */
+proto.im.CreateShopRequest.prototype.getName = function () {
+    return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, ""));
+};
+
+
+/**
+ * @param {string} value
+ * @return {!proto.im.CreateShopRequest} returns this
+ */
+proto.im.CreateShopRequest.prototype.setName = function (value) {
+    return jspb.Message.setProto3StringField(this, 1, value);
+};
+
+
+/**
+ * optional string key = 2;
+ * @return {string}
+ */
+proto.im.CreateShopRequest.prototype.getKey = function () {
+    return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 2, ""));
+};
+
+
+/**
+ * @param {string} value
+ * @return {!proto.im.CreateShopRequest} returns this
+ */
+proto.im.CreateShopRequest.prototype.setKey = function (value) {
+    return jspb.Message.setProto3StringField(this, 2, value);
+};
+
+
+/**
+ * optional int64 sId = 3;
+ * @return {number}
+ */
+proto.im.CreateShopRequest.prototype.getSid = function () {
+    return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 3, 0));
+};
+
+
+/**
+ * @param {number} value
+ * @return {!proto.im.CreateShopRequest} returns this
+ */
+proto.im.CreateShopRequest.prototype.setSid = function (value) {
+    return jspb.Message.setProto3IntField(this, 3, value);
+};
+
+
+/**
+ * optional string addr = 4;
+ * @return {string}
+ */
+proto.im.CreateShopRequest.prototype.getAddr = function () {
+    return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 4, ""));
+};
+
+
+/**
+ * @param {string} value
+ * @return {!proto.im.CreateShopRequest} returns this
+ */
+proto.im.CreateShopRequest.prototype.setAddr = function (value) {
+    return jspb.Message.setProto3StringField(this, 4, value);
+};
+
+
+/**
+ * optional string phone = 5;
+ * @return {string}
+ */
+proto.im.CreateShopRequest.prototype.getPhone = function () {
+    return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 5, ""));
+};
+
+
+/**
+ * @param {string} value
+ * @return {!proto.im.CreateShopRequest} returns this
+ */
+proto.im.CreateShopRequest.prototype.setPhone = function (value) {
+    return jspb.Message.setProto3StringField(this, 5, value);
+};
+
+
+/**
+ * optional string contacts = 6;
+ * @return {string}
+ */
+proto.im.CreateShopRequest.prototype.getContacts = function () {
+    return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 6, ""));
+};
+
+
+/**
+ * @param {string} value
+ * @return {!proto.im.CreateShopRequest} returns this
+ */
+proto.im.CreateShopRequest.prototype.setContacts = function (value) {
+    return jspb.Message.setProto3StringField(this, 6, value);
+};
+
+
+/**
+ * optional int64 createUser = 7;
+ * @return {number}
+ */
+proto.im.CreateShopRequest.prototype.getCreateuser = function () {
+    return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 7, 0));
+};
+
+
+/**
+ * @param {number} value
+ * @return {!proto.im.CreateShopRequest} returns this
+ */
+proto.im.CreateShopRequest.prototype.setCreateuser = function (value) {
+    return jspb.Message.setProto3IntField(this, 7, value);
+};
+
+
+if (jspb.Message.GENERATE_TO_OBJECT) {
+    /**
+     * Creates an object representation of this proto.
+     * Field names that are reserved in JavaScript and will be renamed to pb_name.
+     * Optional fields that are not set will be set to undefined.
+     * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default.
+     * For the list of reserved names please see:
+     *     net/proto2/compiler/js/internal/generator.cc#kKeyword.
+     * @param {boolean=} opt_includeInstance Deprecated. whether to include the
+     *     JSPB instance for transitional soy proto support:
+     *     http://goto/soy-param-migration
+     * @return {!Object}
+     */
+    proto.im.ShopListRequest.prototype.toObject = function (opt_includeInstance) {
+        return proto.im.ShopListRequest.toObject(opt_includeInstance, this);
+    };
+
+
+    /**
+     * Static version of the {@see toObject} method.
+     * @param {boolean|undefined} includeInstance Deprecated. Whether to include
+     *     the JSPB instance for transitional soy proto support:
+     *     http://goto/soy-param-migration
+     * @param {!proto.im.ShopListRequest} msg The msg instance to transform.
+     * @return {!Object}
+     * @suppress {unusedLocalVariables} f is only used for nested messages
+     */
+    proto.im.ShopListRequest.toObject = function (includeInstance, msg) {
+        var f, obj = {
+            sysid: jspb.Message.getFieldWithDefault(msg, 1, 0),
+            name: jspb.Message.getFieldWithDefault(msg, 2, ""),
+            status: jspb.Message.getFieldWithDefault(msg, 3, 0),
+            sid: jspb.Message.getFieldWithDefault(msg, 4, 0)
+        };
+
+        if (includeInstance) {
+            obj.$jspbMessageInstance = msg;
+        }
+        return obj;
+    };
+}
+
+
+/**
+ * Deserializes binary data (in protobuf wire format).
+ * @param {jspb.ByteSource} bytes The bytes to deserialize.
+ * @return {!proto.im.ShopListRequest}
+ */
+proto.im.ShopListRequest.deserializeBinary = function (bytes) {
+    var reader = new jspb.BinaryReader(bytes);
+    var msg = new proto.im.ShopListRequest;
+    return proto.im.ShopListRequest.deserializeBinaryFromReader(msg, reader);
+};
+
+
+/**
+ * Deserializes binary data (in protobuf wire format) from the
+ * given reader into the given message object.
+ * @param {!proto.im.ShopListRequest} msg The message object to deserialize into.
+ * @param {!jspb.BinaryReader} reader The BinaryReader to use.
+ * @return {!proto.im.ShopListRequest}
+ */
+proto.im.ShopListRequest.deserializeBinaryFromReader = function (msg, reader) {
+    while (reader.nextField()) {
+        if (reader.isEndGroup()) {
+            break;
+        }
+        var field = reader.getFieldNumber();
+        switch (field) {
+            case 1:
+                var value = /** @type {number} */ (reader.readInt64());
+                msg.setSysid(value);
+                break;
+            case 2:
+                var value = /** @type {string} */ (reader.readString());
+                msg.setName(value);
+                break;
+            case 3:
+                var value = /** @type {!proto.im.Status} */ (reader.readEnum());
+                msg.setStatus(value);
+                break;
+            case 4:
+                var value = /** @type {number} */ (reader.readInt64());
+                msg.setSid(value);
+                break;
+            default:
+                reader.skipField();
+                break;
+        }
+    }
+    return msg;
+};
+
+
+/**
+ * Serializes the message to binary data (in protobuf wire format).
+ * @return {!Uint8Array}
+ */
+proto.im.ShopListRequest.prototype.serializeBinary = function () {
+    var writer = new jspb.BinaryWriter();
+    proto.im.ShopListRequest.serializeBinaryToWriter(this, writer);
+    return writer.getResultBuffer();
+};
+
+
+/**
+ * Serializes the given message to binary data (in protobuf wire
+ * format), writing to the given BinaryWriter.
+ * @param {!proto.im.ShopListRequest} message
+ * @param {!jspb.BinaryWriter} writer
+ * @suppress {unusedLocalVariables} f is only used for nested messages
+ */
+proto.im.ShopListRequest.serializeBinaryToWriter = function (message, writer) {
+    var f = undefined;
+    f = message.getSysid();
+    if (f !== 0) {
+        writer.writeInt64(
+            1,
+            f
+        );
+    }
+    f = message.getName();
+    if (f.length > 0) {
+        writer.writeString(
+            2,
+            f
+        );
+    }
+    f = message.getStatus();
+    if (f !== 0.0) {
+        writer.writeEnum(
+            3,
+            f
+        );
+    }
+    f = message.getSid();
+    if (f !== 0) {
+        writer.writeInt64(
+            4,
+            f
+        );
+    }
+};
+
+
+/**
+ * optional int64 sysId = 1;
+ * @return {number}
+ */
+proto.im.ShopListRequest.prototype.getSysid = function () {
+    return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 1, 0));
+};
+
+
+/**
+ * @param {number} value
+ * @return {!proto.im.ShopListRequest} returns this
+ */
+proto.im.ShopListRequest.prototype.setSysid = function (value) {
+    return jspb.Message.setProto3IntField(this, 1, value);
+};
+
+
+/**
+ * optional string name = 2;
+ * @return {string}
+ */
+proto.im.ShopListRequest.prototype.getName = function () {
+    return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 2, ""));
+};
+
+
+/**
+ * @param {string} value
+ * @return {!proto.im.ShopListRequest} returns this
+ */
+proto.im.ShopListRequest.prototype.setName = function (value) {
+    return jspb.Message.setProto3StringField(this, 2, value);
+};
+
+
+/**
+ * optional Status status = 3;
+ * @return {!proto.im.Status}
+ */
+proto.im.ShopListRequest.prototype.getStatus = function () {
+    return /** @type {!proto.im.Status} */ (jspb.Message.getFieldWithDefault(this, 3, 0));
+};
+
+
+/**
+ * @param {!proto.im.Status} value
+ * @return {!proto.im.ShopListRequest} returns this
+ */
+proto.im.ShopListRequest.prototype.setStatus = function (value) {
+    return jspb.Message.setProto3EnumField(this, 3, value);
+};
+
+
+/**
+ * optional int64 sId = 4;
+ * @return {number}
+ */
+proto.im.ShopListRequest.prototype.getSid = function () {
+    return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 4, 0));
+};
+
+
+/**
+ * @param {number} value
+ * @return {!proto.im.ShopListRequest} returns this
+ */
+proto.im.ShopListRequest.prototype.setSid = function (value) {
+    return jspb.Message.setProto3IntField(this, 4, value);
+};
+
+
+if (jspb.Message.GENERATE_TO_OBJECT) {
+    /**
+     * Creates an object representation of this proto.
+     * Field names that are reserved in JavaScript and will be renamed to pb_name.
+     * Optional fields that are not set will be set to undefined.
+     * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default.
+     * For the list of reserved names please see:
+     *     net/proto2/compiler/js/internal/generator.cc#kKeyword.
+     * @param {boolean=} opt_includeInstance Deprecated. whether to include the
+     *     JSPB instance for transitional soy proto support:
+     *     http://goto/soy-param-migration
+     * @return {!Object}
+     */
+    proto.im.ShopInfo.prototype.toObject = function (opt_includeInstance) {
+        return proto.im.ShopInfo.toObject(opt_includeInstance, this);
+    };
+
+
+    /**
+     * Static version of the {@see toObject} method.
+     * @param {boolean|undefined} includeInstance Deprecated. Whether to include
+     *     the JSPB instance for transitional soy proto support:
+     *     http://goto/soy-param-migration
+     * @param {!proto.im.ShopInfo} msg The msg instance to transform.
+     * @return {!Object}
+     * @suppress {unusedLocalVariables} f is only used for nested messages
+     */
+    proto.im.ShopInfo.toObject = function (includeInstance, msg) {
+        var f, obj = {
+            shopid: jspb.Message.getFieldWithDefault(msg, 1, 0),
+            name: jspb.Message.getFieldWithDefault(msg, 2, ""),
+            sid: jspb.Message.getFieldWithDefault(msg, 3, 0),
+            addr: jspb.Message.getFieldWithDefault(msg, 4, ""),
+            phone: jspb.Message.getFieldWithDefault(msg, 5, ""),
+            contacts: jspb.Message.getFieldWithDefault(msg, 6, ""),
+            status: jspb.Message.getFieldWithDefault(msg, 7, 0),
+            createdAt: jspb.Message.getFieldWithDefault(msg, 8, 0),
+            createdUser: jspb.Message.getFieldWithDefault(msg, 9, 0),
+            updatedAt: jspb.Message.getFieldWithDefault(msg, 10, 0),
+            updatedUser: jspb.Message.getFieldWithDefault(msg, 11, 0)
+        };
+
+        if (includeInstance) {
+            obj.$jspbMessageInstance = msg;
+        }
+        return obj;
+    };
+}
+
+
+/**
+ * Deserializes binary data (in protobuf wire format).
+ * @param {jspb.ByteSource} bytes The bytes to deserialize.
+ * @return {!proto.im.ShopInfo}
+ */
+proto.im.ShopInfo.deserializeBinary = function (bytes) {
+    var reader = new jspb.BinaryReader(bytes);
+    var msg = new proto.im.ShopInfo;
+    return proto.im.ShopInfo.deserializeBinaryFromReader(msg, reader);
+};
+
+
+/**
+ * Deserializes binary data (in protobuf wire format) from the
+ * given reader into the given message object.
+ * @param {!proto.im.ShopInfo} msg The message object to deserialize into.
+ * @param {!jspb.BinaryReader} reader The BinaryReader to use.
+ * @return {!proto.im.ShopInfo}
+ */
+proto.im.ShopInfo.deserializeBinaryFromReader = function (msg, reader) {
+    while (reader.nextField()) {
+        if (reader.isEndGroup()) {
+            break;
+        }
+        var field = reader.getFieldNumber();
+        switch (field) {
+            case 1:
+                var value = /** @type {number} */ (reader.readInt64());
+                msg.setShopid(value);
+                break;
+            case 2:
+                var value = /** @type {string} */ (reader.readString());
+                msg.setName(value);
+                break;
+            case 3:
+                var value = /** @type {number} */ (reader.readInt64());
+                msg.setSid(value);
+                break;
+            case 4:
+                var value = /** @type {string} */ (reader.readString());
+                msg.setAddr(value);
+                break;
+            case 5:
+                var value = /** @type {string} */ (reader.readString());
+                msg.setPhone(value);
+                break;
+            case 6:
+                var value = /** @type {string} */ (reader.readString());
+                msg.setContacts(value);
+                break;
+            case 7:
+                var value = /** @type {!proto.im.Status} */ (reader.readEnum());
+                msg.setStatus(value);
+                break;
+            case 8:
+                var value = /** @type {number} */ (reader.readInt64());
+                msg.setCreatedAt(value);
+                break;
+            case 9:
+                var value = /** @type {number} */ (reader.readInt64());
+                msg.setCreatedUser(value);
+                break;
+            case 10:
+                var value = /** @type {number} */ (reader.readInt64());
+                msg.setUpdatedAt(value);
+                break;
+            case 11:
+                var value = /** @type {number} */ (reader.readInt64());
+                msg.setUpdatedUser(value);
+                break;
+            default:
+                reader.skipField();
+                break;
+        }
+    }
+    return msg;
+};
+
+
+/**
+ * Serializes the message to binary data (in protobuf wire format).
+ * @return {!Uint8Array}
+ */
+proto.im.ShopInfo.prototype.serializeBinary = function () {
+    var writer = new jspb.BinaryWriter();
+    proto.im.ShopInfo.serializeBinaryToWriter(this, writer);
+    return writer.getResultBuffer();
+};
+
+
+/**
+ * Serializes the given message to binary data (in protobuf wire
+ * format), writing to the given BinaryWriter.
+ * @param {!proto.im.ShopInfo} message
+ * @param {!jspb.BinaryWriter} writer
+ * @suppress {unusedLocalVariables} f is only used for nested messages
+ */
+proto.im.ShopInfo.serializeBinaryToWriter = function (message, writer) {
+    var f = undefined;
+    f = message.getShopid();
+    if (f !== 0) {
+        writer.writeInt64(
+            1,
+            f
+        );
+    }
+    f = message.getName();
+    if (f.length > 0) {
+        writer.writeString(
+            2,
+            f
+        );
+    }
+    f = message.getSid();
+    if (f !== 0) {
+        writer.writeInt64(
+            3,
+            f
+        );
+    }
+    f = message.getAddr();
+    if (f.length > 0) {
+        writer.writeString(
+            4,
+            f
+        );
+    }
+    f = message.getPhone();
+    if (f.length > 0) {
+        writer.writeString(
+            5,
+            f
+        );
+    }
+    f = message.getContacts();
+    if (f.length > 0) {
+        writer.writeString(
+            6,
+            f
+        );
+    }
+    f = message.getStatus();
+    if (f !== 0.0) {
+        writer.writeEnum(
+            7,
+            f
+        );
+    }
+    f = message.getCreatedAt();
+    if (f !== 0) {
+        writer.writeInt64(
+            8,
+            f
+        );
+    }
+    f = message.getCreatedUser();
+    if (f !== 0) {
+        writer.writeInt64(
+            9,
+            f
+        );
+    }
+    f = message.getUpdatedAt();
+    if (f !== 0) {
+        writer.writeInt64(
+            10,
+            f
+        );
+    }
+    f = message.getUpdatedUser();
+    if (f !== 0) {
+        writer.writeInt64(
+            11,
+            f
+        );
+    }
+};
+
+
+/**
+ * optional int64 shopId = 1;
+ * @return {number}
+ */
+proto.im.ShopInfo.prototype.getShopid = function () {
+    return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 1, 0));
+};
+
+
+/**
+ * @param {number} value
+ * @return {!proto.im.ShopInfo} returns this
+ */
+proto.im.ShopInfo.prototype.setShopid = function (value) {
+    return jspb.Message.setProto3IntField(this, 1, value);
+};
+
+
+/**
+ * optional string name = 2;
+ * @return {string}
+ */
+proto.im.ShopInfo.prototype.getName = function () {
+    return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 2, ""));
+};
+
+
+/**
+ * @param {string} value
+ * @return {!proto.im.ShopInfo} returns this
+ */
+proto.im.ShopInfo.prototype.setName = function (value) {
+    return jspb.Message.setProto3StringField(this, 2, value);
+};
+
+
+/**
+ * optional int64 sId = 3;
+ * @return {number}
+ */
+proto.im.ShopInfo.prototype.getSid = function () {
+    return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 3, 0));
+};
+
+
+/**
+ * @param {number} value
+ * @return {!proto.im.ShopInfo} returns this
+ */
+proto.im.ShopInfo.prototype.setSid = function (value) {
+    return jspb.Message.setProto3IntField(this, 3, value);
+};
+
+
+/**
+ * optional string addr = 4;
+ * @return {string}
+ */
+proto.im.ShopInfo.prototype.getAddr = function () {
+    return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 4, ""));
+};
+
+
+/**
+ * @param {string} value
+ * @return {!proto.im.ShopInfo} returns this
+ */
+proto.im.ShopInfo.prototype.setAddr = function (value) {
+    return jspb.Message.setProto3StringField(this, 4, value);
+};
+
+
+/**
+ * optional string phone = 5;
+ * @return {string}
+ */
+proto.im.ShopInfo.prototype.getPhone = function () {
+    return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 5, ""));
+};
+
+
+/**
+ * @param {string} value
+ * @return {!proto.im.ShopInfo} returns this
+ */
+proto.im.ShopInfo.prototype.setPhone = function (value) {
+    return jspb.Message.setProto3StringField(this, 5, value);
+};
+
+
+/**
+ * optional string contacts = 6;
+ * @return {string}
+ */
+proto.im.ShopInfo.prototype.getContacts = function () {
+    return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 6, ""));
+};
+
+
+/**
+ * @param {string} value
+ * @return {!proto.im.ShopInfo} returns this
+ */
+proto.im.ShopInfo.prototype.setContacts = function (value) {
+    return jspb.Message.setProto3StringField(this, 6, value);
+};
+
+
+/**
+ * optional Status status = 7;
+ * @return {!proto.im.Status}
+ */
+proto.im.ShopInfo.prototype.getStatus = function () {
+    return /** @type {!proto.im.Status} */ (jspb.Message.getFieldWithDefault(this, 7, 0));
+};
+
+
+/**
+ * @param {!proto.im.Status} value
+ * @return {!proto.im.ShopInfo} returns this
+ */
+proto.im.ShopInfo.prototype.setStatus = function (value) {
+    return jspb.Message.setProto3EnumField(this, 7, value);
+};
+
+
+/**
+ * optional int64 created_at = 8;
+ * @return {number}
+ */
+proto.im.ShopInfo.prototype.getCreatedAt = function () {
+    return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 8, 0));
+};
+
+
+/**
+ * @param {number} value
+ * @return {!proto.im.ShopInfo} returns this
+ */
+proto.im.ShopInfo.prototype.setCreatedAt = function (value) {
+    return jspb.Message.setProto3IntField(this, 8, value);
+};
+
+
+/**
+ * optional int64 created_user = 9;
+ * @return {number}
+ */
+proto.im.ShopInfo.prototype.getCreatedUser = function () {
+    return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 9, 0));
+};
+
+
+/**
+ * @param {number} value
+ * @return {!proto.im.ShopInfo} returns this
+ */
+proto.im.ShopInfo.prototype.setCreatedUser = function (value) {
+    return jspb.Message.setProto3IntField(this, 9, value);
+};
+
+
+/**
+ * optional int64 updated_at = 10;
+ * @return {number}
+ */
+proto.im.ShopInfo.prototype.getUpdatedAt = function () {
+    return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 10, 0));
+};
+
+
+/**
+ * @param {number} value
+ * @return {!proto.im.ShopInfo} returns this
+ */
+proto.im.ShopInfo.prototype.setUpdatedAt = function (value) {
+    return jspb.Message.setProto3IntField(this, 10, value);
+};
+
+
+/**
+ * optional int64 updated_user = 11;
+ * @return {number}
+ */
+proto.im.ShopInfo.prototype.getUpdatedUser = function () {
+    return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 11, 0));
+};
+
+
+/**
+ * @param {number} value
+ * @return {!proto.im.ShopInfo} returns this
+ */
+proto.im.ShopInfo.prototype.setUpdatedUser = function (value) {
+    return jspb.Message.setProto3IntField(this, 11, value);
+};
+
+
+/**
+ * List of repeated fields within this message type.
+ * @private {!Array<number>}
+ * @const
+ */
+proto.im.ShopListReply.repeatedFields_ = [1];
+
+
+if (jspb.Message.GENERATE_TO_OBJECT) {
+    /**
+     * Creates an object representation of this proto.
+     * Field names that are reserved in JavaScript and will be renamed to pb_name.
+     * Optional fields that are not set will be set to undefined.
+     * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default.
+     * For the list of reserved names please see:
+     *     net/proto2/compiler/js/internal/generator.cc#kKeyword.
+     * @param {boolean=} opt_includeInstance Deprecated. whether to include the
+     *     JSPB instance for transitional soy proto support:
+     *     http://goto/soy-param-migration
+     * @return {!Object}
+     */
+    proto.im.ShopListReply.prototype.toObject = function (opt_includeInstance) {
+        return proto.im.ShopListReply.toObject(opt_includeInstance, this);
+    };
+
+
+    /**
+     * Static version of the {@see toObject} method.
+     * @param {boolean|undefined} includeInstance Deprecated. Whether to include
+     *     the JSPB instance for transitional soy proto support:
+     *     http://goto/soy-param-migration
+     * @param {!proto.im.ShopListReply} msg The msg instance to transform.
+     * @return {!Object}
+     * @suppress {unusedLocalVariables} f is only used for nested messages
+     */
+    proto.im.ShopListReply.toObject = function (includeInstance, msg) {
+        var f, obj = {
+            listList: jspb.Message.toObjectList(msg.getListList(),
+                proto.im.ShopInfo.toObject, includeInstance)
+        };
+
+        if (includeInstance) {
+            obj.$jspbMessageInstance = msg;
+        }
+        return obj;
+    };
+}
+
+
+/**
+ * Deserializes binary data (in protobuf wire format).
+ * @param {jspb.ByteSource} bytes The bytes to deserialize.
+ * @return {!proto.im.ShopListReply}
+ */
+proto.im.ShopListReply.deserializeBinary = function (bytes) {
+    var reader = new jspb.BinaryReader(bytes);
+    var msg = new proto.im.ShopListReply;
+    return proto.im.ShopListReply.deserializeBinaryFromReader(msg, reader);
+};
+
+
+/**
+ * Deserializes binary data (in protobuf wire format) from the
+ * given reader into the given message object.
+ * @param {!proto.im.ShopListReply} msg The message object to deserialize into.
+ * @param {!jspb.BinaryReader} reader The BinaryReader to use.
+ * @return {!proto.im.ShopListReply}
+ */
+proto.im.ShopListReply.deserializeBinaryFromReader = function (msg, reader) {
+    while (reader.nextField()) {
+        if (reader.isEndGroup()) {
+            break;
+        }
+        var field = reader.getFieldNumber();
+        switch (field) {
+            case 1:
+                var value = new proto.im.ShopInfo;
+                reader.readMessage(value, proto.im.ShopInfo.deserializeBinaryFromReader);
+                msg.addList(value);
+                break;
+            default:
+                reader.skipField();
+                break;
+        }
+    }
+    return msg;
+};
+
+
+/**
+ * Serializes the message to binary data (in protobuf wire format).
+ * @return {!Uint8Array}
+ */
+proto.im.ShopListReply.prototype.serializeBinary = function () {
+    var writer = new jspb.BinaryWriter();
+    proto.im.ShopListReply.serializeBinaryToWriter(this, writer);
+    return writer.getResultBuffer();
+};
+
+
+/**
+ * Serializes the given message to binary data (in protobuf wire
+ * format), writing to the given BinaryWriter.
+ * @param {!proto.im.ShopListReply} message
+ * @param {!jspb.BinaryWriter} writer
+ * @suppress {unusedLocalVariables} f is only used for nested messages
+ */
+proto.im.ShopListReply.serializeBinaryToWriter = function (message, writer) {
+    var f = undefined;
+    f = message.getListList();
+    if (f.length > 0) {
+        writer.writeRepeatedMessage(
+            1,
+            f,
+            proto.im.ShopInfo.serializeBinaryToWriter
+        );
+    }
+};
+
+
+/**
+ * repeated ShopInfo list = 1;
+ * @return {!Array<!proto.im.ShopInfo>}
+ */
+proto.im.ShopListReply.prototype.getListList = function () {
+    return /** @type{!Array<!proto.im.ShopInfo>} */ (
+        jspb.Message.getRepeatedWrapperField(this, proto.im.ShopInfo, 1));
+};
+
+
+/**
+ * @param {!Array<!proto.im.ShopInfo>} value
+ * @return {!proto.im.ShopListReply} returns this
+ */
+proto.im.ShopListReply.prototype.setListList = function (value) {
+    return jspb.Message.setRepeatedWrapperField(this, 1, value);
+};
+
+
+/**
+ * @param {!proto.im.ShopInfo=} opt_value
+ * @param {number=} opt_index
+ * @return {!proto.im.ShopInfo}
+ */
+proto.im.ShopListReply.prototype.addList = function (opt_value, opt_index) {
+    return jspb.Message.addToRepeatedWrapperField(this, 1, opt_value, proto.im.ShopInfo, opt_index);
+};
+
+
+/**
+ * Clears the list making it empty but non-null.
+ * @return {!proto.im.ShopListReply} returns this
+ */
+proto.im.ShopListReply.prototype.clearListList = function () {
+    return this.setListList([]);
+};
+
+
+if (jspb.Message.GENERATE_TO_OBJECT) {
+    /**
+     * Creates an object representation of this proto.
+     * Field names that are reserved in JavaScript and will be renamed to pb_name.
+     * Optional fields that are not set will be set to undefined.
+     * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default.
+     * For the list of reserved names please see:
+     *     net/proto2/compiler/js/internal/generator.cc#kKeyword.
+     * @param {boolean=} opt_includeInstance Deprecated. whether to include the
+     *     JSPB instance for transitional soy proto support:
+     *     http://goto/soy-param-migration
+     * @return {!Object}
+     */
+    proto.im.SystemAddShopRequest.prototype.toObject = function (opt_includeInstance) {
+        return proto.im.SystemAddShopRequest.toObject(opt_includeInstance, this);
+    };
+
+
+    /**
+     * Static version of the {@see toObject} method.
+     * @param {boolean|undefined} includeInstance Deprecated. Whether to include
+     *     the JSPB instance for transitional soy proto support:
+     *     http://goto/soy-param-migration
+     * @param {!proto.im.SystemAddShopRequest} msg The msg instance to transform.
+     * @return {!Object}
+     * @suppress {unusedLocalVariables} f is only used for nested messages
+     */
+    proto.im.SystemAddShopRequest.toObject = function (includeInstance, msg) {
+        var f, obj = {
+            sysid: jspb.Message.getFieldWithDefault(msg, 1, 0),
+            shopid: jspb.Message.getFieldWithDefault(msg, 2, 0)
+        };
+
+        if (includeInstance) {
+            obj.$jspbMessageInstance = msg;
+        }
+        return obj;
+    };
+}
+
+
+/**
+ * Deserializes binary data (in protobuf wire format).
+ * @param {jspb.ByteSource} bytes The bytes to deserialize.
+ * @return {!proto.im.SystemAddShopRequest}
+ */
+proto.im.SystemAddShopRequest.deserializeBinary = function (bytes) {
+    var reader = new jspb.BinaryReader(bytes);
+    var msg = new proto.im.SystemAddShopRequest;
+    return proto.im.SystemAddShopRequest.deserializeBinaryFromReader(msg, reader);
+};
+
+
+/**
+ * Deserializes binary data (in protobuf wire format) from the
+ * given reader into the given message object.
+ * @param {!proto.im.SystemAddShopRequest} msg The message object to deserialize into.
+ * @param {!jspb.BinaryReader} reader The BinaryReader to use.
+ * @return {!proto.im.SystemAddShopRequest}
+ */
+proto.im.SystemAddShopRequest.deserializeBinaryFromReader = function (msg, reader) {
+    while (reader.nextField()) {
+        if (reader.isEndGroup()) {
+            break;
+        }
+        var field = reader.getFieldNumber();
+        switch (field) {
+            case 1:
+                var value = /** @type {number} */ (reader.readInt64());
+                msg.setSysid(value);
+                break;
+            case 2:
+                var value = /** @type {number} */ (reader.readInt64());
+                msg.setShopid(value);
+                break;
+            default:
+                reader.skipField();
+                break;
+        }
+    }
+    return msg;
+};
+
+
+/**
+ * Serializes the message to binary data (in protobuf wire format).
+ * @return {!Uint8Array}
+ */
+proto.im.SystemAddShopRequest.prototype.serializeBinary = function () {
+    var writer = new jspb.BinaryWriter();
+    proto.im.SystemAddShopRequest.serializeBinaryToWriter(this, writer);
+    return writer.getResultBuffer();
+};
+
+
+/**
+ * Serializes the given message to binary data (in protobuf wire
+ * format), writing to the given BinaryWriter.
+ * @param {!proto.im.SystemAddShopRequest} message
+ * @param {!jspb.BinaryWriter} writer
+ * @suppress {unusedLocalVariables} f is only used for nested messages
+ */
+proto.im.SystemAddShopRequest.serializeBinaryToWriter = function (message, writer) {
+    var f = undefined;
+    f = message.getSysid();
+    if (f !== 0) {
+        writer.writeInt64(
+            1,
+            f
+        );
+    }
+    f = message.getShopid();
+    if (f !== 0) {
+        writer.writeInt64(
+            2,
+            f
+        );
+    }
+};
+
+
+/**
+ * optional int64 sysId = 1;
+ * @return {number}
+ */
+proto.im.SystemAddShopRequest.prototype.getSysid = function () {
+    return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 1, 0));
+};
+
+
+/**
+ * @param {number} value
+ * @return {!proto.im.SystemAddShopRequest} returns this
+ */
+proto.im.SystemAddShopRequest.prototype.setSysid = function (value) {
+    return jspb.Message.setProto3IntField(this, 1, value);
+};
+
+
+/**
+ * optional int64 shopId = 2;
+ * @return {number}
+ */
+proto.im.SystemAddShopRequest.prototype.getShopid = function () {
+    return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 2, 0));
+};
+
+
+/**
+ * @param {number} value
+ * @return {!proto.im.SystemAddShopRequest} returns this
+ */
+proto.im.SystemAddShopRequest.prototype.setShopid = function (value) {
+    return jspb.Message.setProto3IntField(this, 2, value);
+};
+
+
+if (jspb.Message.GENERATE_TO_OBJECT) {
+    /**
+     * Creates an object representation of this proto.
+     * Field names that are reserved in JavaScript and will be renamed to pb_name.
+     * Optional fields that are not set will be set to undefined.
+     * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default.
+     * For the list of reserved names please see:
+     *     net/proto2/compiler/js/internal/generator.cc#kKeyword.
+     * @param {boolean=} opt_includeInstance Deprecated. whether to include the
+     *     JSPB instance for transitional soy proto support:
+     *     http://goto/soy-param-migration
+     * @return {!Object}
+     */
+    proto.im.SystemAddUserRequest.prototype.toObject = function (opt_includeInstance) {
+        return proto.im.SystemAddUserRequest.toObject(opt_includeInstance, this);
+    };
+
+
+    /**
+     * Static version of the {@see toObject} method.
+     * @param {boolean|undefined} includeInstance Deprecated. Whether to include
+     *     the JSPB instance for transitional soy proto support:
+     *     http://goto/soy-param-migration
+     * @param {!proto.im.SystemAddUserRequest} msg The msg instance to transform.
+     * @return {!Object}
+     * @suppress {unusedLocalVariables} f is only used for nested messages
+     */
+    proto.im.SystemAddUserRequest.toObject = function (includeInstance, msg) {
+        var f, obj = {
+            sysid: jspb.Message.getFieldWithDefault(msg, 1, 0),
+            userid: jspb.Message.getFieldWithDefault(msg, 2, 0)
+        };
+
+        if (includeInstance) {
+            obj.$jspbMessageInstance = msg;
+        }
+        return obj;
+    };
+}
+
+
+/**
+ * Deserializes binary data (in protobuf wire format).
+ * @param {jspb.ByteSource} bytes The bytes to deserialize.
+ * @return {!proto.im.SystemAddUserRequest}
+ */
+proto.im.SystemAddUserRequest.deserializeBinary = function (bytes) {
+    var reader = new jspb.BinaryReader(bytes);
+    var msg = new proto.im.SystemAddUserRequest;
+    return proto.im.SystemAddUserRequest.deserializeBinaryFromReader(msg, reader);
+};
+
+
+/**
+ * Deserializes binary data (in protobuf wire format) from the
+ * given reader into the given message object.
+ * @param {!proto.im.SystemAddUserRequest} msg The message object to deserialize into.
+ * @param {!jspb.BinaryReader} reader The BinaryReader to use.
+ * @return {!proto.im.SystemAddUserRequest}
+ */
+proto.im.SystemAddUserRequest.deserializeBinaryFromReader = function (msg, reader) {
+    while (reader.nextField()) {
+        if (reader.isEndGroup()) {
+            break;
+        }
+        var field = reader.getFieldNumber();
+        switch (field) {
+            case 1:
+                var value = /** @type {number} */ (reader.readInt64());
+                msg.setSysid(value);
+                break;
+            case 2:
+                var value = /** @type {number} */ (reader.readInt64());
+                msg.setUserid(value);
+                break;
+            default:
+                reader.skipField();
+                break;
+        }
+    }
+    return msg;
+};
+
+
+/**
+ * Serializes the message to binary data (in protobuf wire format).
+ * @return {!Uint8Array}
+ */
+proto.im.SystemAddUserRequest.prototype.serializeBinary = function () {
+    var writer = new jspb.BinaryWriter();
+    proto.im.SystemAddUserRequest.serializeBinaryToWriter(this, writer);
+    return writer.getResultBuffer();
+};
+
+
+/**
+ * Serializes the given message to binary data (in protobuf wire
+ * format), writing to the given BinaryWriter.
+ * @param {!proto.im.SystemAddUserRequest} message
+ * @param {!jspb.BinaryWriter} writer
+ * @suppress {unusedLocalVariables} f is only used for nested messages
+ */
+proto.im.SystemAddUserRequest.serializeBinaryToWriter = function (message, writer) {
+    var f = undefined;
+    f = message.getSysid();
+    if (f !== 0) {
+        writer.writeInt64(
+            1,
+            f
+        );
+    }
+    f = message.getUserid();
+    if (f !== 0) {
+        writer.writeInt64(
+            2,
+            f
+        );
+    }
+};
+
+
+/**
+ * optional int64 sysId = 1;
+ * @return {number}
+ */
+proto.im.SystemAddUserRequest.prototype.getSysid = function () {
+    return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 1, 0));
+};
+
+
+/**
+ * @param {number} value
+ * @return {!proto.im.SystemAddUserRequest} returns this
+ */
+proto.im.SystemAddUserRequest.prototype.setSysid = function (value) {
+    return jspb.Message.setProto3IntField(this, 1, value);
+};
+
+
+/**
+ * optional int64 userId = 2;
+ * @return {number}
+ */
+proto.im.SystemAddUserRequest.prototype.getUserid = function () {
+    return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 2, 0));
+};
+
+
+/**
+ * @param {number} value
+ * @return {!proto.im.SystemAddUserRequest} returns this
+ */
+proto.im.SystemAddUserRequest.prototype.setUserid = function (value) {
+    return jspb.Message.setProto3IntField(this, 2, value);
+};
+
+
+if (jspb.Message.GENERATE_TO_OBJECT) {
+    /**
+     * Creates an object representation of this proto.
+     * Field names that are reserved in JavaScript and will be renamed to pb_name.
+     * Optional fields that are not set will be set to undefined.
+     * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default.
+     * For the list of reserved names please see:
+     *     net/proto2/compiler/js/internal/generator.cc#kKeyword.
+     * @param {boolean=} opt_includeInstance Deprecated. whether to include the
+     *     JSPB instance for transitional soy proto support:
+     *     http://goto/soy-param-migration
+     * @return {!Object}
+     */
+    proto.im.Message.prototype.toObject = function (opt_includeInstance) {
+        return proto.im.Message.toObject(opt_includeInstance, this);
+    };
+
+
+    /**
+     * Static version of the {@see toObject} method.
+     * @param {boolean|undefined} includeInstance Deprecated. Whether to include
+     *     the JSPB instance for transitional soy proto support:
+     *     http://goto/soy-param-migration
+     * @param {!proto.im.Message} msg The msg instance to transform.
+     * @return {!Object}
+     * @suppress {unusedLocalVariables} f is only used for nested messages
+     */
+    proto.im.Message.toObject = function (includeInstance, msg) {
+        var f, obj = {
+            id: jspb.Message.getFieldWithDefault(msg, 1, 0),
+            title: jspb.Message.getFieldWithDefault(msg, 2, ""),
+            content: jspb.Message.getFieldWithDefault(msg, 3, ""),
+            level: jspb.Message.getFieldWithDefault(msg, 4, 0),
+            createat: jspb.Message.getFieldWithDefault(msg, 5, 0)
+        };
+
+        if (includeInstance) {
+            obj.$jspbMessageInstance = msg;
+        }
+        return obj;
+    };
+}
+
+
+/**
+ * Deserializes binary data (in protobuf wire format).
+ * @param {jspb.ByteSource} bytes The bytes to deserialize.
+ * @return {!proto.im.Message}
+ */
+proto.im.Message.deserializeBinary = function (bytes) {
+    var reader = new jspb.BinaryReader(bytes);
+    var msg = new proto.im.Message;
+    return proto.im.Message.deserializeBinaryFromReader(msg, reader);
+};
+
+
+/**
+ * Deserializes binary data (in protobuf wire format) from the
+ * given reader into the given message object.
+ * @param {!proto.im.Message} msg The message object to deserialize into.
+ * @param {!jspb.BinaryReader} reader The BinaryReader to use.
+ * @return {!proto.im.Message}
+ */
+proto.im.Message.deserializeBinaryFromReader = function (msg, reader) {
+    while (reader.nextField()) {
+        if (reader.isEndGroup()) {
+            break;
+        }
+        var field = reader.getFieldNumber();
+        switch (field) {
+            case 1:
+                var value = /** @type {number} */ (reader.readInt64());
+                msg.setId(value);
+                break;
+            case 2:
+                var value = /** @type {string} */ (reader.readString());
+                msg.setTitle(value);
+                break;
+            case 3:
+                var value = /** @type {string} */ (reader.readString());
+                msg.setContent(value);
+                break;
+            case 4:
+                var value = /** @type {!proto.im.Message.Level} */ (reader.readEnum());
+                msg.setLevel(value);
+                break;
+            case 5:
+                var value = /** @type {number} */ (reader.readInt64());
+                msg.setCreateat(value);
+                break;
+            default:
+                reader.skipField();
+                break;
+        }
+    }
+    return msg;
+};
+
+
+/**
+ * Serializes the message to binary data (in protobuf wire format).
+ * @return {!Uint8Array}
+ */
+proto.im.Message.prototype.serializeBinary = function () {
+    var writer = new jspb.BinaryWriter();
+    proto.im.Message.serializeBinaryToWriter(this, writer);
+    return writer.getResultBuffer();
+};
+
+
+/**
+ * Serializes the given message to binary data (in protobuf wire
+ * format), writing to the given BinaryWriter.
+ * @param {!proto.im.Message} message
+ * @param {!jspb.BinaryWriter} writer
+ * @suppress {unusedLocalVariables} f is only used for nested messages
+ */
+proto.im.Message.serializeBinaryToWriter = function (message, writer) {
+    var f = undefined;
+    f = message.getId();
+    if (f !== 0) {
+        writer.writeInt64(
+            1,
+            f
+        );
+    }
+    f = message.getTitle();
+    if (f.length > 0) {
+        writer.writeString(
+            2,
+            f
+        );
+    }
+    f = message.getContent();
+    if (f.length > 0) {
+        writer.writeString(
+            3,
+            f
+        );
+    }
+    f = message.getLevel();
+    if (f !== 0.0) {
+        writer.writeEnum(
+            4,
+            f
+        );
+    }
+    f = message.getCreateat();
+    if (f !== 0) {
+        writer.writeInt64(
+            5,
+            f
+        );
+    }
+};
+
+
+/**
+ * @enum {number}
+ */
+proto.im.Message.Level = {
+    NULL: 0,
+    NORMAL: 1,
+    WARN: 2,
+    ERROR: 3
+};
+
+/**
+ * optional int64 id = 1;
+ * @return {number}
+ */
+proto.im.Message.prototype.getId = function () {
+    return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 1, 0));
+};
+
+
+/**
+ * @param {number} value
+ * @return {!proto.im.Message} returns this
+ */
+proto.im.Message.prototype.setId = function (value) {
+    return jspb.Message.setProto3IntField(this, 1, value);
+};
+
+
+/**
+ * optional string title = 2;
+ * @return {string}
+ */
+proto.im.Message.prototype.getTitle = function () {
+    return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 2, ""));
+};
+
+
+/**
+ * @param {string} value
+ * @return {!proto.im.Message} returns this
+ */
+proto.im.Message.prototype.setTitle = function (value) {
+    return jspb.Message.setProto3StringField(this, 2, value);
+};
+
+
+/**
+ * optional string content = 3;
+ * @return {string}
+ */
+proto.im.Message.prototype.getContent = function () {
+    return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 3, ""));
+};
+
+
+/**
+ * @param {string} value
+ * @return {!proto.im.Message} returns this
+ */
+proto.im.Message.prototype.setContent = function (value) {
+    return jspb.Message.setProto3StringField(this, 3, value);
+};
+
+
+/**
+ * optional Level level = 4;
+ * @return {!proto.im.Message.Level}
+ */
+proto.im.Message.prototype.getLevel = function () {
+    return /** @type {!proto.im.Message.Level} */ (jspb.Message.getFieldWithDefault(this, 4, 0));
+};
+
+
+/**
+ * @param {!proto.im.Message.Level} value
+ * @return {!proto.im.Message} returns this
+ */
+proto.im.Message.prototype.setLevel = function (value) {
+    return jspb.Message.setProto3EnumField(this, 4, value);
+};
+
+
+/**
+ * optional int64 createAt = 5;
+ * @return {number}
+ */
+proto.im.Message.prototype.getCreateat = function () {
+    return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 5, 0));
+};
+
+
+/**
+ * @param {number} value
+ * @return {!proto.im.Message} returns this
+ */
+proto.im.Message.prototype.setCreateat = function (value) {
+    return jspb.Message.setProto3IntField(this, 5, value);
+};
+
+
+/**
+ * @enum {number}
+ */
+proto.im.ErrorCode = {
+    OK: 0,
+    PARAM: 4001,
+    EXIST: 4002,
+    TOKEN: 4003
+};
+
+/**
+ * @enum {number}
+ */
+proto.im.Status = {
+    NULL: 0,
+    BAN: 1,
+    ON: 2,
+    DELETE: 9
+};
+
+goog.object.extend(exports, proto.im);

+ 5 - 0
src/grpc/package.json

@@ -0,0 +1,5 @@
+{
+  "devDependencies": {
+    "compression-webpack-plugin": "^1.1.12"
+  }
+}

+ 55 - 0
src/grpc/readme.md

@@ -0,0 +1,55 @@
+# readme
+
+## 生成服务
+
+执行gen.bat 重新生成服务文件
+
+### 安装依赖
+
+cnpm i google-protobuf   
+cnpm install --save grpc-web
+
+### 使用
+
+#### 单页引用
+
+import {SignInPasswordRequest, FlushDataRequest, Data} from "@/assets/grpcBack/im_pb"; //{}内容为传入参数的方法名,按实际需求添加
+
+import {ApiClient} from "@/assets/grpcBack/im_grpc_web_pb"; // 固定内容无需修改
+
+[comment]: <> (function)
+let that = this; //端口地址 this.client = new ApiClient("http://192.168.0.3:20010", null, null);
+
+// 报文内容和方法,方法取自im.proto文件 rpc rpc SignInUserCode (SignInPasswordRequest) returns (TokenParam)  {}
+
+let pwdtext = "asdf*123"
+let authtext = "admin"
+let getRequest = new SignInPasswordRequest();
+
+// 对报文内容字符串进行编码 ,setXXX方法取自im.proto文件 message SignInPasswordRequest { ... ,内部属性要加set前缀字
+
+getRequest.setPassword(pwdtext); getRequest.setAuth(authtext); getRequest.setExpirationsec(10000);
+
+//接口名取自im.proto文件 rpc rpc SignInUserCode (SignInPasswordRequest) returns (TokenParam)  {}
+
+let res = this.client.signInUserCode(getRequest, {}, (err, response) => { //回调方法名取自im.proto文件 rpc SignInUserCode (
+SignInPasswordRequest) returns (TokenParam)  {} 的TokenParam返回值, //内部属性要加get前缀字
+
+this.message = response.getToken(); });
+
+//****注意,加前缀子的编码方法和回调方法的大小写请逐一在im_grpc_web_pb.js文件中核对,转换规则一般是小驼峰书写。
+
+#### 全局使用
+
+main.js 里 import {ApiClient} from "../src/grpc/im_grpc_web_pb"; // 建立grpc连接服务 let client = new
+ApiClient("http://192.168.0.3:20010", null, null); // 挂载为全局方法 Vue.prototype.client = client;
+
+目标vue页面 里 按需引入 import {SignInPasswordRequest} from "@/grpc/im_pb";
+
+...
+
+methods: { grpcServe(){ let that = this; let getRequest = new SignInPasswordRequest(); getRequest.setPassword("asdf*
+123"); getRequest.setAuth("admin"); getRequest.setExpirationsec(10000); that.client.signInUserCode(getRequest, {}, (err,
+response) => { that.TodayCalcValues = response.getToken(); }); },
+
+//TodayCalcValues为显示容器

+ 7 - 0
src/main.js

@@ -7,6 +7,7 @@ import ElementUI from 'element-ui';
 import 'element-ui/lib/theme-chalk/index.css';
 import axios from 'axios'
 
+import {ApiClient} from "../src/grpc/im_grpc_web_pb";
 
 Vue.config.productionTip = false;
 import VCharts from 'v-charts'
@@ -28,6 +29,12 @@ if (process.env.NODE_ENV === 'development') {
 // 演示版本数据
 // require('./Mock/index.js');
 
+// 建立grpc连接服务
+let client = new ApiClient("http://192.168.0.3:20010", null, null);
+// 挂载为全局方法
+Vue.prototype.client = client;
+
+
 new Vue({
     router,
     store,

+ 17 - 1
src/router/index.js

@@ -325,7 +325,7 @@ const routes = [
                     title: "课时管理",
                     // clmid: "999",
                 }
-            },{
+            }, {
                 path: '/classChange',
                 name: 'classChange',
                 component: () => import('@/views/Class/classChange.vue'),
@@ -333,6 +333,22 @@ const routes = [
                     title: "课时调整",
                     // clmid: "999",
                 }
+            }, {
+                path: '/videoClass',
+                name: 'videoClass',
+                component: () => import('@/views/Class/videoClass.vue'),
+                meta: {
+                    title: "视频上课",
+                    // clmid: "999",
+                }
+            }, {
+                path: '/grpcDemo',
+                name: 'grpcDemo',
+                component: () => import('@/views/Class/grpcDemo.vue'),
+                meta: {
+                    title: "grpcDemo",
+                    // clmid: "999",
+                }
             },
         ]
     }, {

+ 5 - 0
src/socket/config.js

@@ -0,0 +1,5 @@
+const config = {
+    url: 'https://tv2.beswell.com:3016'//服务端口
+}
+
+export default config

+ 590 - 0
src/static/grpc/RoomClient.js

@@ -0,0 +1,590 @@
+const mediaType = {
+    audio: 'audioType',
+    video: 'videoType',
+    screen: 'screenType'
+}
+const _EVENTS = {
+    exitRoom: 'exitRoom',
+    openRoom: 'openRoom',
+    startVideo: 'startVideo',
+    stopVideo: 'stopVideo',
+    startAudio: 'startAudio',
+    stopAudio: 'stopAudio',
+    startScreen: 'startScreen',
+    stopScreen: 'stopScreen'
+}
+let producer = null;
+
+class RoomClient {
+
+    constructor(localMediaEl, remoteVideoEl, remoteAudioEl, mediasoupClient, socket, room_id, name, successCallback, that) {
+        this.name = name
+        this.localMediaEl = localMediaEl
+        this.remoteVideoEl = remoteVideoEl
+        this.remoteAudioEl = remoteAudioEl
+        this.mediasoupClient = mediasoupClient
+        this.socket = socket
+        this.producerTransport = null
+        this.consumerTransport = null
+        this.device = null
+        this.room_id = room_id
+
+        this.consumers = new Map()
+        this.producers = new Map()
+        /**
+         * map that contains a mediatype as key and producer_id as value
+         */
+        this.producerLabel = new Map()
+
+        this._isOpen = false
+        this.eventListeners = new Map()
+        Object.keys(_EVENTS).forEach(function (evt) {
+            this.eventListeners.set(evt, [])
+        }.bind(this))
+        this.createRoom(room_id).then(async function () {
+            await this.join(name, room_id)
+            this.initSockets()
+            this._isOpen = true
+            successCallback()
+        }.bind(this))
+    }
+
+    ////////// INIT /////////
+
+    async createRoom(room_id) {
+        await this.socket.request('createRoom', {
+            room_id
+        }).catch(err => {
+            console.log(err)
+        })
+    }
+
+    async join(name, room_id) {
+        this.socket.request('join', {
+            name,
+            room_id
+        }).then(async function (e) {
+            const data = await this.socket.request('getRouterRtpCapabilities');
+            let device = await this.loadDevice(data)
+            this.device = device
+            await this.initTransports(device)
+            this.socket.emit('getProducers')
+        }.bind(this)).catch(e => {
+            console.log(e)
+        })
+    }
+
+    async loadDevice(routerRtpCapabilities) {
+        let device
+        try {
+            device = new this.mediasoupClient.Device();
+        } catch (error) {
+            if (error.name === 'UnsupportedError') {
+                console.error('browser not supported');
+            }
+            console.error(error)
+        }
+        await device.load({
+            routerRtpCapabilities
+        })
+        return device
+
+    }
+
+    async initTransports(device) {
+
+        // init producerTransport
+        {
+            const data = await this.socket.request('createWebRtcTransport', {
+                forceTcp: false,
+                rtpCapabilities: device.rtpCapabilities,
+            })
+            if (data.error) {
+                console.error(data.error);
+                return;
+            }
+
+            this.producerTransport = device.createSendTransport(data);
+
+            this.producerTransport.on('connect', async function ({
+                                                                     dtlsParameters
+                                                                 }, callback, errback) {
+                this.socket.request('connectTransport', {
+                    dtlsParameters,
+                    transport_id: data.id
+                })
+                    .then(callback)
+                    .catch(errback)
+            }.bind(this));
+
+            this.producerTransport.on('produce', async function ({
+                                                                     kind,
+                                                                     rtpParameters
+                                                                 }, callback, errback) {
+                try {
+                    const {
+                        producer_id
+                    } = await this.socket.request('produce', {
+                        producerTransportId: this.producerTransport.id,
+                        kind,
+                        rtpParameters,
+                    });
+                    callback({
+                        id: producer_id
+                    });
+                } catch (err) {
+                    errback(err);
+                }
+            }.bind(this))
+
+            this.producerTransport.on('connectionstatechange', function (state) {
+                switch (state) {
+                    case 'connecting':
+
+                        break;
+
+                    case 'connected':
+                        //localVideo.srcObject = stream
+                        break;
+
+                    case 'failed':
+                        this.producerTransport.close();
+                        break;
+
+                    default:
+                        break;
+                }
+            }.bind(this));
+        }
+
+        // init consumerTransport
+        {
+            const data = await this.socket.request('createWebRtcTransport', {
+                forceTcp: false,
+            });
+            if (data.error) {
+                console.error(data.error);
+                return;
+            }
+            // only one needed
+            this.consumerTransport = device.createRecvTransport(data);
+            this.consumerTransport.on('connect', function ({
+                                                               dtlsParameters
+                                                           }, callback, errback) {
+                this.socket.request('connectTransport', {
+                    transport_id: this.consumerTransport.id,
+                    dtlsParameters
+                })
+                    .then(callback)
+                    .catch(errback);
+            }.bind(this));
+
+            this.consumerTransport.on('connectionstatechange', async function (state) {
+                console.log('state', state);
+                switch (state) {
+                    case 'connecting':
+                        break;
+
+                    case 'connected':
+                        //remoteVideo.srcObject = await stream;
+                        //await socket.request('resume');
+                        break;
+
+                    case 'failed':
+                        this.consumerTransport.close();
+                        break;
+
+                    default:
+                        break;
+                }
+            }.bind(this));
+        }
+
+    }
+
+    initSockets() {
+        this.socket.on('consumerClosed', function ({
+                                                       consumer_id
+                                                   }) {
+            console.log('closing consumer:', consumer_id)
+            this.removeConsumer(consumer_id)
+        }.bind(this))
+
+        /**
+         * data: [ {
+         *  producer_id:
+         *  producer_socket_id:
+         * }]
+         */
+        console.log('=====producers======');
+        this.socket.on('newProducers', async function (data) {
+            console.log(123);
+            console.log(data);
+            for (let {
+                producer_id
+            } of data) {
+                await this.consume(producer_id)
+            }
+        }.bind(this))
+
+        this.socket.on('disconnect', function () {
+            this.exit(true)
+        }.bind(this))
+
+
+    }
+
+
+    //////// MAIN FUNCTIONS /////////////
+
+
+    async produce(type, deviceId = null) {
+        let mediaConstraints = {}
+        let audio = false
+        let screen = false
+        switch (type) {
+            case mediaType.audio:
+                mediaConstraints = {
+                    audio: {
+                        deviceId: deviceId
+                    },
+                    video: false
+                }
+                audio = true
+                break
+            case mediaType.video:
+                mediaConstraints = {
+                    audio: false,
+                    video: {
+                        width: {
+                            min: 640,
+                            ideal: 1920
+                        },
+                        height: {
+                            min: 400,
+                            ideal: 1080
+                        },
+                        deviceId: deviceId
+                        /*aspectRatio: {
+                            ideal: 1.7777777778
+                        }*/
+                    }
+                }
+                break
+            case mediaType.screen:
+                mediaConstraints = false
+                screen = true
+                break;
+            default:
+                return
+                break;
+        }
+        if (!this.device.canProduce('video') && !audio) {
+            console.error('cannot produce video');
+            return;
+        }
+        if (this.producerLabel.has(type)) {
+            console.log('producer already exists for this type ' + type)
+            return
+        }
+        console.log('mediacontraints:', mediaConstraints)
+        let stream;
+        try {
+            stream = screen ? await navigator.mediaDevices.getDisplayMedia() : await navigator.mediaDevices.getUserMedia(mediaConstraints)
+            console.log(navigator.mediaDevices.getSupportedConstraints())
+
+
+            const track = audio ? stream.getAudioTracks()[0] : stream.getVideoTracks()[0]
+            const params = {
+                track
+            };
+            if (!audio && !screen) {
+                params.encodings = [{
+                    rid: 'r0',
+                    maxBitrate: 100000,
+                    //scaleResolutionDownBy: 10.0,
+                    scalabilityMode: 'S1T3'
+                },
+                    {
+                        rid: 'r1',
+                        maxBitrate: 300000,
+                        scalabilityMode: 'S1T3'
+                    },
+                    {
+                        rid: 'r2',
+                        maxBitrate: 900000,
+                        scalabilityMode: 'S1T3'
+                    }
+                ];
+                params.codecOptions = {
+                    videoGoogleStartBitrate: 1000
+                };
+            }
+            producer = await this.producerTransport.produce(params)
+
+            console.log('producer', producer)
+
+            this.producers.set(producer.id, producer)
+
+            let elem
+            if (!audio) {
+                elem = document.createElement('video')
+                elem.srcObject = stream
+                elem.id = producer.id
+                elem.playsinline = false
+                elem.autoplay = true
+                elem.className = "vid"
+                this.localMediaEl.appendChild(elem)
+
+            }
+
+            producer.on('trackended', () => {
+                this.closeProducer(type)
+            })
+
+            producer.on('transportclose', () => {
+                console.log('producer transport close')
+                if (!audio) {
+                    elem.srcObject.getTracks().forEach(function (track) {
+                        track.stop()
+                    })
+                    elem.parentNode.removeChild(elem)
+                }
+                this.producers.delete(producer.id)
+
+            })
+
+            producer.on('close', () => {
+                console.log('closing producer')
+                if (!audio) {
+                    elem.srcObject.getTracks().forEach(function (track) {
+                        track.stop()
+                    })
+                    elem.parentNode.removeChild(elem)
+                }
+                this.producers.delete(producer.id)
+
+            })
+
+            this.producerLabel.set(type, producer.id)
+
+            switch (type) {
+                case mediaType.audio:
+                    this.event(_EVENTS.startAudio)
+                    break
+                case mediaType.video:
+                    this.event(_EVENTS.startVideo)
+                    break
+                case mediaType.screen:
+                    this.event(_EVENTS.startScreen)
+                    break;
+                default:
+                    return
+                    break;
+            }
+        } catch (err) {
+            console.log(err)
+        }
+    }
+
+    async consume(producer_id) {
+        console.log(123);
+        //let info = await roomInfo()
+
+        this.getConsumeStream(producer_id).then(function ({
+                                                              consumer,
+                                                              stream,
+                                                              kind
+                                                          }) {
+
+            this.consumers.set(consumer.id, consumer)
+            let elem;
+            if (kind === 'video') {
+                console.log(stream);
+                elem = document.createElement('video')
+                elem.srcObject = stream
+                elem.id = consumer.id
+                elem.playsinline = false
+                elem.autoplay = true
+                elem.className = "vid"
+                this.remoteVideoEl.appendChild(elem)
+            } else {
+                elem = document.createElement('audio')
+                elem.srcObject = stream
+                elem.id = consumer.id
+                elem.playsinline = false
+                elem.autoplay = true
+                this.remoteAudioEl.appendChild(elem)
+            }
+
+            consumer.on('trackended', function () {
+                this.removeConsumer(consumer.id)
+            }.bind(this))
+            consumer.on('transportclose', function () {
+                this.removeConsumer(consumer.id)
+            }.bind(this))
+
+
+        }.bind(this))
+    }
+
+    async getConsumeStream(producerId) {
+        const {
+            rtpCapabilities
+        } = this.device
+        const data = await this.socket.request('consume', {
+            rtpCapabilities,
+            consumerTransportId: this.consumerTransport.id, // might be 
+            producerId
+        });
+        const {
+            id,
+            kind,
+            rtpParameters,
+        } = data;
+
+        let codecOptions = {};
+        const consumer = await this.consumerTransport.consume({
+            id,
+            producerId,
+            kind,
+            rtpParameters,
+            codecOptions,
+        })
+        const stream = new MediaStream();
+        stream.addTrack(consumer.track);
+        return {
+            consumer,
+            stream,
+            kind
+        }
+    }
+
+    closeProducer(type) {
+        if (!this.producerLabel.has(type)) {
+            console.log('there is no producer for this type ' + type)
+            return
+        }
+        let producer_id = this.producerLabel.get(type)
+        console.log(producer_id)
+        this.socket.emit('producerClosed', {
+            producer_id
+        })
+        this.producers.get(producer_id).close()
+        this.producers.delete(producer_id)
+        this.producerLabel.delete(type)
+
+        if (type !== mediaType.audio) {
+            let elem = document.getElementById(producer_id)
+            elem.srcObject.getTracks().forEach(function (track) {
+                track.stop()
+            })
+            elem.parentNode.removeChild(elem)
+        }
+
+        switch (type) {
+            case mediaType.audio:
+                this.event(_EVENTS.stopAudio)
+                break
+            case mediaType.video:
+                this.event(_EVENTS.stopVideo)
+                break
+            case mediaType.screen:
+                this.event(_EVENTS.stopScreen)
+                break;
+            default:
+                return
+                break;
+        }
+
+    }
+
+    pauseProducer(type) {
+        if (!this.producerLabel.has(type)) {
+            console.log('there is no producer for this type ' + type)
+            return
+        }
+        let producer_id = this.producerLabel.get(type)
+        this.producers.get(producer_id).pause()
+
+    }
+
+    resumeProducer(type) {
+        if (!this.producerLabel.has(type)) {
+            console.log('there is no producer for this type ' + type)
+            return
+        }
+        let producer_id = this.producerLabel.get(type)
+        this.producers.get(producer_id).resume()
+
+    }
+
+    removeConsumer(consumer_id) {
+        let elem = document.getElementById(consumer_id)
+        elem.srcObject.getTracks().forEach(function (track) {
+            track.stop()
+        })
+        elem.parentNode.removeChild(elem)
+
+        this.consumers.delete(consumer_id)
+    }
+
+    exit(offline = false) {
+
+        let clean = function () {
+            this._isOpen = false
+            this.consumerTransport.close()
+            this.producerTransport.close()
+            this.socket.off('disconnect')
+            this.socket.off('newProducers')
+            this.socket.off('consumerClosed')
+        }.bind(this)
+
+        if (!offline) {
+            this.socket.request('exitRoom').then(e => console.log(e)).catch(e => console.warn(e)).finally(function () {
+                clean()
+            }.bind(this))
+        } else {
+            clean()
+        }
+
+        this.event(_EVENTS.exitRoom)
+
+    }
+
+    ///////  HELPERS //////////
+
+    async roomInfo() {
+        let info = await socket.request('getMyRoomInfo')
+        return info
+    }
+
+    static get mediaType() {
+        return mediaType
+    }
+
+    event(evt) {
+        if (this.eventListeners.has(evt)) {
+            this.eventListeners.get(evt).forEach(callback => callback())
+        }
+    }
+
+    on(evt, callback) {
+        console.log('evt', evt);
+        console.log('callback', callback);
+        this.eventListeners.get(evt).push(callback)
+    }
+
+
+    //////// GETTERS ////////
+
+    isOpen() {
+        return this._isOpen
+    }
+
+    static get EVENTS() {
+        return _EVENTS
+    }
+}
+
+module.exports = RoomClient;

Diferenças do arquivo suprimidas por serem muito extensas
+ 148 - 0
src/static/grpc/mediasoupclient.min.js


Diferenças do arquivo suprimidas por serem muito extensas
+ 5 - 0
src/static/grpc/socket.io.js


+ 39 - 0
src/views/Class/grpcDemo.vue

@@ -0,0 +1,39 @@
+<template>
+  <h5>
+    grpc DEMO
+    <br>
+    {{ TodayCalcValues }}
+  </h5>
+</template>
+
+<script>
+import {SignInPasswordRequest} from "@/grpc/im_pb";
+
+export default {
+  data() {
+    return {
+      eqSn: '30:9C:23:0C:8B:1E',
+      TodayCalcValues: '112233',
+    }
+  },
+  mounted() {
+    this.grpcServe();
+  },
+  methods: {
+    grpcServe() {
+      let that = this;
+      let getRequest = new SignInPasswordRequest();
+      getRequest.setPassword("asdf*123");
+      getRequest.setAuth("admin");
+      getRequest.setExpirationsec(10000);
+      that.client.signInUserCode(getRequest, {}, (err, response) => {
+        that.TodayCalcValues = response.getToken();
+      });
+    },
+  },
+}
+</script>
+
+<style scoped>
+
+</style>

+ 211 - 0
src/views/Class/videoClass.vue

@@ -0,0 +1,211 @@
+<template>
+  <div>
+    <h5>视频上课</h5>
+    <p>测试时,请使用http://localhost:9315/videoClass 地址,避免本地摄像头被禁用问题</p>
+    <p>测试端口为 https://tv2.beswell.com:3016 是当前工位的虚拟机提供的服务,需开启虚拟机</p>
+    <div id="login" v-if="show == 1">
+      Room: <input id="roomidInput" v-model="roomidInput" type="text"/>
+      <br/>
+      <br/>
+      User: <input id='nameInput' v-model="nameInput" type="text"/>
+      <br>
+      <br>
+      <button id='joinButton' @click="joinRoom()">Join</button>
+    </div>
+    <div id="control" class="hidden" v-if="show == 2">
+      <button id='exitButton' @click="exit()">Exit</button>
+      <br/>
+      <br/>
+      audio: <select id="audioSelect" v-model="audioSelect">
+      <option v-for="audio in audioOptions" :value="audio.deviceId" :label="audio.label"></option>
+    </select>
+      <br/>
+      <br/>
+      video: <select id="videoSelect" v-model="videoSelect">
+      <option v-for="video in videoOptions" :value="video.deviceId" :label="video.label"></option>
+    </select>
+      <br/>
+      <br/>
+      <button id='startAudioButton' @click="produce('audio')" v-if="btnAudioShow">
+        audio
+      </button>
+      <button id='stopAudioButton' @click="closeProducer('audio')" v-if="!btnAudioShow">close
+        audio
+      </button>
+      &nbsp;
+      <button id='startVideoButton' @click="produce('video')" v-if="btnVideoButton">
+        video
+      </button>
+      <button id='stopVideoButton' @click="closeProducer('video')" v-if="!btnVideoButton">close
+        video
+      </button>
+      &nbsp;
+      <button id='startScreenButton' @click="produce('screen')" v-if="btnScreenButton">screen</button>
+      <button id='stopScreenButton' @click="closeProducer('screen')" v-if="!btnScreenButton">close
+        screen
+      </button>
+      <br/>
+    </div>
+    <div id='videoMedia' v-show="show == 2">
+      <h2>------local------</h2>
+      <div id="localMedia"></div>
+      <!--      <video id="localVideo" autoplay inline class="vid" :srcObject="localVideo.srcObject" :playsinline="false"></video>-->
+      <!--      <video id="localScreen" autoplay inline class="vid"></video>-->
+      <h2>-----remote-----</h2>
+      <div id="remoteVideos" class="container">
+      </div>
+
+      <div id="remoteAudios"></div>
+    </div>
+  </div>
+</template>
+
+<script>
+import Io from '@/static/grpc/socket.io'
+import RoomClient from '@/static/grpc/RoomClient'
+import socketConfig from '@/socket/config'
+import mediasoupclient from '@/static/grpc/mediasoupclient.min'
+
+const socketIo = Io(socketConfig.url)
+socketIo.request = function request(type, data = {}) {
+  return new Promise((resolve, reject) => {
+    socketIo.emit(type, data, (data) => {
+      if (data.error) {
+        reject(data.error)
+      } else {
+        resolve(data)
+      }
+    })
+  })
+}
+
+export default {
+  data() {
+    return {
+      roomidInput: '123',
+      nameInput: 'bob' + parseInt(Math.random() * 100),
+      show: 1,
+      RoomClient: null,
+      btnAudioShow: true,
+      btnVideoButton: true,
+      btnScreenButton: true,
+      producer: null,
+      audioOptions: [],
+      videoOptions: [],
+      audioSelect: '',
+      videoSelect: '',
+      localVideo: {
+        srcObject: null
+      },
+    }
+  },
+  mounted() {
+    this.init();
+  },
+  methods: {
+    init() {
+      let that = this;
+      //   获取摄像头和麦克风设备
+      navigator.mediaDevices.enumerateDevices().then(devices =>
+          devices.forEach(device => {
+            if ('audioinput' === device.kind) {
+              that.audioOptions.push(device);
+              that.audioSelect = that.audioOptions[0].deviceId;//默认第一个
+            } else if ('videoinput' === device.kind) {
+              that.videoOptions.push(device);
+              that.videoSelect = that.videoOptions[0].deviceId;//默认第一个
+            }
+          })
+      )
+    },
+    joinRoom() {
+      let that = this;
+      that.show = 2;
+      if (that.rc && that.rc.isOpen()) {
+        console.log('already connected to a room')
+      } else {
+        let localMedia = document.getElementById('localMedia');
+        let remoteVideos = document.getElementById('remoteVideos');
+        let remoteAudios = document.getElementById('remoteAudios');
+        let socket = socketIo;
+        console.log(socket);
+        let room_id = this.roomidInput;
+        let name = this.nameInput;
+        let roomOpen = function () {
+          console.log('链接已建立');
+        }
+        // 创建RoomClient链接
+        that.rc = new RoomClient(localMedia, remoteVideos, remoteAudios, window.mediasoupClient, socket, room_id, name, roomOpen, that)
+      }
+    },
+    exit() {
+      this.show = 1;
+      this.rc.exit();
+      console.log('disconnect:', '已经断开 socket 链接');
+    },
+    produce(type) {
+      let that = this;
+      if (type == 'audio') {
+        that.rc.produce(RoomClient.mediaType.audio, audioSelect.value);
+        that.btnAudioShow = !that.btnAudioShow;
+      }
+      if (type == 'video') {
+        that.rc.produce(RoomClient.mediaType.video, videoSelect.value);
+        that.btnVideoButton = !that.btnVideoButton;
+      }
+      if (type == 'screen') {
+        that.rc.produce(RoomClient.mediaType.screen);
+        that.btnScreenButton = !that.btnScreenButton;
+      }
+    },
+    closeProducer(type) {
+      let that = this;
+      if (type == 'audio') {
+        that.rc.closeProducer(RoomClient.mediaType.audio);
+        that.btnAudioShow = !that.btnAudioShow;
+      }
+      if (type == 'video') {
+        that.rc.closeProducer(RoomClient.mediaType.video);
+        that.btnVideoButton = !that.btnVideoButton;
+      }
+      if (type == 'screen') {
+        that.rc.closeProducer(RoomClient.mediaType.screen);
+        that.btnScreenButton = !that.btnScreenButton;
+      }
+    },
+  }
+}
+</script>
+
+<style scoped>
+h3 {
+  margin: 40px 0 0;
+}
+
+ul {
+  list-style-type: none;
+  padding: 0;
+}
+
+li {
+  display: inline-block;
+  margin: 0 10px;
+}
+
+a {
+  color: #42b983;
+}
+
+#localMedia {
+
+  display: block;
+  overflow: hidden;
+}
+
+/deep/ .vid {
+  width: 320px;
+  height: 160px;
+  overflow: hidden;
+  float: left;
+}
+</style>

+ 224 - 222
src/views/Index/Index.vue

@@ -1,232 +1,234 @@
 <template>
-    <div class="IndexContainer">
-        <el-container>
-            <el-aside :class="[{ 'shortElaside': isCollapse }, { 'lognElaside': !isCollapse }]">
-                <Navside :isCollapse="isCollapse" @lefthide="left_hide"></Navside>
-            </el-aside>
-            <el-container>
-                <el-header>
-                    <Headside @lefthide="left_hide"></Headside>
-                </el-header>
-                <el-main :style="{'height': clientHeight+'px'}">
-                    <keep-alive>
-                        <router-view></router-view>
-                    </keep-alive>
-                </el-main>
-                <!-- <el-footer v-if="true">
-                    <p class="footer">济南佰意兴网络科技有限公司提供技术支持</p>
-                </el-footer>-->
-            </el-container>
-        </el-container>
-    </div>
+  <div class="IndexContainer">
+    <el-container>
+      <el-aside :class="[{ 'shortElaside': isCollapse }, { 'lognElaside': !isCollapse }]">
+        <Navside :isCollapse="isCollapse" @lefthide="left_hide" @refreshList="onRefresList"></Navside>
+      </el-aside>
+      <el-container>
+        <el-header>
+          <Headside @lefthide="left_hide" :tableTabs="tableTabs"></Headside>
+        </el-header>
+        <el-main :style="{'height': clientHeight+'px'}">
+          <keep-alive>
+            <router-view></router-view>
+          </keep-alive>
+        </el-main>
+        <el-footer v-if="true">
+          <p class="footer">济南佰意兴网络科技有限公司提供技术支持</p>
+        </el-footer>
+      </el-container>
+    </el-container>
+  </div>
 </template>
 
 <script>
-    // @ is an alias to /src
-    import Headside from '@/components/Headside.vue'
-    import Navside from '@/components/Navside.vue'
-    import Navs from '../../api/Navs';
-
-    export default {
-        name: 'Home',
-        data() {
-            return {
-              isCollapse: true,
-              clientHeight: document.documentElement.clientHeight - 50,
-              aSideState: false,
-              thisClick: 0,
-              tabwildState: 1,
-              navs: Navs,
-              handleTabsList: [{
-                title: '系统首页',
-                name: '1',
-                clmurl: '/',
-              }],
-                editableTabsValue: '1'
-            }
-        },
-        mounted() {
-            // checkScreen
-            if (document.body.clientWidth < 768) {
-                this.$message.warning('请横屏使用本系统');
-            }
-        },
-        methods: {
-            left_hide() {
-                this.aSideState = !this.aSideState;
-                this.isCollapse = !this.isCollapse;
-            },
-        },
-        components: {
-            Headside,
-            Navside
-        }
+// @ is an alias to /src
+import Headside from '@/components/Headside.vue'
+import Navside from '@/components/Navside.vue'
+import Navs from '../../api/Navs';
+
+export default {
+  name: 'Home',
+  data() {
+    return {
+      isCollapse: true,
+      clientHeight: document.documentElement.clientHeight - 50,
+      aSideState: false,
+      thisClick: 0,
+      tabwildState: 1,
+      navs: Navs,
+      tableTabs: [{
+        title: '系统首页',
+        name: '1',
+        clmurl: '/',
+      }],
+      editableTabsValue: '1',
     }
+  },
+  mounted() {
+    // checkScreen
+    if (document.body.clientWidth < 768) {
+      this.$message.warning('请横屏使用本系统');
+    }
+  },
+  methods: {
+    onRefresList(v) {
+      this.tableTabs.push(v);
+    },
+    left_hide() {
+      this.aSideState = !this.aSideState;
+      this.isCollapse = !this.isCollapse;
+    },
+  },
+  components: {
+    Headside,
+    Navside
+  }
+}
 </script>
 
 <!-- Add "scoped" attribute to limit CSS to this component only -->
 <style>
-    .el-header {
-      padding: 0 !important;
-      height: 72px !important;
-    }
-
-    .lognElaside {
-      width: 256px !important;
-      overflow: hidden;
-      height: 100%;
-      float: left;
-    }
-
-    .shortElaside {
-      width: 72px !important;
-      overflow: hidden;
-      height: 100%;
-      float: left;
-    }
-
-    /deep/ .nav {
-      width: 60px;
-    }
-
-    .IndexContainer {
-      position: absolute;
-      top: 0;
-      bottom: 0;
-      left: 0;
-        right: 0;
-        background: #f0f2f5;
-    }
-
-    .IndexContainer>.el-container {
-        width: 100%;
-        height: 100%;
-        overflow: hidden;
-        display: block;
-        margin: 0 auto;
-    }
-
-    .footer {
-        position: absolute;
-        bottom: 0px;
-        width: 100%;
-        padding: 10px;
-        overflow: hidden;
-        display: block;
-        margin: 0 auto;
-        text-align: center;
-        text-indent: -30%;
-        font-size: 12px;
-        color: #bdbdbd;
-        background: #f0f2f5;
-        z-index: 222;
-    }
-
-    .el-main {
-        width: 100%;
-        height: 100%;
-        /*min-height: 800px;*/
-        overflow: hidden;
-        display: block;
-        margin: 0 auto;
-        overflow-y: scroll;
-        padding: 10px 20px;
-        padding-bottom: 60px;
-        margin-bottom: 30px;
-    }
-
-
-    @media (min-width: 320px) and (max-width: 1367px) {
-        .el-header {
-            height: 40px !important;
-        }
-
-        .shortElaside {
-            width: 45px !important;
-            overflow: hidden;
-            height: 100%;
-            float: left;
-        }
-
-        .el-container.is-vertical {
-            left: 60px;
-            display: -webkit-box;
-            /* OLD - iOS 6-, Safari 3.1-6 */
-            display: -moz-box;
-            /* OLD - Firefox 19- (buggy but mostly works) */
-            display: -ms-flexbox;
-            /* TWEENER - IE 10 */
-            display: -webkit-flex;
-            /* NEW - Chrome */
-            display: flex;
-            /* NEW, Spec - Opera 12.1, Firefox 20+ */
-        }
-
-        .el-transfer__buttons {
-            width: 20px;
-            padding: 3px;
-        }
-
-        .el-transfer .el-transfer__buttons {
-            width: 60px;
-            padding: 3px;
-        }
-
-        .el-transfer .el-button+.el-button {
-            float: right;
-        }
-
-        /*.context {
-        border-radius: 12px;
-        height: 823px !important;
-        overflow-y: scroll;
-    }*/
-
-        .el-dialog {
-            padding: 5px;
-            padding-bottom: 15px;
-        }
-
-        .el-aside.lognElaside {
-            width: 100px !important;
-        }
-
-        .logoContainer img {
-            display: none !important;
-        }
-
-        .el-main {
-            position: relative;
-            top: 0;
-            bottom: 0;
-            overflow-y: scroll;
-            padding-bottom: 60px;
-            margin-bottom: 30px;
-        }
-
-        .el-main>.context {
-            /*height: 640px;*/
-            /*overflow-y: scroll;*/
-            padding: 6px !important;
-        }
-
-        .table {
-            /*width: 950px;*/
-            /*overflow-x: scroll;*/
-        }
-
-        .el-dialog {
-            max-width: 960px;
-        }
-
-        /deep/ .el-footer {
-            display: none;
-        }
-
-        .footer {
-            display: none;
-            height: 14px;
-            padding: 3px;
-        }
-    }
+.el-header {
+  padding: 0 !important;
+  height: 72px !important;
+}
+
+.lognElaside {
+  width: 256px !important;
+  overflow: hidden;
+  height: 100%;
+  float: left;
+}
+
+.shortElaside {
+  width: 72px !important;
+  overflow: hidden;
+  height: 100%;
+  float: left;
+}
+
+/deep/ .nav {
+  width: 60px;
+}
+
+.IndexContainer {
+  position: absolute;
+  top: 0;
+  bottom: 0;
+  left: 0;
+  right: 0;
+  background: #f0f2f5;
+}
+
+.IndexContainer > .el-container {
+  width: 100%;
+  height: 100%;
+  overflow: hidden;
+  display: block;
+  margin: 0 auto;
+}
+
+.footer {
+  position: absolute;
+  bottom: 0px;
+  width: 100%;
+  padding: 10px;
+  overflow: hidden;
+  display: block;
+  margin: 0 auto;
+  text-align: center;
+  text-indent: -30%;
+  font-size: 12px;
+  color: #bdbdbd;
+  background: #f0f2f5;
+  z-index: 222;
+}
+
+.el-main {
+  width: 100%;
+  height: 100%;
+  /*min-height: 800px;*/
+  overflow: hidden;
+  display: block;
+  margin: 0 auto;
+  overflow-y: scroll;
+  padding: 10px 20px;
+  padding-bottom: 60px;
+  margin-bottom: 30px;
+}
+
+
+@media (min-width: 320px) and (max-width: 1367px) {
+  .el-header {
+    height: 40px !important;
+  }
+
+  .shortElaside {
+    width: 45px !important;
+    overflow: hidden;
+    height: 100%;
+    float: left;
+  }
+
+  .el-container.is-vertical {
+    left: 60px;
+    display: -webkit-box;
+    /* OLD - iOS 6-, Safari 3.1-6 */
+    display: -moz-box;
+    /* OLD - Firefox 19- (buggy but mostly works) */
+    display: -ms-flexbox;
+    /* TWEENER - IE 10 */
+    display: -webkit-flex;
+    /* NEW - Chrome */
+    display: flex;
+    /* NEW, Spec - Opera 12.1, Firefox 20+ */
+  }
+
+  .el-transfer__buttons {
+    width: 20px;
+    padding: 3px;
+  }
+
+  .el-transfer .el-transfer__buttons {
+    width: 60px;
+    padding: 3px;
+  }
+
+  .el-transfer .el-button + .el-button {
+    float: right;
+  }
+
+  /*.context {
+  border-radius: 12px;
+  height: 823px !important;
+  overflow-y: scroll;
+}*/
+  .el-dialog {
+    padding: 5px;
+    padding-bottom: 15px;
+  }
+
+  .el-aside.lognElaside {
+    width: 100px !important;
+  }
+
+  .logoContainer img {
+    display: none !important;
+  }
+
+  .el-main {
+    position: relative;
+    top: 0;
+    bottom: 0;
+    overflow-y: scroll;
+    padding-bottom: 60px;
+    margin-bottom: 30px;
+  }
+
+  .el-main > .context {
+    /*height: 640px;*/
+    /*overflow-y: scroll;*/
+    padding: 6px !important;
+  }
+
+  .table {
+    /*width: 950px;*/
+    /*overflow-x: scroll;*/
+  }
+
+  .el-dialog {
+    max-width: 960px;
+  }
+
+  /deep/ .el-footer {
+    display: none;
+  }
+
+  .footer {
+    display: none;
+    height: 14px;
+    padding: 3px;
+  }
+}
 </style>

Alguns arquivos não foram mostrados porque muitos arquivos mudaram nesse diff