(function (global, factory) {
	typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) :
	typeof define === 'function' && define.amd ? define(['exports'], factory) :
	(global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global.Play = {}));
}(this, (function (exports) { 'use strict';

	var commonjsGlobal = typeof globalThis !== 'undefined' ? globalThis : typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {};

	function unwrapExports (x) {
		return x && x.__esModule && Object.prototype.hasOwnProperty.call(x, 'default') ? x['default'] : x;
	}

	function createCommonjsModule(fn, module) {
		return module = { exports: {} }, fn(module, module.exports), module.exports;
	}

	var runtime = createCommonjsModule(function (module) {
	/**
	 * Copyright (c) 2014-present, Facebook, Inc.
	 *
	 * This source code is licensed under the MIT license found in the
	 * LICENSE file in the root directory of this source tree.
	 */

	!(function(global) {

	  var Op = Object.prototype;
	  var hasOwn = Op.hasOwnProperty;
	  var undefined$1; // More compressible than void 0.
	  var $Symbol = typeof Symbol === "function" ? Symbol : {};
	  var iteratorSymbol = $Symbol.iterator || "@@iterator";
	  var asyncIteratorSymbol = $Symbol.asyncIterator || "@@asyncIterator";
	  var toStringTagSymbol = $Symbol.toStringTag || "@@toStringTag";
	  var runtime = global.regeneratorRuntime;
	  if (runtime) {
	    {
	      // If regeneratorRuntime is defined globally and we're in a module,
	      // make the exports object identical to regeneratorRuntime.
	      module.exports = runtime;
	    }
	    // Don't bother evaluating the rest of this file if the runtime was
	    // already defined globally.
	    return;
	  }

	  // Define the runtime globally (as expected by generated code) as either
	  // module.exports (if we're in a module) or a new, empty object.
	  runtime = global.regeneratorRuntime = module.exports ;

	  function wrap(innerFn, outerFn, self, tryLocsList) {
	    // If outerFn provided and outerFn.prototype is a Generator, then outerFn.prototype instanceof Generator.
	    var protoGenerator = outerFn && outerFn.prototype instanceof Generator ? outerFn : Generator;
	    var generator = Object.create(protoGenerator.prototype);
	    var context = new Context(tryLocsList || []);

	    // The ._invoke method unifies the implementations of the .next,
	    // .throw, and .return methods.
	    generator._invoke = makeInvokeMethod(innerFn, self, context);

	    return generator;
	  }
	  runtime.wrap = wrap;

	  // Try/catch helper to minimize deoptimizations. Returns a completion
	  // record like context.tryEntries[i].completion. This interface could
	  // have been (and was previously) designed to take a closure to be
	  // invoked without arguments, but in all the cases we care about we
	  // already have an existing method we want to call, so there's no need
	  // to create a new function object. We can even get away with assuming
	  // the method takes exactly one argument, since that happens to be true
	  // in every case, so we don't have to touch the arguments object. The
	  // only additional allocation required is the completion record, which
	  // has a stable shape and so hopefully should be cheap to allocate.
	  function tryCatch(fn, obj, arg) {
	    try {
	      return { type: "normal", arg: fn.call(obj, arg) };
	    } catch (err) {
	      return { type: "throw", arg: err };
	    }
	  }

	  var GenStateSuspendedStart = "suspendedStart";
	  var GenStateSuspendedYield = "suspendedYield";
	  var GenStateExecuting = "executing";
	  var GenStateCompleted = "completed";

	  // Returning this object from the innerFn has the same effect as
	  // breaking out of the dispatch switch statement.
	  var ContinueSentinel = {};

	  // Dummy constructor functions that we use as the .constructor and
	  // .constructor.prototype properties for functions that return Generator
	  // objects. For full spec compliance, you may wish to configure your
	  // minifier not to mangle the names of these two functions.
	  function Generator() {}
	  function GeneratorFunction() {}
	  function GeneratorFunctionPrototype() {}

	  // This is a polyfill for %IteratorPrototype% for environments that
	  // don't natively support it.
	  var IteratorPrototype = {};
	  IteratorPrototype[iteratorSymbol] = function () {
	    return this;
	  };

	  var getProto = Object.getPrototypeOf;
	  var NativeIteratorPrototype = getProto && getProto(getProto(values([])));
	  if (NativeIteratorPrototype &&
	      NativeIteratorPrototype !== Op &&
	      hasOwn.call(NativeIteratorPrototype, iteratorSymbol)) {
	    // This environment has a native %IteratorPrototype%; use it instead
	    // of the polyfill.
	    IteratorPrototype = NativeIteratorPrototype;
	  }

	  var Gp = GeneratorFunctionPrototype.prototype =
	    Generator.prototype = Object.create(IteratorPrototype);
	  GeneratorFunction.prototype = Gp.constructor = GeneratorFunctionPrototype;
	  GeneratorFunctionPrototype.constructor = GeneratorFunction;
	  GeneratorFunctionPrototype[toStringTagSymbol] =
	    GeneratorFunction.displayName = "GeneratorFunction";

	  // Helper for defining the .next, .throw, and .return methods of the
	  // Iterator interface in terms of a single ._invoke method.
	  function defineIteratorMethods(prototype) {
	    ["next", "throw", "return"].forEach(function(method) {
	      prototype[method] = function(arg) {
	        return this._invoke(method, arg);
	      };
	    });
	  }

	  runtime.isGeneratorFunction = function(genFun) {
	    var ctor = typeof genFun === "function" && genFun.constructor;
	    return ctor
	      ? ctor === GeneratorFunction ||
	        // For the native GeneratorFunction constructor, the best we can
	        // do is to check its .name property.
	        (ctor.displayName || ctor.name) === "GeneratorFunction"
	      : false;
	  };

	  runtime.mark = function(genFun) {
	    if (Object.setPrototypeOf) {
	      Object.setPrototypeOf(genFun, GeneratorFunctionPrototype);
	    } else {
	      genFun.__proto__ = GeneratorFunctionPrototype;
	      if (!(toStringTagSymbol in genFun)) {
	        genFun[toStringTagSymbol] = "GeneratorFunction";
	      }
	    }
	    genFun.prototype = Object.create(Gp);
	    return genFun;
	  };

	  // Within the body of any async function, `await x` is transformed to
	  // `yield regeneratorRuntime.awrap(x)`, so that the runtime can test
	  // `hasOwn.call(value, "__await")` to determine if the yielded value is
	  // meant to be awaited.
	  runtime.awrap = function(arg) {
	    return { __await: arg };
	  };

	  function AsyncIterator(generator) {
	    function invoke(method, arg, resolve, reject) {
	      var record = tryCatch(generator[method], generator, arg);
	      if (record.type === "throw") {
	        reject(record.arg);
	      } else {
	        var result = record.arg;
	        var value = result.value;
	        if (value &&
	            typeof value === "object" &&
	            hasOwn.call(value, "__await")) {
	          return Promise.resolve(value.__await).then(function(value) {
	            invoke("next", value, resolve, reject);
	          }, function(err) {
	            invoke("throw", err, resolve, reject);
	          });
	        }

	        return Promise.resolve(value).then(function(unwrapped) {
	          // When a yielded Promise is resolved, its final value becomes
	          // the .value of the Promise<{value,done}> result for the
	          // current iteration. If the Promise is rejected, however, the
	          // result for this iteration will be rejected with the same
	          // reason. Note that rejections of yielded Promises are not
	          // thrown back into the generator function, as is the case
	          // when an awaited Promise is rejected. This difference in
	          // behavior between yield and await is important, because it
	          // allows the consumer to decide what to do with the yielded
	          // rejection (swallow it and continue, manually .throw it back
	          // into the generator, abandon iteration, whatever). With
	          // await, by contrast, there is no opportunity to examine the
	          // rejection reason outside the generator function, so the
	          // only option is to throw it from the await expression, and
	          // let the generator function handle the exception.
	          result.value = unwrapped;
	          resolve(result);
	        }, reject);
	      }
	    }

	    var previousPromise;

	    function enqueue(method, arg) {
	      function callInvokeWithMethodAndArg() {
	        return new Promise(function(resolve, reject) {
	          invoke(method, arg, resolve, reject);
	        });
	      }

	      return previousPromise =
	        // If enqueue has been called before, then we want to wait until
	        // all previous Promises have been resolved before calling invoke,
	        // so that results are always delivered in the correct order. If
	        // enqueue has not been called before, then it is important to
	        // call invoke immediately, without waiting on a callback to fire,
	        // so that the async generator function has the opportunity to do
	        // any necessary setup in a predictable way. This predictability
	        // is why the Promise constructor synchronously invokes its
	        // executor callback, and why async functions synchronously
	        // execute code before the first await. Since we implement simple
	        // async functions in terms of async generators, it is especially
	        // important to get this right, even though it requires care.
	        previousPromise ? previousPromise.then(
	          callInvokeWithMethodAndArg,
	          // Avoid propagating failures to Promises returned by later
	          // invocations of the iterator.
	          callInvokeWithMethodAndArg
	        ) : callInvokeWithMethodAndArg();
	    }

	    // Define the unified helper method that is used to implement .next,
	    // .throw, and .return (see defineIteratorMethods).
	    this._invoke = enqueue;
	  }

	  defineIteratorMethods(AsyncIterator.prototype);
	  AsyncIterator.prototype[asyncIteratorSymbol] = function () {
	    return this;
	  };
	  runtime.AsyncIterator = AsyncIterator;

	  // Note that simple async functions are implemented on top of
	  // AsyncIterator objects; they just return a Promise for the value of
	  // the final result produced by the iterator.
	  runtime.async = function(innerFn, outerFn, self, tryLocsList) {
	    var iter = new AsyncIterator(
	      wrap(innerFn, outerFn, self, tryLocsList)
	    );

	    return runtime.isGeneratorFunction(outerFn)
	      ? iter // If outerFn is a generator, return the full iterator.
	      : iter.next().then(function(result) {
	          return result.done ? result.value : iter.next();
	        });
	  };

	  function makeInvokeMethod(innerFn, self, context) {
	    var state = GenStateSuspendedStart;

	    return function invoke(method, arg) {
	      if (state === GenStateExecuting) {
	        throw new Error("Generator is already running");
	      }

	      if (state === GenStateCompleted) {
	        if (method === "throw") {
	          throw arg;
	        }

	        // Be forgiving, per 25.3.3.3.3 of the spec:
	        // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-generatorresume
	        return doneResult();
	      }

	      context.method = method;
	      context.arg = arg;

	      while (true) {
	        var delegate = context.delegate;
	        if (delegate) {
	          var delegateResult = maybeInvokeDelegate(delegate, context);
	          if (delegateResult) {
	            if (delegateResult === ContinueSentinel) continue;
	            return delegateResult;
	          }
	        }

	        if (context.method === "next") {
	          // Setting context._sent for legacy support of Babel's
	          // function.sent implementation.
	          context.sent = context._sent = context.arg;

	        } else if (context.method === "throw") {
	          if (state === GenStateSuspendedStart) {
	            state = GenStateCompleted;
	            throw context.arg;
	          }

	          context.dispatchException(context.arg);

	        } else if (context.method === "return") {
	          context.abrupt("return", context.arg);
	        }

	        state = GenStateExecuting;

	        var record = tryCatch(innerFn, self, context);
	        if (record.type === "normal") {
	          // If an exception is thrown from innerFn, we leave state ===
	          // GenStateExecuting and loop back for another invocation.
	          state = context.done
	            ? GenStateCompleted
	            : GenStateSuspendedYield;

	          if (record.arg === ContinueSentinel) {
	            continue;
	          }

	          return {
	            value: record.arg,
	            done: context.done
	          };

	        } else if (record.type === "throw") {
	          state = GenStateCompleted;
	          // Dispatch the exception by looping back around to the
	          // context.dispatchException(context.arg) call above.
	          context.method = "throw";
	          context.arg = record.arg;
	        }
	      }
	    };
	  }

	  // Call delegate.iterator[context.method](context.arg) and handle the
	  // result, either by returning a { value, done } result from the
	  // delegate iterator, or by modifying context.method and context.arg,
	  // setting context.delegate to null, and returning the ContinueSentinel.
	  function maybeInvokeDelegate(delegate, context) {
	    var method = delegate.iterator[context.method];
	    if (method === undefined$1) {
	      // A .throw or .return when the delegate iterator has no .throw
	      // method always terminates the yield* loop.
	      context.delegate = null;

	      if (context.method === "throw") {
	        if (delegate.iterator.return) {
	          // If the delegate iterator has a return method, give it a
	          // chance to clean up.
	          context.method = "return";
	          context.arg = undefined$1;
	          maybeInvokeDelegate(delegate, context);

	          if (context.method === "throw") {
	            // If maybeInvokeDelegate(context) changed context.method from
	            // "return" to "throw", let that override the TypeError below.
	            return ContinueSentinel;
	          }
	        }

	        context.method = "throw";
	        context.arg = new TypeError(
	          "The iterator does not provide a 'throw' method");
	      }

	      return ContinueSentinel;
	    }

	    var record = tryCatch(method, delegate.iterator, context.arg);

	    if (record.type === "throw") {
	      context.method = "throw";
	      context.arg = record.arg;
	      context.delegate = null;
	      return ContinueSentinel;
	    }

	    var info = record.arg;

	    if (! info) {
	      context.method = "throw";
	      context.arg = new TypeError("iterator result is not an object");
	      context.delegate = null;
	      return ContinueSentinel;
	    }

	    if (info.done) {
	      // Assign the result of the finished delegate to the temporary
	      // variable specified by delegate.resultName (see delegateYield).
	      context[delegate.resultName] = info.value;

	      // Resume execution at the desired location (see delegateYield).
	      context.next = delegate.nextLoc;

	      // If context.method was "throw" but the delegate handled the
	      // exception, let the outer generator proceed normally. If
	      // context.method was "next", forget context.arg since it has been
	      // "consumed" by the delegate iterator. If context.method was
	      // "return", allow the original .return call to continue in the
	      // outer generator.
	      if (context.method !== "return") {
	        context.method = "next";
	        context.arg = undefined$1;
	      }

	    } else {
	      // Re-yield the result returned by the delegate method.
	      return info;
	    }

	    // The delegate iterator is finished, so forget it and continue with
	    // the outer generator.
	    context.delegate = null;
	    return ContinueSentinel;
	  }

	  // Define Generator.prototype.{next,throw,return} in terms of the
	  // unified ._invoke helper method.
	  defineIteratorMethods(Gp);

	  Gp[toStringTagSymbol] = "Generator";

	  // A Generator should always return itself as the iterator object when the
	  // @@iterator function is called on it. Some browsers' implementations of the
	  // iterator prototype chain incorrectly implement this, causing the Generator
	  // object to not be returned from this call. This ensures that doesn't happen.
	  // See https://github.com/facebook/regenerator/issues/274 for more details.
	  Gp[iteratorSymbol] = function() {
	    return this;
	  };

	  Gp.toString = function() {
	    return "[object Generator]";
	  };

	  function pushTryEntry(locs) {
	    var entry = { tryLoc: locs[0] };

	    if (1 in locs) {
	      entry.catchLoc = locs[1];
	    }

	    if (2 in locs) {
	      entry.finallyLoc = locs[2];
	      entry.afterLoc = locs[3];
	    }

	    this.tryEntries.push(entry);
	  }

	  function resetTryEntry(entry) {
	    var record = entry.completion || {};
	    record.type = "normal";
	    delete record.arg;
	    entry.completion = record;
	  }

	  function Context(tryLocsList) {
	    // The root entry object (effectively a try statement without a catch
	    // or a finally block) gives us a place to store values thrown from
	    // locations where there is no enclosing try statement.
	    this.tryEntries = [{ tryLoc: "root" }];
	    tryLocsList.forEach(pushTryEntry, this);
	    this.reset(true);
	  }

	  runtime.keys = function(object) {
	    var keys = [];
	    for (var key in object) {
	      keys.push(key);
	    }
	    keys.reverse();

	    // Rather than returning an object with a next method, we keep
	    // things simple and return the next function itself.
	    return function next() {
	      while (keys.length) {
	        var key = keys.pop();
	        if (key in object) {
	          next.value = key;
	          next.done = false;
	          return next;
	        }
	      }

	      // To avoid creating an additional object, we just hang the .value
	      // and .done properties off the next function object itself. This
	      // also ensures that the minifier will not anonymize the function.
	      next.done = true;
	      return next;
	    };
	  };

	  function values(iterable) {
	    if (iterable) {
	      var iteratorMethod = iterable[iteratorSymbol];
	      if (iteratorMethod) {
	        return iteratorMethod.call(iterable);
	      }

	      if (typeof iterable.next === "function") {
	        return iterable;
	      }

	      if (!isNaN(iterable.length)) {
	        var i = -1, next = function next() {
	          while (++i < iterable.length) {
	            if (hasOwn.call(iterable, i)) {
	              next.value = iterable[i];
	              next.done = false;
	              return next;
	            }
	          }

	          next.value = undefined$1;
	          next.done = true;

	          return next;
	        };

	        return next.next = next;
	      }
	    }

	    // Return an iterator with no values.
	    return { next: doneResult };
	  }
	  runtime.values = values;

	  function doneResult() {
	    return { value: undefined$1, done: true };
	  }

	  Context.prototype = {
	    constructor: Context,

	    reset: function(skipTempReset) {
	      this.prev = 0;
	      this.next = 0;
	      // Resetting context._sent for legacy support of Babel's
	      // function.sent implementation.
	      this.sent = this._sent = undefined$1;
	      this.done = false;
	      this.delegate = null;

	      this.method = "next";
	      this.arg = undefined$1;

	      this.tryEntries.forEach(resetTryEntry);

	      if (!skipTempReset) {
	        for (var name in this) {
	          // Not sure about the optimal order of these conditions:
	          if (name.charAt(0) === "t" &&
	              hasOwn.call(this, name) &&
	              !isNaN(+name.slice(1))) {
	            this[name] = undefined$1;
	          }
	        }
	      }
	    },

	    stop: function() {
	      this.done = true;

	      var rootEntry = this.tryEntries[0];
	      var rootRecord = rootEntry.completion;
	      if (rootRecord.type === "throw") {
	        throw rootRecord.arg;
	      }

	      return this.rval;
	    },

	    dispatchException: function(exception) {
	      if (this.done) {
	        throw exception;
	      }

	      var context = this;
	      function handle(loc, caught) {
	        record.type = "throw";
	        record.arg = exception;
	        context.next = loc;

	        if (caught) {
	          // If the dispatched exception was caught by a catch block,
	          // then let that catch block handle the exception normally.
	          context.method = "next";
	          context.arg = undefined$1;
	        }

	        return !! caught;
	      }

	      for (var i = this.tryEntries.length - 1; i >= 0; --i) {
	        var entry = this.tryEntries[i];
	        var record = entry.completion;

	        if (entry.tryLoc === "root") {
	          // Exception thrown outside of any try block that could handle
	          // it, so set the completion value of the entire function to
	          // throw the exception.
	          return handle("end");
	        }

	        if (entry.tryLoc <= this.prev) {
	          var hasCatch = hasOwn.call(entry, "catchLoc");
	          var hasFinally = hasOwn.call(entry, "finallyLoc");

	          if (hasCatch && hasFinally) {
	            if (this.prev < entry.catchLoc) {
	              return handle(entry.catchLoc, true);
	            } else if (this.prev < entry.finallyLoc) {
	              return handle(entry.finallyLoc);
	            }

	          } else if (hasCatch) {
	            if (this.prev < entry.catchLoc) {
	              return handle(entry.catchLoc, true);
	            }

	          } else if (hasFinally) {
	            if (this.prev < entry.finallyLoc) {
	              return handle(entry.finallyLoc);
	            }

	          } else {
	            throw new Error("try statement without catch or finally");
	          }
	        }
	      }
	    },

	    abrupt: function(type, arg) {
	      for (var i = this.tryEntries.length - 1; i >= 0; --i) {
	        var entry = this.tryEntries[i];
	        if (entry.tryLoc <= this.prev &&
	            hasOwn.call(entry, "finallyLoc") &&
	            this.prev < entry.finallyLoc) {
	          var finallyEntry = entry;
	          break;
	        }
	      }

	      if (finallyEntry &&
	          (type === "break" ||
	           type === "continue") &&
	          finallyEntry.tryLoc <= arg &&
	          arg <= finallyEntry.finallyLoc) {
	        // Ignore the finally entry if control is not jumping to a
	        // location outside the try/catch block.
	        finallyEntry = null;
	      }

	      var record = finallyEntry ? finallyEntry.completion : {};
	      record.type = type;
	      record.arg = arg;

	      if (finallyEntry) {
	        this.method = "next";
	        this.next = finallyEntry.finallyLoc;
	        return ContinueSentinel;
	      }

	      return this.complete(record);
	    },

	    complete: function(record, afterLoc) {
	      if (record.type === "throw") {
	        throw record.arg;
	      }

	      if (record.type === "break" ||
	          record.type === "continue") {
	        this.next = record.arg;
	      } else if (record.type === "return") {
	        this.rval = this.arg = record.arg;
	        this.method = "return";
	        this.next = "end";
	      } else if (record.type === "normal" && afterLoc) {
	        this.next = afterLoc;
	      }

	      return ContinueSentinel;
	    },

	    finish: function(finallyLoc) {
	      for (var i = this.tryEntries.length - 1; i >= 0; --i) {
	        var entry = this.tryEntries[i];
	        if (entry.finallyLoc === finallyLoc) {
	          this.complete(entry.completion, entry.afterLoc);
	          resetTryEntry(entry);
	          return ContinueSentinel;
	        }
	      }
	    },

	    "catch": function(tryLoc) {
	      for (var i = this.tryEntries.length - 1; i >= 0; --i) {
	        var entry = this.tryEntries[i];
	        if (entry.tryLoc === tryLoc) {
	          var record = entry.completion;
	          if (record.type === "throw") {
	            var thrown = record.arg;
	            resetTryEntry(entry);
	          }
	          return thrown;
	        }
	      }

	      // The context.catch method must only be called with a location
	      // argument that corresponds to a known catch block.
	      throw new Error("illegal catch attempt");
	    },

	    delegateYield: function(iterable, resultName, nextLoc) {
	      this.delegate = {
	        iterator: values(iterable),
	        resultName: resultName,
	        nextLoc: nextLoc
	      };

	      if (this.method === "next") {
	        // Deliberately forget the last sent value so that we don't
	        // accidentally pass it on to the delegate.
	        this.arg = undefined$1;
	      }

	      return ContinueSentinel;
	    }
	  };
	})(
	  // In sloppy mode, unbound `this` refers to the global object, fallback to
	  // Function constructor if we're in global strict mode. That is sadly a form
	  // of indirect eval which violates Content Security Policy.
	  (function() { return this })() || Function("return this")()
	);
	});

	/**
	 * Copyright (c) 2014-present, Facebook, Inc.
	 *
	 * This source code is licensed under the MIT license found in the
	 * LICENSE file in the root directory of this source tree.
	 */

	// This method of obtaining a reference to the global object needs to be
	// kept identical to the way it is obtained in runtime.js
	var g = (function() { return this })() || Function("return this")();

	// Use `getOwnPropertyNames` because not all browsers support calling
	// `hasOwnProperty` on the global `self` object in a worker. See #183.
	var hadRuntime = g.regeneratorRuntime &&
	  Object.getOwnPropertyNames(g).indexOf("regeneratorRuntime") >= 0;

	// Save the old regeneratorRuntime in case it needs to be restored later.
	var oldRuntime = hadRuntime && g.regeneratorRuntime;

	// Force reevalutation of runtime.js.
	g.regeneratorRuntime = undefined;

	var runtimeModule = runtime;

	if (hadRuntime) {
	  // Restore the original runtime.
	  g.regeneratorRuntime = oldRuntime;
	} else {
	  // Remove the global property added by runtime.js.
	  try {
	    delete g.regeneratorRuntime;
	  } catch(e) {
	    g.regeneratorRuntime = undefined;
	  }
	}

	var regenerator = runtimeModule;

	// 7.1.4 ToInteger
	var ceil = Math.ceil;
	var floor = Math.floor;
	var _toInteger = function (it) {
	  return isNaN(it = +it) ? 0 : (it > 0 ? floor : ceil)(it);
	};

	// 7.2.1 RequireObjectCoercible(argument)
	var _defined = function (it) {
	  if (it == undefined) throw TypeError("Can't call method on  " + it);
	  return it;
	};

	// true  -> String#at
	// false -> String#codePointAt
	var _stringAt = function (TO_STRING) {
	  return function (that, pos) {
	    var s = String(_defined(that));
	    var i = _toInteger(pos);
	    var l = s.length;
	    var a, b;
	    if (i < 0 || i >= l) return TO_STRING ? '' : undefined;
	    a = s.charCodeAt(i);
	    return a < 0xd800 || a > 0xdbff || i + 1 === l || (b = s.charCodeAt(i + 1)) < 0xdc00 || b > 0xdfff
	      ? TO_STRING ? s.charAt(i) : a
	      : TO_STRING ? s.slice(i, i + 2) : (a - 0xd800 << 10) + (b - 0xdc00) + 0x10000;
	  };
	};

	var _library = true;

	var _global = createCommonjsModule(function (module) {
	// https://github.com/zloirock/core-js/issues/86#issuecomment-115759028
	var global = module.exports = typeof window != 'undefined' && window.Math == Math
	  ? window : typeof self != 'undefined' && self.Math == Math ? self
	  // eslint-disable-next-line no-new-func
	  : Function('return this')();
	if (typeof __g == 'number') __g = global; // eslint-disable-line no-undef
	});

	var _core = createCommonjsModule(function (module) {
	var core = module.exports = { version: '2.6.12' };
	if (typeof __e == 'number') __e = core; // eslint-disable-line no-undef
	});
	_core.version;

	var _aFunction = function (it) {
	  if (typeof it != 'function') throw TypeError(it + ' is not a function!');
	  return it;
	};

	// optional / simple context binding

	var _ctx = function (fn, that, length) {
	  _aFunction(fn);
	  if (that === undefined) return fn;
	  switch (length) {
	    case 1: return function (a) {
	      return fn.call(that, a);
	    };
	    case 2: return function (a, b) {
	      return fn.call(that, a, b);
	    };
	    case 3: return function (a, b, c) {
	      return fn.call(that, a, b, c);
	    };
	  }
	  return function (/* ...args */) {
	    return fn.apply(that, arguments);
	  };
	};

	var _isObject = function (it) {
	  return typeof it === 'object' ? it !== null : typeof it === 'function';
	};

	var _anObject = function (it) {
	  if (!_isObject(it)) throw TypeError(it + ' is not an object!');
	  return it;
	};

	var _fails = function (exec) {
	  try {
	    return !!exec();
	  } catch (e) {
	    return true;
	  }
	};

	// Thank's IE8 for his funny defineProperty
	var _descriptors = !_fails(function () {
	  return Object.defineProperty({}, 'a', { get: function () { return 7; } }).a != 7;
	});

	var document$2 = _global.document;
	// typeof document.createElement is 'object' in old IE
	var is = _isObject(document$2) && _isObject(document$2.createElement);
	var _domCreate = function (it) {
	  return is ? document$2.createElement(it) : {};
	};

	var _ie8DomDefine = !_descriptors && !_fails(function () {
	  return Object.defineProperty(_domCreate('div'), 'a', { get: function () { return 7; } }).a != 7;
	});

	// 7.1.1 ToPrimitive(input [, PreferredType])

	// instead of the ES6 spec version, we didn't implement @@toPrimitive case
	// and the second argument - flag - preferred type is a string
	var _toPrimitive = function (it, S) {
	  if (!_isObject(it)) return it;
	  var fn, val;
	  if (S && typeof (fn = it.toString) == 'function' && !_isObject(val = fn.call(it))) return val;
	  if (typeof (fn = it.valueOf) == 'function' && !_isObject(val = fn.call(it))) return val;
	  if (!S && typeof (fn = it.toString) == 'function' && !_isObject(val = fn.call(it))) return val;
	  throw TypeError("Can't convert object to primitive value");
	};

	var dP$1 = Object.defineProperty;

	var f$7 = _descriptors ? Object.defineProperty : function defineProperty(O, P, Attributes) {
	  _anObject(O);
	  P = _toPrimitive(P, true);
	  _anObject(Attributes);
	  if (_ie8DomDefine) try {
	    return dP$1(O, P, Attributes);
	  } catch (e) { /* empty */ }
	  if ('get' in Attributes || 'set' in Attributes) throw TypeError('Accessors not supported!');
	  if ('value' in Attributes) O[P] = Attributes.value;
	  return O;
	};

	var _objectDp = {
		f: f$7
	};

	var _propertyDesc = function (bitmap, value) {
	  return {
	    enumerable: !(bitmap & 1),
	    configurable: !(bitmap & 2),
	    writable: !(bitmap & 4),
	    value: value
	  };
	};

	var _hide = _descriptors ? function (object, key, value) {
	  return _objectDp.f(object, key, _propertyDesc(1, value));
	} : function (object, key, value) {
	  object[key] = value;
	  return object;
	};

	var hasOwnProperty = {}.hasOwnProperty;
	var _has = function (it, key) {
	  return hasOwnProperty.call(it, key);
	};

	var PROTOTYPE$2 = 'prototype';

	var $export = function (type, name, source) {
	  var IS_FORCED = type & $export.F;
	  var IS_GLOBAL = type & $export.G;
	  var IS_STATIC = type & $export.S;
	  var IS_PROTO = type & $export.P;
	  var IS_BIND = type & $export.B;
	  var IS_WRAP = type & $export.W;
	  var exports = IS_GLOBAL ? _core : _core[name] || (_core[name] = {});
	  var expProto = exports[PROTOTYPE$2];
	  var target = IS_GLOBAL ? _global : IS_STATIC ? _global[name] : (_global[name] || {})[PROTOTYPE$2];
	  var key, own, out;
	  if (IS_GLOBAL) source = name;
	  for (key in source) {
	    // contains in native
	    own = !IS_FORCED && target && target[key] !== undefined;
	    if (own && _has(exports, key)) continue;
	    // export native or passed
	    out = own ? target[key] : source[key];
	    // prevent global pollution for namespaces
	    exports[key] = IS_GLOBAL && typeof target[key] != 'function' ? source[key]
	    // bind timers to global for call from export context
	    : IS_BIND && own ? _ctx(out, _global)
	    // wrap global constructors for prevent change them in library
	    : IS_WRAP && target[key] == out ? (function (C) {
	      var F = function (a, b, c) {
	        if (this instanceof C) {
	          switch (arguments.length) {
	            case 0: return new C();
	            case 1: return new C(a);
	            case 2: return new C(a, b);
	          } return new C(a, b, c);
	        } return C.apply(this, arguments);
	      };
	      F[PROTOTYPE$2] = C[PROTOTYPE$2];
	      return F;
	    // make static versions for prototype methods
	    })(out) : IS_PROTO && typeof out == 'function' ? _ctx(Function.call, out) : out;
	    // export proto methods to core.%CONSTRUCTOR%.methods.%NAME%
	    if (IS_PROTO) {
	      (exports.virtual || (exports.virtual = {}))[key] = out;
	      // export proto methods to core.%CONSTRUCTOR%.prototype.%NAME%
	      if (type & $export.R && expProto && !expProto[key]) _hide(expProto, key, out);
	    }
	  }
	};
	// type bitmap
	$export.F = 1;   // forced
	$export.G = 2;   // global
	$export.S = 4;   // static
	$export.P = 8;   // proto
	$export.B = 16;  // bind
	$export.W = 32;  // wrap
	$export.U = 64;  // safe
	$export.R = 128; // real proto method for `library`
	var _export = $export;

	var _redefine = _hide;

	var _iterators = {};

	var toString$1 = {}.toString;

	var _cof = function (it) {
	  return toString$1.call(it).slice(8, -1);
	};

	// fallback for non-array-like ES3 and non-enumerable old V8 strings

	// eslint-disable-next-line no-prototype-builtins
	var _iobject = Object('z').propertyIsEnumerable(0) ? Object : function (it) {
	  return _cof(it) == 'String' ? it.split('') : Object(it);
	};

	// to indexed object, toObject with fallback for non-array-like ES3 strings


	var _toIobject = function (it) {
	  return _iobject(_defined(it));
	};

	// 7.1.15 ToLength

	var min$1 = Math.min;
	var _toLength = function (it) {
	  return it > 0 ? min$1(_toInteger(it), 0x1fffffffffffff) : 0; // pow(2, 53) - 1 == 9007199254740991
	};

	var max = Math.max;
	var min = Math.min;
	var _toAbsoluteIndex = function (index, length) {
	  index = _toInteger(index);
	  return index < 0 ? max(index + length, 0) : min(index, length);
	};

	// false -> Array#indexOf
	// true  -> Array#includes



	var _arrayIncludes = function (IS_INCLUDES) {
	  return function ($this, el, fromIndex) {
	    var O = _toIobject($this);
	    var length = _toLength(O.length);
	    var index = _toAbsoluteIndex(fromIndex, length);
	    var value;
	    // Array#includes uses SameValueZero equality algorithm
	    // eslint-disable-next-line no-self-compare
	    if (IS_INCLUDES && el != el) while (length > index) {
	      value = O[index++];
	      // eslint-disable-next-line no-self-compare
	      if (value != value) return true;
	    // Array#indexOf ignores holes, Array#includes - not
	    } else for (;length > index; index++) if (IS_INCLUDES || index in O) {
	      if (O[index] === el) return IS_INCLUDES || index || 0;
	    } return !IS_INCLUDES && -1;
	  };
	};

	var _shared = createCommonjsModule(function (module) {
	var SHARED = '__core-js_shared__';
	var store = _global[SHARED] || (_global[SHARED] = {});

	(module.exports = function (key, value) {
	  return store[key] || (store[key] = value !== undefined ? value : {});
	})('versions', []).push({
	  version: _core.version,
	  mode: 'pure' ,
	  copyright: '© 2020 Denis Pushkarev (zloirock.ru)'
	});
	});

	var id = 0;
	var px = Math.random();
	var _uid = function (key) {
	  return 'Symbol('.concat(key === undefined ? '' : key, ')_', (++id + px).toString(36));
	};

	var shared = _shared('keys');

	var _sharedKey = function (key) {
	  return shared[key] || (shared[key] = _uid(key));
	};

	var arrayIndexOf = _arrayIncludes(false);
	var IE_PROTO$2 = _sharedKey('IE_PROTO');

	var _objectKeysInternal = function (object, names) {
	  var O = _toIobject(object);
	  var i = 0;
	  var result = [];
	  var key;
	  for (key in O) if (key != IE_PROTO$2) _has(O, key) && result.push(key);
	  // Don't enum bug & hidden keys
	  while (names.length > i) if (_has(O, key = names[i++])) {
	    ~arrayIndexOf(result, key) || result.push(key);
	  }
	  return result;
	};

	// IE 8- don't enum bug keys
	var _enumBugKeys = (
	  'constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf'
	).split(',');

	// 19.1.2.14 / 15.2.3.14 Object.keys(O)



	var _objectKeys = Object.keys || function keys(O) {
	  return _objectKeysInternal(O, _enumBugKeys);
	};

	var _objectDps = _descriptors ? Object.defineProperties : function defineProperties(O, Properties) {
	  _anObject(O);
	  var keys = _objectKeys(Properties);
	  var length = keys.length;
	  var i = 0;
	  var P;
	  while (length > i) _objectDp.f(O, P = keys[i++], Properties[P]);
	  return O;
	};

	var document$1 = _global.document;
	var _html = document$1 && document$1.documentElement;

	// 19.1.2.2 / 15.2.3.5 Object.create(O [, Properties])



	var IE_PROTO$1 = _sharedKey('IE_PROTO');
	var Empty = function () { /* empty */ };
	var PROTOTYPE$1 = 'prototype';

	// Create object with fake `null` prototype: use iframe Object with cleared prototype
	var createDict = function () {
	  // Thrash, waste and sodomy: IE GC bug
	  var iframe = _domCreate('iframe');
	  var i = _enumBugKeys.length;
	  var lt = '<';
	  var gt = '>';
	  var iframeDocument;
	  iframe.style.display = 'none';
	  _html.appendChild(iframe);
	  iframe.src = 'javascript:'; // eslint-disable-line no-script-url
	  // createDict = iframe.contentWindow.Object;
	  // html.removeChild(iframe);
	  iframeDocument = iframe.contentWindow.document;
	  iframeDocument.open();
	  iframeDocument.write(lt + 'script' + gt + 'document.F=Object' + lt + '/script' + gt);
	  iframeDocument.close();
	  createDict = iframeDocument.F;
	  while (i--) delete createDict[PROTOTYPE$1][_enumBugKeys[i]];
	  return createDict();
	};

	var _objectCreate = Object.create || function create(O, Properties) {
	  var result;
	  if (O !== null) {
	    Empty[PROTOTYPE$1] = _anObject(O);
	    result = new Empty();
	    Empty[PROTOTYPE$1] = null;
	    // add "__proto__" for Object.getPrototypeOf polyfill
	    result[IE_PROTO$1] = O;
	  } else result = createDict();
	  return Properties === undefined ? result : _objectDps(result, Properties);
	};

	var _wks = createCommonjsModule(function (module) {
	var store = _shared('wks');

	var Symbol = _global.Symbol;
	var USE_SYMBOL = typeof Symbol == 'function';

	var $exports = module.exports = function (name) {
	  return store[name] || (store[name] =
	    USE_SYMBOL && Symbol[name] || (USE_SYMBOL ? Symbol : _uid)('Symbol.' + name));
	};

	$exports.store = store;
	});

	var def = _objectDp.f;

	var TAG$1 = _wks('toStringTag');

	var _setToStringTag = function (it, tag, stat) {
	  if (it && !_has(it = stat ? it : it.prototype, TAG$1)) def(it, TAG$1, { configurable: true, value: tag });
	};

	var IteratorPrototype = {};

	// 25.1.2.1.1 %IteratorPrototype%[@@iterator]()
	_hide(IteratorPrototype, _wks('iterator'), function () { return this; });

	var _iterCreate = function (Constructor, NAME, next) {
	  Constructor.prototype = _objectCreate(IteratorPrototype, { next: _propertyDesc(1, next) });
	  _setToStringTag(Constructor, NAME + ' Iterator');
	};

	// 7.1.13 ToObject(argument)

	var _toObject = function (it) {
	  return Object(_defined(it));
	};

	// 19.1.2.9 / 15.2.3.2 Object.getPrototypeOf(O)


	var IE_PROTO = _sharedKey('IE_PROTO');
	var ObjectProto$1 = Object.prototype;

	var _objectGpo = Object.getPrototypeOf || function (O) {
	  O = _toObject(O);
	  if (_has(O, IE_PROTO)) return O[IE_PROTO];
	  if (typeof O.constructor == 'function' && O instanceof O.constructor) {
	    return O.constructor.prototype;
	  } return O instanceof Object ? ObjectProto$1 : null;
	};

	var ITERATOR$4 = _wks('iterator');
	var BUGGY = !([].keys && 'next' in [].keys()); // Safari has buggy iterators w/o `next`
	var FF_ITERATOR = '@@iterator';
	var KEYS = 'keys';
	var VALUES = 'values';

	var returnThis = function () { return this; };

	var _iterDefine = function (Base, NAME, Constructor, next, DEFAULT, IS_SET, FORCED) {
	  _iterCreate(Constructor, NAME, next);
	  var getMethod = function (kind) {
	    if (!BUGGY && kind in proto) return proto[kind];
	    switch (kind) {
	      case KEYS: return function keys() { return new Constructor(this, kind); };
	      case VALUES: return function values() { return new Constructor(this, kind); };
	    } return function entries() { return new Constructor(this, kind); };
	  };
	  var TAG = NAME + ' Iterator';
	  var DEF_VALUES = DEFAULT == VALUES;
	  var VALUES_BUG = false;
	  var proto = Base.prototype;
	  var $native = proto[ITERATOR$4] || proto[FF_ITERATOR] || DEFAULT && proto[DEFAULT];
	  var $default = $native || getMethod(DEFAULT);
	  var $entries = DEFAULT ? !DEF_VALUES ? $default : getMethod('entries') : undefined;
	  var $anyNative = NAME == 'Array' ? proto.entries || $native : $native;
	  var methods, key, IteratorPrototype;
	  // Fix native
	  if ($anyNative) {
	    IteratorPrototype = _objectGpo($anyNative.call(new Base()));
	    if (IteratorPrototype !== Object.prototype && IteratorPrototype.next) {
	      // Set @@toStringTag to native iterators
	      _setToStringTag(IteratorPrototype, TAG, true);
	    }
	  }
	  // fix Array#{values, @@iterator}.name in V8 / FF
	  if (DEF_VALUES && $native && $native.name !== VALUES) {
	    VALUES_BUG = true;
	    $default = function values() { return $native.call(this); };
	  }
	  // Define iterator
	  if ((FORCED) && (BUGGY || VALUES_BUG || !proto[ITERATOR$4])) {
	    _hide(proto, ITERATOR$4, $default);
	  }
	  // Plug for library
	  _iterators[NAME] = $default;
	  _iterators[TAG] = returnThis;
	  if (DEFAULT) {
	    methods = {
	      values: DEF_VALUES ? $default : getMethod(VALUES),
	      keys: IS_SET ? $default : getMethod(KEYS),
	      entries: $entries
	    };
	    if (FORCED) for (key in methods) {
	      if (!(key in proto)) _redefine(proto, key, methods[key]);
	    } else _export(_export.P + _export.F * (BUGGY || VALUES_BUG), NAME, methods);
	  }
	  return methods;
	};

	var $at = _stringAt(true);

	// 21.1.3.27 String.prototype[@@iterator]()
	_iterDefine(String, 'String', function (iterated) {
	  this._t = String(iterated); // target
	  this._i = 0;                // next index
	// 21.1.5.2.1 %StringIteratorPrototype%.next()
	}, function () {
	  var O = this._t;
	  var index = this._i;
	  var point;
	  if (index >= O.length) return { value: undefined, done: true };
	  point = $at(O, index);
	  this._i += point.length;
	  return { value: point, done: false };
	});

	var _iterStep = function (done, value) {
	  return { value: value, done: !!done };
	};

	// 22.1.3.4 Array.prototype.entries()
	// 22.1.3.13 Array.prototype.keys()
	// 22.1.3.29 Array.prototype.values()
	// 22.1.3.30 Array.prototype[@@iterator]()
	_iterDefine(Array, 'Array', function (iterated, kind) {
	  this._t = _toIobject(iterated); // target
	  this._i = 0;                   // next index
	  this._k = kind;                // kind
	// 22.1.5.2.1 %ArrayIteratorPrototype%.next()
	}, function () {
	  var O = this._t;
	  var kind = this._k;
	  var index = this._i++;
	  if (!O || index >= O.length) {
	    this._t = undefined;
	    return _iterStep(1);
	  }
	  if (kind == 'keys') return _iterStep(0, index);
	  if (kind == 'values') return _iterStep(0, O[index]);
	  return _iterStep(0, [index, O[index]]);
	}, 'values');

	// argumentsList[@@iterator] is %ArrayProto_values% (9.4.4.6, 9.4.4.7)
	_iterators.Arguments = _iterators.Array;

	var TO_STRING_TAG = _wks('toStringTag');

	var DOMIterables = ('CSSRuleList,CSSStyleDeclaration,CSSValueList,ClientRectList,DOMRectList,DOMStringList,' +
	  'DOMTokenList,DataTransferItemList,FileList,HTMLAllCollection,HTMLCollection,HTMLFormElement,HTMLSelectElement,' +
	  'MediaList,MimeTypeArray,NamedNodeMap,NodeList,PaintRequestList,Plugin,PluginArray,SVGLengthList,SVGNumberList,' +
	  'SVGPathSegList,SVGPointList,SVGStringList,SVGTransformList,SourceBufferList,StyleSheetList,TextTrackCueList,' +
	  'TextTrackList,TouchList').split(',');

	for (var i = 0; i < DOMIterables.length; i++) {
	  var NAME = DOMIterables[i];
	  var Collection = _global[NAME];
	  var proto = Collection && Collection.prototype;
	  if (proto && !proto[TO_STRING_TAG]) _hide(proto, TO_STRING_TAG, NAME);
	  _iterators[NAME] = _iterators.Array;
	}

	// getting tag from 19.1.3.6 Object.prototype.toString()

	var TAG = _wks('toStringTag');
	// ES3 wrong here
	var ARG = _cof(function () { return arguments; }()) == 'Arguments';

	// fallback for IE11 Script Access Denied error
	var tryGet = function (it, key) {
	  try {
	    return it[key];
	  } catch (e) { /* empty */ }
	};

	var _classof = function (it) {
	  var O, T, B;
	  return it === undefined ? 'Undefined' : it === null ? 'Null'
	    // @@toStringTag case
	    : typeof (T = tryGet(O = Object(it), TAG)) == 'string' ? T
	    // builtinTag case
	    : ARG ? _cof(O)
	    // ES3 arguments fallback
	    : (B = _cof(O)) == 'Object' && typeof O.callee == 'function' ? 'Arguments' : B;
	};

	var _anInstance = function (it, Constructor, name, forbiddenField) {
	  if (!(it instanceof Constructor) || (forbiddenField !== undefined && forbiddenField in it)) {
	    throw TypeError(name + ': incorrect invocation!');
	  } return it;
	};

	// call something on iterator step with safe closing on error

	var _iterCall = function (iterator, fn, value, entries) {
	  try {
	    return entries ? fn(_anObject(value)[0], value[1]) : fn(value);
	  // 7.4.6 IteratorClose(iterator, completion)
	  } catch (e) {
	    var ret = iterator['return'];
	    if (ret !== undefined) _anObject(ret.call(iterator));
	    throw e;
	  }
	};

	// check on default Array iterator

	var ITERATOR$3 = _wks('iterator');
	var ArrayProto = Array.prototype;

	var _isArrayIter = function (it) {
	  return it !== undefined && (_iterators.Array === it || ArrayProto[ITERATOR$3] === it);
	};

	var ITERATOR$2 = _wks('iterator');

	var core_getIteratorMethod = _core.getIteratorMethod = function (it) {
	  if (it != undefined) return it[ITERATOR$2]
	    || it['@@iterator']
	    || _iterators[_classof(it)];
	};

	var _forOf = createCommonjsModule(function (module) {
	var BREAK = {};
	var RETURN = {};
	var exports = module.exports = function (iterable, entries, fn, that, ITERATOR) {
	  var iterFn = ITERATOR ? function () { return iterable; } : core_getIteratorMethod(iterable);
	  var f = _ctx(fn, that, entries ? 2 : 1);
	  var index = 0;
	  var length, step, iterator, result;
	  if (typeof iterFn != 'function') throw TypeError(iterable + ' is not iterable!');
	  // fast case for arrays with default iterator
	  if (_isArrayIter(iterFn)) for (length = _toLength(iterable.length); length > index; index++) {
	    result = entries ? f(_anObject(step = iterable[index])[0], step[1]) : f(iterable[index]);
	    if (result === BREAK || result === RETURN) return result;
	  } else for (iterator = iterFn.call(iterable); !(step = iterator.next()).done;) {
	    result = _iterCall(iterator, f, step.value, entries);
	    if (result === BREAK || result === RETURN) return result;
	  }
	};
	exports.BREAK = BREAK;
	exports.RETURN = RETURN;
	});

	// 7.3.20 SpeciesConstructor(O, defaultConstructor)


	var SPECIES$1 = _wks('species');
	var _speciesConstructor = function (O, D) {
	  var C = _anObject(O).constructor;
	  var S;
	  return C === undefined || (S = _anObject(C)[SPECIES$1]) == undefined ? D : _aFunction(S);
	};

	// fast apply, http://jsperf.lnkit.com/fast-apply/5
	var _invoke = function (fn, args, that) {
	  var un = that === undefined;
	  switch (args.length) {
	    case 0: return un ? fn()
	                      : fn.call(that);
	    case 1: return un ? fn(args[0])
	                      : fn.call(that, args[0]);
	    case 2: return un ? fn(args[0], args[1])
	                      : fn.call(that, args[0], args[1]);
	    case 3: return un ? fn(args[0], args[1], args[2])
	                      : fn.call(that, args[0], args[1], args[2]);
	    case 4: return un ? fn(args[0], args[1], args[2], args[3])
	                      : fn.call(that, args[0], args[1], args[2], args[3]);
	  } return fn.apply(that, args);
	};

	var process$3 = _global.process;
	var setTask = _global.setImmediate;
	var clearTask = _global.clearImmediate;
	var MessageChannel = _global.MessageChannel;
	var Dispatch = _global.Dispatch;
	var counter = 0;
	var queue = {};
	var ONREADYSTATECHANGE = 'onreadystatechange';
	var defer, channel, port;
	var run = function () {
	  var id = +this;
	  // eslint-disable-next-line no-prototype-builtins
	  if (queue.hasOwnProperty(id)) {
	    var fn = queue[id];
	    delete queue[id];
	    fn();
	  }
	};
	var listener = function (event) {
	  run.call(event.data);
	};
	// Node.js 0.9+ & IE10+ has setImmediate, otherwise:
	if (!setTask || !clearTask) {
	  setTask = function setImmediate(fn) {
	    var args = [];
	    var i = 1;
	    while (arguments.length > i) args.push(arguments[i++]);
	    queue[++counter] = function () {
	      // eslint-disable-next-line no-new-func
	      _invoke(typeof fn == 'function' ? fn : Function(fn), args);
	    };
	    defer(counter);
	    return counter;
	  };
	  clearTask = function clearImmediate(id) {
	    delete queue[id];
	  };
	  // Node.js 0.8-
	  if (_cof(process$3) == 'process') {
	    defer = function (id) {
	      process$3.nextTick(_ctx(run, id, 1));
	    };
	  // Sphere (JS game engine) Dispatch API
	  } else if (Dispatch && Dispatch.now) {
	    defer = function (id) {
	      Dispatch.now(_ctx(run, id, 1));
	    };
	  // Browsers with MessageChannel, includes WebWorkers
	  } else if (MessageChannel) {
	    channel = new MessageChannel();
	    port = channel.port2;
	    channel.port1.onmessage = listener;
	    defer = _ctx(port.postMessage, port, 1);
	  // Browsers with postMessage, skip WebWorkers
	  // IE8 has postMessage, but it's sync & typeof its postMessage is 'object'
	  } else if (_global.addEventListener && typeof postMessage == 'function' && !_global.importScripts) {
	    defer = function (id) {
	      _global.postMessage(id + '', '*');
	    };
	    _global.addEventListener('message', listener, false);
	  // IE8-
	  } else if (ONREADYSTATECHANGE in _domCreate('script')) {
	    defer = function (id) {
	      _html.appendChild(_domCreate('script'))[ONREADYSTATECHANGE] = function () {
	        _html.removeChild(this);
	        run.call(id);
	      };
	    };
	  // Rest old browsers
	  } else {
	    defer = function (id) {
	      setTimeout(_ctx(run, id, 1), 0);
	    };
	  }
	}
	var _task = {
	  set: setTask,
	  clear: clearTask
	};

	var macrotask = _task.set;
	var Observer = _global.MutationObserver || _global.WebKitMutationObserver;
	var process$2 = _global.process;
	var Promise$1 = _global.Promise;
	var isNode$1 = _cof(process$2) == 'process';

	var _microtask = function () {
	  var head, last, notify;

	  var flush = function () {
	    var parent, fn;
	    if (isNode$1 && (parent = process$2.domain)) parent.exit();
	    while (head) {
	      fn = head.fn;
	      head = head.next;
	      try {
	        fn();
	      } catch (e) {
	        if (head) notify();
	        else last = undefined;
	        throw e;
	      }
	    } last = undefined;
	    if (parent) parent.enter();
	  };

	  // Node.js
	  if (isNode$1) {
	    notify = function () {
	      process$2.nextTick(flush);
	    };
	  // browsers with MutationObserver, except iOS Safari - https://github.com/zloirock/core-js/issues/339
	  } else if (Observer && !(_global.navigator && _global.navigator.standalone)) {
	    var toggle = true;
	    var node = document.createTextNode('');
	    new Observer(flush).observe(node, { characterData: true }); // eslint-disable-line no-new
	    notify = function () {
	      node.data = toggle = !toggle;
	    };
	  // environments with maybe non-completely correct, but existent Promise
	  } else if (Promise$1 && Promise$1.resolve) {
	    // Promise.resolve without an argument throws an error in LG WebOS 2
	    var promise = Promise$1.resolve(undefined);
	    notify = function () {
	      promise.then(flush);
	    };
	  // for other environments - macrotask based on:
	  // - setImmediate
	  // - MessageChannel
	  // - window.postMessag
	  // - onreadystatechange
	  // - setTimeout
	  } else {
	    notify = function () {
	      // strange IE + webpack dev server bug - use .call(global)
	      macrotask.call(_global, flush);
	    };
	  }

	  return function (fn) {
	    var task = { fn: fn, next: undefined };
	    if (last) last.next = task;
	    if (!head) {
	      head = task;
	      notify();
	    } last = task;
	  };
	};

	// 25.4.1.5 NewPromiseCapability(C)


	function PromiseCapability(C) {
	  var resolve, reject;
	  this.promise = new C(function ($$resolve, $$reject) {
	    if (resolve !== undefined || reject !== undefined) throw TypeError('Bad Promise constructor');
	    resolve = $$resolve;
	    reject = $$reject;
	  });
	  this.resolve = _aFunction(resolve);
	  this.reject = _aFunction(reject);
	}

	var f$6 = function (C) {
	  return new PromiseCapability(C);
	};

	var _newPromiseCapability = {
		f: f$6
	};

	var _perform = function (exec) {
	  try {
	    return { e: false, v: exec() };
	  } catch (e) {
	    return { e: true, v: e };
	  }
	};

	var navigator$1 = _global.navigator;

	var _userAgent = navigator$1 && navigator$1.userAgent || '';

	var _promiseResolve = function (C, x) {
	  _anObject(C);
	  if (_isObject(x) && x.constructor === C) return x;
	  var promiseCapability = _newPromiseCapability.f(C);
	  var resolve = promiseCapability.resolve;
	  resolve(x);
	  return promiseCapability.promise;
	};

	var _redefineAll = function (target, src, safe) {
	  for (var key in src) {
	    if (safe && target[key]) target[key] = src[key];
	    else _hide(target, key, src[key]);
	  } return target;
	};

	var SPECIES = _wks('species');

	var _setSpecies = function (KEY) {
	  var C = typeof _core[KEY] == 'function' ? _core[KEY] : _global[KEY];
	  if (_descriptors && C && !C[SPECIES]) _objectDp.f(C, SPECIES, {
	    configurable: true,
	    get: function () { return this; }
	  });
	};

	var ITERATOR$1 = _wks('iterator');
	var SAFE_CLOSING = false;

	try {
	  var riter = [7][ITERATOR$1]();
	  riter['return'] = function () { SAFE_CLOSING = true; };
	  // eslint-disable-next-line no-throw-literal
	  Array.from(riter, function () { throw 2; });
	} catch (e) { /* empty */ }

	var _iterDetect = function (exec, skipClosing) {
	  if (!skipClosing && !SAFE_CLOSING) return false;
	  var safe = false;
	  try {
	    var arr = [7];
	    var iter = arr[ITERATOR$1]();
	    iter.next = function () { return { done: safe = true }; };
	    arr[ITERATOR$1] = function () { return iter; };
	    exec(arr);
	  } catch (e) { /* empty */ }
	  return safe;
	};

	var task = _task.set;
	var microtask = _microtask();




	var PROMISE = 'Promise';
	var TypeError$1 = _global.TypeError;
	var process$1 = _global.process;
	var versions = process$1 && process$1.versions;
	var v8 = versions && versions.v8 || '';
	var $Promise = _global[PROMISE];
	var isNode = _classof(process$1) == 'process';
	var empty = function () { /* empty */ };
	var Internal, newGenericPromiseCapability, OwnPromiseCapability, Wrapper;
	var newPromiseCapability = newGenericPromiseCapability = _newPromiseCapability.f;

	var USE_NATIVE$1 = !!function () {
	  try {
	    // correct subclassing with @@species support
	    var promise = $Promise.resolve(1);
	    var FakePromise = (promise.constructor = {})[_wks('species')] = function (exec) {
	      exec(empty, empty);
	    };
	    // unhandled rejections tracking support, NodeJS Promise without it fails @@species test
	    return (isNode || typeof PromiseRejectionEvent == 'function')
	      && promise.then(empty) instanceof FakePromise
	      // v8 6.6 (Node 10 and Chrome 66) have a bug with resolving custom thenables
	      // https://bugs.chromium.org/p/chromium/issues/detail?id=830565
	      // we can't detect it synchronously, so just check versions
	      && v8.indexOf('6.6') !== 0
	      && _userAgent.indexOf('Chrome/66') === -1;
	  } catch (e) { /* empty */ }
	}();

	// helpers
	var isThenable = function (it) {
	  var then;
	  return _isObject(it) && typeof (then = it.then) == 'function' ? then : false;
	};
	var notify = function (promise, isReject) {
	  if (promise._n) return;
	  promise._n = true;
	  var chain = promise._c;
	  microtask(function () {
	    var value = promise._v;
	    var ok = promise._s == 1;
	    var i = 0;
	    var run = function (reaction) {
	      var handler = ok ? reaction.ok : reaction.fail;
	      var resolve = reaction.resolve;
	      var reject = reaction.reject;
	      var domain = reaction.domain;
	      var result, then, exited;
	      try {
	        if (handler) {
	          if (!ok) {
	            if (promise._h == 2) onHandleUnhandled(promise);
	            promise._h = 1;
	          }
	          if (handler === true) result = value;
	          else {
	            if (domain) domain.enter();
	            result = handler(value); // may throw
	            if (domain) {
	              domain.exit();
	              exited = true;
	            }
	          }
	          if (result === reaction.promise) {
	            reject(TypeError$1('Promise-chain cycle'));
	          } else if (then = isThenable(result)) {
	            then.call(result, resolve, reject);
	          } else resolve(result);
	        } else reject(value);
	      } catch (e) {
	        if (domain && !exited) domain.exit();
	        reject(e);
	      }
	    };
	    while (chain.length > i) run(chain[i++]); // variable length - can't use forEach
	    promise._c = [];
	    promise._n = false;
	    if (isReject && !promise._h) onUnhandled(promise);
	  });
	};
	var onUnhandled = function (promise) {
	  task.call(_global, function () {
	    var value = promise._v;
	    var unhandled = isUnhandled(promise);
	    var result, handler, console;
	    if (unhandled) {
	      result = _perform(function () {
	        if (isNode) {
	          process$1.emit('unhandledRejection', value, promise);
	        } else if (handler = _global.onunhandledrejection) {
	          handler({ promise: promise, reason: value });
	        } else if ((console = _global.console) && console.error) {
	          console.error('Unhandled promise rejection', value);
	        }
	      });
	      // Browsers should not trigger `rejectionHandled` event if it was handled here, NodeJS - should
	      promise._h = isNode || isUnhandled(promise) ? 2 : 1;
	    } promise._a = undefined;
	    if (unhandled && result.e) throw result.v;
	  });
	};
	var isUnhandled = function (promise) {
	  return promise._h !== 1 && (promise._a || promise._c).length === 0;
	};
	var onHandleUnhandled = function (promise) {
	  task.call(_global, function () {
	    var handler;
	    if (isNode) {
	      process$1.emit('rejectionHandled', promise);
	    } else if (handler = _global.onrejectionhandled) {
	      handler({ promise: promise, reason: promise._v });
	    }
	  });
	};
	var $reject = function (value) {
	  var promise = this;
	  if (promise._d) return;
	  promise._d = true;
	  promise = promise._w || promise; // unwrap
	  promise._v = value;
	  promise._s = 2;
	  if (!promise._a) promise._a = promise._c.slice();
	  notify(promise, true);
	};
	var $resolve = function (value) {
	  var promise = this;
	  var then;
	  if (promise._d) return;
	  promise._d = true;
	  promise = promise._w || promise; // unwrap
	  try {
	    if (promise === value) throw TypeError$1("Promise can't be resolved itself");
	    if (then = isThenable(value)) {
	      microtask(function () {
	        var wrapper = { _w: promise, _d: false }; // wrap
	        try {
	          then.call(value, _ctx($resolve, wrapper, 1), _ctx($reject, wrapper, 1));
	        } catch (e) {
	          $reject.call(wrapper, e);
	        }
	      });
	    } else {
	      promise._v = value;
	      promise._s = 1;
	      notify(promise, false);
	    }
	  } catch (e) {
	    $reject.call({ _w: promise, _d: false }, e); // wrap
	  }
	};

	// constructor polyfill
	if (!USE_NATIVE$1) {
	  // 25.4.3.1 Promise(executor)
	  $Promise = function Promise(executor) {
	    _anInstance(this, $Promise, PROMISE, '_h');
	    _aFunction(executor);
	    Internal.call(this);
	    try {
	      executor(_ctx($resolve, this, 1), _ctx($reject, this, 1));
	    } catch (err) {
	      $reject.call(this, err);
	    }
	  };
	  // eslint-disable-next-line no-unused-vars
	  Internal = function Promise(executor) {
	    this._c = [];             // <- awaiting reactions
	    this._a = undefined;      // <- checked in isUnhandled reactions
	    this._s = 0;              // <- state
	    this._d = false;          // <- done
	    this._v = undefined;      // <- value
	    this._h = 0;              // <- rejection state, 0 - default, 1 - handled, 2 - unhandled
	    this._n = false;          // <- notify
	  };
	  Internal.prototype = _redefineAll($Promise.prototype, {
	    // 25.4.5.3 Promise.prototype.then(onFulfilled, onRejected)
	    then: function then(onFulfilled, onRejected) {
	      var reaction = newPromiseCapability(_speciesConstructor(this, $Promise));
	      reaction.ok = typeof onFulfilled == 'function' ? onFulfilled : true;
	      reaction.fail = typeof onRejected == 'function' && onRejected;
	      reaction.domain = isNode ? process$1.domain : undefined;
	      this._c.push(reaction);
	      if (this._a) this._a.push(reaction);
	      if (this._s) notify(this, false);
	      return reaction.promise;
	    },
	    // 25.4.5.1 Promise.prototype.catch(onRejected)
	    'catch': function (onRejected) {
	      return this.then(undefined, onRejected);
	    }
	  });
	  OwnPromiseCapability = function () {
	    var promise = new Internal();
	    this.promise = promise;
	    this.resolve = _ctx($resolve, promise, 1);
	    this.reject = _ctx($reject, promise, 1);
	  };
	  _newPromiseCapability.f = newPromiseCapability = function (C) {
	    return C === $Promise || C === Wrapper
	      ? new OwnPromiseCapability(C)
	      : newGenericPromiseCapability(C);
	  };
	}

	_export(_export.G + _export.W + _export.F * !USE_NATIVE$1, { Promise: $Promise });
	_setToStringTag($Promise, PROMISE);
	_setSpecies(PROMISE);
	Wrapper = _core[PROMISE];

	// statics
	_export(_export.S + _export.F * !USE_NATIVE$1, PROMISE, {
	  // 25.4.4.5 Promise.reject(r)
	  reject: function reject(r) {
	    var capability = newPromiseCapability(this);
	    var $$reject = capability.reject;
	    $$reject(r);
	    return capability.promise;
	  }
	});
	_export(_export.S + _export.F * (_library ), PROMISE, {
	  // 25.4.4.6 Promise.resolve(x)
	  resolve: function resolve(x) {
	    return _promiseResolve(this === Wrapper ? $Promise : this, x);
	  }
	});
	_export(_export.S + _export.F * !(USE_NATIVE$1 && _iterDetect(function (iter) {
	  $Promise.all(iter)['catch'](empty);
	})), PROMISE, {
	  // 25.4.4.1 Promise.all(iterable)
	  all: function all(iterable) {
	    var C = this;
	    var capability = newPromiseCapability(C);
	    var resolve = capability.resolve;
	    var reject = capability.reject;
	    var result = _perform(function () {
	      var values = [];
	      var index = 0;
	      var remaining = 1;
	      _forOf(iterable, false, function (promise) {
	        var $index = index++;
	        var alreadyCalled = false;
	        values.push(undefined);
	        remaining++;
	        C.resolve(promise).then(function (value) {
	          if (alreadyCalled) return;
	          alreadyCalled = true;
	          values[$index] = value;
	          --remaining || resolve(values);
	        }, reject);
	      });
	      --remaining || resolve(values);
	    });
	    if (result.e) reject(result.v);
	    return capability.promise;
	  },
	  // 25.4.4.4 Promise.race(iterable)
	  race: function race(iterable) {
	    var C = this;
	    var capability = newPromiseCapability(C);
	    var reject = capability.reject;
	    var result = _perform(function () {
	      _forOf(iterable, false, function (promise) {
	        C.resolve(promise).then(capability.resolve, reject);
	      });
	    });
	    if (result.e) reject(result.v);
	    return capability.promise;
	  }
	});

	_export(_export.P + _export.R, 'Promise', { 'finally': function (onFinally) {
	  var C = _speciesConstructor(this, _core.Promise || _global.Promise);
	  var isFunction = typeof onFinally == 'function';
	  return this.then(
	    isFunction ? function (x) {
	      return _promiseResolve(C, onFinally()).then(function () { return x; });
	    } : onFinally,
	    isFunction ? function (e) {
	      return _promiseResolve(C, onFinally()).then(function () { throw e; });
	    } : onFinally
	  );
	} });

	// https://github.com/tc39/proposal-promise-try




	_export(_export.S, 'Promise', { 'try': function (callbackfn) {
	  var promiseCapability = _newPromiseCapability.f(this);
	  var result = _perform(callbackfn);
	  (result.e ? promiseCapability.reject : promiseCapability.resolve)(result.v);
	  return promiseCapability.promise;
	} });

	var promise$1 = _core.Promise;

	var promise = createCommonjsModule(function (module) {
	module.exports = { "default": promise$1, __esModule: true };
	});

	var _Promise = unwrapExports(promise);

	var asyncToGenerator = createCommonjsModule(function (module, exports) {

	exports.__esModule = true;



	var _promise2 = _interopRequireDefault(promise);

	function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

	exports.default = function (fn) {
	  return function () {
	    var gen = fn.apply(this, arguments);
	    return new _promise2.default(function (resolve, reject) {
	      function step(key, arg) {
	        try {
	          var info = gen[key](arg);
	          var value = info.value;
	        } catch (error) {
	          reject(error);
	          return;
	        }

	        if (info.done) {
	          resolve(value);
	        } else {
	          return _promise2.default.resolve(value).then(function (value) {
	            step("next", value);
	          }, function (err) {
	            step("throw", err);
	          });
	        }
	      }

	      return step("next");
	    });
	  };
	};
	});

	var _asyncToGenerator = unwrapExports(asyncToGenerator);

	// most Object methods by ES6 should accept primitives



	var _objectSap = function (KEY, exec) {
	  var fn = (_core.Object || {})[KEY] || Object[KEY];
	  var exp = {};
	  exp[KEY] = exec(fn);
	  _export(_export.S + _export.F * _fails(function () { fn(1); }), 'Object', exp);
	};

	// 19.1.2.9 Object.getPrototypeOf(O)



	_objectSap('getPrototypeOf', function () {
	  return function getPrototypeOf(it) {
	    return _objectGpo(_toObject(it));
	  };
	});

	var getPrototypeOf$1 = _core.Object.getPrototypeOf;

	var getPrototypeOf = createCommonjsModule(function (module) {
	module.exports = { "default": getPrototypeOf$1, __esModule: true };
	});

	var _Object$getPrototypeOf = unwrapExports(getPrototypeOf);

	var classCallCheck = createCommonjsModule(function (module, exports) {

	exports.__esModule = true;

	exports.default = function (instance, Constructor) {
	  if (!(instance instanceof Constructor)) {
	    throw new TypeError("Cannot call a class as a function");
	  }
	};
	});

	var _classCallCheck = unwrapExports(classCallCheck);

	// 19.1.2.4 / 15.2.3.6 Object.defineProperty(O, P, Attributes)
	_export(_export.S + _export.F * !_descriptors, 'Object', { defineProperty: _objectDp.f });

	var $Object$2 = _core.Object;
	var defineProperty$3 = function defineProperty(it, key, desc) {
	  return $Object$2.defineProperty(it, key, desc);
	};

	var defineProperty$2 = createCommonjsModule(function (module) {
	module.exports = { "default": defineProperty$3, __esModule: true };
	});

	unwrapExports(defineProperty$2);

	var createClass = createCommonjsModule(function (module, exports) {

	exports.__esModule = true;



	var _defineProperty2 = _interopRequireDefault(defineProperty$2);

	function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

	exports.default = function () {
	  function defineProperties(target, props) {
	    for (var i = 0; i < props.length; i++) {
	      var descriptor = props[i];
	      descriptor.enumerable = descriptor.enumerable || false;
	      descriptor.configurable = true;
	      if ("value" in descriptor) descriptor.writable = true;
	      (0, _defineProperty2.default)(target, descriptor.key, descriptor);
	    }
	  }

	  return function (Constructor, protoProps, staticProps) {
	    if (protoProps) defineProperties(Constructor.prototype, protoProps);
	    if (staticProps) defineProperties(Constructor, staticProps);
	    return Constructor;
	  };
	}();
	});

	var _createClass = unwrapExports(createClass);

	var f$5 = _wks;

	var _wksExt = {
		f: f$5
	};

	var iterator$1 = _wksExt.f('iterator');

	var iterator = createCommonjsModule(function (module) {
	module.exports = { "default": iterator$1, __esModule: true };
	});

	unwrapExports(iterator);

	var _meta = createCommonjsModule(function (module) {
	var META = _uid('meta');


	var setDesc = _objectDp.f;
	var id = 0;
	var isExtensible = Object.isExtensible || function () {
	  return true;
	};
	var FREEZE = !_fails(function () {
	  return isExtensible(Object.preventExtensions({}));
	});
	var setMeta = function (it) {
	  setDesc(it, META, { value: {
	    i: 'O' + ++id, // object ID
	    w: {}          // weak collections IDs
	  } });
	};
	var fastKey = function (it, create) {
	  // return primitive with prefix
	  if (!_isObject(it)) return typeof it == 'symbol' ? it : (typeof it == 'string' ? 'S' : 'P') + it;
	  if (!_has(it, META)) {
	    // can't set metadata to uncaught frozen object
	    if (!isExtensible(it)) return 'F';
	    // not necessary to add metadata
	    if (!create) return 'E';
	    // add missing metadata
	    setMeta(it);
	  // return object ID
	  } return it[META].i;
	};
	var getWeak = function (it, create) {
	  if (!_has(it, META)) {
	    // can't set metadata to uncaught frozen object
	    if (!isExtensible(it)) return true;
	    // not necessary to add metadata
	    if (!create) return false;
	    // add missing metadata
	    setMeta(it);
	  // return hash weak collections IDs
	  } return it[META].w;
	};
	// add metadata on freeze-family methods calling
	var onFreeze = function (it) {
	  if (FREEZE && meta.NEED && isExtensible(it) && !_has(it, META)) setMeta(it);
	  return it;
	};
	var meta = module.exports = {
	  KEY: META,
	  NEED: false,
	  fastKey: fastKey,
	  getWeak: getWeak,
	  onFreeze: onFreeze
	};
	});
	_meta.KEY;
	_meta.NEED;
	_meta.fastKey;
	_meta.getWeak;
	_meta.onFreeze;

	var defineProperty$1 = _objectDp.f;
	var _wksDefine = function (name) {
	  var $Symbol = _core.Symbol || (_core.Symbol = {} );
	  if (name.charAt(0) != '_' && !(name in $Symbol)) defineProperty$1($Symbol, name, { value: _wksExt.f(name) });
	};

	var f$4 = Object.getOwnPropertySymbols;

	var _objectGops = {
		f: f$4
	};

	var f$3 = {}.propertyIsEnumerable;

	var _objectPie = {
		f: f$3
	};

	// all enumerable object keys, includes symbols



	var _enumKeys = function (it) {
	  var result = _objectKeys(it);
	  var getSymbols = _objectGops.f;
	  if (getSymbols) {
	    var symbols = getSymbols(it);
	    var isEnum = _objectPie.f;
	    var i = 0;
	    var key;
	    while (symbols.length > i) if (isEnum.call(it, key = symbols[i++])) result.push(key);
	  } return result;
	};

	// 7.2.2 IsArray(argument)

	var _isArray = Array.isArray || function isArray(arg) {
	  return _cof(arg) == 'Array';
	};

	// 19.1.2.7 / 15.2.3.4 Object.getOwnPropertyNames(O)

	var hiddenKeys = _enumBugKeys.concat('length', 'prototype');

	var f$2 = Object.getOwnPropertyNames || function getOwnPropertyNames(O) {
	  return _objectKeysInternal(O, hiddenKeys);
	};

	var _objectGopn = {
		f: f$2
	};

	// fallback for IE11 buggy Object.getOwnPropertyNames with iframe and window

	var gOPN$1 = _objectGopn.f;
	var toString = {}.toString;

	var windowNames = typeof window == 'object' && window && Object.getOwnPropertyNames
	  ? Object.getOwnPropertyNames(window) : [];

	var getWindowNames = function (it) {
	  try {
	    return gOPN$1(it);
	  } catch (e) {
	    return windowNames.slice();
	  }
	};

	var f$1 = function getOwnPropertyNames(it) {
	  return windowNames && toString.call(it) == '[object Window]' ? getWindowNames(it) : gOPN$1(_toIobject(it));
	};

	var _objectGopnExt = {
		f: f$1
	};

	var gOPD$1 = Object.getOwnPropertyDescriptor;

	var f = _descriptors ? gOPD$1 : function getOwnPropertyDescriptor(O, P) {
	  O = _toIobject(O);
	  P = _toPrimitive(P, true);
	  if (_ie8DomDefine) try {
	    return gOPD$1(O, P);
	  } catch (e) { /* empty */ }
	  if (_has(O, P)) return _propertyDesc(!_objectPie.f.call(O, P), O[P]);
	};

	var _objectGopd = {
		f: f
	};

	// ECMAScript 6 symbols shim





	var META = _meta.KEY;





















	var gOPD = _objectGopd.f;
	var dP = _objectDp.f;
	var gOPN = _objectGopnExt.f;
	var $Symbol = _global.Symbol;
	var $JSON$1 = _global.JSON;
	var _stringify = $JSON$1 && $JSON$1.stringify;
	var PROTOTYPE = 'prototype';
	var HIDDEN = _wks('_hidden');
	var TO_PRIMITIVE = _wks('toPrimitive');
	var isEnum$1 = {}.propertyIsEnumerable;
	var SymbolRegistry = _shared('symbol-registry');
	var AllSymbols = _shared('symbols');
	var OPSymbols = _shared('op-symbols');
	var ObjectProto = Object[PROTOTYPE];
	var USE_NATIVE = typeof $Symbol == 'function' && !!_objectGops.f;
	var QObject = _global.QObject;
	// Don't use setters in Qt Script, https://github.com/zloirock/core-js/issues/173
	var setter = !QObject || !QObject[PROTOTYPE] || !QObject[PROTOTYPE].findChild;

	// fallback for old Android, https://code.google.com/p/v8/issues/detail?id=687
	var setSymbolDesc = _descriptors && _fails(function () {
	  return _objectCreate(dP({}, 'a', {
	    get: function () { return dP(this, 'a', { value: 7 }).a; }
	  })).a != 7;
	}) ? function (it, key, D) {
	  var protoDesc = gOPD(ObjectProto, key);
	  if (protoDesc) delete ObjectProto[key];
	  dP(it, key, D);
	  if (protoDesc && it !== ObjectProto) dP(ObjectProto, key, protoDesc);
	} : dP;

	var wrap = function (tag) {
	  var sym = AllSymbols[tag] = _objectCreate($Symbol[PROTOTYPE]);
	  sym._k = tag;
	  return sym;
	};

	var isSymbol = USE_NATIVE && typeof $Symbol.iterator == 'symbol' ? function (it) {
	  return typeof it == 'symbol';
	} : function (it) {
	  return it instanceof $Symbol;
	};

	var $defineProperty = function defineProperty(it, key, D) {
	  if (it === ObjectProto) $defineProperty(OPSymbols, key, D);
	  _anObject(it);
	  key = _toPrimitive(key, true);
	  _anObject(D);
	  if (_has(AllSymbols, key)) {
	    if (!D.enumerable) {
	      if (!_has(it, HIDDEN)) dP(it, HIDDEN, _propertyDesc(1, {}));
	      it[HIDDEN][key] = true;
	    } else {
	      if (_has(it, HIDDEN) && it[HIDDEN][key]) it[HIDDEN][key] = false;
	      D = _objectCreate(D, { enumerable: _propertyDesc(0, false) });
	    } return setSymbolDesc(it, key, D);
	  } return dP(it, key, D);
	};
	var $defineProperties = function defineProperties(it, P) {
	  _anObject(it);
	  var keys = _enumKeys(P = _toIobject(P));
	  var i = 0;
	  var l = keys.length;
	  var key;
	  while (l > i) $defineProperty(it, key = keys[i++], P[key]);
	  return it;
	};
	var $create = function create(it, P) {
	  return P === undefined ? _objectCreate(it) : $defineProperties(_objectCreate(it), P);
	};
	var $propertyIsEnumerable = function propertyIsEnumerable(key) {
	  var E = isEnum$1.call(this, key = _toPrimitive(key, true));
	  if (this === ObjectProto && _has(AllSymbols, key) && !_has(OPSymbols, key)) return false;
	  return E || !_has(this, key) || !_has(AllSymbols, key) || _has(this, HIDDEN) && this[HIDDEN][key] ? E : true;
	};
	var $getOwnPropertyDescriptor$1 = function getOwnPropertyDescriptor(it, key) {
	  it = _toIobject(it);
	  key = _toPrimitive(key, true);
	  if (it === ObjectProto && _has(AllSymbols, key) && !_has(OPSymbols, key)) return;
	  var D = gOPD(it, key);
	  if (D && _has(AllSymbols, key) && !(_has(it, HIDDEN) && it[HIDDEN][key])) D.enumerable = true;
	  return D;
	};
	var $getOwnPropertyNames = function getOwnPropertyNames(it) {
	  var names = gOPN(_toIobject(it));
	  var result = [];
	  var i = 0;
	  var key;
	  while (names.length > i) {
	    if (!_has(AllSymbols, key = names[i++]) && key != HIDDEN && key != META) result.push(key);
	  } return result;
	};
	var $getOwnPropertySymbols = function getOwnPropertySymbols(it) {
	  var IS_OP = it === ObjectProto;
	  var names = gOPN(IS_OP ? OPSymbols : _toIobject(it));
	  var result = [];
	  var i = 0;
	  var key;
	  while (names.length > i) {
	    if (_has(AllSymbols, key = names[i++]) && (IS_OP ? _has(ObjectProto, key) : true)) result.push(AllSymbols[key]);
	  } return result;
	};

	// 19.4.1.1 Symbol([description])
	if (!USE_NATIVE) {
	  $Symbol = function Symbol() {
	    if (this instanceof $Symbol) throw TypeError('Symbol is not a constructor!');
	    var tag = _uid(arguments.length > 0 ? arguments[0] : undefined);
	    var $set = function (value) {
	      if (this === ObjectProto) $set.call(OPSymbols, value);
	      if (_has(this, HIDDEN) && _has(this[HIDDEN], tag)) this[HIDDEN][tag] = false;
	      setSymbolDesc(this, tag, _propertyDesc(1, value));
	    };
	    if (_descriptors && setter) setSymbolDesc(ObjectProto, tag, { configurable: true, set: $set });
	    return wrap(tag);
	  };
	  _redefine($Symbol[PROTOTYPE], 'toString', function toString() {
	    return this._k;
	  });

	  _objectGopd.f = $getOwnPropertyDescriptor$1;
	  _objectDp.f = $defineProperty;
	  _objectGopn.f = _objectGopnExt.f = $getOwnPropertyNames;
	  _objectPie.f = $propertyIsEnumerable;
	  _objectGops.f = $getOwnPropertySymbols;

	  if (_descriptors && !_library) {
	    _redefine(ObjectProto, 'propertyIsEnumerable', $propertyIsEnumerable);
	  }

	  _wksExt.f = function (name) {
	    return wrap(_wks(name));
	  };
	}

	_export(_export.G + _export.W + _export.F * !USE_NATIVE, { Symbol: $Symbol });

	for (var es6Symbols = (
	  // 19.4.2.2, 19.4.2.3, 19.4.2.4, 19.4.2.6, 19.4.2.8, 19.4.2.9, 19.4.2.10, 19.4.2.11, 19.4.2.12, 19.4.2.13, 19.4.2.14
	  'hasInstance,isConcatSpreadable,iterator,match,replace,search,species,split,toPrimitive,toStringTag,unscopables'
	).split(','), j = 0; es6Symbols.length > j;)_wks(es6Symbols[j++]);

	for (var wellKnownSymbols = _objectKeys(_wks.store), k = 0; wellKnownSymbols.length > k;) _wksDefine(wellKnownSymbols[k++]);

	_export(_export.S + _export.F * !USE_NATIVE, 'Symbol', {
	  // 19.4.2.1 Symbol.for(key)
	  'for': function (key) {
	    return _has(SymbolRegistry, key += '')
	      ? SymbolRegistry[key]
	      : SymbolRegistry[key] = $Symbol(key);
	  },
	  // 19.4.2.5 Symbol.keyFor(sym)
	  keyFor: function keyFor(sym) {
	    if (!isSymbol(sym)) throw TypeError(sym + ' is not a symbol!');
	    for (var key in SymbolRegistry) if (SymbolRegistry[key] === sym) return key;
	  },
	  useSetter: function () { setter = true; },
	  useSimple: function () { setter = false; }
	});

	_export(_export.S + _export.F * !USE_NATIVE, 'Object', {
	  // 19.1.2.2 Object.create(O [, Properties])
	  create: $create,
	  // 19.1.2.4 Object.defineProperty(O, P, Attributes)
	  defineProperty: $defineProperty,
	  // 19.1.2.3 Object.defineProperties(O, Properties)
	  defineProperties: $defineProperties,
	  // 19.1.2.6 Object.getOwnPropertyDescriptor(O, P)
	  getOwnPropertyDescriptor: $getOwnPropertyDescriptor$1,
	  // 19.1.2.7 Object.getOwnPropertyNames(O)
	  getOwnPropertyNames: $getOwnPropertyNames,
	  // 19.1.2.8 Object.getOwnPropertySymbols(O)
	  getOwnPropertySymbols: $getOwnPropertySymbols
	});

	// Chrome 38 and 39 `Object.getOwnPropertySymbols` fails on primitives
	// https://bugs.chromium.org/p/v8/issues/detail?id=3443
	var FAILS_ON_PRIMITIVES = _fails(function () { _objectGops.f(1); });

	_export(_export.S + _export.F * FAILS_ON_PRIMITIVES, 'Object', {
	  getOwnPropertySymbols: function getOwnPropertySymbols(it) {
	    return _objectGops.f(_toObject(it));
	  }
	});

	// 24.3.2 JSON.stringify(value [, replacer [, space]])
	$JSON$1 && _export(_export.S + _export.F * (!USE_NATIVE || _fails(function () {
	  var S = $Symbol();
	  // MS Edge converts symbol values to JSON as {}
	  // WebKit converts symbol values to JSON as null
	  // V8 throws on boxed symbols
	  return _stringify([S]) != '[null]' || _stringify({ a: S }) != '{}' || _stringify(Object(S)) != '{}';
	})), 'JSON', {
	  stringify: function stringify(it) {
	    var args = [it];
	    var i = 1;
	    var replacer, $replacer;
	    while (arguments.length > i) args.push(arguments[i++]);
	    $replacer = replacer = args[1];
	    if (!_isObject(replacer) && it === undefined || isSymbol(it)) return; // IE8 returns string on undefined
	    if (!_isArray(replacer)) replacer = function (key, value) {
	      if (typeof $replacer == 'function') value = $replacer.call(this, key, value);
	      if (!isSymbol(value)) return value;
	    };
	    args[1] = replacer;
	    return _stringify.apply($JSON$1, args);
	  }
	});

	// 19.4.3.4 Symbol.prototype[@@toPrimitive](hint)
	$Symbol[PROTOTYPE][TO_PRIMITIVE] || _hide($Symbol[PROTOTYPE], TO_PRIMITIVE, $Symbol[PROTOTYPE].valueOf);
	// 19.4.3.5 Symbol.prototype[@@toStringTag]
	_setToStringTag($Symbol, 'Symbol');
	// 20.2.1.9 Math[@@toStringTag]
	_setToStringTag(Math, 'Math', true);
	// 24.3.3 JSON[@@toStringTag]
	_setToStringTag(_global.JSON, 'JSON', true);

	_wksDefine('asyncIterator');

	_wksDefine('observable');

	var symbol$1 = _core.Symbol;

	var symbol = createCommonjsModule(function (module) {
	module.exports = { "default": symbol$1, __esModule: true };
	});

	unwrapExports(symbol);

	var _typeof_1 = createCommonjsModule(function (module, exports) {

	exports.__esModule = true;



	var _iterator2 = _interopRequireDefault(iterator);



	var _symbol2 = _interopRequireDefault(symbol);

	var _typeof = typeof _symbol2.default === "function" && typeof _iterator2.default === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof _symbol2.default === "function" && obj.constructor === _symbol2.default && obj !== _symbol2.default.prototype ? "symbol" : typeof obj; };

	function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

	exports.default = typeof _symbol2.default === "function" && _typeof(_iterator2.default) === "symbol" ? function (obj) {
	  return typeof obj === "undefined" ? "undefined" : _typeof(obj);
	} : function (obj) {
	  return obj && typeof _symbol2.default === "function" && obj.constructor === _symbol2.default && obj !== _symbol2.default.prototype ? "symbol" : typeof obj === "undefined" ? "undefined" : _typeof(obj);
	};
	});

	var _typeof = unwrapExports(_typeof_1);

	var possibleConstructorReturn = createCommonjsModule(function (module, exports) {

	exports.__esModule = true;



	var _typeof3 = _interopRequireDefault(_typeof_1);

	function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

	exports.default = function (self, call) {
	  if (!self) {
	    throw new ReferenceError("this hasn't been initialised - super() hasn't been called");
	  }

	  return call && ((typeof call === "undefined" ? "undefined" : (0, _typeof3.default)(call)) === "object" || typeof call === "function") ? call : self;
	};
	});

	var _possibleConstructorReturn = unwrapExports(possibleConstructorReturn);

	// Works with __proto__ only. Old v8 can't work with null proto objects.
	/* eslint-disable no-proto */


	var check = function (O, proto) {
	  _anObject(O);
	  if (!_isObject(proto) && proto !== null) throw TypeError(proto + ": can't set as prototype!");
	};
	var _setProto = {
	  set: Object.setPrototypeOf || ('__proto__' in {} ? // eslint-disable-line
	    function (test, buggy, set) {
	      try {
	        set = _ctx(Function.call, _objectGopd.f(Object.prototype, '__proto__').set, 2);
	        set(test, []);
	        buggy = !(test instanceof Array);
	      } catch (e) { buggy = true; }
	      return function setPrototypeOf(O, proto) {
	        check(O, proto);
	        if (buggy) O.__proto__ = proto;
	        else set(O, proto);
	        return O;
	      };
	    }({}, false) : undefined),
	  check: check
	};

	// 19.1.3.19 Object.setPrototypeOf(O, proto)

	_export(_export.S, 'Object', { setPrototypeOf: _setProto.set });

	var setPrototypeOf$1 = _core.Object.setPrototypeOf;

	var setPrototypeOf = createCommonjsModule(function (module) {
	module.exports = { "default": setPrototypeOf$1, __esModule: true };
	});

	var _Object$setPrototypeOf = unwrapExports(setPrototypeOf);

	// 19.1.2.2 / 15.2.3.5 Object.create(O [, Properties])
	_export(_export.S, 'Object', { create: _objectCreate });

	var $Object$1 = _core.Object;
	var create$1 = function create(P, D) {
	  return $Object$1.create(P, D);
	};

	var create = createCommonjsModule(function (module) {
	module.exports = { "default": create$1, __esModule: true };
	});

	var _Object$create = unwrapExports(create);

	var inherits$1 = createCommonjsModule(function (module, exports) {

	exports.__esModule = true;



	var _setPrototypeOf2 = _interopRequireDefault(setPrototypeOf);



	var _create2 = _interopRequireDefault(create);



	var _typeof3 = _interopRequireDefault(_typeof_1);

	function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

	exports.default = function (subClass, superClass) {
	  if (typeof superClass !== "function" && superClass !== null) {
	    throw new TypeError("Super expression must either be null or a function, not " + (typeof superClass === "undefined" ? "undefined" : (0, _typeof3.default)(superClass)));
	  }

	  subClass.prototype = (0, _create2.default)(superClass && superClass.prototype, {
	    constructor: {
	      value: subClass,
	      enumerable: false,
	      writable: true,
	      configurable: true
	    }
	  });
	  if (superClass) _setPrototypeOf2.default ? (0, _setPrototypeOf2.default)(subClass, superClass) : subClass.__proto__ = superClass;
	};
	});

	var _inherits = unwrapExports(inherits$1);

	var eventemitter3 = createCommonjsModule(function (module) {

	var has = Object.prototype.hasOwnProperty
	  , prefix = '~';

	/**
	 * Constructor to create a storage for our `EE` objects.
	 * An `Events` instance is a plain object whose properties are event names.
	 *
	 * @constructor
	 * @private
	 */
	function Events() {}

	//
	// We try to not inherit from `Object.prototype`. In some engines creating an
	// instance in this way is faster than calling `Object.create(null)` directly.
	// If `Object.create(null)` is not supported we prefix the event names with a
	// character to make sure that the built-in object properties are not
	// overridden or used as an attack vector.
	//
	if (Object.create) {
	  Events.prototype = Object.create(null);

	  //
	  // This hack is needed because the `__proto__` property is still inherited in
	  // some old browsers like Android 4, iPhone 5.1, Opera 11 and Safari 5.
	  //
	  if (!new Events().__proto__) prefix = false;
	}

	/**
	 * Representation of a single event listener.
	 *
	 * @param {Function} fn The listener function.
	 * @param {*} context The context to invoke the listener with.
	 * @param {Boolean} [once=false] Specify if the listener is a one-time listener.
	 * @constructor
	 * @private
	 */
	function EE(fn, context, once) {
	  this.fn = fn;
	  this.context = context;
	  this.once = once || false;
	}

	/**
	 * Add a listener for a given event.
	 *
	 * @param {EventEmitter} emitter Reference to the `EventEmitter` instance.
	 * @param {(String|Symbol)} event The event name.
	 * @param {Function} fn The listener function.
	 * @param {*} context The context to invoke the listener with.
	 * @param {Boolean} once Specify if the listener is a one-time listener.
	 * @returns {EventEmitter}
	 * @private
	 */
	function addListener(emitter, event, fn, context, once) {
	  if (typeof fn !== 'function') {
	    throw new TypeError('The listener must be a function');
	  }

	  var listener = new EE(fn, context || emitter, once)
	    , evt = prefix ? prefix + event : event;

	  if (!emitter._events[evt]) emitter._events[evt] = listener, emitter._eventsCount++;
	  else if (!emitter._events[evt].fn) emitter._events[evt].push(listener);
	  else emitter._events[evt] = [emitter._events[evt], listener];

	  return emitter;
	}

	/**
	 * Clear event by name.
	 *
	 * @param {EventEmitter} emitter Reference to the `EventEmitter` instance.
	 * @param {(String|Symbol)} evt The Event name.
	 * @private
	 */
	function clearEvent(emitter, evt) {
	  if (--emitter._eventsCount === 0) emitter._events = new Events();
	  else delete emitter._events[evt];
	}

	/**
	 * Minimal `EventEmitter` interface that is molded against the Node.js
	 * `EventEmitter` interface.
	 *
	 * @constructor
	 * @public
	 */
	function EventEmitter() {
	  this._events = new Events();
	  this._eventsCount = 0;
	}

	/**
	 * Return an array listing the events for which the emitter has registered
	 * listeners.
	 *
	 * @returns {Array}
	 * @public
	 */
	EventEmitter.prototype.eventNames = function eventNames() {
	  var names = []
	    , events
	    , name;

	  if (this._eventsCount === 0) return names;

	  for (name in (events = this._events)) {
	    if (has.call(events, name)) names.push(prefix ? name.slice(1) : name);
	  }

	  if (Object.getOwnPropertySymbols) {
	    return names.concat(Object.getOwnPropertySymbols(events));
	  }

	  return names;
	};

	/**
	 * Return the listeners registered for a given event.
	 *
	 * @param {(String|Symbol)} event The event name.
	 * @returns {Array} The registered listeners.
	 * @public
	 */
	EventEmitter.prototype.listeners = function listeners(event) {
	  var evt = prefix ? prefix + event : event
	    , handlers = this._events[evt];

	  if (!handlers) return [];
	  if (handlers.fn) return [handlers.fn];

	  for (var i = 0, l = handlers.length, ee = new Array(l); i < l; i++) {
	    ee[i] = handlers[i].fn;
	  }

	  return ee;
	};

	/**
	 * Return the number of listeners listening to a given event.
	 *
	 * @param {(String|Symbol)} event The event name.
	 * @returns {Number} The number of listeners.
	 * @public
	 */
	EventEmitter.prototype.listenerCount = function listenerCount(event) {
	  var evt = prefix ? prefix + event : event
	    , listeners = this._events[evt];

	  if (!listeners) return 0;
	  if (listeners.fn) return 1;
	  return listeners.length;
	};

	/**
	 * Calls each of the listeners registered for a given event.
	 *
	 * @param {(String|Symbol)} event The event name.
	 * @returns {Boolean} `true` if the event had listeners, else `false`.
	 * @public
	 */
	EventEmitter.prototype.emit = function emit(event, a1, a2, a3, a4, a5) {
	  var evt = prefix ? prefix + event : event;

	  if (!this._events[evt]) return false;

	  var listeners = this._events[evt]
	    , len = arguments.length
	    , args
	    , i;

	  if (listeners.fn) {
	    if (listeners.once) this.removeListener(event, listeners.fn, undefined, true);

	    switch (len) {
	      case 1: return listeners.fn.call(listeners.context), true;
	      case 2: return listeners.fn.call(listeners.context, a1), true;
	      case 3: return listeners.fn.call(listeners.context, a1, a2), true;
	      case 4: return listeners.fn.call(listeners.context, a1, a2, a3), true;
	      case 5: return listeners.fn.call(listeners.context, a1, a2, a3, a4), true;
	      case 6: return listeners.fn.call(listeners.context, a1, a2, a3, a4, a5), true;
	    }

	    for (i = 1, args = new Array(len -1); i < len; i++) {
	      args[i - 1] = arguments[i];
	    }

	    listeners.fn.apply(listeners.context, args);
	  } else {
	    var length = listeners.length
	      , j;

	    for (i = 0; i < length; i++) {
	      if (listeners[i].once) this.removeListener(event, listeners[i].fn, undefined, true);

	      switch (len) {
	        case 1: listeners[i].fn.call(listeners[i].context); break;
	        case 2: listeners[i].fn.call(listeners[i].context, a1); break;
	        case 3: listeners[i].fn.call(listeners[i].context, a1, a2); break;
	        case 4: listeners[i].fn.call(listeners[i].context, a1, a2, a3); break;
	        default:
	          if (!args) for (j = 1, args = new Array(len -1); j < len; j++) {
	            args[j - 1] = arguments[j];
	          }

	          listeners[i].fn.apply(listeners[i].context, args);
	      }
	    }
	  }

	  return true;
	};

	/**
	 * Add a listener for a given event.
	 *
	 * @param {(String|Symbol)} event The event name.
	 * @param {Function} fn The listener function.
	 * @param {*} [context=this] The context to invoke the listener with.
	 * @returns {EventEmitter} `this`.
	 * @public
	 */
	EventEmitter.prototype.on = function on(event, fn, context) {
	  return addListener(this, event, fn, context, false);
	};

	/**
	 * Add a one-time listener for a given event.
	 *
	 * @param {(String|Symbol)} event The event name.
	 * @param {Function} fn The listener function.
	 * @param {*} [context=this] The context to invoke the listener with.
	 * @returns {EventEmitter} `this`.
	 * @public
	 */
	EventEmitter.prototype.once = function once(event, fn, context) {
	  return addListener(this, event, fn, context, true);
	};

	/**
	 * Remove the listeners of a given event.
	 *
	 * @param {(String|Symbol)} event The event name.
	 * @param {Function} fn Only remove the listeners that match this function.
	 * @param {*} context Only remove the listeners that have this context.
	 * @param {Boolean} once Only remove one-time listeners.
	 * @returns {EventEmitter} `this`.
	 * @public
	 */
	EventEmitter.prototype.removeListener = function removeListener(event, fn, context, once) {
	  var evt = prefix ? prefix + event : event;

	  if (!this._events[evt]) return this;
	  if (!fn) {
	    clearEvent(this, evt);
	    return this;
	  }

	  var listeners = this._events[evt];

	  if (listeners.fn) {
	    if (
	      listeners.fn === fn &&
	      (!once || listeners.once) &&
	      (!context || listeners.context === context)
	    ) {
	      clearEvent(this, evt);
	    }
	  } else {
	    for (var i = 0, events = [], length = listeners.length; i < length; i++) {
	      if (
	        listeners[i].fn !== fn ||
	        (once && !listeners[i].once) ||
	        (context && listeners[i].context !== context)
	      ) {
	        events.push(listeners[i]);
	      }
	    }

	    //
	    // Reset the array, or remove it completely if we have no more listeners.
	    //
	    if (events.length) this._events[evt] = events.length === 1 ? events[0] : events;
	    else clearEvent(this, evt);
	  }

	  return this;
	};

	/**
	 * Remove all listeners, or those of the specified event.
	 *
	 * @param {(String|Symbol)} [event] The event name.
	 * @returns {EventEmitter} `this`.
	 * @public
	 */
	EventEmitter.prototype.removeAllListeners = function removeAllListeners(event) {
	  var evt;

	  if (event) {
	    evt = prefix ? prefix + event : event;
	    if (this._events[evt]) clearEvent(this, evt);
	  } else {
	    this._events = new Events();
	    this._eventsCount = 0;
	  }

	  return this;
	};

	//
	// Alias methods names because people roll like that.
	//
	EventEmitter.prototype.off = EventEmitter.prototype.removeListener;
	EventEmitter.prototype.addListener = EventEmitter.prototype.on;

	//
	// Expose the prefix.
	//
	EventEmitter.prefixed = prefix;

	//
	// Allow `EventEmitter` to be imported as module namespace.
	//
	EventEmitter.EventEmitter = EventEmitter;

	//
	// Expose the module.
	//
	{
	  module.exports = EventEmitter;
	}
	});

	/**
	 * 接收组枚举
	 * @readonly
	 * @enum {Number}
	 */
	var ReceiverGroup = {
	  /**
	                       * 其他人（除了自己之外的所有人）
	                       */
	  Others: 0,
	  /**
	              * 所有人（包括自己）
	              */
	  All: 1,
	  /**
	           * 主机客户端
	           */
	  MasterClient: 2 };

	var $JSON = _core.JSON || (_core.JSON = { stringify: JSON.stringify });
	var stringify$1 = function stringify(it) { // eslint-disable-line no-unused-vars
	  return $JSON.stringify.apply($JSON, arguments);
	};

	var stringify = createCommonjsModule(function (module) {
	module.exports = { "default": stringify$1, __esModule: true };
	});

	var _JSON$stringify = unwrapExports(stringify);

	var componentEmitter = createCommonjsModule(function (module) {
	/**
	 * Expose `Emitter`.
	 */

	{
	  module.exports = Emitter;
	}

	/**
	 * Initialize a new `Emitter`.
	 *
	 * @api public
	 */

	function Emitter(obj) {
	  if (obj) return mixin(obj);
	}
	/**
	 * Mixin the emitter properties.
	 *
	 * @param {Object} obj
	 * @return {Object}
	 * @api private
	 */

	function mixin(obj) {
	  for (var key in Emitter.prototype) {
	    obj[key] = Emitter.prototype[key];
	  }
	  return obj;
	}

	/**
	 * Listen on the given `event` with `fn`.
	 *
	 * @param {String} event
	 * @param {Function} fn
	 * @return {Emitter}
	 * @api public
	 */

	Emitter.prototype.on =
	Emitter.prototype.addEventListener = function(event, fn){
	  this._callbacks = this._callbacks || {};
	  (this._callbacks['$' + event] = this._callbacks['$' + event] || [])
	    .push(fn);
	  return this;
	};

	/**
	 * Adds an `event` listener that will be invoked a single
	 * time then automatically removed.
	 *
	 * @param {String} event
	 * @param {Function} fn
	 * @return {Emitter}
	 * @api public
	 */

	Emitter.prototype.once = function(event, fn){
	  function on() {
	    this.off(event, on);
	    fn.apply(this, arguments);
	  }

	  on.fn = fn;
	  this.on(event, on);
	  return this;
	};

	/**
	 * Remove the given callback for `event` or all
	 * registered callbacks.
	 *
	 * @param {String} event
	 * @param {Function} fn
	 * @return {Emitter}
	 * @api public
	 */

	Emitter.prototype.off =
	Emitter.prototype.removeListener =
	Emitter.prototype.removeAllListeners =
	Emitter.prototype.removeEventListener = function(event, fn){
	  this._callbacks = this._callbacks || {};

	  // all
	  if (0 == arguments.length) {
	    this._callbacks = {};
	    return this;
	  }

	  // specific event
	  var callbacks = this._callbacks['$' + event];
	  if (!callbacks) return this;

	  // remove all handlers
	  if (1 == arguments.length) {
	    delete this._callbacks['$' + event];
	    return this;
	  }

	  // remove specific handler
	  var cb;
	  for (var i = 0; i < callbacks.length; i++) {
	    cb = callbacks[i];
	    if (cb === fn || cb.fn === fn) {
	      callbacks.splice(i, 1);
	      break;
	    }
	  }

	  // Remove event specific arrays for event types that no
	  // one is subscribed for to avoid memory leak.
	  if (callbacks.length === 0) {
	    delete this._callbacks['$' + event];
	  }

	  return this;
	};

	/**
	 * Emit `event` with the given args.
	 *
	 * @param {String} event
	 * @param {Mixed} ...
	 * @return {Emitter}
	 */

	Emitter.prototype.emit = function(event){
	  this._callbacks = this._callbacks || {};

	  var args = new Array(arguments.length - 1)
	    , callbacks = this._callbacks['$' + event];

	  for (var i = 1; i < arguments.length; i++) {
	    args[i - 1] = arguments[i];
	  }

	  if (callbacks) {
	    callbacks = callbacks.slice(0);
	    for (var i = 0, len = callbacks.length; i < len; ++i) {
	      callbacks[i].apply(this, args);
	    }
	  }

	  return this;
	};

	/**
	 * Return array of callbacks for `event`.
	 *
	 * @param {String} event
	 * @return {Array}
	 * @api public
	 */

	Emitter.prototype.listeners = function(event){
	  this._callbacks = this._callbacks || {};
	  return this._callbacks['$' + event] || [];
	};

	/**
	 * Check if this emitter has `event` handlers.
	 *
	 * @param {String} event
	 * @return {Boolean}
	 * @api public
	 */

	Emitter.prototype.hasListeners = function(event){
	  return !! this.listeners(event).length;
	};
	});

	/**
	 * Check if `obj` is an object.
	 *
	 * @param {Object} obj
	 * @return {Boolean}
	 * @api private
	 */

	function isObject(obj) {
	  return null !== obj && 'object' === typeof obj;
	}

	var isObject_1 = isObject;

	/**
	 * Module of mixed-in functions shared between node and client code
	 */


	/**
	 * Expose `RequestBase`.
	 */

	var requestBase = RequestBase;

	/**
	 * Initialize a new `RequestBase`.
	 *
	 * @api public
	 */

	function RequestBase(obj) {
	  if (obj) return mixin$1(obj);
	}

	/**
	 * Mixin the prototype properties.
	 *
	 * @param {Object} obj
	 * @return {Object}
	 * @api private
	 */

	function mixin$1(obj) {
	  for (var key in RequestBase.prototype) {
	    obj[key] = RequestBase.prototype[key];
	  }
	  return obj;
	}

	/**
	 * Clear previous timeout.
	 *
	 * @return {Request} for chaining
	 * @api public
	 */

	RequestBase.prototype.clearTimeout = function _clearTimeout(){
	  clearTimeout(this._timer);
	  clearTimeout(this._responseTimeoutTimer);
	  delete this._timer;
	  delete this._responseTimeoutTimer;
	  return this;
	};

	/**
	 * Override default response body parser
	 *
	 * This function will be called to convert incoming data into request.body
	 *
	 * @param {Function}
	 * @api public
	 */

	RequestBase.prototype.parse = function parse(fn){
	  this._parser = fn;
	  return this;
	};

	/**
	 * Set format of binary response body.
	 * In browser valid formats are 'blob' and 'arraybuffer',
	 * which return Blob and ArrayBuffer, respectively.
	 *
	 * In Node all values result in Buffer.
	 *
	 * Examples:
	 *
	 *      req.get('/')
	 *        .responseType('blob')
	 *        .end(callback);
	 *
	 * @param {String} val
	 * @return {Request} for chaining
	 * @api public
	 */

	RequestBase.prototype.responseType = function(val){
	  this._responseType = val;
	  return this;
	};

	/**
	 * Override default request body serializer
	 *
	 * This function will be called to convert data set via .send or .attach into payload to send
	 *
	 * @param {Function}
	 * @api public
	 */

	RequestBase.prototype.serialize = function serialize(fn){
	  this._serializer = fn;
	  return this;
	};

	/**
	 * Set timeouts.
	 *
	 * - response timeout is time between sending request and receiving the first byte of the response. Includes DNS and connection time.
	 * - deadline is the time from start of the request to receiving response body in full. If the deadline is too short large files may not load at all on slow connections.
	 *
	 * Value of 0 or false means no timeout.
	 *
	 * @param {Number|Object} ms or {response, deadline}
	 * @return {Request} for chaining
	 * @api public
	 */

	RequestBase.prototype.timeout = function timeout(options){
	  if (!options || 'object' !== typeof options) {
	    this._timeout = options;
	    this._responseTimeout = 0;
	    return this;
	  }

	  for(var option in options) {
	    switch(option) {
	      case 'deadline':
	        this._timeout = options.deadline;
	        break;
	      case 'response':
	        this._responseTimeout = options.response;
	        break;
	      default:
	        console.warn("Unknown timeout option", option);
	    }
	  }
	  return this;
	};

	/**
	 * Set number of retry attempts on error.
	 *
	 * Failed requests will be retried 'count' times if timeout or err.code >= 500.
	 *
	 * @param {Number} count
	 * @param {Function} [fn]
	 * @return {Request} for chaining
	 * @api public
	 */

	RequestBase.prototype.retry = function retry(count, fn){
	  // Default to 1 if no count passed or true
	  if (arguments.length === 0 || count === true) count = 1;
	  if (count <= 0) count = 0;
	  this._maxRetries = count;
	  this._retries = 0;
	  this._retryCallback = fn;
	  return this;
	};

	var ERROR_CODES = [
	  'ECONNRESET',
	  'ETIMEDOUT',
	  'EADDRINFO',
	  'ESOCKETTIMEDOUT'
	];

	/**
	 * Determine if a request should be retried.
	 * (Borrowed from segmentio/superagent-retry)
	 *
	 * @param {Error} err
	 * @param {Response} [res]
	 * @returns {Boolean}
	 */
	RequestBase.prototype._shouldRetry = function(err, res) {
	  if (!this._maxRetries || this._retries++ >= this._maxRetries) {
	    return false;
	  }
	  if (this._retryCallback) {
	    try {
	      var override = this._retryCallback(err, res);
	      if (override === true) return true;
	      if (override === false) return false;
	      // undefined falls back to defaults
	    } catch(e) {
	      console.error(e);
	    }
	  }
	  if (res && res.status && res.status >= 500 && res.status != 501) return true;
	  if (err) {
	    if (err.code && ~ERROR_CODES.indexOf(err.code)) return true;
	    // Superagent timeout
	    if (err.timeout && err.code == 'ECONNABORTED') return true;
	    if (err.crossDomain) return true;
	  }
	  return false;
	};

	/**
	 * Retry request
	 *
	 * @return {Request} for chaining
	 * @api private
	 */

	RequestBase.prototype._retry = function() {

	  this.clearTimeout();

	  // node
	  if (this.req) {
	    this.req = null;
	    this.req = this.request();
	  }

	  this._aborted = false;
	  this.timedout = false;

	  return this._end();
	};

	/**
	 * Promise support
	 *
	 * @param {Function} resolve
	 * @param {Function} [reject]
	 * @return {Request}
	 */

	RequestBase.prototype.then = function then(resolve, reject) {
	  if (!this._fullfilledPromise) {
	    var self = this;
	    if (this._endCalled) {
	      console.warn("Warning: superagent request was sent twice, because both .end() and .then() were called. Never call .end() if you use promises");
	    }
	    this._fullfilledPromise = new Promise(function(innerResolve, innerReject) {
	      self.end(function(err, res) {
	        if (err) innerReject(err);
	        else innerResolve(res);
	      });
	    });
	  }
	  return this._fullfilledPromise.then(resolve, reject);
	};

	RequestBase.prototype['catch'] = function(cb) {
	  return this.then(undefined, cb);
	};

	/**
	 * Allow for extension
	 */

	RequestBase.prototype.use = function use(fn) {
	  fn(this);
	  return this;
	};

	RequestBase.prototype.ok = function(cb) {
	  if ('function' !== typeof cb) throw Error("Callback required");
	  this._okCallback = cb;
	  return this;
	};

	RequestBase.prototype._isResponseOK = function(res) {
	  if (!res) {
	    return false;
	  }

	  if (this._okCallback) {
	    return this._okCallback(res);
	  }

	  return res.status >= 200 && res.status < 300;
	};

	/**
	 * Get request header `field`.
	 * Case-insensitive.
	 *
	 * @param {String} field
	 * @return {String}
	 * @api public
	 */

	RequestBase.prototype.get = function(field){
	  return this._header[field.toLowerCase()];
	};

	/**
	 * Get case-insensitive header `field` value.
	 * This is a deprecated internal API. Use `.get(field)` instead.
	 *
	 * (getHeader is no longer used internally by the superagent code base)
	 *
	 * @param {String} field
	 * @return {String}
	 * @api private
	 * @deprecated
	 */

	RequestBase.prototype.getHeader = RequestBase.prototype.get;

	/**
	 * Set header `field` to `val`, or multiple fields with one object.
	 * Case-insensitive.
	 *
	 * Examples:
	 *
	 *      req.get('/')
	 *        .set('Accept', 'application/json')
	 *        .set('X-API-Key', 'foobar')
	 *        .end(callback);
	 *
	 *      req.get('/')
	 *        .set({ Accept: 'application/json', 'X-API-Key': 'foobar' })
	 *        .end(callback);
	 *
	 * @param {String|Object} field
	 * @param {String} val
	 * @return {Request} for chaining
	 * @api public
	 */

	RequestBase.prototype.set = function(field, val){
	  if (isObject_1(field)) {
	    for (var key in field) {
	      this.set(key, field[key]);
	    }
	    return this;
	  }
	  this._header[field.toLowerCase()] = val;
	  this.header[field] = val;
	  return this;
	};

	/**
	 * Remove header `field`.
	 * Case-insensitive.
	 *
	 * Example:
	 *
	 *      req.get('/')
	 *        .unset('User-Agent')
	 *        .end(callback);
	 *
	 * @param {String} field
	 */
	RequestBase.prototype.unset = function(field){
	  delete this._header[field.toLowerCase()];
	  delete this.header[field];
	  return this;
	};

	/**
	 * Write the field `name` and `val`, or multiple fields with one object
	 * for "multipart/form-data" request bodies.
	 *
	 * ``` js
	 * request.post('/upload')
	 *   .field('foo', 'bar')
	 *   .end(callback);
	 *
	 * request.post('/upload')
	 *   .field({ foo: 'bar', baz: 'qux' })
	 *   .end(callback);
	 * ```
	 *
	 * @param {String|Object} name
	 * @param {String|Blob|File|Buffer|fs.ReadStream} val
	 * @return {Request} for chaining
	 * @api public
	 */
	RequestBase.prototype.field = function(name, val) {
	  // name should be either a string or an object.
	  if (null === name || undefined === name) {
	    throw new Error('.field(name, val) name can not be empty');
	  }

	  if (this._data) {
	    console.error(".field() can't be used if .send() is used. Please use only .send() or only .field() & .attach()");
	  }

	  if (isObject_1(name)) {
	    for (var key in name) {
	      this.field(key, name[key]);
	    }
	    return this;
	  }

	  if (Array.isArray(val)) {
	    for (var i in val) {
	      this.field(name, val[i]);
	    }
	    return this;
	  }

	  // val should be defined now
	  if (null === val || undefined === val) {
	    throw new Error('.field(name, val) val can not be empty');
	  }
	  if ('boolean' === typeof val) {
	    val = '' + val;
	  }
	  this._getFormData().append(name, val);
	  return this;
	};

	/**
	 * Abort the request, and clear potential timeout.
	 *
	 * @return {Request}
	 * @api public
	 */
	RequestBase.prototype.abort = function(){
	  if (this._aborted) {
	    return this;
	  }
	  this._aborted = true;
	  this.xhr && this.xhr.abort(); // browser
	  this.req && this.req.abort(); // node
	  this.clearTimeout();
	  this.emit('abort');
	  return this;
	};

	RequestBase.prototype._auth = function(user, pass, options, base64Encoder) {
	  switch (options.type) {
	    case 'basic':
	      this.set('Authorization', 'Basic ' + base64Encoder(user + ':' + pass));
	      break;

	    case 'auto':
	      this.username = user;
	      this.password = pass;
	      break;

	    case 'bearer': // usage would be .auth(accessToken, { type: 'bearer' })
	      this.set('Authorization', 'Bearer ' + user);
	      break;
	  }
	  return this;
	};

	/**
	 * Enable transmission of cookies with x-domain requests.
	 *
	 * Note that for this to work the origin must not be
	 * using "Access-Control-Allow-Origin" with a wildcard,
	 * and also must set "Access-Control-Allow-Credentials"
	 * to "true".
	 *
	 * @api public
	 */

	RequestBase.prototype.withCredentials = function(on) {
	  // This is browser-only functionality. Node side is no-op.
	  if (on == undefined) on = true;
	  this._withCredentials = on;
	  return this;
	};

	/**
	 * Set the max redirects to `n`. Does noting in browser XHR implementation.
	 *
	 * @param {Number} n
	 * @return {Request} for chaining
	 * @api public
	 */

	RequestBase.prototype.redirects = function(n){
	  this._maxRedirects = n;
	  return this;
	};

	/**
	 * Maximum size of buffered response body, in bytes. Counts uncompressed size.
	 * Default 200MB.
	 *
	 * @param {Number} n
	 * @return {Request} for chaining
	 */
	RequestBase.prototype.maxResponseSize = function(n){
	  if ('number' !== typeof n) {
	    throw TypeError("Invalid argument");
	  }
	  this._maxResponseSize = n;
	  return this;
	};

	/**
	 * Convert to a plain javascript object (not JSON string) of scalar properties.
	 * Note as this method is designed to return a useful non-this value,
	 * it cannot be chained.
	 *
	 * @return {Object} describing method, url, and data of this request
	 * @api public
	 */

	RequestBase.prototype.toJSON = function() {
	  return {
	    method: this.method,
	    url: this.url,
	    data: this._data,
	    headers: this._header,
	  };
	};

	/**
	 * Send `data` as the request body, defaulting the `.type()` to "json" when
	 * an object is given.
	 *
	 * Examples:
	 *
	 *       // manual json
	 *       request.post('/user')
	 *         .type('json')
	 *         .send('{"name":"tj"}')
	 *         .end(callback)
	 *
	 *       // auto json
	 *       request.post('/user')
	 *         .send({ name: 'tj' })
	 *         .end(callback)
	 *
	 *       // manual x-www-form-urlencoded
	 *       request.post('/user')
	 *         .type('form')
	 *         .send('name=tj')
	 *         .end(callback)
	 *
	 *       // auto x-www-form-urlencoded
	 *       request.post('/user')
	 *         .type('form')
	 *         .send({ name: 'tj' })
	 *         .end(callback)
	 *
	 *       // defaults to x-www-form-urlencoded
	 *      request.post('/user')
	 *        .send('name=tobi')
	 *        .send('species=ferret')
	 *        .end(callback)
	 *
	 * @param {String|Object} data
	 * @return {Request} for chaining
	 * @api public
	 */

	RequestBase.prototype.send = function(data){
	  var isObj = isObject_1(data);
	  var type = this._header['content-type'];

	  if (this._formData) {
	    console.error(".send() can't be used if .attach() or .field() is used. Please use only .send() or only .field() & .attach()");
	  }

	  if (isObj && !this._data) {
	    if (Array.isArray(data)) {
	      this._data = [];
	    } else if (!this._isHost(data)) {
	      this._data = {};
	    }
	  } else if (data && this._data && this._isHost(this._data)) {
	    throw Error("Can't merge these send calls");
	  }

	  // merge
	  if (isObj && isObject_1(this._data)) {
	    for (var key in data) {
	      this._data[key] = data[key];
	    }
	  } else if ('string' == typeof data) {
	    // default to x-www-form-urlencoded
	    if (!type) this.type('form');
	    type = this._header['content-type'];
	    if ('application/x-www-form-urlencoded' == type) {
	      this._data = this._data
	        ? this._data + '&' + data
	        : data;
	    } else {
	      this._data = (this._data || '') + data;
	    }
	  } else {
	    this._data = data;
	  }

	  if (!isObj || this._isHost(data)) {
	    return this;
	  }

	  // default to json
	  if (!type) this.type('json');
	  return this;
	};

	/**
	 * Sort `querystring` by the sort function
	 *
	 *
	 * Examples:
	 *
	 *       // default order
	 *       request.get('/user')
	 *         .query('name=Nick')
	 *         .query('search=Manny')
	 *         .sortQuery()
	 *         .end(callback)
	 *
	 *       // customized sort function
	 *       request.get('/user')
	 *         .query('name=Nick')
	 *         .query('search=Manny')
	 *         .sortQuery(function(a, b){
	 *           return a.length - b.length;
	 *         })
	 *         .end(callback)
	 *
	 *
	 * @param {Function} sort
	 * @return {Request} for chaining
	 * @api public
	 */

	RequestBase.prototype.sortQuery = function(sort) {
	  // _sort default to true but otherwise can be a function or boolean
	  this._sort = typeof sort === 'undefined' ? true : sort;
	  return this;
	};

	/**
	 * Compose querystring to append to req.url
	 *
	 * @api private
	 */
	RequestBase.prototype._finalizeQueryString = function(){
	  var query = this._query.join('&');
	  if (query) {
	    this.url += (this.url.indexOf('?') >= 0 ? '&' : '?') + query;
	  }
	  this._query.length = 0; // Makes the call idempotent

	  if (this._sort) {
	    var index = this.url.indexOf('?');
	    if (index >= 0) {
	      var queryArr = this.url.substring(index + 1).split('&');
	      if ('function' === typeof this._sort) {
	        queryArr.sort(this._sort);
	      } else {
	        queryArr.sort();
	      }
	      this.url = this.url.substring(0, index) + '?' + queryArr.join('&');
	    }
	  }
	};

	// For backwards compat only
	RequestBase.prototype._appendQueryString = function() {console.trace("Unsupported");};

	/**
	 * Invoke callback with timeout error.
	 *
	 * @api private
	 */

	RequestBase.prototype._timeoutError = function(reason, timeout, errno){
	  if (this._aborted) {
	    return;
	  }
	  var err = new Error(reason + timeout + 'ms exceeded');
	  err.timeout = timeout;
	  err.code = 'ECONNABORTED';
	  err.errno = errno;
	  this.timedout = true;
	  this.abort();
	  this.callback(err);
	};

	RequestBase.prototype._setTimeouts = function() {
	  var self = this;

	  // deadline
	  if (this._timeout && !this._timer) {
	    this._timer = setTimeout(function(){
	      self._timeoutError('Timeout of ', self._timeout, 'ETIME');
	    }, this._timeout);
	  }
	  // response timeout
	  if (this._responseTimeout && !this._responseTimeoutTimer) {
	    this._responseTimeoutTimer = setTimeout(function(){
	      self._timeoutError('Response timeout of ', self._responseTimeout, 'ETIMEDOUT');
	    }, this._responseTimeout);
	  }
	};

	/**
	 * Return the mime type for the given `str`.
	 *
	 * @param {String} str
	 * @return {String}
	 * @api private
	 */

	var type = function(str){
	  return str.split(/ *; */).shift();
	};

	/**
	 * Return header field parameters.
	 *
	 * @param {String} str
	 * @return {Object}
	 * @api private
	 */

	var params = function(str){
	  return str.split(/ *; */).reduce(function(obj, str){
	    var parts = str.split(/ *= */);
	    var key = parts.shift();
	    var val = parts.shift();

	    if (key && val) obj[key] = val;
	    return obj;
	  }, {});
	};

	/**
	 * Parse Link header fields.
	 *
	 * @param {String} str
	 * @return {Object}
	 * @api private
	 */

	var parseLinks = function(str){
	  return str.split(/ *, */).reduce(function(obj, str){
	    var parts = str.split(/ *; */);
	    var url = parts[0].slice(1, -1);
	    var rel = parts[1].split(/ *= */)[1].slice(1, -1);
	    obj[rel] = url;
	    return obj;
	  }, {});
	};

	/**
	 * Strip content related fields from `header`.
	 *
	 * @param {Object} header
	 * @return {Object} header
	 * @api private
	 */

	var cleanHeader = function(header, changesOrigin){
	  delete header['content-type'];
	  delete header['content-length'];
	  delete header['transfer-encoding'];
	  delete header['host'];
	  // secuirty
	  if (changesOrigin) {
	    delete header['authorization'];
	    delete header['cookie'];
	  }
	  return header;
	};

	var utils = {
		type: type,
		params: params,
		parseLinks: parseLinks,
		cleanHeader: cleanHeader
	};

	/**
	 * Module dependencies.
	 */



	/**
	 * Expose `ResponseBase`.
	 */

	var responseBase = ResponseBase;

	/**
	 * Initialize a new `ResponseBase`.
	 *
	 * @api public
	 */

	function ResponseBase(obj) {
	  if (obj) return mixin(obj);
	}

	/**
	 * Mixin the prototype properties.
	 *
	 * @param {Object} obj
	 * @return {Object}
	 * @api private
	 */

	function mixin(obj) {
	  for (var key in ResponseBase.prototype) {
	    obj[key] = ResponseBase.prototype[key];
	  }
	  return obj;
	}

	/**
	 * Get case-insensitive `field` value.
	 *
	 * @param {String} field
	 * @return {String}
	 * @api public
	 */

	ResponseBase.prototype.get = function(field) {
	  return this.header[field.toLowerCase()];
	};

	/**
	 * Set header related properties:
	 *
	 *   - `.type` the content type without params
	 *
	 * A response of "Content-Type: text/plain; charset=utf-8"
	 * will provide you with a `.type` of "text/plain".
	 *
	 * @param {Object} header
	 * @api private
	 */

	ResponseBase.prototype._setHeaderProperties = function(header){
	    // TODO: moar!
	    // TODO: make this a util

	    // content-type
	    var ct = header['content-type'] || '';
	    this.type = utils.type(ct);

	    // params
	    var params = utils.params(ct);
	    for (var key in params) this[key] = params[key];

	    this.links = {};

	    // links
	    try {
	        if (header.link) {
	            this.links = utils.parseLinks(header.link);
	        }
	    } catch (err) {
	        // ignore
	    }
	};

	/**
	 * Set flags such as `.ok` based on `status`.
	 *
	 * For example a 2xx response will give you a `.ok` of __true__
	 * whereas 5xx will be __false__ and `.error` will be __true__. The
	 * `.clientError` and `.serverError` are also available to be more
	 * specific, and `.statusType` is the class of error ranging from 1..5
	 * sometimes useful for mapping respond colors etc.
	 *
	 * "sugar" properties are also defined for common cases. Currently providing:
	 *
	 *   - .noContent
	 *   - .badRequest
	 *   - .unauthorized
	 *   - .notAcceptable
	 *   - .notFound
	 *
	 * @param {Number} status
	 * @api private
	 */

	ResponseBase.prototype._setStatusProperties = function(status){
	    var type = status / 100 | 0;

	    // status / class
	    this.status = this.statusCode = status;
	    this.statusType = type;

	    // basics
	    this.info = 1 == type;
	    this.ok = 2 == type;
	    this.redirect = 3 == type;
	    this.clientError = 4 == type;
	    this.serverError = 5 == type;
	    this.error = (4 == type || 5 == type)
	        ? this.toError()
	        : false;

	    // sugar
	    this.created = 201 == status;
	    this.accepted = 202 == status;
	    this.noContent = 204 == status;
	    this.badRequest = 400 == status;
	    this.unauthorized = 401 == status;
	    this.notAcceptable = 406 == status;
	    this.forbidden = 403 == status;
	    this.notFound = 404 == status;
	    this.unprocessableEntity = 422 == status;
	};

	function Agent() {
	  this._defaults = [];
	}

	["use", "on", "once", "set", "query", "type", "accept", "auth", "withCredentials", "sortQuery", "retry", "ok", "redirects",
	 "timeout", "buffer", "serialize", "parse", "ca", "key", "pfx", "cert"].forEach(function(fn) {
	  /** Default setting for all requests from this agent */
	  Agent.prototype[fn] = function(/*varargs*/) {
	    this._defaults.push({fn:fn, arguments:arguments});
	    return this;
	  };
	});

	Agent.prototype._setDefaults = function(req) {
	    this._defaults.forEach(function(def) {
	      req[def.fn].apply(req, def.arguments);
	    });
	};

	var agentBase = Agent;

	var client = createCommonjsModule(function (module, exports) {
	/**
	 * Root reference for iframes.
	 */

	var root;
	if (typeof window !== 'undefined') { // Browser window
	  root = window;
	} else if (typeof self !== 'undefined') { // Web Worker
	  root = self;
	} else { // Other environments
	  console.warn("Using browser-only version of superagent in non-browser environment");
	  root = commonjsGlobal;
	}







	/**
	 * Noop.
	 */

	function noop(){}
	/**
	 * Expose `request`.
	 */

	var request = exports = module.exports = function(method, url) {
	  // callback
	  if ('function' == typeof url) {
	    return new exports.Request('GET', method).end(url);
	  }

	  // url first
	  if (1 == arguments.length) {
	    return new exports.Request('GET', method);
	  }

	  return new exports.Request(method, url);
	};

	exports.Request = Request;

	/**
	 * Determine XHR.
	 */

	request.getXHR = function () {
	  if (root.XMLHttpRequest
	      && (!root.location || 'file:' != root.location.protocol
	          || !root.ActiveXObject)) {
	    return new XMLHttpRequest;
	  } else {
	    try { return new ActiveXObject('Microsoft.XMLHTTP'); } catch(e) {}
	    try { return new ActiveXObject('Msxml2.XMLHTTP.6.0'); } catch(e) {}
	    try { return new ActiveXObject('Msxml2.XMLHTTP.3.0'); } catch(e) {}
	    try { return new ActiveXObject('Msxml2.XMLHTTP'); } catch(e) {}
	  }
	  throw Error("Browser-only version of superagent could not find XHR");
	};

	/**
	 * Removes leading and trailing whitespace, added to support IE.
	 *
	 * @param {String} s
	 * @return {String}
	 * @api private
	 */

	var trim = ''.trim
	  ? function(s) { return s.trim(); }
	  : function(s) { return s.replace(/(^\s*|\s*$)/g, ''); };

	/**
	 * Serialize the given `obj`.
	 *
	 * @param {Object} obj
	 * @return {String}
	 * @api private
	 */

	function serialize(obj) {
	  if (!isObject_1(obj)) return obj;
	  var pairs = [];
	  for (var key in obj) {
	    pushEncodedKeyValuePair(pairs, key, obj[key]);
	  }
	  return pairs.join('&');
	}

	/**
	 * Helps 'serialize' with serializing arrays.
	 * Mutates the pairs array.
	 *
	 * @param {Array} pairs
	 * @param {String} key
	 * @param {Mixed} val
	 */

	function pushEncodedKeyValuePair(pairs, key, val) {
	  if (val != null) {
	    if (Array.isArray(val)) {
	      val.forEach(function(v) {
	        pushEncodedKeyValuePair(pairs, key, v);
	      });
	    } else if (isObject_1(val)) {
	      for(var subkey in val) {
	        pushEncodedKeyValuePair(pairs, key + '[' + subkey + ']', val[subkey]);
	      }
	    } else {
	      pairs.push(encodeURIComponent(key)
	        + '=' + encodeURIComponent(val));
	    }
	  } else if (val === null) {
	    pairs.push(encodeURIComponent(key));
	  }
	}

	/**
	 * Expose serialization method.
	 */

	request.serializeObject = serialize;

	/**
	  * Parse the given x-www-form-urlencoded `str`.
	  *
	  * @param {String} str
	  * @return {Object}
	  * @api private
	  */

	function parseString(str) {
	  var obj = {};
	  var pairs = str.split('&');
	  var pair;
	  var pos;

	  for (var i = 0, len = pairs.length; i < len; ++i) {
	    pair = pairs[i];
	    pos = pair.indexOf('=');
	    if (pos == -1) {
	      obj[decodeURIComponent(pair)] = '';
	    } else {
	      obj[decodeURIComponent(pair.slice(0, pos))] =
	        decodeURIComponent(pair.slice(pos + 1));
	    }
	  }

	  return obj;
	}

	/**
	 * Expose parser.
	 */

	request.parseString = parseString;

	/**
	 * Default MIME type map.
	 *
	 *     superagent.types.xml = 'application/xml';
	 *
	 */

	request.types = {
	  html: 'text/html',
	  json: 'application/json',
	  xml: 'text/xml',
	  urlencoded: 'application/x-www-form-urlencoded',
	  'form': 'application/x-www-form-urlencoded',
	  'form-data': 'application/x-www-form-urlencoded'
	};

	/**
	 * Default serialization map.
	 *
	 *     superagent.serialize['application/xml'] = function(obj){
	 *       return 'generated xml here';
	 *     };
	 *
	 */

	request.serialize = {
	  'application/x-www-form-urlencoded': serialize,
	  'application/json': JSON.stringify
	};

	/**
	  * Default parsers.
	  *
	  *     superagent.parse['application/xml'] = function(str){
	  *       return { object parsed from str };
	  *     };
	  *
	  */

	request.parse = {
	  'application/x-www-form-urlencoded': parseString,
	  'application/json': JSON.parse
	};

	/**
	 * Parse the given header `str` into
	 * an object containing the mapped fields.
	 *
	 * @param {String} str
	 * @return {Object}
	 * @api private
	 */

	function parseHeader(str) {
	  var lines = str.split(/\r?\n/);
	  var fields = {};
	  var index;
	  var line;
	  var field;
	  var val;

	  for (var i = 0, len = lines.length; i < len; ++i) {
	    line = lines[i];
	    index = line.indexOf(':');
	    if (index === -1) { // could be empty line, just skip it
	      continue;
	    }
	    field = line.slice(0, index).toLowerCase();
	    val = trim(line.slice(index + 1));
	    fields[field] = val;
	  }

	  return fields;
	}

	/**
	 * Check if `mime` is json or has +json structured syntax suffix.
	 *
	 * @param {String} mime
	 * @return {Boolean}
	 * @api private
	 */

	function isJSON(mime) {
	  // should match /json or +json
	  // but not /json-seq
	  return /[\/+]json($|[^-\w])/.test(mime);
	}

	/**
	 * Initialize a new `Response` with the given `xhr`.
	 *
	 *  - set flags (.ok, .error, etc)
	 *  - parse header
	 *
	 * Examples:
	 *
	 *  Aliasing `superagent` as `request` is nice:
	 *
	 *      request = superagent;
	 *
	 *  We can use the promise-like API, or pass callbacks:
	 *
	 *      request.get('/').end(function(res){});
	 *      request.get('/', function(res){});
	 *
	 *  Sending data can be chained:
	 *
	 *      request
	 *        .post('/user')
	 *        .send({ name: 'tj' })
	 *        .end(function(res){});
	 *
	 *  Or passed to `.send()`:
	 *
	 *      request
	 *        .post('/user')
	 *        .send({ name: 'tj' }, function(res){});
	 *
	 *  Or passed to `.post()`:
	 *
	 *      request
	 *        .post('/user', { name: 'tj' })
	 *        .end(function(res){});
	 *
	 * Or further reduced to a single call for simple cases:
	 *
	 *      request
	 *        .post('/user', { name: 'tj' }, function(res){});
	 *
	 * @param {XMLHTTPRequest} xhr
	 * @param {Object} options
	 * @api private
	 */

	function Response(req) {
	  this.req = req;
	  this.xhr = this.req.xhr;
	  // responseText is accessible only if responseType is '' or 'text' and on older browsers
	  this.text = ((this.req.method !='HEAD' && (this.xhr.responseType === '' || this.xhr.responseType === 'text')) || typeof this.xhr.responseType === 'undefined')
	     ? this.xhr.responseText
	     : null;
	  this.statusText = this.req.xhr.statusText;
	  var status = this.xhr.status;
	  // handle IE9 bug: http://stackoverflow.com/questions/10046972/msie-returns-status-code-of-1223-for-ajax-request
	  if (status === 1223) {
	    status = 204;
	  }
	  this._setStatusProperties(status);
	  this.header = this.headers = parseHeader(this.xhr.getAllResponseHeaders());
	  // getAllResponseHeaders sometimes falsely returns "" for CORS requests, but
	  // getResponseHeader still works. so we get content-type even if getting
	  // other headers fails.
	  this.header['content-type'] = this.xhr.getResponseHeader('content-type');
	  this._setHeaderProperties(this.header);

	  if (null === this.text && req._responseType) {
	    this.body = this.xhr.response;
	  } else {
	    this.body = this.req.method != 'HEAD'
	      ? this._parseBody(this.text ? this.text : this.xhr.response)
	      : null;
	  }
	}

	responseBase(Response.prototype);

	/**
	 * Parse the given body `str`.
	 *
	 * Used for auto-parsing of bodies. Parsers
	 * are defined on the `superagent.parse` object.
	 *
	 * @param {String} str
	 * @return {Mixed}
	 * @api private
	 */

	Response.prototype._parseBody = function(str) {
	  var parse = request.parse[this.type];
	  if (this.req._parser) {
	    return this.req._parser(this, str);
	  }
	  if (!parse && isJSON(this.type)) {
	    parse = request.parse['application/json'];
	  }
	  return parse && str && (str.length || str instanceof Object)
	    ? parse(str)
	    : null;
	};

	/**
	 * Return an `Error` representative of this response.
	 *
	 * @return {Error}
	 * @api public
	 */

	Response.prototype.toError = function(){
	  var req = this.req;
	  var method = req.method;
	  var url = req.url;

	  var msg = 'cannot ' + method + ' ' + url + ' (' + this.status + ')';
	  var err = new Error(msg);
	  err.status = this.status;
	  err.method = method;
	  err.url = url;

	  return err;
	};

	/**
	 * Expose `Response`.
	 */

	request.Response = Response;

	/**
	 * Initialize a new `Request` with the given `method` and `url`.
	 *
	 * @param {String} method
	 * @param {String} url
	 * @api public
	 */

	function Request(method, url) {
	  var self = this;
	  this._query = this._query || [];
	  this.method = method;
	  this.url = url;
	  this.header = {}; // preserves header name case
	  this._header = {}; // coerces header names to lowercase
	  this.on('end', function(){
	    var err = null;
	    var res = null;

	    try {
	      res = new Response(self);
	    } catch(e) {
	      err = new Error('Parser is unable to parse the response');
	      err.parse = true;
	      err.original = e;
	      // issue #675: return the raw response if the response parsing fails
	      if (self.xhr) {
	        // ie9 doesn't have 'response' property
	        err.rawResponse = typeof self.xhr.responseType == 'undefined' ? self.xhr.responseText : self.xhr.response;
	        // issue #876: return the http status code if the response parsing fails
	        err.status = self.xhr.status ? self.xhr.status : null;
	        err.statusCode = err.status; // backwards-compat only
	      } else {
	        err.rawResponse = null;
	        err.status = null;
	      }

	      return self.callback(err);
	    }

	    self.emit('response', res);

	    var new_err;
	    try {
	      if (!self._isResponseOK(res)) {
	        new_err = new Error(res.statusText || 'Unsuccessful HTTP response');
	      }
	    } catch(custom_err) {
	      new_err = custom_err; // ok() callback can throw
	    }

	    // #1000 don't catch errors from the callback to avoid double calling it
	    if (new_err) {
	      new_err.original = err;
	      new_err.response = res;
	      new_err.status = res.status;
	      self.callback(new_err, res);
	    } else {
	      self.callback(null, res);
	    }
	  });
	}

	/**
	 * Mixin `Emitter` and `RequestBase`.
	 */

	componentEmitter(Request.prototype);
	requestBase(Request.prototype);

	/**
	 * Set Content-Type to `type`, mapping values from `request.types`.
	 *
	 * Examples:
	 *
	 *      superagent.types.xml = 'application/xml';
	 *
	 *      request.post('/')
	 *        .type('xml')
	 *        .send(xmlstring)
	 *        .end(callback);
	 *
	 *      request.post('/')
	 *        .type('application/xml')
	 *        .send(xmlstring)
	 *        .end(callback);
	 *
	 * @param {String} type
	 * @return {Request} for chaining
	 * @api public
	 */

	Request.prototype.type = function(type){
	  this.set('Content-Type', request.types[type] || type);
	  return this;
	};

	/**
	 * Set Accept to `type`, mapping values from `request.types`.
	 *
	 * Examples:
	 *
	 *      superagent.types.json = 'application/json';
	 *
	 *      request.get('/agent')
	 *        .accept('json')
	 *        .end(callback);
	 *
	 *      request.get('/agent')
	 *        .accept('application/json')
	 *        .end(callback);
	 *
	 * @param {String} accept
	 * @return {Request} for chaining
	 * @api public
	 */

	Request.prototype.accept = function(type){
	  this.set('Accept', request.types[type] || type);
	  return this;
	};

	/**
	 * Set Authorization field value with `user` and `pass`.
	 *
	 * @param {String} user
	 * @param {String} [pass] optional in case of using 'bearer' as type
	 * @param {Object} options with 'type' property 'auto', 'basic' or 'bearer' (default 'basic')
	 * @return {Request} for chaining
	 * @api public
	 */

	Request.prototype.auth = function(user, pass, options){
	  if (1 === arguments.length) pass = '';
	  if (typeof pass === 'object' && pass !== null) { // pass is optional and can be replaced with options
	    options = pass;
	    pass = '';
	  }
	  if (!options) {
	    options = {
	      type: 'function' === typeof btoa ? 'basic' : 'auto',
	    };
	  }

	  var encoder = function(string) {
	    if ('function' === typeof btoa) {
	      return btoa(string);
	    }
	    throw new Error('Cannot use basic auth, btoa is not a function');
	  };

	  return this._auth(user, pass, options, encoder);
	};

	/**
	 * Add query-string `val`.
	 *
	 * Examples:
	 *
	 *   request.get('/shoes')
	 *     .query('size=10')
	 *     .query({ color: 'blue' })
	 *
	 * @param {Object|String} val
	 * @return {Request} for chaining
	 * @api public
	 */

	Request.prototype.query = function(val){
	  if ('string' != typeof val) val = serialize(val);
	  if (val) this._query.push(val);
	  return this;
	};

	/**
	 * Queue the given `file` as an attachment to the specified `field`,
	 * with optional `options` (or filename).
	 *
	 * ``` js
	 * request.post('/upload')
	 *   .attach('content', new Blob(['<a id="a"><b id="b">hey!</b></a>'], { type: "text/html"}))
	 *   .end(callback);
	 * ```
	 *
	 * @param {String} field
	 * @param {Blob|File} file
	 * @param {String|Object} options
	 * @return {Request} for chaining
	 * @api public
	 */

	Request.prototype.attach = function(field, file, options){
	  if (file) {
	    if (this._data) {
	      throw Error("superagent can't mix .send() and .attach()");
	    }

	    this._getFormData().append(field, file, options || file.name);
	  }
	  return this;
	};

	Request.prototype._getFormData = function(){
	  if (!this._formData) {
	    this._formData = new root.FormData();
	  }
	  return this._formData;
	};

	/**
	 * Invoke the callback with `err` and `res`
	 * and handle arity check.
	 *
	 * @param {Error} err
	 * @param {Response} res
	 * @api private
	 */

	Request.prototype.callback = function(err, res){
	  if (this._shouldRetry(err, res)) {
	    return this._retry();
	  }

	  var fn = this._callback;
	  this.clearTimeout();

	  if (err) {
	    if (this._maxRetries) err.retries = this._retries - 1;
	    this.emit('error', err);
	  }

	  fn(err, res);
	};

	/**
	 * Invoke callback with x-domain error.
	 *
	 * @api private
	 */

	Request.prototype.crossDomainError = function(){
	  var err = new Error('Request has been terminated\nPossible causes: the network is offline, Origin is not allowed by Access-Control-Allow-Origin, the page is being unloaded, etc.');
	  err.crossDomain = true;

	  err.status = this.status;
	  err.method = this.method;
	  err.url = this.url;

	  this.callback(err);
	};

	// This only warns, because the request is still likely to work
	Request.prototype.buffer = Request.prototype.ca = Request.prototype.agent = function(){
	  console.warn("This is not supported in browser version of superagent");
	  return this;
	};

	// This throws, because it can't send/receive data as expected
	Request.prototype.pipe = Request.prototype.write = function(){
	  throw Error("Streaming is not supported in browser version of superagent");
	};

	/**
	 * Check if `obj` is a host object,
	 * we don't want to serialize these :)
	 *
	 * @param {Object} obj
	 * @return {Boolean}
	 * @api private
	 */
	Request.prototype._isHost = function _isHost(obj) {
	  // Native objects stringify to [object File], [object Blob], [object FormData], etc.
	  return obj && 'object' === typeof obj && !Array.isArray(obj) && Object.prototype.toString.call(obj) !== '[object Object]';
	};

	/**
	 * Initiate request, invoking callback `fn(res)`
	 * with an instanceof `Response`.
	 *
	 * @param {Function} fn
	 * @return {Request} for chaining
	 * @api public
	 */

	Request.prototype.end = function(fn){
	  if (this._endCalled) {
	    console.warn("Warning: .end() was called twice. This is not supported in superagent");
	  }
	  this._endCalled = true;

	  // store callback
	  this._callback = fn || noop;

	  // querystring
	  this._finalizeQueryString();

	  return this._end();
	};

	Request.prototype._end = function() {
	  var self = this;
	  var xhr = (this.xhr = request.getXHR());
	  var data = this._formData || this._data;

	  this._setTimeouts();

	  // state change
	  xhr.onreadystatechange = function(){
	    var readyState = xhr.readyState;
	    if (readyState >= 2 && self._responseTimeoutTimer) {
	      clearTimeout(self._responseTimeoutTimer);
	    }
	    if (4 != readyState) {
	      return;
	    }

	    // In IE9, reads to any property (e.g. status) off of an aborted XHR will
	    // result in the error "Could not complete the operation due to error c00c023f"
	    var status;
	    try { status = xhr.status; } catch(e) { status = 0; }

	    if (!status) {
	      if (self.timedout || self._aborted) return;
	      return self.crossDomainError();
	    }
	    self.emit('end');
	  };

	  // progress
	  var handleProgress = function(direction, e) {
	    if (e.total > 0) {
	      e.percent = e.loaded / e.total * 100;
	    }
	    e.direction = direction;
	    self.emit('progress', e);
	  };
	  if (this.hasListeners('progress')) {
	    try {
	      xhr.onprogress = handleProgress.bind(null, 'download');
	      if (xhr.upload) {
	        xhr.upload.onprogress = handleProgress.bind(null, 'upload');
	      }
	    } catch(e) {
	      // Accessing xhr.upload fails in IE from a web worker, so just pretend it doesn't exist.
	      // Reported here:
	      // https://connect.microsoft.com/IE/feedback/details/837245/xmlhttprequest-upload-throws-invalid-argument-when-used-from-web-worker-context
	    }
	  }

	  // initiate request
	  try {
	    if (this.username && this.password) {
	      xhr.open(this.method, this.url, true, this.username, this.password);
	    } else {
	      xhr.open(this.method, this.url, true);
	    }
	  } catch (err) {
	    // see #1149
	    return this.callback(err);
	  }

	  // CORS
	  if (this._withCredentials) xhr.withCredentials = true;

	  // body
	  if (!this._formData && 'GET' != this.method && 'HEAD' != this.method && 'string' != typeof data && !this._isHost(data)) {
	    // serialize stuff
	    var contentType = this._header['content-type'];
	    var serialize = this._serializer || request.serialize[contentType ? contentType.split(';')[0] : ''];
	    if (!serialize && isJSON(contentType)) {
	      serialize = request.serialize['application/json'];
	    }
	    if (serialize) data = serialize(data);
	  }

	  // set header fields
	  for (var field in this.header) {
	    if (null == this.header[field]) continue;

	    if (this.header.hasOwnProperty(field))
	      xhr.setRequestHeader(field, this.header[field]);
	  }

	  if (this._responseType) {
	    xhr.responseType = this._responseType;
	  }

	  // send stuff
	  this.emit('request', this);

	  // IE11 xhr.send(undefined) sends 'undefined' string as POST payload (instead of nothing)
	  // We need null here if data is undefined
	  xhr.send(typeof data !== 'undefined' ? data : null);
	  return this;
	};

	request.agent = function() {
	  return new agentBase();
	};

	["GET", "POST", "OPTIONS", "PATCH", "PUT", "DELETE"].forEach(function(method) {
	  agentBase.prototype[method.toLowerCase()] = function(url, fn) {
	    var req = new request.Request(method, url);
	    this._setDefaults(req);
	    if (fn) {
	      req.end(fn);
	    }
	    return req;
	  };
	});

	agentBase.prototype.del = agentBase.prototype['delete'];

	/**
	 * GET `url` with optional callback `fn(res)`.
	 *
	 * @param {String} url
	 * @param {Mixed|Function} [data] or fn
	 * @param {Function} [fn]
	 * @return {Request}
	 * @api public
	 */

	request.get = function(url, data, fn) {
	  var req = request('GET', url);
	  if ('function' == typeof data) (fn = data), (data = null);
	  if (data) req.query(data);
	  if (fn) req.end(fn);
	  return req;
	};

	/**
	 * HEAD `url` with optional callback `fn(res)`.
	 *
	 * @param {String} url
	 * @param {Mixed|Function} [data] or fn
	 * @param {Function} [fn]
	 * @return {Request}
	 * @api public
	 */

	request.head = function(url, data, fn) {
	  var req = request('HEAD', url);
	  if ('function' == typeof data) (fn = data), (data = null);
	  if (data) req.query(data);
	  if (fn) req.end(fn);
	  return req;
	};

	/**
	 * OPTIONS query to `url` with optional callback `fn(res)`.
	 *
	 * @param {String} url
	 * @param {Mixed|Function} [data] or fn
	 * @param {Function} [fn]
	 * @return {Request}
	 * @api public
	 */

	request.options = function(url, data, fn) {
	  var req = request('OPTIONS', url);
	  if ('function' == typeof data) (fn = data), (data = null);
	  if (data) req.send(data);
	  if (fn) req.end(fn);
	  return req;
	};

	/**
	 * DELETE `url` with optional `data` and callback `fn(res)`.
	 *
	 * @param {String} url
	 * @param {Mixed} [data]
	 * @param {Function} [fn]
	 * @return {Request}
	 * @api public
	 */

	function del(url, data, fn) {
	  var req = request('DELETE', url);
	  if ('function' == typeof data) (fn = data), (data = null);
	  if (data) req.send(data);
	  if (fn) req.end(fn);
	  return req;
	}

	request['del'] = del;
	request['delete'] = del;

	/**
	 * PATCH `url` with optional `data` and callback `fn(res)`.
	 *
	 * @param {String} url
	 * @param {Mixed} [data]
	 * @param {Function} [fn]
	 * @return {Request}
	 * @api public
	 */

	request.patch = function(url, data, fn) {
	  var req = request('PATCH', url);
	  if ('function' == typeof data) (fn = data), (data = null);
	  if (data) req.send(data);
	  if (fn) req.end(fn);
	  return req;
	};

	/**
	 * POST `url` with optional `data` and callback `fn(res)`.
	 *
	 * @param {String} url
	 * @param {Mixed} [data]
	 * @param {Function} [fn]
	 * @return {Request}
	 * @api public
	 */

	request.post = function(url, data, fn) {
	  var req = request('POST', url);
	  if ('function' == typeof data) (fn = data), (data = null);
	  if (data) req.send(data);
	  if (fn) req.end(fn);
	  return req;
	};

	/**
	 * PUT `url` with optional `data` and callback `fn(res)`.
	 *
	 * @param {String} url
	 * @param {Mixed|Function} [data] or fn
	 * @param {Function} [fn]
	 * @return {Request}
	 * @api public
	 */

	request.put = function(url, data, fn) {
	  var req = request('PUT', url);
	  if ('function' == typeof data) (fn = data), (data = null);
	  if (data) req.send(data);
	  if (fn) req.end(fn);
	  return req;
	};
	});
	client.Request;

	// 19.1.2.1 Object.assign(target, source, ...)






	var $assign = Object.assign;

	// should work with symbols and should have deterministic property order (V8 bug)
	var _objectAssign = !$assign || _fails(function () {
	  var A = {};
	  var B = {};
	  // eslint-disable-next-line no-undef
	  var S = Symbol();
	  var K = 'abcdefghijklmnopqrst';
	  A[S] = 7;
	  K.split('').forEach(function (k) { B[k] = k; });
	  return $assign({}, A)[S] != 7 || Object.keys($assign({}, B)).join('') != K;
	}) ? function assign(target, source) { // eslint-disable-line no-unused-vars
	  var T = _toObject(target);
	  var aLen = arguments.length;
	  var index = 1;
	  var getSymbols = _objectGops.f;
	  var isEnum = _objectPie.f;
	  while (aLen > index) {
	    var S = _iobject(arguments[index++]);
	    var keys = getSymbols ? _objectKeys(S).concat(getSymbols(S)) : _objectKeys(S);
	    var length = keys.length;
	    var j = 0;
	    var key;
	    while (length > j) {
	      key = keys[j++];
	      if (!_descriptors || isEnum.call(S, key)) T[key] = S[key];
	    }
	  } return T;
	} : $assign;

	// 19.1.3.1 Object.assign(target, source)


	_export(_export.S + _export.F, 'Object', { assign: _objectAssign });

	var assign$1 = _core.Object.assign;

	var assign = createCommonjsModule(function (module) {
	module.exports = { "default": assign$1, __esModule: true };
	});

	var _Object$assign = unwrapExports(assign);

	var defineProperty = createCommonjsModule(function (module, exports) {

	exports.__esModule = true;



	var _defineProperty2 = _interopRequireDefault(defineProperty$2);

	function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

	exports.default = function (obj, key, value) {
	  if (key in obj) {
	    (0, _defineProperty2.default)(obj, key, {
	      value: value,
	      enumerable: true,
	      configurable: true,
	      writable: true
	    });
	  } else {
	    obj[key] = value;
	  }

	  return obj;
	};
	});

	var _defineProperty = unwrapExports(defineProperty);

	/**
	 * Helpers.
	 */

	var s = 1000;
	var m = s * 60;
	var h = m * 60;
	var d$1 = h * 24;
	var w = d$1 * 7;
	var y = d$1 * 365.25;

	/**
	 * Parse or format the given `val`.
	 *
	 * Options:
	 *
	 *  - `long` verbose formatting [false]
	 *
	 * @param {String|Number} val
	 * @param {Object} [options]
	 * @throws {Error} throw an error if val is not a non-empty string or a number
	 * @return {String|Number}
	 * @api public
	 */

	var ms = function (val, options) {
	  options = options || {};
	  var type = typeof val;
	  if (type === 'string' && val.length > 0) {
	    return parse(val);
	  } else if (type === 'number' && isFinite(val)) {
	    return options.long ? fmtLong(val) : fmtShort(val);
	  }
	  throw new Error(
	    'val is not a non-empty string or a valid number. val=' +
	      JSON.stringify(val)
	  );
	};

	/**
	 * Parse the given `str` and return milliseconds.
	 *
	 * @param {String} str
	 * @return {Number}
	 * @api private
	 */

	function parse(str) {
	  str = String(str);
	  if (str.length > 100) {
	    return;
	  }
	  var match = /^(-?(?:\d+)?\.?\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|weeks?|w|years?|yrs?|y)?$/i.exec(
	    str
	  );
	  if (!match) {
	    return;
	  }
	  var n = parseFloat(match[1]);
	  var type = (match[2] || 'ms').toLowerCase();
	  switch (type) {
	    case 'years':
	    case 'year':
	    case 'yrs':
	    case 'yr':
	    case 'y':
	      return n * y;
	    case 'weeks':
	    case 'week':
	    case 'w':
	      return n * w;
	    case 'days':
	    case 'day':
	    case 'd':
	      return n * d$1;
	    case 'hours':
	    case 'hour':
	    case 'hrs':
	    case 'hr':
	    case 'h':
	      return n * h;
	    case 'minutes':
	    case 'minute':
	    case 'mins':
	    case 'min':
	    case 'm':
	      return n * m;
	    case 'seconds':
	    case 'second':
	    case 'secs':
	    case 'sec':
	    case 's':
	      return n * s;
	    case 'milliseconds':
	    case 'millisecond':
	    case 'msecs':
	    case 'msec':
	    case 'ms':
	      return n;
	    default:
	      return undefined;
	  }
	}

	/**
	 * Short format for `ms`.
	 *
	 * @param {Number} ms
	 * @return {String}
	 * @api private
	 */

	function fmtShort(ms) {
	  var msAbs = Math.abs(ms);
	  if (msAbs >= d$1) {
	    return Math.round(ms / d$1) + 'd';
	  }
	  if (msAbs >= h) {
	    return Math.round(ms / h) + 'h';
	  }
	  if (msAbs >= m) {
	    return Math.round(ms / m) + 'm';
	  }
	  if (msAbs >= s) {
	    return Math.round(ms / s) + 's';
	  }
	  return ms + 'ms';
	}

	/**
	 * Long format for `ms`.
	 *
	 * @param {Number} ms
	 * @return {String}
	 * @api private
	 */

	function fmtLong(ms) {
	  var msAbs = Math.abs(ms);
	  if (msAbs >= d$1) {
	    return plural(ms, msAbs, d$1, 'day');
	  }
	  if (msAbs >= h) {
	    return plural(ms, msAbs, h, 'hour');
	  }
	  if (msAbs >= m) {
	    return plural(ms, msAbs, m, 'minute');
	  }
	  if (msAbs >= s) {
	    return plural(ms, msAbs, s, 'second');
	  }
	  return ms + ' ms';
	}

	/**
	 * Pluralization helper.
	 */

	function plural(ms, msAbs, n, name) {
	  var isPlural = msAbs >= n * 1.5;
	  return Math.round(ms / n) + ' ' + name + (isPlural ? 's' : '');
	}

	/**
	 * This is the common logic for both the Node.js and web browser
	 * implementations of `debug()`.
	 */
	function setup(env) {
	  createDebug.debug = createDebug;
	  createDebug.default = createDebug;
	  createDebug.coerce = coerce;
	  createDebug.disable = disable;
	  createDebug.enable = enable;
	  createDebug.enabled = enabled;
	  createDebug.humanize = ms;
	  Object.keys(env).forEach(function (key) {
	    createDebug[key] = env[key];
	  });
	  /**
	  * Active `debug` instances.
	  */

	  createDebug.instances = [];
	  /**
	  * The currently active debug mode names, and names to skip.
	  */

	  createDebug.names = [];
	  createDebug.skips = [];
	  /**
	  * Map of special "%n" handling functions, for the debug "format" argument.
	  *
	  * Valid key names are a single, lower or upper-case letter, i.e. "n" and "N".
	  */

	  createDebug.formatters = {};
	  /**
	  * Selects a color for a debug namespace
	  * @param {String} namespace The namespace string for the for the debug instance to be colored
	  * @return {Number|String} An ANSI color code for the given namespace
	  * @api private
	  */

	  function selectColor(namespace) {
	    var hash = 0;

	    for (var i = 0; i < namespace.length; i++) {
	      hash = (hash << 5) - hash + namespace.charCodeAt(i);
	      hash |= 0; // Convert to 32bit integer
	    }

	    return createDebug.colors[Math.abs(hash) % createDebug.colors.length];
	  }

	  createDebug.selectColor = selectColor;
	  /**
	  * Create a debugger with the given `namespace`.
	  *
	  * @param {String} namespace
	  * @return {Function}
	  * @api public
	  */

	  function createDebug(namespace) {
	    var prevTime;

	    function debug() {
	      // Disabled?
	      if (!debug.enabled) {
	        return;
	      }

	      for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
	        args[_key] = arguments[_key];
	      }

	      var self = debug; // Set `diff` timestamp

	      var curr = Number(new Date());
	      var ms = curr - (prevTime || curr);
	      self.diff = ms;
	      self.prev = prevTime;
	      self.curr = curr;
	      prevTime = curr;
	      args[0] = createDebug.coerce(args[0]);

	      if (typeof args[0] !== 'string') {
	        // Anything else let's inspect with %O
	        args.unshift('%O');
	      } // Apply any `formatters` transformations


	      var index = 0;
	      args[0] = args[0].replace(/%([a-zA-Z%])/g, function (match, format) {
	        // If we encounter an escaped % then don't increase the array index
	        if (match === '%%') {
	          return match;
	        }

	        index++;
	        var formatter = createDebug.formatters[format];

	        if (typeof formatter === 'function') {
	          var val = args[index];
	          match = formatter.call(self, val); // Now we need to remove `args[index]` since it's inlined in the `format`

	          args.splice(index, 1);
	          index--;
	        }

	        return match;
	      }); // Apply env-specific formatting (colors, etc.)

	      createDebug.formatArgs.call(self, args);
	      var logFn = self.log || createDebug.log;
	      logFn.apply(self, args);
	    }

	    debug.namespace = namespace;
	    debug.enabled = createDebug.enabled(namespace);
	    debug.useColors = createDebug.useColors();
	    debug.color = selectColor(namespace);
	    debug.destroy = destroy;
	    debug.extend = extend; // Debug.formatArgs = formatArgs;
	    // debug.rawLog = rawLog;
	    // env-specific initialization logic for debug instances

	    if (typeof createDebug.init === 'function') {
	      createDebug.init(debug);
	    }

	    createDebug.instances.push(debug);
	    return debug;
	  }

	  function destroy() {
	    var index = createDebug.instances.indexOf(this);

	    if (index !== -1) {
	      createDebug.instances.splice(index, 1);
	      return true;
	    }

	    return false;
	  }

	  function extend(namespace, delimiter) {
	    return createDebug(this.namespace + (typeof delimiter === 'undefined' ? ':' : delimiter) + namespace);
	  }
	  /**
	  * Enables a debug mode by namespaces. This can include modes
	  * separated by a colon and wildcards.
	  *
	  * @param {String} namespaces
	  * @api public
	  */


	  function enable(namespaces) {
	    createDebug.save(namespaces);
	    createDebug.names = [];
	    createDebug.skips = [];
	    var i;
	    var split = (typeof namespaces === 'string' ? namespaces : '').split(/[\s,]+/);
	    var len = split.length;

	    for (i = 0; i < len; i++) {
	      if (!split[i]) {
	        // ignore empty strings
	        continue;
	      }

	      namespaces = split[i].replace(/\*/g, '.*?');

	      if (namespaces[0] === '-') {
	        createDebug.skips.push(new RegExp('^' + namespaces.substr(1) + '$'));
	      } else {
	        createDebug.names.push(new RegExp('^' + namespaces + '$'));
	      }
	    }

	    for (i = 0; i < createDebug.instances.length; i++) {
	      var instance = createDebug.instances[i];
	      instance.enabled = createDebug.enabled(instance.namespace);
	    }
	  }
	  /**
	  * Disable debug output.
	  *
	  * @api public
	  */


	  function disable() {
	    createDebug.enable('');
	  }
	  /**
	  * Returns true if the given mode name is enabled, false otherwise.
	  *
	  * @param {String} name
	  * @return {Boolean}
	  * @api public
	  */


	  function enabled(name) {
	    if (name[name.length - 1] === '*') {
	      return true;
	    }

	    var i;
	    var len;

	    for (i = 0, len = createDebug.skips.length; i < len; i++) {
	      if (createDebug.skips[i].test(name)) {
	        return false;
	      }
	    }

	    for (i = 0, len = createDebug.names.length; i < len; i++) {
	      if (createDebug.names[i].test(name)) {
	        return true;
	      }
	    }

	    return false;
	  }
	  /**
	  * Coerce `val`.
	  *
	  * @param {Mixed} val
	  * @return {Mixed}
	  * @api private
	  */


	  function coerce(val) {
	    if (val instanceof Error) {
	      return val.stack || val.message;
	    }

	    return val;
	  }

	  createDebug.enable(createDebug.load());
	  return createDebug;
	}

	var common = setup;

	var browser$1 = createCommonjsModule(function (module, exports) {

	function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }

	/* eslint-env browser */

	/**
	 * This is the web browser implementation of `debug()`.
	 */
	exports.log = log;
	exports.formatArgs = formatArgs;
	exports.save = save;
	exports.load = load;
	exports.useColors = useColors;
	exports.storage = localstorage();
	/**
	 * Colors.
	 */

	exports.colors = ['#0000CC', '#0000FF', '#0033CC', '#0033FF', '#0066CC', '#0066FF', '#0099CC', '#0099FF', '#00CC00', '#00CC33', '#00CC66', '#00CC99', '#00CCCC', '#00CCFF', '#3300CC', '#3300FF', '#3333CC', '#3333FF', '#3366CC', '#3366FF', '#3399CC', '#3399FF', '#33CC00', '#33CC33', '#33CC66', '#33CC99', '#33CCCC', '#33CCFF', '#6600CC', '#6600FF', '#6633CC', '#6633FF', '#66CC00', '#66CC33', '#9900CC', '#9900FF', '#9933CC', '#9933FF', '#99CC00', '#99CC33', '#CC0000', '#CC0033', '#CC0066', '#CC0099', '#CC00CC', '#CC00FF', '#CC3300', '#CC3333', '#CC3366', '#CC3399', '#CC33CC', '#CC33FF', '#CC6600', '#CC6633', '#CC9900', '#CC9933', '#CCCC00', '#CCCC33', '#FF0000', '#FF0033', '#FF0066', '#FF0099', '#FF00CC', '#FF00FF', '#FF3300', '#FF3333', '#FF3366', '#FF3399', '#FF33CC', '#FF33FF', '#FF6600', '#FF6633', '#FF9900', '#FF9933', '#FFCC00', '#FFCC33'];
	/**
	 * Currently only WebKit-based Web Inspectors, Firefox >= v31,
	 * and the Firebug extension (any Firefox version) are known
	 * to support "%c" CSS customizations.
	 *
	 * TODO: add a `localStorage` variable to explicitly enable/disable colors
	 */
	// eslint-disable-next-line complexity

	function useColors() {
	  // NB: In an Electron preload script, document will be defined but not fully
	  // initialized. Since we know we're in Chrome, we'll just detect this case
	  // explicitly
	  if (typeof window !== 'undefined' && window.process && (window.process.type === 'renderer' || window.process.__nwjs)) {
	    return true;
	  } // Internet Explorer and Edge do not support colors.


	  if (typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/(edge|trident)\/(\d+)/)) {
	    return false;
	  } // Is webkit? http://stackoverflow.com/a/16459606/376773
	  // document is undefined in react-native: https://github.com/facebook/react-native/pull/1632


	  return typeof document !== 'undefined' && document.documentElement && document.documentElement.style && document.documentElement.style.WebkitAppearance || // Is firebug? http://stackoverflow.com/a/398120/376773
	  typeof window !== 'undefined' && window.console && (window.console.firebug || window.console.exception && window.console.table) || // Is firefox >= v31?
	  // https://developer.mozilla.org/en-US/docs/Tools/Web_Console#Styling_messages
	  typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/firefox\/(\d+)/) && parseInt(RegExp.$1, 10) >= 31 || // Double check webkit in userAgent just in case we are in a worker
	  typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/applewebkit\/(\d+)/);
	}
	/**
	 * Colorize log arguments if enabled.
	 *
	 * @api public
	 */


	function formatArgs(args) {
	  args[0] = (this.useColors ? '%c' : '') + this.namespace + (this.useColors ? ' %c' : ' ') + args[0] + (this.useColors ? '%c ' : ' ') + '+' + module.exports.humanize(this.diff);

	  if (!this.useColors) {
	    return;
	  }

	  var c = 'color: ' + this.color;
	  args.splice(1, 0, c, 'color: inherit'); // The final "%c" is somewhat tricky, because there could be other
	  // arguments passed either before or after the %c, so we need to
	  // figure out the correct index to insert the CSS into

	  var index = 0;
	  var lastC = 0;
	  args[0].replace(/%[a-zA-Z%]/g, function (match) {
	    if (match === '%%') {
	      return;
	    }

	    index++;

	    if (match === '%c') {
	      // We only are interested in the *last* %c
	      // (the user may have provided their own)
	      lastC = index;
	    }
	  });
	  args.splice(lastC, 0, c);
	}
	/**
	 * Invokes `console.log()` when available.
	 * No-op when `console.log` is not a "function".
	 *
	 * @api public
	 */


	function log() {
	  var _console;

	  // This hackery is required for IE8/9, where
	  // the `console.log` function doesn't have 'apply'
	  return (typeof console === "undefined" ? "undefined" : _typeof(console)) === 'object' && console.log && (_console = console).log.apply(_console, arguments);
	}
	/**
	 * Save `namespaces`.
	 *
	 * @param {String} namespaces
	 * @api private
	 */


	function save(namespaces) {
	  try {
	    if (namespaces) {
	      exports.storage.setItem('debug', namespaces);
	    } else {
	      exports.storage.removeItem('debug');
	    }
	  } catch (error) {// Swallow
	    // XXX (@Qix-) should we be logging these?
	  }
	}
	/**
	 * Load `namespaces`.
	 *
	 * @return {String} returns the previously persisted debug modes
	 * @api private
	 */


	function load() {
	  var r;

	  try {
	    r = exports.storage.getItem('debug');
	  } catch (error) {} // Swallow
	  // XXX (@Qix-) should we be logging these?
	  // If debug isn't set in LS, and we're in Electron, try to load $DEBUG


	  if (!r && typeof process !== 'undefined' && 'env' in process) {
	    r = process.env.DEBUG;
	  }

	  return r;
	}
	/**
	 * Localstorage attempts to return the localstorage.
	 *
	 * This is necessary because safari throws
	 * when a user disables cookies/localstorage
	 * and you attempt to access it.
	 *
	 * @return {LocalStorage}
	 * @api private
	 */


	function localstorage() {
	  try {
	    // TVMLKit (Apple TV JS Runtime) does not have a window object, just localStorage in the global context
	    // The Browser also has localStorage in the global context.
	    return localStorage;
	  } catch (error) {// Swallow
	    // XXX (@Qix-) should we be logging these?
	  }
	}

	module.exports = common(exports);
	var formatters = module.exports.formatters;
	/**
	 * Map %j to `JSON.stringify()`, since no Web Inspectors do that by default.
	 */

	formatters.j = function (v) {
	  try {
	    return JSON.stringify(v);
	  } catch (error) {
	    return '[UnexpectedJSONParseError]: ' + error.message;
	  }
	};
	});
	browser$1.log;
	browser$1.formatArgs;
	browser$1.save;
	browser$1.load;
	browser$1.useColors;
	browser$1.storage;
	browser$1.colors;

	var _logger;
	var d = browser$1('Play');

	/**
	                         * 日志级别
	                         */
	var LogLevel = {
	  Debug: 'Debug',
	  Warn: 'Warn',
	  Error: 'Error' };


	var logger = (_logger = {}, _defineProperty(_logger,
	LogLevel.Debug, d), _defineProperty(_logger,
	LogLevel.Warn, console.warn.bind(console)), _defineProperty(_logger,
	LogLevel.Error, console.error.bind(console)), _logger);


	function setLogger(newLogger) {
	  _Object$assign(logger, newLogger);
	}

	/**
	   * 调试输出
	   * @ignore
	   * @param {String} log
	   */
	function debug(log) {
	  var fullLog = '[DEBUG] ' + log;
	  logger[LogLevel.Debug](fullLog);
	}

	/**
	   * 错误输出
	   * @ignore
	   * @param {String} log
	   */
	function error(log) {
	  var fullLog = '[ERROR] ' + log;
	  logger[LogLevel.Error](fullLog);
	}

	var isWeapp =
	// eslint-disable-next-line no-undef
	(typeof wx === 'undefined' ? 'undefined' : _typeof(wx)) === 'object' && typeof wx.connectSocket === 'function';

	// eslint-disable-next-line no-sequences
	var tap = function tap(interceptor) {return function (value) {return interceptor(value), value;};};

	function getFallbackRouter(appId) {
	  var prefix = appId.slice(0, 8).toLowerCase();
	  return 'https://' + prefix + '.play.lncldglobal.com/1/multiplayer/router/route';
	}var

	AppRouter = function () {
	  function AppRouter(_ref) {var appId = _ref.appId,server = _ref.server;_classCallCheck(this, AppRouter);
	    this._appId = appId;
	    this._playServer = server;
	    this._url = null;
	    this._serverValidTimestamp = 0;
	  }_createClass(AppRouter, [{ key: 'fetch', value: function fetch()

	    {
	      // 私有部署和本地调试
	      if (this._playServer !== undefined) {
	        return _Promise.resolve(
	        this._playServer + '/1/multiplayer/router/authorize');

	      }
	      var now = Date.now();
	      if (now < this._serverValidTimestamp) {
	        // 在有效期内，则直接返回缓存数据
	        debug('get app router from cache: ' + this._url);
	        return _Promise.resolve(this._url);
	      }
	      return this._fetch();
	    } }, { key: '_fetch', value: function _fetch()

	    {var _this = this;
	      return new _Promise(function () {var _ref2 = _asyncToGenerator( /*#__PURE__*/regenerator.mark(function _callee(resolve, reject) {var url, payload, res, body, ttl, secondaryServer, primaryServer, playServer;return regenerator.wrap(function _callee$(_context) {while (1) {switch (_context.prev = _context.next) {case 0:
	                  url = 'https://app-router.leancloud.cn/2/route';
	                  payload = {
	                    appId: _this._appId };_context.prev = 2;_context.next = 5;return (


	                    client.get(url).query(payload));case 5:res = _context.sent;
	                  body = JSON.parse(res.text);

	                  ttl =


	                  body.ttl, secondaryServer = body.play_server, primaryServer = body.multiplayer_router_server;
	                  playServer = primaryServer || secondaryServer;
	                  if (playServer === undefined) {
	                    reject(new Error('router server is null'));
	                  }
	                  _this._url = 'https://' + playServer + '/1/multiplayer/router/authorize';
	                  _this._serverValidTimestamp = Date.now() + ttl * 1000;
	                  debug('server valid timestamp: ' + _this._serverValidTimestamp);
	                  debug('get app router from server: ' + _this._url);
	                  resolve(_this._url);_context.next = 23;break;case 17:_context.prev = 17;_context.t0 = _context['catch'](2);

	                  _this._url = getFallbackRouter(_this._appId);
	                  debug('fallback router: ' + _this._url);
	                  _this._serverValidTimestamp = Date.now() + 10800 * 1000;
	                  resolve(_this._url);case 23:case 'end':return _context.stop();}}}, _callee, _this, [[2, 17]]);}));return function (_x, _x2) {return _ref2.apply(this, arguments);};}());


	    } }]);return AppRouter;}();

	var

	GameRouter = function () {
	  function GameRouter(appId, appKey, userId, server, feature) {_classCallCheck(this, GameRouter);
	    this._appId = appId;
	    this._appKey = appKey;
	    this._userId = userId;
	    this._server = server;
	    this._feature = feature;

	    this._appRouter = new AppRouter({
	      appId: appId,
	      server: server });

	    // 缓存的 Lobby 信息，包括地址和 token
	    this._sessionToken = null;
	    this._url = null;
	    this._serverValidTimeStamp = 0;
	  }

	  // 鉴权
	  _createClass(GameRouter, [{ key: 'authorize', value: function authorize() {var _this = this;
	      if (this._isValid()) {
	        return _Promise.resolve({
	          url: this._url,
	          sessionToken: this._sessionToken });

	      }
	      return new _Promise(function () {var _ref = _asyncToGenerator( /*#__PURE__*/regenerator.mark(function _callee(resolve, reject) {var gameRouterUrl, data, res, _JSON$parse, sessionToken, lobbyAddr, ttl;return regenerator.wrap(function _callee$(_context) {while (1) {switch (_context.prev = _context.next) {case 0:_context.prev = 0;_context.next = 3;return (

	                    _this._appRouter.fetch());case 3:gameRouterUrl = _context.sent;
	                  debug(gameRouterUrl);
	                  data = {};
	                  if (isWeapp) {
	                    data.feature = 'wechat';
	                  }
	                  if (_this._feature) {
	                    data.feature = _this._feature;
	                  }_context.next = 10;return (
	                    client.
	                    post(gameRouterUrl).
	                    set(_this._getHeaders()).
	                    send(data));case 10:res = _context.sent;
	                  debug(res.text);_JSON$parse =
	                  JSON.parse(res.text), sessionToken = _JSON$parse.sessionToken, lobbyAddr = _JSON$parse.lobbyAddr, ttl = _JSON$parse.ttl;
	                  _this._sessionToken = sessionToken;
	                  _this._url = lobbyAddr;
	                  _this._serverValidTimeStamp = Date.now() + ttl * 1000;
	                  resolve({
	                    url: _this._url,
	                    sessionToken: _this._sessionToken });_context.next = 23;break;case 19:_context.prev = 19;_context.t0 = _context['catch'](0);


	                  error(_JSON$stringify(_context.t0));
	                  reject(_context.t0);case 23:case 'end':return _context.stop();}}}, _callee, _this, [[0, 19]]);}));return function (_x, _x2) {return _ref.apply(this, arguments);};}());


	    } }, { key: '_isValid', value: function _isValid()

	    {
	      return (
	        this._sessionToken != null &&
	        this._url != null &&
	        Date.now() < this._serverValidTimeStamp);

	    } }, { key: '_getHeaders', value: function _getHeaders()

	    {
	      return {
	        'X-LC-ID': this._appId,
	        'X-LC-KEY': this._appKey,
	        'X-LC-PLAY-USER-ID': this._userId,
	        'Content-Type': 'application/json' };

	    } }]);return GameRouter;}();

	var version = "1.0.2";
	var protocolVersion = "0";

	var _createProperty = function (object, index, value) {
	  if (index in object) _objectDp.f(object, index, _propertyDesc(0, value));
	  else object[index] = value;
	};

	_export(_export.S + _export.F * !_iterDetect(function (iter) { Array.from(iter); }), 'Array', {
	  // 22.1.2.1 Array.from(arrayLike, mapfn = undefined, thisArg = undefined)
	  from: function from(arrayLike /* , mapfn = undefined, thisArg = undefined */) {
	    var O = _toObject(arrayLike);
	    var C = typeof this == 'function' ? this : Array;
	    var aLen = arguments.length;
	    var mapfn = aLen > 1 ? arguments[1] : undefined;
	    var mapping = mapfn !== undefined;
	    var index = 0;
	    var iterFn = core_getIteratorMethod(O);
	    var length, result, step, iterator;
	    if (mapping) mapfn = _ctx(mapfn, aLen > 2 ? arguments[2] : undefined, 2);
	    // if object isn't iterable or it's array with default iterator - use simple case
	    if (iterFn != undefined && !(C == Array && _isArrayIter(iterFn))) {
	      for (iterator = iterFn.call(O), result = new C(); !(step = iterator.next()).done; index++) {
	        _createProperty(result, index, mapping ? _iterCall(iterator, mapfn, [step.value, index], true) : step.value);
	      }
	    } else {
	      length = _toLength(O.length);
	      for (result = new C(length); length > index; index++) {
	        _createProperty(result, index, mapping ? mapfn(O[index], index) : O[index]);
	      }
	    }
	    result.length = index;
	    return result;
	  }
	});

	var from_1$1 = _core.Array.from;

	var from_1 = createCommonjsModule(function (module) {
	module.exports = { "default": from_1$1, __esModule: true };
	});

	var _Array$from = unwrapExports(from_1);

	var arraySlice = [].slice;
	var factories = {};

	var construct$2 = function (F, len, args) {
	  if (!(len in factories)) {
	    for (var n = [], i = 0; i < len; i++) n[i] = 'a[' + i + ']';
	    // eslint-disable-next-line no-new-func
	    factories[len] = Function('F,a', 'return new F(' + n.join(',') + ')');
	  } return factories[len](F, args);
	};

	var _bind = Function.bind || function bind(that /* , ...args */) {
	  var fn = _aFunction(this);
	  var partArgs = arraySlice.call(arguments, 1);
	  var bound = function (/* args... */) {
	    var args = partArgs.concat(arraySlice.call(arguments));
	    return this instanceof bound ? construct$2(fn, args.length, args) : _invoke(fn, args, that);
	  };
	  if (_isObject(fn.prototype)) bound.prototype = fn.prototype;
	  return bound;
	};

	// 26.1.2 Reflect.construct(target, argumentsList [, newTarget])







	var rConstruct = (_global.Reflect || {}).construct;

	// MS Edge supports only 2 arguments and argumentsList argument is optional
	// FF Nightly sets third argument as `new.target`, but does not create `this` from it
	var NEW_TARGET_BUG = _fails(function () {
	  function F() { /* empty */ }
	  return !(rConstruct(function () { /* empty */ }, [], F) instanceof F);
	});
	var ARGS_BUG = !_fails(function () {
	  rConstruct(function () { /* empty */ });
	});

	_export(_export.S + _export.F * (NEW_TARGET_BUG || ARGS_BUG), 'Reflect', {
	  construct: function construct(Target, args /* , newTarget */) {
	    _aFunction(Target);
	    _anObject(args);
	    var newTarget = arguments.length < 3 ? Target : _aFunction(arguments[2]);
	    if (ARGS_BUG && !NEW_TARGET_BUG) return rConstruct(Target, args, newTarget);
	    if (Target == newTarget) {
	      // w/o altered newTarget, optimization for 0-4 arguments
	      switch (args.length) {
	        case 0: return new Target();
	        case 1: return new Target(args[0]);
	        case 2: return new Target(args[0], args[1]);
	        case 3: return new Target(args[0], args[1], args[2]);
	        case 4: return new Target(args[0], args[1], args[2], args[3]);
	      }
	      // w/o altered newTarget, lot of arguments case
	      var $args = [null];
	      $args.push.apply($args, args);
	      return new (_bind.apply(Target, $args))();
	    }
	    // with altered newTarget, not support built-in constructors
	    var proto = newTarget.prototype;
	    var instance = _objectCreate(_isObject(proto) ? proto : Object.prototype);
	    var result = Function.apply.call(Target, instance, args);
	    return _isObject(result) ? result : instance;
	  }
	});

	var construct$1 = _core.Reflect.construct;

	var construct = createCommonjsModule(function (module) {
	module.exports = { "default": construct$1, __esModule: true };
	});

	var _Reflect$construct = unwrapExports(construct);

	function _extendableBuiltin(cls) {function ExtendableBuiltin() {var instance = _Reflect$construct(cls, _Array$from(arguments));_Object$setPrototypeOf(instance, _Object$getPrototypeOf(this));return instance;}ExtendableBuiltin.prototype = _Object$create(cls.prototype, { constructor: { value: cls, enumerable: false, writable: true, configurable: true } });if (_Object$setPrototypeOf) {_Object$setPrototypeOf(ExtendableBuiltin, cls);} else {ExtendableBuiltin.__proto__ = cls;}return ExtendableBuiltin;}var PLAY_ERRPR = 'PlayError';var PlayError = function (_extendableBuiltin2) {_inherits(PlayError, _extendableBuiltin2);
	  function PlayError(code, detail) {_classCallCheck(this, PlayError);var _this = _possibleConstructorReturn(this, (PlayError.__proto__ || _Object$getPrototypeOf(PlayError)).call(this,
	    PLAY_ERRPR + ': ' + code + ' - ' + detail));
	    _this.name = PLAY_ERRPR;
	    _this.code = code;
	    _this.detail = detail;return _this;
	  }return PlayError;}(_extendableBuiltin(Error));

	var SESSION_TOKEN_KEY = 'X-LC-PLAY-MULTIPLAYER-SESSION-TOKEN';

	function _tapError(e) {
	  error(_JSON$stringify(e));
	  if (e.response.text) {
	    var err = JSON.parse(e.response.text);var
	    reasonCode = err.reasonCode,detail = err.detail;
	    return new PlayError(reasonCode, detail);
	  }
	  return e;
	}var

	LobbyService = function () {
	  function LobbyService(client) {_classCallCheck(this, LobbyService);
	    this._client = client;var _client =
	    this._client,_appId = _client._appId,_appKey = _client._appKey,_userId = _client._userId,_playServer = _client._playServer,_feature = _client._feature;

	    this._gameRouter = new GameRouter(
	    _appId,
	    _appKey,
	    _userId,
	    _playServer,
	    _feature);


	    this._defaultHeaders = {
	      'X-LC-ID': _appId,
	      'X-LC-KEY': _appKey,
	      'X-LC-PLAY-USER-ID': _userId,
	      'Content-Type': 'application/json' };

	  }_createClass(LobbyService, [{ key: 'authorize', value: function authorize()

	    {
	      return this._gameRouter.authorize();
	    } }, { key: 'createRoom', value: function createRoom(

	    roomName) {var _this = this;
	      return new _Promise(function () {var _ref = _asyncToGenerator( /*#__PURE__*/regenerator.mark(function _callee(resolve, reject) {var _ref2, url, sessionToken, path, fullUrl, _client2, _gameVersion, _insecure, data, res, _JSON$parse, cid, addr;return regenerator.wrap(function _callee$(_context) {while (1) {switch (_context.prev = _context.next) {case 0:_context.prev = 0;_context.next = 3;return (

	                    _this._gameRouter.authorize());case 3:_ref2 = _context.sent;url = _ref2.url;sessionToken = _ref2.sessionToken;
	                  path = '/1/multiplayer/lobby/room';
	                  fullUrl = '' + url + path;
	                  debug(fullUrl);_client2 =
	                  _this._client, _gameVersion = _client2._gameVersion, _insecure = _client2._insecure;
	                  data = {
	                    gameVersion: _gameVersion,
	                    sdkVersion: version,
	                    protocolVersion: protocolVersion,
	                    useInsecureAddr: _insecure };

	                  if (roomName) {
	                    data.cid = roomName;
	                  }_context.next = 14;return (
	                    client.
	                    post(fullUrl).
	                    set(_this._defaultHeaders).
	                    set(SESSION_TOKEN_KEY, sessionToken).
	                    send(data));case 14:res = _context.sent;
	                  debug(res.text);_JSON$parse =
	                  JSON.parse(res.text), cid = _JSON$parse.cid, addr = _JSON$parse.addr;
	                  resolve({ cid: cid, addr: addr });_context.next = 23;break;case 20:_context.prev = 20;_context.t0 = _context['catch'](0);

	                  reject(_tapError(_context.t0));case 23:case 'end':return _context.stop();}}}, _callee, _this, [[0, 20]]);}));return function (_x, _x2) {return _ref.apply(this, arguments);};}());


	    } }, { key: 'joinRoom', value: function joinRoom(_ref3)

	    {var _this2 = this;var roomName = _ref3.roomName,expectedUserIds = _ref3.expectedUserIds,rejoin = _ref3.rejoin,createOnNotFound = _ref3.createOnNotFound;
	      return new _Promise(function () {var _ref4 = _asyncToGenerator( /*#__PURE__*/regenerator.mark(function _callee2(resolve, reject) {var _ref5, url, sessionToken, path, fullUrl, _client3, _gameVersion, _insecure, data, res, _JSON$parse2, cid, addr, roomCreated;return regenerator.wrap(function _callee2$(_context2) {while (1) {switch (_context2.prev = _context2.next) {case 0:_context2.prev = 0;_context2.next = 3;return (

	                    _this2._gameRouter.authorize());case 3:_ref5 = _context2.sent;url = _ref5.url;sessionToken = _ref5.sessionToken;
	                  path = '/1/multiplayer/lobby/room/' + roomName;
	                  fullUrl = '' + url + path;_client3 =
	                  _this2._client, _gameVersion = _client3._gameVersion, _insecure = _client3._insecure;
	                  data = {
	                    cid: roomName,
	                    gameVersion: _gameVersion,
	                    sdkVersion: version,
	                    protocolVersion: protocolVersion,
	                    useInsecureAddr: _insecure };

	                  if (expectedUserIds) {
	                    data.expectMembers = expectedUserIds;
	                  }
	                  if (rejoin !== undefined) {
	                    data.rejoin = rejoin;
	                  }
	                  if (createOnNotFound !== undefined) {
	                    data.createOnNotFound = createOnNotFound;
	                  }
	                  debug(_JSON$stringify(data));_context2.next = 16;return (
	                    client.
	                    post(fullUrl).
	                    set(_this2._defaultHeaders).
	                    set(SESSION_TOKEN_KEY, sessionToken).
	                    send(data));case 16:res = _context2.sent;
	                  debug(res.text);_JSON$parse2 =
	                  JSON.parse(res.text), cid = _JSON$parse2.cid, addr = _JSON$parse2.addr, roomCreated = _JSON$parse2.roomCreated;
	                  resolve({ cid: cid, addr: addr, roomCreated: roomCreated });_context2.next = 25;break;case 22:_context2.prev = 22;_context2.t0 = _context2['catch'](0);

	                  reject(_tapError(_context2.t0));case 25:case 'end':return _context2.stop();}}}, _callee2, _this2, [[0, 22]]);}));return function (_x3, _x4) {return _ref4.apply(this, arguments);};}());


	    } }, { key: 'joinRandomRoom', value: function joinRandomRoom(

	    matchProperties, expectedUserIds) {var _this3 = this;
	      return new _Promise(function () {var _ref6 = _asyncToGenerator( /*#__PURE__*/regenerator.mark(function _callee3(resolve, reject) {var _ref7, url, sessionToken, path, fullUrl, _client4, _gameVersion, _insecure, data, res, _JSON$parse3, cid, addr;return regenerator.wrap(function _callee3$(_context3) {while (1) {switch (_context3.prev = _context3.next) {case 0:_context3.prev = 0;_context3.next = 3;return (

	                    _this3._gameRouter.authorize());case 3:_ref7 = _context3.sent;url = _ref7.url;sessionToken = _ref7.sessionToken;
	                  path = '/1/multiplayer/lobby/match/room';
	                  fullUrl = '' + url + path;_client4 =
	                  _this3._client, _gameVersion = _client4._gameVersion, _insecure = _client4._insecure;
	                  data = {
	                    gameVersion: _gameVersion,
	                    sdkVersion: version,
	                    protocolVersion: protocolVersion,
	                    useInsecureAddr: _insecure };

	                  if (matchProperties) {
	                    data.expectAttr = matchProperties;
	                  }
	                  if (expectedUserIds) {
	                    data.expectMembers = expectedUserIds;
	                  }_context3.next = 14;return (
	                    client.
	                    post(fullUrl).
	                    set(_this3._defaultHeaders).
	                    set(SESSION_TOKEN_KEY, sessionToken).
	                    send(data));case 14:res = _context3.sent;
	                  debug(res.text);_JSON$parse3 =
	                  JSON.parse(res.text), cid = _JSON$parse3.cid, addr = _JSON$parse3.addr;
	                  resolve({ cid: cid, addr: addr });_context3.next = 23;break;case 20:_context3.prev = 20;_context3.t0 = _context3['catch'](0);

	                  reject(_tapError(_context3.t0));case 23:case 'end':return _context3.stop();}}}, _callee3, _this3, [[0, 20]]);}));return function (_x5, _x6) {return _ref6.apply(this, arguments);};}());


	    } }, { key: 'matchRandom', value: function matchRandom(

	    piggybackPeerId, matchProperties, expectedUserIds) {var _this4 = this;
	      if (typeof piggybackPeerId !== 'string') {
	        throw new TypeError(piggybackPeerId + ' is not a string');
	      }
	      if (matchProperties !== null && (typeof matchProperties === 'undefined' ? 'undefined' : _typeof(matchProperties)) !== 'object') {
	        throw new TypeError(matchProperties + ' is not an object');
	      }
	      if (expectedUserIds !== null && !Array.isArray(expectedUserIds)) {
	        throw new TypeError(expectedUserIds + ' is not an array with string');
	      }
	      return new _Promise(function () {var _ref8 = _asyncToGenerator( /*#__PURE__*/regenerator.mark(function _callee4(resolve, reject) {var _ref9, url, sessionToken, path, fullUrl, _client5, _gameVersion, _insecure, data, res, _JSON$parse4, cid, addr;return regenerator.wrap(function _callee4$(_context4) {while (1) {switch (_context4.prev = _context4.next) {case 0:_context4.prev = 0;_context4.next = 3;return (

	                    _this4._gameRouter.authorize());case 3:_ref9 = _context4.sent;url = _ref9.url;sessionToken = _ref9.sessionToken;
	                  path = '/1/multiplayer/lobby/match/room';
	                  fullUrl = '' + url + path;_client5 =
	                  _this4._client, _gameVersion = _client5._gameVersion, _insecure = _client5._insecure;
	                  data = {
	                    gameVersion: _gameVersion,
	                    sdkVersion: version,
	                    protocolVersion: protocolVersion,
	                    piggybackPeerId: piggybackPeerId,
	                    useInsecureAddr: _insecure };

	                  if (matchProperties) {
	                    data.expectAttr = matchProperties;
	                  }
	                  if (expectedUserIds) {
	                    data.expectMembers = expectedUserIds;
	                  }_context4.next = 14;return (
	                    client.
	                    post(fullUrl).
	                    set(_this4._defaultHeaders).
	                    set(SESSION_TOKEN_KEY, sessionToken).
	                    send(data));case 14:res = _context4.sent;
	                  debug(res.text);_JSON$parse4 =
	                  JSON.parse(res.text), cid = _JSON$parse4.cid, addr = _JSON$parse4.addr;
	                  resolve({ roomName: cid, addr: addr });_context4.next = 23;break;case 20:_context4.prev = 20;_context4.t0 = _context4['catch'](0);

	                  reject(_tapError(_context4.t0));case 23:case 'end':return _context4.stop();}}}, _callee4, _this4, [[0, 20]]);}));return function (_x7, _x8) {return _ref8.apply(this, arguments);};}());


	    } }]);return LobbyService;}();

	var isEnum = _objectPie.f;
	var _objectToArray = function (isEntries) {
	  return function (it) {
	    var O = _toIobject(it);
	    var keys = _objectKeys(O);
	    var length = keys.length;
	    var i = 0;
	    var result = [];
	    var key;
	    while (length > i) {
	      key = keys[i++];
	      if (!_descriptors || isEnum.call(O, key)) {
	        result.push(isEntries ? [key, O[key]] : O[key]);
	      }
	    }
	    return result;
	  };
	};

	// https://github.com/tc39/proposal-object-values-entries

	var $values = _objectToArray(false);

	_export(_export.S, 'Object', {
	  values: function values(it) {
	    return $values(it);
	  }
	});

	var values$1 = _core.Object.values;

	var values = createCommonjsModule(function (module) {
	module.exports = { "default": values$1, __esModule: true };
	});

	var _Object$values = unwrapExports(values);

	var stateMachine = createCommonjsModule(function (module, exports) {
	(function webpackUniversalModuleDefinition(root, factory) {
		module.exports = factory();
	})(commonjsGlobal, function() {
	return /******/ (function(modules) { // webpackBootstrap
	/******/ 	// The module cache
	/******/ 	var installedModules = {};
	/******/
	/******/ 	// The require function
	/******/ 	function __webpack_require__(moduleId) {
	/******/
	/******/ 		// Check if module is in cache
	/******/ 		if(installedModules[moduleId]) {
	/******/ 			return installedModules[moduleId].exports;
	/******/ 		}
	/******/ 		// Create a new module (and put it into the cache)
	/******/ 		var module = installedModules[moduleId] = {
	/******/ 			i: moduleId,
	/******/ 			l: false,
	/******/ 			exports: {}
	/******/ 		};
	/******/
	/******/ 		// Execute the module function
	/******/ 		modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
	/******/
	/******/ 		// Flag the module as loaded
	/******/ 		module.l = true;
	/******/
	/******/ 		// Return the exports of the module
	/******/ 		return module.exports;
	/******/ 	}
	/******/
	/******/
	/******/ 	// expose the modules object (__webpack_modules__)
	/******/ 	__webpack_require__.m = modules;
	/******/
	/******/ 	// expose the module cache
	/******/ 	__webpack_require__.c = installedModules;
	/******/
	/******/ 	// identity function for calling harmony imports with the correct context
	/******/ 	__webpack_require__.i = function(value) { return value; };
	/******/
	/******/ 	// define getter function for harmony exports
	/******/ 	__webpack_require__.d = function(exports, name, getter) {
	/******/ 		if(!__webpack_require__.o(exports, name)) {
	/******/ 			Object.defineProperty(exports, name, {
	/******/ 				configurable: false,
	/******/ 				enumerable: true,
	/******/ 				get: getter
	/******/ 			});
	/******/ 		}
	/******/ 	};
	/******/
	/******/ 	// getDefaultExport function for compatibility with non-harmony modules
	/******/ 	__webpack_require__.n = function(module) {
	/******/ 		var getter = module && module.__esModule ?
	/******/ 			function getDefault() { return module['default']; } :
	/******/ 			function getModuleExports() { return module; };
	/******/ 		__webpack_require__.d(getter, 'a', getter);
	/******/ 		return getter;
	/******/ 	};
	/******/
	/******/ 	// Object.prototype.hasOwnProperty.call
	/******/ 	__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
	/******/
	/******/ 	// __webpack_public_path__
	/******/ 	__webpack_require__.p = "";
	/******/
	/******/ 	// Load entry module and return exports
	/******/ 	return __webpack_require__(__webpack_require__.s = 5);
	/******/ })
	/************************************************************************/
	/******/ ([
	/* 0 */
	/***/ (function(module, exports, __webpack_require__) {


	module.exports = function(target, sources) {
	  var n, source, key;
	  for(n = 1 ; n < arguments.length ; n++) {
	    source = arguments[n];
	    for(key in source) {
	      if (source.hasOwnProperty(key))
	        target[key] = source[key];
	    }
	  }
	  return target;
	};


	/***/ }),
	/* 1 */
	/***/ (function(module, exports, __webpack_require__) {


	//-------------------------------------------------------------------------------------------------

	var mixin = __webpack_require__(0);

	//-------------------------------------------------------------------------------------------------

	module.exports = {

	  build: function(target, config) {
	    var n, max, plugin, plugins = config.plugins;
	    for(n = 0, max = plugins.length ; n < max ; n++) {
	      plugin = plugins[n];
	      if (plugin.methods)
	        mixin(target, plugin.methods);
	      if (plugin.properties)
	        Object.defineProperties(target, plugin.properties);
	    }
	  },

	  hook: function(fsm, name, additional) {
	    var n, max, method, plugin,
	        plugins = fsm.config.plugins,
	        args    = [fsm.context];

	    if (additional)
	      args = args.concat(additional);

	    for(n = 0, max = plugins.length ; n < max ; n++) {
	      plugin = plugins[n];
	      method = plugins[n][name];
	      if (method)
	        method.apply(plugin, args);
	    }
	  }

	};

	//-------------------------------------------------------------------------------------------------


	/***/ }),
	/* 2 */
	/***/ (function(module, exports, __webpack_require__) {


	//-------------------------------------------------------------------------------------------------

	function camelize(label) {

	  if (label.length === 0)
	    return label;

	  var n, result, words = label.split(/[_-]/);

	  // single word with first character already lowercase, return untouched
	  if ((words.length === 1) && (words[0][0].toLowerCase() === words[0][0]))
	    return label;

	  result = words[0].toLowerCase();
	  for(n = 1 ; n < words.length ; n++) {
	    result = result + words[n].charAt(0).toUpperCase() + words[n].substring(1).toLowerCase();
	  }

	  return result;
	}

	//-------------------------------------------------------------------------------------------------

	camelize.prepended = function(prepend, label) {
	  label = camelize(label);
	  return prepend + label[0].toUpperCase() + label.substring(1);
	};

	//-------------------------------------------------------------------------------------------------

	module.exports = camelize;


	/***/ }),
	/* 3 */
	/***/ (function(module, exports, __webpack_require__) {


	//-------------------------------------------------------------------------------------------------

	var mixin    = __webpack_require__(0),
	    camelize = __webpack_require__(2);

	//-------------------------------------------------------------------------------------------------

	function Config(options, StateMachine) {

	  options = options || {};

	  this.options     = options; // preserving original options can be useful (e.g visualize plugin)
	  this.defaults    = StateMachine.defaults;
	  this.states      = [];
	  this.transitions = [];
	  this.map         = {};
	  this.lifecycle   = this.configureLifecycle();
	  this.init        = this.configureInitTransition(options.init);
	  this.data        = this.configureData(options.data);
	  this.methods     = this.configureMethods(options.methods);

	  this.map[this.defaults.wildcard] = {};

	  this.configureTransitions(options.transitions || []);

	  this.plugins = this.configurePlugins(options.plugins, StateMachine.plugin);

	}

	//-------------------------------------------------------------------------------------------------

	mixin(Config.prototype, {

	  addState: function(name) {
	    if (!this.map[name]) {
	      this.states.push(name);
	      this.addStateLifecycleNames(name);
	      this.map[name] = {};
	    }
	  },

	  addStateLifecycleNames: function(name) {
	    this.lifecycle.onEnter[name] = camelize.prepended('onEnter', name);
	    this.lifecycle.onLeave[name] = camelize.prepended('onLeave', name);
	    this.lifecycle.on[name]      = camelize.prepended('on',      name);
	  },

	  addTransition: function(name) {
	    if (this.transitions.indexOf(name) < 0) {
	      this.transitions.push(name);
	      this.addTransitionLifecycleNames(name);
	    }
	  },

	  addTransitionLifecycleNames: function(name) {
	    this.lifecycle.onBefore[name] = camelize.prepended('onBefore', name);
	    this.lifecycle.onAfter[name]  = camelize.prepended('onAfter',  name);
	    this.lifecycle.on[name]       = camelize.prepended('on',       name);
	  },

	  mapTransition: function(transition) {
	    var name = transition.name,
	        from = transition.from,
	        to   = transition.to;
	    this.addState(from);
	    if (typeof to !== 'function')
	      this.addState(to);
	    this.addTransition(name);
	    this.map[from][name] = transition;
	    return transition;
	  },

	  configureLifecycle: function() {
	    return {
	      onBefore: { transition: 'onBeforeTransition' },
	      onAfter:  { transition: 'onAfterTransition'  },
	      onEnter:  { state:      'onEnterState'       },
	      onLeave:  { state:      'onLeaveState'       },
	      on:       { transition: 'onTransition'       }
	    };
	  },

	  configureInitTransition: function(init) {
	    if (typeof init === 'string') {
	      return this.mapTransition(mixin({}, this.defaults.init, { to: init, active: true }));
	    }
	    else if (typeof init === 'object') {
	      return this.mapTransition(mixin({}, this.defaults.init, init, { active: true }));
	    }
	    else {
	      this.addState(this.defaults.init.from);
	      return this.defaults.init;
	    }
	  },

	  configureData: function(data) {
	    if (typeof data === 'function')
	      return data;
	    else if (typeof data === 'object')
	      return function() { return data; }
	    else
	      return function() { return {};  }
	  },

	  configureMethods: function(methods) {
	    return methods || {};
	  },

	  configurePlugins: function(plugins, builtin) {
	    plugins = plugins || [];
	    var n, max, plugin;
	    for(n = 0, max = plugins.length ; n < max ; n++) {
	      plugin = plugins[n];
	      if (typeof plugin === 'function')
	        plugins[n] = plugin = plugin();
	      if (plugin.configure)
	        plugin.configure(this);
	    }
	    return plugins
	  },

	  configureTransitions: function(transitions) {
	    var i, n, transition, from, to, wildcard = this.defaults.wildcard;
	    for(n = 0 ; n < transitions.length ; n++) {
	      transition = transitions[n];
	      from  = Array.isArray(transition.from) ? transition.from : [transition.from || wildcard];
	      to    = transition.to || wildcard;
	      for(i = 0 ; i < from.length ; i++) {
	        this.mapTransition({ name: transition.name, from: from[i], to: to });
	      }
	    }
	  },

	  transitionFor: function(state, transition) {
	    var wildcard = this.defaults.wildcard;
	    return this.map[state][transition] ||
	           this.map[wildcard][transition];
	  },

	  transitionsFor: function(state) {
	    var wildcard = this.defaults.wildcard;
	    return Object.keys(this.map[state]).concat(Object.keys(this.map[wildcard]));
	  },

	  allStates: function() {
	    return this.states;
	  },

	  allTransitions: function() {
	    return this.transitions;
	  }

	});

	//-------------------------------------------------------------------------------------------------

	module.exports = Config;

	//-------------------------------------------------------------------------------------------------


	/***/ }),
	/* 4 */
	/***/ (function(module, exports, __webpack_require__) {


	var mixin      = __webpack_require__(0),
	    Exception  = __webpack_require__(6),
	    plugin     = __webpack_require__(1),
	    UNOBSERVED = [ null, [] ];

	//-------------------------------------------------------------------------------------------------

	function JSM(context, config) {
	  this.context   = context;
	  this.config    = config;
	  this.state     = config.init.from;
	  this.observers = [context];
	}

	//-------------------------------------------------------------------------------------------------

	mixin(JSM.prototype, {

	  init: function(args) {
	    mixin(this.context, this.config.data.apply(this.context, args));
	    plugin.hook(this, 'init');
	    if (this.config.init.active)
	      return this.fire(this.config.init.name, []);
	  },

	  is: function(state) {
	    return Array.isArray(state) ? (state.indexOf(this.state) >= 0) : (this.state === state);
	  },

	  isPending: function() {
	    return this.pending;
	  },

	  can: function(transition) {
	    return !this.isPending() && !!this.seek(transition);
	  },

	  cannot: function(transition) {
	    return !this.can(transition);
	  },

	  allStates: function() {
	    return this.config.allStates();
	  },

	  allTransitions: function() {
	    return this.config.allTransitions();
	  },

	  transitions: function() {
	    return this.config.transitionsFor(this.state);
	  },

	  seek: function(transition, args) {
	    var wildcard = this.config.defaults.wildcard,
	        entry    = this.config.transitionFor(this.state, transition),
	        to       = entry && entry.to;
	    if (typeof to === 'function')
	      return to.apply(this.context, args);
	    else if (to === wildcard)
	      return this.state
	    else
	      return to
	  },

	  fire: function(transition, args) {
	    return this.transit(transition, this.state, this.seek(transition, args), args);
	  },

	  transit: function(transition, from, to, args) {

	    var lifecycle = this.config.lifecycle,
	        changed   = this.config.options.observeUnchangedState || (from !== to);

	    if (!to)
	      return this.context.onInvalidTransition(transition, from, to);

	    if (this.isPending())
	      return this.context.onPendingTransition(transition, from, to);

	    this.config.addState(to);  // might need to add this state if it's unknown (e.g. conditional transition or goto)

	    this.beginTransit();

	    args.unshift({             // this context will be passed to each lifecycle event observer
	      transition: transition,
	      from:       from,
	      to:         to,
	      fsm:        this.context
	    });

	    return this.observeEvents([
	                this.observersForEvent(lifecycle.onBefore.transition),
	                this.observersForEvent(lifecycle.onBefore[transition]),
	      changed ? this.observersForEvent(lifecycle.onLeave.state) : UNOBSERVED,
	      changed ? this.observersForEvent(lifecycle.onLeave[from]) : UNOBSERVED,
	                this.observersForEvent(lifecycle.on.transition),
	      changed ? [ 'doTransit', [ this ] ]                       : UNOBSERVED,
	      changed ? this.observersForEvent(lifecycle.onEnter.state) : UNOBSERVED,
	      changed ? this.observersForEvent(lifecycle.onEnter[to])   : UNOBSERVED,
	      changed ? this.observersForEvent(lifecycle.on[to])        : UNOBSERVED,
	                this.observersForEvent(lifecycle.onAfter.transition),
	                this.observersForEvent(lifecycle.onAfter[transition]),
	                this.observersForEvent(lifecycle.on[transition])
	    ], args);
	  },

	  beginTransit: function()          { this.pending = true;                 },
	  endTransit:   function(result)    { this.pending = false; return result; },
	  failTransit:  function(result)    { this.pending = false; throw result;  },
	  doTransit:    function(lifecycle) { this.state = lifecycle.to;           },

	  observe: function(args) {
	    if (args.length === 2) {
	      var observer = {};
	      observer[args[0]] = args[1];
	      this.observers.push(observer);
	    }
	    else {
	      this.observers.push(args[0]);
	    }
	  },

	  observersForEvent: function(event) { // TODO: this could be cached
	    var n = 0, max = this.observers.length, observer, result = [];
	    for( ; n < max ; n++) {
	      observer = this.observers[n];
	      if (observer[event])
	        result.push(observer);
	    }
	    return [ event, result, true ]
	  },

	  observeEvents: function(events, args, previousEvent, previousResult) {
	    if (events.length === 0) {
	      return this.endTransit(previousResult === undefined ? true : previousResult);
	    }

	    var event     = events[0][0],
	        observers = events[0][1],
	        pluggable = events[0][2];

	    args[0].event = event;
	    if (event && pluggable && event !== previousEvent)
	      plugin.hook(this, 'lifecycle', args);

	    if (observers.length === 0) {
	      events.shift();
	      return this.observeEvents(events, args, event, previousResult);
	    }
	    else {
	      var observer = observers.shift(),
	          result = observer[event].apply(observer, args);
	      if (result && typeof result.then === 'function') {
	        return result.then(this.observeEvents.bind(this, events, args, event))
	                     .catch(this.failTransit.bind(this))
	      }
	      else if (result === false) {
	        return this.endTransit(false);
	      }
	      else {
	        return this.observeEvents(events, args, event, result);
	      }
	    }
	  },

	  onInvalidTransition: function(transition, from, to) {
	    throw new Exception("transition is invalid in current state", transition, from, to, this.state);
	  },

	  onPendingTransition: function(transition, from, to) {
	    throw new Exception("transition is invalid while previous transition is still in progress", transition, from, to, this.state);
	  }

	});

	//-------------------------------------------------------------------------------------------------

	module.exports = JSM;

	//-------------------------------------------------------------------------------------------------


	/***/ }),
	/* 5 */
	/***/ (function(module, exports, __webpack_require__) {


	//-----------------------------------------------------------------------------------------------

	var mixin    = __webpack_require__(0),
	    camelize = __webpack_require__(2),
	    plugin   = __webpack_require__(1),
	    Config   = __webpack_require__(3),
	    JSM      = __webpack_require__(4);

	//-----------------------------------------------------------------------------------------------

	var PublicMethods = {
	  is:                  function(state)       { return this._fsm.is(state)                                     },
	  can:                 function(transition)  { return this._fsm.can(transition)                               },
	  cannot:              function(transition)  { return this._fsm.cannot(transition)                            },
	  observe:             function()            { return this._fsm.observe(arguments)                            },
	  transitions:         function()            { return this._fsm.transitions()                                 },
	  allTransitions:      function()            { return this._fsm.allTransitions()                              },
	  allStates:           function()            { return this._fsm.allStates()                                   },
	  onInvalidTransition: function(t, from, to) { return this._fsm.onInvalidTransition(t, from, to)              },
	  onPendingTransition: function(t, from, to) { return this._fsm.onPendingTransition(t, from, to)              },
	};

	var PublicProperties = {
	  state: {
	    configurable: false,
	    enumerable:   true,
	    get: function() {
	      return this._fsm.state;
	    },
	    set: function(state) {
	      throw Error('use transitions to change state')
	    }
	  }
	};

	//-----------------------------------------------------------------------------------------------

	function StateMachine(options) {
	  return apply(this || {}, options);
	}

	function factory() {
	  var cstor, options;
	  if (typeof arguments[0] === 'function') {
	    cstor   = arguments[0];
	    options = arguments[1] || {};
	  }
	  else {
	    cstor   = function() { this._fsm.apply(this, arguments); };
	    options = arguments[0] || {};
	  }
	  var config = new Config(options, StateMachine);
	  build(cstor.prototype, config);
	  cstor.prototype._fsm.config = config; // convenience access to shared config without needing an instance
	  return cstor;
	}

	//-------------------------------------------------------------------------------------------------

	function apply(instance, options) {
	  var config = new Config(options, StateMachine);
	  build(instance, config);
	  instance._fsm();
	  return instance;
	}

	function build(target, config) {
	  if ((typeof target !== 'object') || Array.isArray(target))
	    throw Error('StateMachine can only be applied to objects');
	  plugin.build(target, config);
	  Object.defineProperties(target, PublicProperties);
	  mixin(target, PublicMethods);
	  mixin(target, config.methods);
	  config.allTransitions().forEach(function(transition) {
	    target[camelize(transition)] = function() {
	      return this._fsm.fire(transition, [].slice.call(arguments))
	    };
	  });
	  target._fsm = function() {
	    this._fsm = new JSM(this, config);
	    this._fsm.init(arguments);
	  };
	}

	//-----------------------------------------------------------------------------------------------

	StateMachine.version  = '3.0.1';
	StateMachine.factory  = factory;
	StateMachine.apply    = apply;
	StateMachine.defaults = {
	  wildcard: '*',
	  init: {
	    name: 'init',
	    from: 'none'
	  }
	};

	//===============================================================================================

	module.exports = StateMachine;


	/***/ }),
	/* 6 */
	/***/ (function(module, exports, __webpack_require__) {


	module.exports = function(message, transition, from, to, current) {
	  this.message    = message;
	  this.transition = transition;
	  this.from       = from;
	  this.to         = to;
	  this.current    = current;
	};


	/***/ })
	/******/ ]);
	});
	});

	var StateMachine = unwrapExports(stateMachine);

	var ITERATOR = _wks('iterator');

	var core_isIterable = _core.isIterable = function (it) {
	  var O = Object(it);
	  return O[ITERATOR] !== undefined
	    || '@@iterator' in O
	    // eslint-disable-next-line no-prototype-builtins
	    || _iterators.hasOwnProperty(_classof(O));
	};

	var isIterable$1 = core_isIterable;

	var isIterable = createCommonjsModule(function (module) {
	module.exports = { "default": isIterable$1, __esModule: true };
	});

	unwrapExports(isIterable);

	var core_getIterator = _core.getIterator = function (it) {
	  var iterFn = core_getIteratorMethod(it);
	  if (typeof iterFn != 'function') throw TypeError(it + ' is not iterable!');
	  return _anObject(iterFn.call(it));
	};

	var getIterator$1 = core_getIterator;

	var getIterator = createCommonjsModule(function (module) {
	module.exports = { "default": getIterator$1, __esModule: true };
	});

	unwrapExports(getIterator);

	var slicedToArray = createCommonjsModule(function (module, exports) {

	exports.__esModule = true;



	var _isIterable3 = _interopRequireDefault(isIterable);



	var _getIterator3 = _interopRequireDefault(getIterator);

	function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

	exports.default = function () {
	  function sliceIterator(arr, i) {
	    var _arr = [];
	    var _n = true;
	    var _d = false;
	    var _e = undefined;

	    try {
	      for (var _i = (0, _getIterator3.default)(arr), _s; !(_n = (_s = _i.next()).done); _n = true) {
	        _arr.push(_s.value);

	        if (i && _arr.length === i) break;
	      }
	    } catch (err) {
	      _d = true;
	      _e = err;
	    } finally {
	      try {
	        if (!_n && _i["return"]) _i["return"]();
	      } finally {
	        if (_d) throw _e;
	      }
	    }

	    return _arr;
	  }

	  return function (arr, i) {
	    if (Array.isArray(arr)) {
	      return arr;
	    } else if ((0, _isIterable3.default)(Object(arr))) {
	      return sliceIterator(arr, i);
	    } else {
	      throw new TypeError("Invalid attempt to destructure non-iterable instance");
	    }
	  };
	}();
	});

	var _slicedToArray = unwrapExports(slicedToArray);

	// https://github.com/tc39/proposal-object-values-entries

	var $entries = _objectToArray(true);

	_export(_export.S, 'Object', {
	  entries: function entries(it) {
	    return $entries(it);
	  }
	});

	var entries$1 = _core.Object.entries;

	var entries = createCommonjsModule(function (module) {
	module.exports = { "default": entries$1, __esModule: true };
	});

	var _Object$entries = unwrapExports(entries);

	var $jscomp=$jscomp||{};$jscomp.scope={};$jscomp.findInternal=function(a,b,c){a instanceof String&&(a=String(a));for(var d=a.length,e=0;e<d;e++){var f=a[e];if(b.call(c,f,e,a))return {i:e,v:f}}return {i:-1,v:void 0}};$jscomp.ASSUME_ES5=!1;$jscomp.ASSUME_NO_NATIVE_MAP=!1;$jscomp.ASSUME_NO_NATIVE_SET=!1;$jscomp.SIMPLE_FROUND_POLYFILL=!1;
	$jscomp.defineProperty=$jscomp.ASSUME_ES5||"function"==typeof Object.defineProperties?Object.defineProperty:function(a,b,c){a!=Array.prototype&&a!=Object.prototype&&(a[b]=c.value);};$jscomp.getGlobal=function(a){return "undefined"!=typeof window&&window===a?a:"undefined"!=typeof commonjsGlobal&&null!=commonjsGlobal?commonjsGlobal:a};$jscomp.global=$jscomp.getGlobal(commonjsGlobal);
	$jscomp.polyfill=function(a,b,c,d){if(b){c=$jscomp.global;a=a.split(".");for(d=0;d<a.length-1;d++){var e=a[d];e in c||(c[e]={});c=c[e];}a=a[a.length-1];d=c[a];b=b(d);b!=d&&null!=b&&$jscomp.defineProperty(c,a,{configurable:!0,writable:!0,value:b});}};$jscomp.polyfill("Array.prototype.findIndex",function(a){return a?a:function(a,c){return $jscomp.findInternal(this,a,c).i}},"es6","es3");
	$jscomp.checkStringArgs=function(a,b,c){if(null==a)throw new TypeError("The 'this' value for String.prototype."+c+" must not be null or undefined");if(b instanceof RegExp)throw new TypeError("First argument to String.prototype."+c+" must not be a regular expression");return a+""};
	$jscomp.polyfill("String.prototype.endsWith",function(a){return a?a:function(a,c){var b=$jscomp.checkStringArgs(this,a,"endsWith");a+="";void 0===c&&(c=b.length);c=Math.max(0,Math.min(c|0,b.length));for(var e=a.length;0<e&&0<c;)if(b[--c]!=a[--e])return !1;return 0>=e}},"es6","es3");$jscomp.polyfill("Array.prototype.find",function(a){return a?a:function(a,c){return $jscomp.findInternal(this,a,c).v}},"es6","es3");
	$jscomp.polyfill("String.prototype.startsWith",function(a){return a?a:function(a,c){var b=$jscomp.checkStringArgs(this,a,"startsWith");a+="";var e=b.length,f=a.length;c=Math.max(0,Math.min(c|0,b.length));for(var g=0;g<f&&c<e;)if(b[c++]!=a[g++])return !1;return g>=f}},"es6","es3");
	$jscomp.polyfill("String.prototype.repeat",function(a){return a?a:function(a){var b=$jscomp.checkStringArgs(this,null,"repeat");if(0>a||1342177279<a)throw new RangeError("Invalid count value");a|=0;for(var d="";a;)if(a&1&&(d+=b),a>>>=1)b+=b;return d}},"es6","es3");var COMPILED$1=!0,goog=goog||{};goog.global=commonjsGlobal||self;goog.isDef=function(a){return void 0!==a};goog.isString=function(a){return "string"==typeof a};goog.isBoolean=function(a){return "boolean"==typeof a};
	goog.isNumber=function(a){return "number"==typeof a};goog.exportPath_=function(a,b,c){a=a.split(".");c=c||goog.global;a[0]in c||"undefined"==typeof c.execScript||c.execScript("var "+a[0]);for(var d;a.length&&(d=a.shift());)!a.length&&goog.isDef(b)?c[d]=b:c=c[d]&&c[d]!==Object.prototype[d]?c[d]:c[d]={};};
	goog.define=function(a,b){return b};goog.FEATURESET_YEAR=2012;goog.DEBUG=!0;goog.LOCALE="en";goog.TRUSTED_SITE=!0;goog.STRICT_MODE_COMPATIBLE=!1;goog.DISALLOW_TEST_ONLY_CODE=!goog.DEBUG;goog.ENABLE_CHROME_APP_SAFE_SCRIPT_LOADING=!1;
	goog.provide=function(a){if(goog.isInModuleLoader_())throw Error("goog.provide cannot be used within a module.");goog.constructNamespace_(a);};goog.constructNamespace_=function(a,b){goog.exportPath_(a,b);};
	goog.getScriptNonce=function(a){if(a&&a!=goog.global)return goog.getScriptNonce_(a.document);null===goog.cspNonce_&&(goog.cspNonce_=goog.getScriptNonce_(goog.global.document));return goog.cspNonce_};goog.NONCE_PATTERN_=/^[\w+/_-]+[=]{0,2}$/;goog.cspNonce_=null;goog.getScriptNonce_=function(a){return (a=a.querySelector&&a.querySelector("script[nonce]"))&&(a=a.nonce||a.getAttribute("nonce"))&&goog.NONCE_PATTERN_.test(a)?a:""};goog.VALID_MODULE_RE_=/^[a-zA-Z_$][a-zA-Z0-9._$]*$/;
	goog.module=function(a){if(!goog.isString(a)||!a||-1==a.search(goog.VALID_MODULE_RE_))throw Error("Invalid module identifier");if(!goog.isInGoogModuleLoader_())throw Error("Module "+a+" has been loaded incorrectly. Note, modules cannot be loaded as normal scripts. They require some kind of pre-processing step. You're likely trying to load a module via a script tag or as a part of a concatenated bundle without rewriting the module. For more info see: https://github.com/google/closure-library/wiki/goog.module:-an-ES6-module-like-alternative-to-goog.provide.");
	if(goog.moduleLoaderState_.moduleName)throw Error("goog.module may only be called once per module.");goog.moduleLoaderState_.moduleName=a;};goog.module.get=function(a){return goog.module.getInternal_(a)};
	goog.module.getInternal_=function(a){return null};goog.ModuleType={ES6:"es6",GOOG:"goog"};goog.moduleLoaderState_=null;goog.isInModuleLoader_=function(){return goog.isInGoogModuleLoader_()||goog.isInEs6ModuleLoader_()};goog.isInGoogModuleLoader_=function(){return !!goog.moduleLoaderState_&&goog.moduleLoaderState_.type==goog.ModuleType.GOOG};
	goog.isInEs6ModuleLoader_=function(){if(goog.moduleLoaderState_&&goog.moduleLoaderState_.type==goog.ModuleType.ES6)return !0;var a=goog.global.$jscomp;return a?"function"!=typeof a.getCurrentModulePath?!1:!!a.getCurrentModulePath():!1};
	goog.module.declareLegacyNamespace=function(){goog.moduleLoaderState_.declareLegacyNamespace=!0;};
	goog.declareModuleId=function(a){if(goog.moduleLoaderState_)goog.moduleLoaderState_.moduleName=a;else {var b=goog.global.$jscomp;if(!b||"function"!=typeof b.getCurrentModulePath)throw Error('Module with namespace "'+
	a+'" has been loaded incorrectly.');b=b.require(b.getCurrentModulePath());goog.loadedModules_[a]={exports:b,type:goog.ModuleType.ES6,moduleId:a};}};goog.setTestOnly=function(a){if(goog.DISALLOW_TEST_ONLY_CODE)throw a=a||"",Error("Importing test-only code into non-debug environment"+(a?": "+a:"."));};goog.forwardDeclare=function(a){};
	goog.getObjectByName=function(a,b){a=a.split(".");b=b||goog.global;for(var c=0;c<a.length;c++)if(b=b[a[c]],!goog.isDefAndNotNull(b))return null;return b};goog.globalize=function(a,b){b=b||goog.global;for(var c in a)b[c]=a[c];};
	goog.addDependency=function(a,b,c,d){};goog.ENABLE_DEBUG_LOADER=!0;goog.logToConsole_=function(a){goog.global.console&&goog.global.console.error(a);};
	goog.require=function(a){};goog.requireType=function(a){return {}};goog.basePath="";goog.nullFunction=function(){};
	goog.abstractMethod=function(){throw Error("unimplemented abstract method");};goog.addSingletonGetter=function(a){a.instance_=void 0;a.getInstance=function(){if(a.instance_)return a.instance_;goog.DEBUG&&(goog.instantiatedSingletons_[goog.instantiatedSingletons_.length]=a);return a.instance_=new a};};goog.instantiatedSingletons_=[];goog.LOAD_MODULE_USING_EVAL=!0;goog.SEAL_MODULE_EXPORTS=goog.DEBUG;goog.loadedModules_={};goog.DEPENDENCIES_ENABLED=!COMPILED$1;goog.TRANSPILE="detect";
	goog.ASSUME_ES_MODULES_TRANSPILED=!1;goog.TRANSPILE_TO_LANGUAGE="";goog.TRANSPILER="transpile.js";goog.hasBadLetScoping=null;goog.useSafari10Workaround=function(){if(null==goog.hasBadLetScoping){try{var a=!eval('"use strict";let x = 1; function f() { return typeof x; };f() == "number";');}catch(b){a=!1;}goog.hasBadLetScoping=a;}return goog.hasBadLetScoping};goog.workaroundSafari10EvalBug=function(a){return "(function(){"+a+"\n;})();\n"};
	goog.loadModule=function(a){var b=goog.moduleLoaderState_;try{goog.moduleLoaderState_={moduleName:"",declareLegacyNamespace:!1,type:goog.ModuleType.GOOG};if(goog.isFunction(a))var c=a.call(void 0,{});else if(goog.isString(a))goog.useSafari10Workaround()&&(a=goog.workaroundSafari10EvalBug(a)),c=goog.loadModuleFromSource_.call(void 0,a);else throw Error("Invalid module definition");var d=goog.moduleLoaderState_.moduleName;if(goog.isString(d)&&d)goog.moduleLoaderState_.declareLegacyNamespace?goog.constructNamespace_(d,
	c):goog.SEAL_MODULE_EXPORTS&&Object.seal&&"object"==typeof c&&null!=c&&Object.seal(c),goog.loadedModules_[d]={exports:c,type:goog.ModuleType.GOOG,moduleId:goog.moduleLoaderState_.moduleName};else throw Error('Invalid module name "'+d+'"');}finally{goog.moduleLoaderState_=b;}};goog.loadModuleFromSource_=function(a){eval(a);return {}};goog.normalizePath_=function(a){a=a.split("/");for(var b=0;b<a.length;)"."==a[b]?a.splice(b,1):b&&".."==a[b]&&a[b-1]&&".."!=a[b-1]?a.splice(--b,2):b++;return a.join("/")};
	goog.loadFileSync_=function(a){if(goog.global.CLOSURE_LOAD_FILE_SYNC)return goog.global.CLOSURE_LOAD_FILE_SYNC(a);try{var b=new goog.global.XMLHttpRequest;b.open("get",a,!1);b.send();return 0==b.status||200==b.status?b.responseText:null}catch(c){return null}};
	goog.transpile_=function(a,b,c){var d=goog.global.$jscomp;d||(goog.global.$jscomp=d={});var e=d.transpile;if(!e){var f=goog.basePath+goog.TRANSPILER,g=goog.loadFileSync_(f);if(g){(function(){(0, eval)(g+"\n//# sourceURL="+f);}).call(goog.global);if(goog.global.$gwtExport&&goog.global.$gwtExport.$jscomp&&!goog.global.$gwtExport.$jscomp.transpile)throw Error('The transpiler did not properly export the "transpile" method. $gwtExport: '+JSON.stringify(goog.global.$gwtExport));goog.global.$jscomp.transpile=
	goog.global.$gwtExport.$jscomp.transpile;d=goog.global.$jscomp;e=d.transpile;}}e||(e=d.transpile=function(a,b){goog.logToConsole_(b+" requires transpilation but no transpiler was found.");return a});return e(a,b,c)};
	goog.typeOf=function(a){var b=typeof a;if("object"==b)if(a){if(a instanceof Array)return "array";if(a instanceof Object)return b;var c=Object.prototype.toString.call(a);if("[object Window]"==c)return "object";if("[object Array]"==c||"number"==typeof a.length&&"undefined"!=typeof a.splice&&"undefined"!=typeof a.propertyIsEnumerable&&!a.propertyIsEnumerable("splice"))return "array";if("[object Function]"==c||"undefined"!=typeof a.call&&"undefined"!=typeof a.propertyIsEnumerable&&!a.propertyIsEnumerable("call"))return "function"}else return "null";
	else if("function"==b&&"undefined"==typeof a.call)return "object";return b};goog.isNull=function(a){return null===a};goog.isDefAndNotNull=function(a){return null!=a};goog.isArray=function(a){return "array"==goog.typeOf(a)};goog.isArrayLike=function(a){var b=goog.typeOf(a);return "array"==b||"object"==b&&"number"==typeof a.length};goog.isDateLike=function(a){return goog.isObject(a)&&"function"==typeof a.getFullYear};goog.isFunction=function(a){return "function"==goog.typeOf(a)};
	goog.isObject=function(a){var b=typeof a;return "object"==b&&null!=a||"function"==b};goog.getUid=function(a){return a[goog.UID_PROPERTY_]||(a[goog.UID_PROPERTY_]=++goog.uidCounter_)};goog.hasUid=function(a){return !!a[goog.UID_PROPERTY_]};goog.removeUid=function(a){null!==a&&"removeAttribute"in a&&a.removeAttribute(goog.UID_PROPERTY_);try{delete a[goog.UID_PROPERTY_];}catch(b){}};goog.UID_PROPERTY_="closure_uid_"+(1E9*Math.random()>>>0);goog.uidCounter_=0;goog.getHashCode=goog.getUid;
	goog.removeHashCode=goog.removeUid;goog.cloneObject=function(a){var b=goog.typeOf(a);if("object"==b||"array"==b){if("function"===typeof a.clone)return a.clone();b="array"==b?[]:{};for(var c in a)b[c]=goog.cloneObject(a[c]);return b}return a};goog.bindNative_=function(a,b,c){return a.call.apply(a.bind,arguments)};
	goog.bindJs_=function(a,b,c){if(!a)throw Error();if(2<arguments.length){var d=Array.prototype.slice.call(arguments,2);return function(){var c=Array.prototype.slice.call(arguments);Array.prototype.unshift.apply(c,d);return a.apply(b,c)}}return function(){return a.apply(b,arguments)}};goog.bind=function(a,b,c){Function.prototype.bind&&-1!=Function.prototype.bind.toString().indexOf("native code")?goog.bind=goog.bindNative_:goog.bind=goog.bindJs_;return goog.bind.apply(null,arguments)};
	goog.partial=function(a,b){var c=Array.prototype.slice.call(arguments,1);return function(){var b=c.slice();b.push.apply(b,arguments);return a.apply(this,b)}};goog.mixin=function(a,b){for(var c in b)a[c]=b[c];};goog.now=goog.TRUSTED_SITE&&Date.now||function(){return +new Date};
	goog.globalEval=function(a){if(goog.global.execScript)goog.global.execScript(a,"JavaScript");else if(goog.global.eval){if(null==goog.evalWorksForGlobals_){try{goog.global.eval("var _evalTest_ = 1;");}catch(d){}if("undefined"!=typeof goog.global._evalTest_){try{delete goog.global._evalTest_;}catch(d){}goog.evalWorksForGlobals_=!0;}else goog.evalWorksForGlobals_=!1;}if(goog.evalWorksForGlobals_)goog.global.eval(a);else {var b=goog.global.document,c=b.createElement("SCRIPT");c.type="text/javascript";c.defer=
	!1;c.appendChild(b.createTextNode(a));b.head.appendChild(c);b.head.removeChild(c);}}else throw Error("goog.globalEval not available");};goog.evalWorksForGlobals_=null;
	goog.getCssName=function(a,b){if("."==String(a).charAt(0))throw Error('className passed in goog.getCssName must not start with ".". You passed: '+a);var c=function(a){return goog.cssNameMapping_[a]||a},d=function(a){a=a.split("-");for(var b=[],d=0;d<a.length;d++)b.push(c(a[d]));return b.join("-")};d=goog.cssNameMapping_?"BY_WHOLE"==goog.cssNameMappingStyle_?c:d:function(a){return a};a=b?a+"-"+d(b):d(a);return goog.global.CLOSURE_CSS_NAME_MAP_FN?goog.global.CLOSURE_CSS_NAME_MAP_FN(a):a};
	goog.setCssNameMapping=function(a,b){goog.cssNameMapping_=a;goog.cssNameMappingStyle_=b;};goog.getMsg=function(a,b,c){c&&c.html&&(a=a.replace(/</g,"&lt;"));b&&(a=a.replace(/\{\$([^}]+)}/g,function(a,c){return null!=b&&c in b?b[c]:a}));return a};goog.getMsgWithFallback=function(a,b){return a};goog.exportSymbol=function(a,b,c){goog.exportPath_(a,b,c);};
	goog.exportProperty=function(a,b,c){a[b]=c;};goog.inherits=function(a,b){function c(){}c.prototype=b.prototype;a.superClass_=b.prototype;a.prototype=new c;a.prototype.constructor=a;a.base=function(a,c,f){for(var d=Array(arguments.length-2),e=2;e<arguments.length;e++)d[e-2]=arguments[e];return b.prototype[c].apply(a,d)};};
	goog.base=function(a,b,c){var d=arguments.callee.caller;if(goog.STRICT_MODE_COMPATIBLE||goog.DEBUG&&!d)throw Error("arguments.caller not defined.  goog.base() cannot be used with strict mode code. See http://www.ecma-international.org/ecma-262/5.1/#sec-C");if("undefined"!==typeof d.superClass_){for(var e=Array(arguments.length-1),f=1;f<arguments.length;f++)e[f-1]=arguments[f];return d.superClass_.constructor.apply(a,e)}if("string"!=typeof b&&"symbol"!=typeof b)throw Error("method names provided to goog.base must be a string or a symbol");
	e=Array(arguments.length-2);for(f=2;f<arguments.length;f++)e[f-2]=arguments[f];f=!1;for(var g=a.constructor.prototype;g;g=Object.getPrototypeOf(g))if(g[b]===d)f=!0;else if(f)return g[b].apply(a,e);if(a[b]===d)return a.constructor.prototype[b].apply(a,e);throw Error("goog.base called from a method of one name to a method of a different name");};goog.scope=function(a){if(goog.isInModuleLoader_())throw Error("goog.scope is not supported within a module.");a.call(goog.global);};
	goog.defineClass=function(a,b){var c=b.constructor,d=b.statics;c&&c!=Object.prototype.constructor||(c=function(){throw Error("cannot instantiate an interface (no constructor defined).");});c=goog.defineClass.createSealingConstructor_(c,a);a&&goog.inherits(c,a);delete b.constructor;delete b.statics;goog.defineClass.applyProperties_(c.prototype,b);null!=d&&(d instanceof Function?d(c):goog.defineClass.applyProperties_(c,d));return c};
	goog.defineClass.SEAL_CLASS_INSTANCES=goog.DEBUG;goog.defineClass.createSealingConstructor_=function(a,b){if(!goog.defineClass.SEAL_CLASS_INSTANCES)return a;var c=!goog.defineClass.isUnsealable_(b),d=function(){var b=a.apply(this,arguments)||this;b[goog.UID_PROPERTY_]=b[goog.UID_PROPERTY_];this.constructor===d&&c&&Object.seal instanceof Function&&Object.seal(b);return b};return d};goog.defineClass.isUnsealable_=function(a){return a&&a.prototype&&a.prototype[goog.UNSEALABLE_CONSTRUCTOR_PROPERTY_]};
	goog.defineClass.OBJECT_PROTOTYPE_FIELDS_="constructor hasOwnProperty isPrototypeOf propertyIsEnumerable toLocaleString toString valueOf".split(" ");goog.defineClass.applyProperties_=function(a,b){for(var c in b)Object.prototype.hasOwnProperty.call(b,c)&&(a[c]=b[c]);for(var d=0;d<goog.defineClass.OBJECT_PROTOTYPE_FIELDS_.length;d++)c=goog.defineClass.OBJECT_PROTOTYPE_FIELDS_[d],Object.prototype.hasOwnProperty.call(b,c)&&(a[c]=b[c]);};
	goog.tagUnsealableClass=function(a){};goog.UNSEALABLE_CONSTRUCTOR_PROPERTY_="goog_defineClass_legacy_unsealable";
	goog.TRUSTED_TYPES_POLICY_NAME="";goog.identity_=function(a){return a};goog.createTrustedTypesPolicy=function(a){var b=null;if("undefined"===typeof TrustedTypes||!TrustedTypes.createPolicy)return b;try{b=TrustedTypes.createPolicy(a,{createHTML:goog.identity_,createScript:goog.identity_,createScriptURL:goog.identity_,createURL:goog.identity_});}catch(c){goog.logToConsole_(c.message);}return b};
	goog.TRUSTED_TYPES_POLICY_=goog.TRUSTED_TYPES_POLICY_NAME?goog.createTrustedTypesPolicy(goog.TRUSTED_TYPES_POLICY_NAME+"#base"):null;goog.object={};goog.object.is=function(a,b){return a===b?0!==a||1/a===1/b:a!==a&&b!==b};goog.object.forEach=function(a,b,c){for(var d in a)b.call(c,a[d],d,a);};goog.object.filter=function(a,b,c){var d={},e;for(e in a)b.call(c,a[e],e,a)&&(d[e]=a[e]);return d};goog.object.map=function(a,b,c){var d={},e;for(e in a)d[e]=b.call(c,a[e],e,a);return d};goog.object.some=function(a,b,c){for(var d in a)if(b.call(c,a[d],d,a))return !0;return !1};
	goog.object.every=function(a,b,c){for(var d in a)if(!b.call(c,a[d],d,a))return !1;return !0};goog.object.getCount=function(a){var b=0,c;for(c in a)b++;return b};goog.object.getAnyKey=function(a){for(var b in a)return b};goog.object.getAnyValue=function(a){for(var b in a)return a[b]};goog.object.contains=function(a,b){return goog.object.containsValue(a,b)};goog.object.getValues=function(a){var b=[],c=0,d;for(d in a)b[c++]=a[d];return b};
	goog.object.getKeys=function(a){var b=[],c=0,d;for(d in a)b[c++]=d;return b};goog.object.getValueByKeys=function(a,b){var c=goog.isArrayLike(b),d=c?b:arguments;for(c=c?0:1;c<d.length;c++){if(null==a)return;a=a[d[c]];}return a};goog.object.containsKey=function(a,b){return null!==a&&b in a};goog.object.containsValue=function(a,b){for(var c in a)if(a[c]==b)return !0;return !1};goog.object.findKey=function(a,b,c){for(var d in a)if(b.call(c,a[d],d,a))return d};
	goog.object.findValue=function(a,b,c){return (b=goog.object.findKey(a,b,c))&&a[b]};goog.object.isEmpty=function(a){for(var b in a)return !1;return !0};goog.object.clear=function(a){for(var b in a)delete a[b];};goog.object.remove=function(a,b){var c;(c=b in a)&&delete a[b];return c};goog.object.add=function(a,b,c){if(null!==a&&b in a)throw Error('The object already contains the key "'+b+'"');goog.object.set(a,b,c);};goog.object.get=function(a,b,c){return null!==a&&b in a?a[b]:c};
	goog.object.set=function(a,b,c){a[b]=c;};goog.object.setIfUndefined=function(a,b,c){return b in a?a[b]:a[b]=c};goog.object.setWithReturnValueIfNotSet=function(a,b,c){if(b in a)return a[b];c=c();return a[b]=c};goog.object.equals=function(a,b){for(var c in a)if(!(c in b)||a[c]!==b[c])return !1;for(var d in b)if(!(d in a))return !1;return !0};goog.object.clone=function(a){var b={},c;for(c in a)b[c]=a[c];return b};
	goog.object.unsafeClone=function(a){var b=goog.typeOf(a);if("object"==b||"array"==b){if(goog.isFunction(a.clone))return a.clone();b="array"==b?[]:{};for(var c in a)b[c]=goog.object.unsafeClone(a[c]);return b}return a};goog.object.transpose=function(a){var b={},c;for(c in a)b[a[c]]=c;return b};goog.object.PROTOTYPE_FIELDS_="constructor hasOwnProperty isPrototypeOf propertyIsEnumerable toLocaleString toString valueOf".split(" ");
	goog.object.extend=function(a,b){for(var c,d,e=1;e<arguments.length;e++){d=arguments[e];for(c in d)a[c]=d[c];for(var f=0;f<goog.object.PROTOTYPE_FIELDS_.length;f++)c=goog.object.PROTOTYPE_FIELDS_[f],Object.prototype.hasOwnProperty.call(d,c)&&(a[c]=d[c]);}};
	goog.object.create=function(a){var b=arguments.length;if(1==b&&goog.isArray(arguments[0]))return goog.object.create.apply(null,arguments[0]);if(b%2)throw Error("Uneven number of arguments");for(var c={},d=0;d<b;d+=2)c[arguments[d]]=arguments[d+1];return c};goog.object.createSet=function(a){var b=arguments.length;if(1==b&&goog.isArray(arguments[0]))return goog.object.createSet.apply(null,arguments[0]);for(var c={},d=0;d<b;d++)c[arguments[d]]=!0;return c};
	goog.object.createImmutableView=function(a){var b=a;Object.isFrozen&&!Object.isFrozen(a)&&(b=Object.create(a),Object.freeze(b));return b};goog.object.isImmutableView=function(a){return !!Object.isFrozen&&Object.isFrozen(a)};
	goog.object.getAllPropertyNames=function(a,b,c){if(!a)return [];if(!Object.getOwnPropertyNames||!Object.getPrototypeOf)return goog.object.getKeys(a);for(var d={};a&&(a!==Object.prototype||b)&&(a!==Function.prototype||c);){for(var e=Object.getOwnPropertyNames(a),f=0;f<e.length;f++)d[e[f]]=!0;a=Object.getPrototypeOf(a);}return goog.object.getKeys(d)};goog.object.getSuperClass=function(a){return (a=Object.getPrototypeOf(a.prototype))&&a.constructor};goog.debug={};goog.debug.Error=function(a){if(Error.captureStackTrace)Error.captureStackTrace(this,goog.debug.Error);else {var b=Error().stack;b&&(this.stack=b);}a&&(this.message=String(a));this.reportErrorToServer=!0;};goog.inherits(goog.debug.Error,Error);goog.debug.Error.prototype.name="CustomError";goog.dom={};goog.dom.NodeType={ELEMENT:1,ATTRIBUTE:2,TEXT:3,CDATA_SECTION:4,ENTITY_REFERENCE:5,ENTITY:6,PROCESSING_INSTRUCTION:7,COMMENT:8,DOCUMENT:9,DOCUMENT_TYPE:10,DOCUMENT_FRAGMENT:11,NOTATION:12};goog.asserts={};goog.asserts.ENABLE_ASSERTS=goog.DEBUG;goog.asserts.AssertionError=function(a,b){goog.debug.Error.call(this,goog.asserts.subs_(a,b));this.messagePattern=a;};goog.inherits(goog.asserts.AssertionError,goog.debug.Error);goog.asserts.AssertionError.prototype.name="AssertionError";goog.asserts.DEFAULT_ERROR_HANDLER=function(a){throw a;};goog.asserts.errorHandler_=goog.asserts.DEFAULT_ERROR_HANDLER;
	goog.asserts.subs_=function(a,b){a=a.split("%s");for(var c="",d=a.length-1,e=0;e<d;e++)c+=a[e]+(e<b.length?b[e]:"%s");return c+a[d]};goog.asserts.doAssertFailure_=function(a,b,c,d){var e="Assertion failed";if(c){e+=": "+c;var f=d;}else a&&(e+=": "+a,f=b);a=new goog.asserts.AssertionError(""+e,f||[]);goog.asserts.errorHandler_(a);};goog.asserts.setErrorHandler=function(a){goog.asserts.ENABLE_ASSERTS&&(goog.asserts.errorHandler_=a);};
	goog.asserts.assert=function(a,b,c){goog.asserts.ENABLE_ASSERTS&&!a&&goog.asserts.doAssertFailure_("",null,b,Array.prototype.slice.call(arguments,2));return a};goog.asserts.assertExists=function(a,b,c){goog.asserts.ENABLE_ASSERTS&&null==a&&goog.asserts.doAssertFailure_("Expected to exist: %s.",[a],b,Array.prototype.slice.call(arguments,2));return a};
	goog.asserts.fail=function(a,b){goog.asserts.ENABLE_ASSERTS&&goog.asserts.errorHandler_(new goog.asserts.AssertionError("Failure"+(a?": "+a:""),Array.prototype.slice.call(arguments,1)));};goog.asserts.assertNumber=function(a,b,c){goog.asserts.ENABLE_ASSERTS&&!goog.isNumber(a)&&goog.asserts.doAssertFailure_("Expected number but got %s: %s.",[goog.typeOf(a),a],b,Array.prototype.slice.call(arguments,2));return a};
	goog.asserts.assertString=function(a,b,c){goog.asserts.ENABLE_ASSERTS&&!goog.isString(a)&&goog.asserts.doAssertFailure_("Expected string but got %s: %s.",[goog.typeOf(a),a],b,Array.prototype.slice.call(arguments,2));return a};goog.asserts.assertFunction=function(a,b,c){goog.asserts.ENABLE_ASSERTS&&!goog.isFunction(a)&&goog.asserts.doAssertFailure_("Expected function but got %s: %s.",[goog.typeOf(a),a],b,Array.prototype.slice.call(arguments,2));return a};
	goog.asserts.assertObject=function(a,b,c){goog.asserts.ENABLE_ASSERTS&&!goog.isObject(a)&&goog.asserts.doAssertFailure_("Expected object but got %s: %s.",[goog.typeOf(a),a],b,Array.prototype.slice.call(arguments,2));return a};goog.asserts.assertArray=function(a,b,c){goog.asserts.ENABLE_ASSERTS&&!goog.isArray(a)&&goog.asserts.doAssertFailure_("Expected array but got %s: %s.",[goog.typeOf(a),a],b,Array.prototype.slice.call(arguments,2));return a};
	goog.asserts.assertBoolean=function(a,b,c){goog.asserts.ENABLE_ASSERTS&&!goog.isBoolean(a)&&goog.asserts.doAssertFailure_("Expected boolean but got %s: %s.",[goog.typeOf(a),a],b,Array.prototype.slice.call(arguments,2));return a};goog.asserts.assertElement=function(a,b,c){!goog.asserts.ENABLE_ASSERTS||goog.isObject(a)&&a.nodeType==goog.dom.NodeType.ELEMENT||goog.asserts.doAssertFailure_("Expected Element but got %s: %s.",[goog.typeOf(a),a],b,Array.prototype.slice.call(arguments,2));return a};
	goog.asserts.assertInstanceof=function(a,b,c,d){!goog.asserts.ENABLE_ASSERTS||a instanceof b||goog.asserts.doAssertFailure_("Expected instanceof %s but got %s.",[goog.asserts.getType_(b),goog.asserts.getType_(a)],c,Array.prototype.slice.call(arguments,3));return a};goog.asserts.assertFinite=function(a,b,c){!goog.asserts.ENABLE_ASSERTS||"number"==typeof a&&isFinite(a)||goog.asserts.doAssertFailure_("Expected %s to be a finite number but it is not.",[a],b,Array.prototype.slice.call(arguments,2));return a};
	goog.asserts.assertObjectPrototypeIsIntact=function(){for(var a in Object.prototype)goog.asserts.fail(a+" should not be enumerable in Object.prototype.");};goog.asserts.getType_=function(a){return a instanceof Function?a.displayName||a.name||"unknown type name":a instanceof Object?a.constructor.displayName||a.constructor.name||Object.prototype.toString.call(a):null===a?"null":typeof a};var jspb={BinaryConstants:{},ConstBinaryMessage:function(){},BinaryMessage:function(){}};jspb.BinaryConstants.FieldType={INVALID:-1,DOUBLE:1,FLOAT:2,INT64:3,UINT64:4,INT32:5,FIXED64:6,FIXED32:7,BOOL:8,STRING:9,GROUP:10,MESSAGE:11,BYTES:12,UINT32:13,ENUM:14,SFIXED32:15,SFIXED64:16,SINT32:17,SINT64:18,FHASH64:30,VHASH64:31};jspb.BinaryConstants.WireType={INVALID:-1,VARINT:0,FIXED64:1,DELIMITED:2,START_GROUP:3,END_GROUP:4,FIXED32:5};
	jspb.BinaryConstants.FieldTypeToWireType=function(a){var b=jspb.BinaryConstants.FieldType,c=jspb.BinaryConstants.WireType;switch(a){case b.INT32:case b.INT64:case b.UINT32:case b.UINT64:case b.SINT32:case b.SINT64:case b.BOOL:case b.ENUM:case b.VHASH64:return c.VARINT;case b.DOUBLE:case b.FIXED64:case b.SFIXED64:case b.FHASH64:return c.FIXED64;case b.STRING:case b.MESSAGE:case b.BYTES:return c.DELIMITED;case b.FLOAT:case b.FIXED32:case b.SFIXED32:return c.FIXED32;default:return c.INVALID}};
	jspb.BinaryConstants.INVALID_FIELD_NUMBER=-1;jspb.BinaryConstants.FLOAT32_EPS=1.401298464324817E-45;jspb.BinaryConstants.FLOAT32_MIN=1.1754943508222875E-38;jspb.BinaryConstants.FLOAT32_MAX=3.4028234663852886E38;jspb.BinaryConstants.FLOAT64_EPS=4.9E-324;jspb.BinaryConstants.FLOAT64_MIN=2.2250738585072014E-308;jspb.BinaryConstants.FLOAT64_MAX=1.7976931348623157E308;jspb.BinaryConstants.TWO_TO_20=1048576;jspb.BinaryConstants.TWO_TO_23=8388608;jspb.BinaryConstants.TWO_TO_31=2147483648;
	jspb.BinaryConstants.TWO_TO_32=4294967296;jspb.BinaryConstants.TWO_TO_52=4503599627370496;jspb.BinaryConstants.TWO_TO_63=0x7fffffffffffffff;jspb.BinaryConstants.TWO_TO_64=1.8446744073709552E19;jspb.BinaryConstants.ZERO_HASH="\x00\x00\x00\x00\x00\x00\x00\x00";goog.array={};goog.NATIVE_ARRAY_PROTOTYPES=goog.TRUSTED_SITE;goog.array.ASSUME_NATIVE_FUNCTIONS=2012<goog.FEATURESET_YEAR;goog.array.peek=function(a){return a[a.length-1]};goog.array.last=goog.array.peek;
	goog.array.indexOf=goog.NATIVE_ARRAY_PROTOTYPES&&(goog.array.ASSUME_NATIVE_FUNCTIONS||Array.prototype.indexOf)?function(a,b,c){goog.asserts.assert(null!=a.length);return Array.prototype.indexOf.call(a,b,c)}:function(a,b,c){c=null==c?0:0>c?Math.max(0,a.length+c):c;if(goog.isString(a))return goog.isString(b)&&1==b.length?a.indexOf(b,c):-1;for(;c<a.length;c++)if(c in a&&a[c]===b)return c;return -1};
	goog.array.lastIndexOf=goog.NATIVE_ARRAY_PROTOTYPES&&(goog.array.ASSUME_NATIVE_FUNCTIONS||Array.prototype.lastIndexOf)?function(a,b,c){goog.asserts.assert(null!=a.length);return Array.prototype.lastIndexOf.call(a,b,null==c?a.length-1:c)}:function(a,b,c){c=null==c?a.length-1:c;0>c&&(c=Math.max(0,a.length+c));if(goog.isString(a))return goog.isString(b)&&1==b.length?a.lastIndexOf(b,c):-1;for(;0<=c;c--)if(c in a&&a[c]===b)return c;return -1};
	goog.array.forEach=goog.NATIVE_ARRAY_PROTOTYPES&&(goog.array.ASSUME_NATIVE_FUNCTIONS||Array.prototype.forEach)?function(a,b,c){goog.asserts.assert(null!=a.length);Array.prototype.forEach.call(a,b,c);}:function(a,b,c){for(var d=a.length,e=goog.isString(a)?a.split(""):a,f=0;f<d;f++)f in e&&b.call(c,e[f],f,a);};goog.array.forEachRight=function(a,b,c){var d=a.length,e=goog.isString(a)?a.split(""):a;for(--d;0<=d;--d)d in e&&b.call(c,e[d],d,a);};
	goog.array.filter=goog.NATIVE_ARRAY_PROTOTYPES&&(goog.array.ASSUME_NATIVE_FUNCTIONS||Array.prototype.filter)?function(a,b,c){goog.asserts.assert(null!=a.length);return Array.prototype.filter.call(a,b,c)}:function(a,b,c){for(var d=a.length,e=[],f=0,g=goog.isString(a)?a.split(""):a,h=0;h<d;h++)if(h in g){var k=g[h];b.call(c,k,h,a)&&(e[f++]=k);}return e};
	goog.array.map=goog.NATIVE_ARRAY_PROTOTYPES&&(goog.array.ASSUME_NATIVE_FUNCTIONS||Array.prototype.map)?function(a,b,c){goog.asserts.assert(null!=a.length);return Array.prototype.map.call(a,b,c)}:function(a,b,c){for(var d=a.length,e=Array(d),f=goog.isString(a)?a.split(""):a,g=0;g<d;g++)g in f&&(e[g]=b.call(c,f[g],g,a));return e};
	goog.array.reduce=goog.NATIVE_ARRAY_PROTOTYPES&&(goog.array.ASSUME_NATIVE_FUNCTIONS||Array.prototype.reduce)?function(a,b,c,d){goog.asserts.assert(null!=a.length);d&&(b=goog.bind(b,d));return Array.prototype.reduce.call(a,b,c)}:function(a,b,c,d){var e=c;goog.array.forEach(a,function(c,g){e=b.call(d,e,c,g,a);});return e};
	goog.array.reduceRight=goog.NATIVE_ARRAY_PROTOTYPES&&(goog.array.ASSUME_NATIVE_FUNCTIONS||Array.prototype.reduceRight)?function(a,b,c,d){goog.asserts.assert(null!=a.length);goog.asserts.assert(null!=b);d&&(b=goog.bind(b,d));return Array.prototype.reduceRight.call(a,b,c)}:function(a,b,c,d){var e=c;goog.array.forEachRight(a,function(c,g){e=b.call(d,e,c,g,a);});return e};
	goog.array.some=goog.NATIVE_ARRAY_PROTOTYPES&&(goog.array.ASSUME_NATIVE_FUNCTIONS||Array.prototype.some)?function(a,b,c){goog.asserts.assert(null!=a.length);return Array.prototype.some.call(a,b,c)}:function(a,b,c){for(var d=a.length,e=goog.isString(a)?a.split(""):a,f=0;f<d;f++)if(f in e&&b.call(c,e[f],f,a))return !0;return !1};
	goog.array.every=goog.NATIVE_ARRAY_PROTOTYPES&&(goog.array.ASSUME_NATIVE_FUNCTIONS||Array.prototype.every)?function(a,b,c){goog.asserts.assert(null!=a.length);return Array.prototype.every.call(a,b,c)}:function(a,b,c){for(var d=a.length,e=goog.isString(a)?a.split(""):a,f=0;f<d;f++)if(f in e&&!b.call(c,e[f],f,a))return !1;return !0};goog.array.count=function(a,b,c){var d=0;goog.array.forEach(a,function(a,f,g){b.call(c,a,f,g)&&++d;},c);return d};
	goog.array.find=function(a,b,c){b=goog.array.findIndex(a,b,c);return 0>b?null:goog.isString(a)?a.charAt(b):a[b]};goog.array.findIndex=function(a,b,c){for(var d=a.length,e=goog.isString(a)?a.split(""):a,f=0;f<d;f++)if(f in e&&b.call(c,e[f],f,a))return f;return -1};goog.array.findRight=function(a,b,c){b=goog.array.findIndexRight(a,b,c);return 0>b?null:goog.isString(a)?a.charAt(b):a[b]};
	goog.array.findIndexRight=function(a,b,c){var d=a.length,e=goog.isString(a)?a.split(""):a;for(--d;0<=d;d--)if(d in e&&b.call(c,e[d],d,a))return d;return -1};goog.array.contains=function(a,b){return 0<=goog.array.indexOf(a,b)};goog.array.isEmpty=function(a){return 0==a.length};goog.array.clear=function(a){if(!goog.isArray(a))for(var b=a.length-1;0<=b;b--)delete a[b];a.length=0;};goog.array.insert=function(a,b){goog.array.contains(a,b)||a.push(b);};
	goog.array.insertAt=function(a,b,c){goog.array.splice(a,c,0,b);};goog.array.insertArrayAt=function(a,b,c){goog.partial(goog.array.splice,a,c,0).apply(null,b);};goog.array.insertBefore=function(a,b,c){var d;2==arguments.length||0>(d=goog.array.indexOf(a,c))?a.push(b):goog.array.insertAt(a,b,d);};goog.array.remove=function(a,b){b=goog.array.indexOf(a,b);var c;(c=0<=b)&&goog.array.removeAt(a,b);return c};
	goog.array.removeLast=function(a,b){b=goog.array.lastIndexOf(a,b);return 0<=b?(goog.array.removeAt(a,b),!0):!1};goog.array.removeAt=function(a,b){goog.asserts.assert(null!=a.length);return 1==Array.prototype.splice.call(a,b,1).length};goog.array.removeIf=function(a,b,c){b=goog.array.findIndex(a,b,c);return 0<=b?(goog.array.removeAt(a,b),!0):!1};goog.array.removeAllIf=function(a,b,c){var d=0;goog.array.forEachRight(a,function(e,f){b.call(c,e,f,a)&&goog.array.removeAt(a,f)&&d++;});return d};
	goog.array.concat=function(a){return Array.prototype.concat.apply([],arguments)};goog.array.join=function(a){return Array.prototype.concat.apply([],arguments)};goog.array.toArray=function(a){var b=a.length;if(0<b){for(var c=Array(b),d=0;d<b;d++)c[d]=a[d];return c}return []};goog.array.clone=goog.array.toArray;goog.array.extend=function(a,b){for(var c=1;c<arguments.length;c++){var d=arguments[c];if(goog.isArrayLike(d)){var e=a.length||0,f=d.length||0;a.length=e+f;for(var g=0;g<f;g++)a[e+g]=d[g];}else a.push(d);}};
	goog.array.splice=function(a,b,c,d){goog.asserts.assert(null!=a.length);return Array.prototype.splice.apply(a,goog.array.slice(arguments,1))};goog.array.slice=function(a,b,c){goog.asserts.assert(null!=a.length);return 2>=arguments.length?Array.prototype.slice.call(a,b):Array.prototype.slice.call(a,b,c)};
	goog.array.removeDuplicates=function(a,b,c){b=b||a;var d=function(a){return goog.isObject(a)?"o"+goog.getUid(a):(typeof a).charAt(0)+a};c=c||d;d={};for(var e=0,f=0;f<a.length;){var g=a[f++],h=c(g);Object.prototype.hasOwnProperty.call(d,h)||(d[h]=!0,b[e++]=g);}b.length=e;};goog.array.binarySearch=function(a,b,c){return goog.array.binarySearch_(a,c||goog.array.defaultCompare,!1,b)};goog.array.binarySelect=function(a,b,c){return goog.array.binarySearch_(a,b,!0,void 0,c)};
	goog.array.binarySearch_=function(a,b,c,d,e){for(var f=0,g=a.length,h;f<g;){var k=f+g>>1;var l=c?b.call(e,a[k],k,a):b(d,a[k]);0<l?f=k+1:(g=k,h=!l);}return h?f:~f};goog.array.sort=function(a,b){a.sort(b||goog.array.defaultCompare);};goog.array.stableSort=function(a,b){for(var c=Array(a.length),d=0;d<a.length;d++)c[d]={index:d,value:a[d]};var e=b||goog.array.defaultCompare;goog.array.sort(c,function(a,b){return e(a.value,b.value)||a.index-b.index});for(d=0;d<a.length;d++)a[d]=c[d].value;};
	goog.array.sortByKey=function(a,b,c){var d=c||goog.array.defaultCompare;goog.array.sort(a,function(a,c){return d(b(a),b(c))});};goog.array.sortObjectsByKey=function(a,b,c){goog.array.sortByKey(a,function(a){return a[b]},c);};goog.array.isSorted=function(a,b,c){b=b||goog.array.defaultCompare;for(var d=1;d<a.length;d++){var e=b(a[d-1],a[d]);if(0<e||0==e&&c)return !1}return !0};
	goog.array.equals=function(a,b,c){if(!goog.isArrayLike(a)||!goog.isArrayLike(b)||a.length!=b.length)return !1;var d=a.length;c=c||goog.array.defaultCompareEquality;for(var e=0;e<d;e++)if(!c(a[e],b[e]))return !1;return !0};goog.array.compare3=function(a,b,c){c=c||goog.array.defaultCompare;for(var d=Math.min(a.length,b.length),e=0;e<d;e++){var f=c(a[e],b[e]);if(0!=f)return f}return goog.array.defaultCompare(a.length,b.length)};goog.array.defaultCompare=function(a,b){return a>b?1:a<b?-1:0};
	goog.array.inverseDefaultCompare=function(a,b){return -goog.array.defaultCompare(a,b)};goog.array.defaultCompareEquality=function(a,b){return a===b};goog.array.binaryInsert=function(a,b,c){c=goog.array.binarySearch(a,b,c);return 0>c?(goog.array.insertAt(a,b,-(c+1)),!0):!1};goog.array.binaryRemove=function(a,b,c){b=goog.array.binarySearch(a,b,c);return 0<=b?goog.array.removeAt(a,b):!1};
	goog.array.bucket=function(a,b,c){for(var d={},e=0;e<a.length;e++){var f=a[e],g=b.call(c,f,e,a);goog.isDef(g)&&(d[g]||(d[g]=[])).push(f);}return d};goog.array.toObject=function(a,b,c){var d={};goog.array.forEach(a,function(e,f){d[b.call(c,e,f,a)]=e;});return d};goog.array.range=function(a,b,c){var d=[],e=0,f=a;c=c||1;void 0!==b&&(e=a,f=b);if(0>c*(f-e))return [];if(0<c)for(a=e;a<f;a+=c)d.push(a);else for(a=e;a>f;a+=c)d.push(a);return d};
	goog.array.repeat=function(a,b){for(var c=[],d=0;d<b;d++)c[d]=a;return c};goog.array.flatten=function(a){for(var b=[],c=0;c<arguments.length;c++){var d=arguments[c];if(goog.isArray(d))for(var e=0;e<d.length;e+=8192){var f=goog.array.slice(d,e,e+8192);f=goog.array.flatten.apply(null,f);for(var g=0;g<f.length;g++)b.push(f[g]);}else b.push(d);}return b};
	goog.array.rotate=function(a,b){goog.asserts.assert(null!=a.length);a.length&&(b%=a.length,0<b?Array.prototype.unshift.apply(a,a.splice(-b,b)):0>b&&Array.prototype.push.apply(a,a.splice(0,-b)));return a};goog.array.moveItem=function(a,b,c){goog.asserts.assert(0<=b&&b<a.length);goog.asserts.assert(0<=c&&c<a.length);b=Array.prototype.splice.call(a,b,1);Array.prototype.splice.call(a,c,0,b[0]);};
	goog.array.zip=function(a){if(!arguments.length)return [];for(var b=[],c=arguments[0].length,d=1;d<arguments.length;d++)arguments[d].length<c&&(c=arguments[d].length);for(d=0;d<c;d++){for(var e=[],f=0;f<arguments.length;f++)e.push(arguments[f][d]);b.push(e);}return b};goog.array.shuffle=function(a,b){b=b||Math.random;for(var c=a.length-1;0<c;c--){var d=Math.floor(b()*(c+1)),e=a[c];a[c]=a[d];a[d]=e;}};goog.array.copyByIndex=function(a,b){var c=[];goog.array.forEach(b,function(b){c.push(a[b]);});return c};
	goog.array.concatMap=function(a,b,c){return goog.array.concat.apply([],goog.array.map(a,b,c))};goog.crypt={};goog.crypt.stringToByteArray=function(a){for(var b=[],c=0,d=0;d<a.length;d++){var e=a.charCodeAt(d);255<e&&(b[c++]=e&255,e>>=8);b[c++]=e;}return b};goog.crypt.byteArrayToString=function(a){if(8192>=a.length)return String.fromCharCode.apply(null,a);for(var b="",c=0;c<a.length;c+=8192){var d=goog.array.slice(a,c,c+8192);b+=String.fromCharCode.apply(null,d);}return b};
	goog.crypt.byteArrayToHex=function(a,b){return goog.array.map(a,function(a){a=a.toString(16);return 1<a.length?a:"0"+a}).join(b||"")};goog.crypt.hexToByteArray=function(a){goog.asserts.assert(0==a.length%2,"Key string length must be multiple of 2");for(var b=[],c=0;c<a.length;c+=2)b.push(parseInt(a.substring(c,c+2),16));return b};
	goog.crypt.stringToUtf8ByteArray=function(a){for(var b=[],c=0,d=0;d<a.length;d++){var e=a.charCodeAt(d);128>e?b[c++]=e:(2048>e?b[c++]=e>>6|192:(55296==(e&64512)&&d+1<a.length&&56320==(a.charCodeAt(d+1)&64512)?(e=65536+((e&1023)<<10)+(a.charCodeAt(++d)&1023),b[c++]=e>>18|240,b[c++]=e>>12&63|128):b[c++]=e>>12|224,b[c++]=e>>6&63|128),b[c++]=e&63|128);}return b};
	goog.crypt.utf8ByteArrayToString=function(a){for(var b=[],c=0,d=0;c<a.length;){var e=a[c++];if(128>e)b[d++]=String.fromCharCode(e);else if(191<e&&224>e){var f=a[c++];b[d++]=String.fromCharCode((e&31)<<6|f&63);}else if(239<e&&365>e){f=a[c++];var g=a[c++],h=a[c++];e=((e&7)<<18|(f&63)<<12|(g&63)<<6|h&63)-65536;b[d++]=String.fromCharCode(55296+(e>>10));b[d++]=String.fromCharCode(56320+(e&1023));}else f=a[c++],g=a[c++],b[d++]=String.fromCharCode((e&15)<<12|(f&63)<<6|g&63);}return b.join("")};
	goog.crypt.xorByteArray=function(a,b){goog.asserts.assert(a.length==b.length,"XOR array lengths must match");for(var c=[],d=0;d<a.length;d++)c.push(a[d]^b[d]);return c};goog.dom.asserts={};goog.dom.asserts.assertIsLocation=function(a){if(goog.asserts.ENABLE_ASSERTS){var b=goog.dom.asserts.getWindow_(a);b&&(!a||!(a instanceof b.Location)&&a instanceof b.Element)&&goog.asserts.fail("Argument is not a Location (or a non-Element mock); got: %s",goog.dom.asserts.debugStringForType_(a));}return a};
	goog.dom.asserts.assertIsElementType_=function(a,b){if(goog.asserts.ENABLE_ASSERTS){var c=goog.dom.asserts.getWindow_(a);c&&"undefined"!=typeof c[b]&&(a&&(a instanceof c[b]||!(a instanceof c.Location||a instanceof c.Element))||goog.asserts.fail("Argument is not a %s (or a non-Element, non-Location mock); got: %s",b,goog.dom.asserts.debugStringForType_(a)));}return a};goog.dom.asserts.assertIsHTMLAnchorElement=function(a){return goog.dom.asserts.assertIsElementType_(a,"HTMLAnchorElement")};
	goog.dom.asserts.assertIsHTMLButtonElement=function(a){return goog.dom.asserts.assertIsElementType_(a,"HTMLButtonElement")};goog.dom.asserts.assertIsHTMLLinkElement=function(a){return goog.dom.asserts.assertIsElementType_(a,"HTMLLinkElement")};goog.dom.asserts.assertIsHTMLImageElement=function(a){return goog.dom.asserts.assertIsElementType_(a,"HTMLImageElement")};goog.dom.asserts.assertIsHTMLAudioElement=function(a){return goog.dom.asserts.assertIsElementType_(a,"HTMLAudioElement")};
	goog.dom.asserts.assertIsHTMLVideoElement=function(a){return goog.dom.asserts.assertIsElementType_(a,"HTMLVideoElement")};goog.dom.asserts.assertIsHTMLInputElement=function(a){return goog.dom.asserts.assertIsElementType_(a,"HTMLInputElement")};goog.dom.asserts.assertIsHTMLTextAreaElement=function(a){return goog.dom.asserts.assertIsElementType_(a,"HTMLTextAreaElement")};goog.dom.asserts.assertIsHTMLCanvasElement=function(a){return goog.dom.asserts.assertIsElementType_(a,"HTMLCanvasElement")};
	goog.dom.asserts.assertIsHTMLEmbedElement=function(a){return goog.dom.asserts.assertIsElementType_(a,"HTMLEmbedElement")};goog.dom.asserts.assertIsHTMLFormElement=function(a){return goog.dom.asserts.assertIsElementType_(a,"HTMLFormElement")};goog.dom.asserts.assertIsHTMLFrameElement=function(a){return goog.dom.asserts.assertIsElementType_(a,"HTMLFrameElement")};goog.dom.asserts.assertIsHTMLIFrameElement=function(a){return goog.dom.asserts.assertIsElementType_(a,"HTMLIFrameElement")};
	goog.dom.asserts.assertIsHTMLObjectElement=function(a){return goog.dom.asserts.assertIsElementType_(a,"HTMLObjectElement")};goog.dom.asserts.assertIsHTMLScriptElement=function(a){return goog.dom.asserts.assertIsElementType_(a,"HTMLScriptElement")};
	goog.dom.asserts.debugStringForType_=function(a){if(goog.isObject(a))try{return a.constructor.displayName||a.constructor.name||Object.prototype.toString.call(a)}catch(b){return "<object could not be stringified>"}else return void 0===a?"undefined":null===a?"null":typeof a};goog.dom.asserts.getWindow_=function(a){try{var b=a&&a.ownerDocument,c=b&&(b.defaultView||b.parentWindow);c=c||goog.global;if(c.Element&&c.Location)return c}catch(d){}return null};goog.functions={};goog.functions.constant=function(a){return function(){return a}};goog.functions.FALSE=function(){return !1};goog.functions.TRUE=function(){return !0};goog.functions.NULL=function(){return null};goog.functions.identity=function(a,b){return a};goog.functions.error=function(a){return function(){throw Error(a);}};goog.functions.fail=function(a){return function(){throw a;}};
	goog.functions.lock=function(a,b){b=b||0;return function(){return a.apply(this,Array.prototype.slice.call(arguments,0,b))}};goog.functions.nth=function(a){return function(){return arguments[a]}};goog.functions.partialRight=function(a,b){var c=Array.prototype.slice.call(arguments,1);return function(){var b=Array.prototype.slice.call(arguments);b.push.apply(b,c);return a.apply(this,b)}};goog.functions.withReturnValue=function(a,b){return goog.functions.sequence(a,goog.functions.constant(b))};
	goog.functions.equalTo=function(a,b){return function(c){return b?a==c:a===c}};goog.functions.compose=function(a,b){var c=arguments,d=c.length;return function(){var a;d&&(a=c[d-1].apply(this,arguments));for(var b=d-2;0<=b;b--)a=c[b].call(this,a);return a}};goog.functions.sequence=function(a){var b=arguments,c=b.length;return function(){for(var a,e=0;e<c;e++)a=b[e].apply(this,arguments);return a}};
	goog.functions.and=function(a){var b=arguments,c=b.length;return function(){for(var a=0;a<c;a++)if(!b[a].apply(this,arguments))return !1;return !0}};goog.functions.or=function(a){var b=arguments,c=b.length;return function(){for(var a=0;a<c;a++)if(b[a].apply(this,arguments))return !0;return !1}};goog.functions.not=function(a){return function(){return !a.apply(this,arguments)}};
	goog.functions.create=function(a,b){var c=function(){};c.prototype=a.prototype;c=new c;a.apply(c,Array.prototype.slice.call(arguments,1));return c};goog.functions.CACHE_RETURN_VALUE=!0;goog.functions.cacheReturnValue=function(a){var b=!1,c;return function(){if(!goog.functions.CACHE_RETURN_VALUE)return a();b||(c=a(),b=!0);return c}};goog.functions.once=function(a){var b=a;return function(){if(b){var a=b;b=null;a();}}};
	goog.functions.debounce=function(a,b,c){var d=0;return function(e){goog.global.clearTimeout(d);var f=arguments;d=goog.global.setTimeout(function(){a.apply(c,f);},b);}};goog.functions.throttle=function(a,b,c){var d=0,e=!1,f=[],g=function(){d=0;e&&(e=!1,h());},h=function(){d=goog.global.setTimeout(g,b);a.apply(c,f);};return function(a){f=arguments;d?e=!0:h();}};goog.functions.rateLimit=function(a,b,c){var d=0,e=function(){d=0;};return function(f){d||(d=goog.global.setTimeout(e,b),a.apply(c,arguments));}};goog.dom.HtmlElement=function(){};goog.dom.TagName=function(a){this.tagName_=a;};goog.dom.TagName.prototype.toString=function(){return this.tagName_};goog.dom.TagName.A=new goog.dom.TagName("A");goog.dom.TagName.ABBR=new goog.dom.TagName("ABBR");goog.dom.TagName.ACRONYM=new goog.dom.TagName("ACRONYM");goog.dom.TagName.ADDRESS=new goog.dom.TagName("ADDRESS");goog.dom.TagName.APPLET=new goog.dom.TagName("APPLET");goog.dom.TagName.AREA=new goog.dom.TagName("AREA");goog.dom.TagName.ARTICLE=new goog.dom.TagName("ARTICLE");
	goog.dom.TagName.ASIDE=new goog.dom.TagName("ASIDE");goog.dom.TagName.AUDIO=new goog.dom.TagName("AUDIO");goog.dom.TagName.B=new goog.dom.TagName("B");goog.dom.TagName.BASE=new goog.dom.TagName("BASE");goog.dom.TagName.BASEFONT=new goog.dom.TagName("BASEFONT");goog.dom.TagName.BDI=new goog.dom.TagName("BDI");goog.dom.TagName.BDO=new goog.dom.TagName("BDO");goog.dom.TagName.BIG=new goog.dom.TagName("BIG");goog.dom.TagName.BLOCKQUOTE=new goog.dom.TagName("BLOCKQUOTE");goog.dom.TagName.BODY=new goog.dom.TagName("BODY");
	goog.dom.TagName.BR=new goog.dom.TagName("BR");goog.dom.TagName.BUTTON=new goog.dom.TagName("BUTTON");goog.dom.TagName.CANVAS=new goog.dom.TagName("CANVAS");goog.dom.TagName.CAPTION=new goog.dom.TagName("CAPTION");goog.dom.TagName.CENTER=new goog.dom.TagName("CENTER");goog.dom.TagName.CITE=new goog.dom.TagName("CITE");goog.dom.TagName.CODE=new goog.dom.TagName("CODE");goog.dom.TagName.COL=new goog.dom.TagName("COL");goog.dom.TagName.COLGROUP=new goog.dom.TagName("COLGROUP");
	goog.dom.TagName.COMMAND=new goog.dom.TagName("COMMAND");goog.dom.TagName.DATA=new goog.dom.TagName("DATA");goog.dom.TagName.DATALIST=new goog.dom.TagName("DATALIST");goog.dom.TagName.DD=new goog.dom.TagName("DD");goog.dom.TagName.DEL=new goog.dom.TagName("DEL");goog.dom.TagName.DETAILS=new goog.dom.TagName("DETAILS");goog.dom.TagName.DFN=new goog.dom.TagName("DFN");goog.dom.TagName.DIALOG=new goog.dom.TagName("DIALOG");goog.dom.TagName.DIR=new goog.dom.TagName("DIR");goog.dom.TagName.DIV=new goog.dom.TagName("DIV");
	goog.dom.TagName.DL=new goog.dom.TagName("DL");goog.dom.TagName.DT=new goog.dom.TagName("DT");goog.dom.TagName.EM=new goog.dom.TagName("EM");goog.dom.TagName.EMBED=new goog.dom.TagName("EMBED");goog.dom.TagName.FIELDSET=new goog.dom.TagName("FIELDSET");goog.dom.TagName.FIGCAPTION=new goog.dom.TagName("FIGCAPTION");goog.dom.TagName.FIGURE=new goog.dom.TagName("FIGURE");goog.dom.TagName.FONT=new goog.dom.TagName("FONT");goog.dom.TagName.FOOTER=new goog.dom.TagName("FOOTER");goog.dom.TagName.FORM=new goog.dom.TagName("FORM");
	goog.dom.TagName.FRAME=new goog.dom.TagName("FRAME");goog.dom.TagName.FRAMESET=new goog.dom.TagName("FRAMESET");goog.dom.TagName.H1=new goog.dom.TagName("H1");goog.dom.TagName.H2=new goog.dom.TagName("H2");goog.dom.TagName.H3=new goog.dom.TagName("H3");goog.dom.TagName.H4=new goog.dom.TagName("H4");goog.dom.TagName.H5=new goog.dom.TagName("H5");goog.dom.TagName.H6=new goog.dom.TagName("H6");goog.dom.TagName.HEAD=new goog.dom.TagName("HEAD");goog.dom.TagName.HEADER=new goog.dom.TagName("HEADER");
	goog.dom.TagName.HGROUP=new goog.dom.TagName("HGROUP");goog.dom.TagName.HR=new goog.dom.TagName("HR");goog.dom.TagName.HTML=new goog.dom.TagName("HTML");goog.dom.TagName.I=new goog.dom.TagName("I");goog.dom.TagName.IFRAME=new goog.dom.TagName("IFRAME");goog.dom.TagName.IMG=new goog.dom.TagName("IMG");goog.dom.TagName.INPUT=new goog.dom.TagName("INPUT");goog.dom.TagName.INS=new goog.dom.TagName("INS");goog.dom.TagName.ISINDEX=new goog.dom.TagName("ISINDEX");goog.dom.TagName.KBD=new goog.dom.TagName("KBD");
	goog.dom.TagName.KEYGEN=new goog.dom.TagName("KEYGEN");goog.dom.TagName.LABEL=new goog.dom.TagName("LABEL");goog.dom.TagName.LEGEND=new goog.dom.TagName("LEGEND");goog.dom.TagName.LI=new goog.dom.TagName("LI");goog.dom.TagName.LINK=new goog.dom.TagName("LINK");goog.dom.TagName.MAIN=new goog.dom.TagName("MAIN");goog.dom.TagName.MAP=new goog.dom.TagName("MAP");goog.dom.TagName.MARK=new goog.dom.TagName("MARK");goog.dom.TagName.MATH=new goog.dom.TagName("MATH");goog.dom.TagName.MENU=new goog.dom.TagName("MENU");
	goog.dom.TagName.MENUITEM=new goog.dom.TagName("MENUITEM");goog.dom.TagName.META=new goog.dom.TagName("META");goog.dom.TagName.METER=new goog.dom.TagName("METER");goog.dom.TagName.NAV=new goog.dom.TagName("NAV");goog.dom.TagName.NOFRAMES=new goog.dom.TagName("NOFRAMES");goog.dom.TagName.NOSCRIPT=new goog.dom.TagName("NOSCRIPT");goog.dom.TagName.OBJECT=new goog.dom.TagName("OBJECT");goog.dom.TagName.OL=new goog.dom.TagName("OL");goog.dom.TagName.OPTGROUP=new goog.dom.TagName("OPTGROUP");
	goog.dom.TagName.OPTION=new goog.dom.TagName("OPTION");goog.dom.TagName.OUTPUT=new goog.dom.TagName("OUTPUT");goog.dom.TagName.P=new goog.dom.TagName("P");goog.dom.TagName.PARAM=new goog.dom.TagName("PARAM");goog.dom.TagName.PICTURE=new goog.dom.TagName("PICTURE");goog.dom.TagName.PRE=new goog.dom.TagName("PRE");goog.dom.TagName.PROGRESS=new goog.dom.TagName("PROGRESS");goog.dom.TagName.Q=new goog.dom.TagName("Q");goog.dom.TagName.RP=new goog.dom.TagName("RP");goog.dom.TagName.RT=new goog.dom.TagName("RT");
	goog.dom.TagName.RTC=new goog.dom.TagName("RTC");goog.dom.TagName.RUBY=new goog.dom.TagName("RUBY");goog.dom.TagName.S=new goog.dom.TagName("S");goog.dom.TagName.SAMP=new goog.dom.TagName("SAMP");goog.dom.TagName.SCRIPT=new goog.dom.TagName("SCRIPT");goog.dom.TagName.SECTION=new goog.dom.TagName("SECTION");goog.dom.TagName.SELECT=new goog.dom.TagName("SELECT");goog.dom.TagName.SMALL=new goog.dom.TagName("SMALL");goog.dom.TagName.SOURCE=new goog.dom.TagName("SOURCE");goog.dom.TagName.SPAN=new goog.dom.TagName("SPAN");
	goog.dom.TagName.STRIKE=new goog.dom.TagName("STRIKE");goog.dom.TagName.STRONG=new goog.dom.TagName("STRONG");goog.dom.TagName.STYLE=new goog.dom.TagName("STYLE");goog.dom.TagName.SUB=new goog.dom.TagName("SUB");goog.dom.TagName.SUMMARY=new goog.dom.TagName("SUMMARY");goog.dom.TagName.SUP=new goog.dom.TagName("SUP");goog.dom.TagName.SVG=new goog.dom.TagName("SVG");goog.dom.TagName.TABLE=new goog.dom.TagName("TABLE");goog.dom.TagName.TBODY=new goog.dom.TagName("TBODY");goog.dom.TagName.TD=new goog.dom.TagName("TD");
	goog.dom.TagName.TEMPLATE=new goog.dom.TagName("TEMPLATE");goog.dom.TagName.TEXTAREA=new goog.dom.TagName("TEXTAREA");goog.dom.TagName.TFOOT=new goog.dom.TagName("TFOOT");goog.dom.TagName.TH=new goog.dom.TagName("TH");goog.dom.TagName.THEAD=new goog.dom.TagName("THEAD");goog.dom.TagName.TIME=new goog.dom.TagName("TIME");goog.dom.TagName.TITLE=new goog.dom.TagName("TITLE");goog.dom.TagName.TR=new goog.dom.TagName("TR");goog.dom.TagName.TRACK=new goog.dom.TagName("TRACK");goog.dom.TagName.TT=new goog.dom.TagName("TT");
	goog.dom.TagName.U=new goog.dom.TagName("U");goog.dom.TagName.UL=new goog.dom.TagName("UL");goog.dom.TagName.VAR=new goog.dom.TagName("VAR");goog.dom.TagName.VIDEO=new goog.dom.TagName("VIDEO");goog.dom.TagName.WBR=new goog.dom.TagName("WBR");goog.dom.tags={};goog.dom.tags.VOID_TAGS_={area:!0,base:!0,br:!0,col:!0,command:!0,embed:!0,hr:!0,img:!0,input:!0,keygen:!0,link:!0,meta:!0,param:!0,source:!0,track:!0,wbr:!0};goog.dom.tags.isVoidTag=function(a){return !0===goog.dom.tags.VOID_TAGS_[a]};goog.html={};goog.html.trustedtypes={};goog.html.trustedtypes.PRIVATE_DO_NOT_ACCESS_OR_ELSE_POLICY=goog.TRUSTED_TYPES_POLICY_NAME?goog.createTrustedTypesPolicy(goog.TRUSTED_TYPES_POLICY_NAME+"#html"):null;goog.string={};goog.string.TypedString=function(){};goog.string.Const=function(a,b){this.stringConstValueWithSecurityContract__googStringSecurityPrivate_=a===goog.string.Const.GOOG_STRING_CONSTRUCTOR_TOKEN_PRIVATE_&&b||"";this.STRING_CONST_TYPE_MARKER__GOOG_STRING_SECURITY_PRIVATE_=goog.string.Const.TYPE_MARKER_;};goog.string.Const.prototype.implementsGoogStringTypedString=!0;goog.string.Const.prototype.getTypedStringValue=function(){return this.stringConstValueWithSecurityContract__googStringSecurityPrivate_};
	goog.string.Const.prototype.toString=function(){return "Const{"+this.stringConstValueWithSecurityContract__googStringSecurityPrivate_+"}"};goog.string.Const.unwrap=function(a){if(a instanceof goog.string.Const&&a.constructor===goog.string.Const&&a.STRING_CONST_TYPE_MARKER__GOOG_STRING_SECURITY_PRIVATE_===goog.string.Const.TYPE_MARKER_)return a.stringConstValueWithSecurityContract__googStringSecurityPrivate_;goog.asserts.fail("expected object of type Const, got '"+a+"'");return "type_error:Const"};
	goog.string.Const.from=function(a){return new goog.string.Const(goog.string.Const.GOOG_STRING_CONSTRUCTOR_TOKEN_PRIVATE_,a)};goog.string.Const.TYPE_MARKER_={};goog.string.Const.GOOG_STRING_CONSTRUCTOR_TOKEN_PRIVATE_={};goog.string.Const.EMPTY=goog.string.Const.from("");goog.html.SafeScript=function(){this.privateDoNotAccessOrElseSafeScriptWrappedValue_="";this.SAFE_SCRIPT_TYPE_MARKER_GOOG_HTML_SECURITY_PRIVATE_=goog.html.SafeScript.TYPE_MARKER_GOOG_HTML_SECURITY_PRIVATE_;};goog.html.SafeScript.prototype.implementsGoogStringTypedString=!0;goog.html.SafeScript.TYPE_MARKER_GOOG_HTML_SECURITY_PRIVATE_={};goog.html.SafeScript.fromConstant=function(a){a=goog.string.Const.unwrap(a);return 0===a.length?goog.html.SafeScript.EMPTY:goog.html.SafeScript.createSafeScriptSecurityPrivateDoNotAccessOrElse(a)};
	goog.html.SafeScript.fromConstantAndArgs=function(a,b){for(var c=[],d=1;d<arguments.length;d++)c.push(goog.html.SafeScript.stringify_(arguments[d]));return goog.html.SafeScript.createSafeScriptSecurityPrivateDoNotAccessOrElse("("+goog.string.Const.unwrap(a)+")("+c.join(", ")+");")};goog.html.SafeScript.fromJson=function(a){return goog.html.SafeScript.createSafeScriptSecurityPrivateDoNotAccessOrElse(goog.html.SafeScript.stringify_(a))};goog.html.SafeScript.prototype.getTypedStringValue=function(){return this.privateDoNotAccessOrElseSafeScriptWrappedValue_.toString()};
	goog.DEBUG&&(goog.html.SafeScript.prototype.toString=function(){return "SafeScript{"+this.privateDoNotAccessOrElseSafeScriptWrappedValue_+"}"});goog.html.SafeScript.unwrap=function(a){return goog.html.SafeScript.unwrapTrustedScript(a).toString()};
	goog.html.SafeScript.unwrapTrustedScript=function(a){if(a instanceof goog.html.SafeScript&&a.constructor===goog.html.SafeScript&&a.SAFE_SCRIPT_TYPE_MARKER_GOOG_HTML_SECURITY_PRIVATE_===goog.html.SafeScript.TYPE_MARKER_GOOG_HTML_SECURITY_PRIVATE_)return a.privateDoNotAccessOrElseSafeScriptWrappedValue_;goog.asserts.fail("expected object of type SafeScript, got '"+a+"' of type "+goog.typeOf(a));return "type_error:SafeScript"};
	goog.html.SafeScript.stringify_=function(a){return JSON.stringify(a).replace(/</g,"\\x3c")};goog.html.SafeScript.createSafeScriptSecurityPrivateDoNotAccessOrElse=function(a){return (new goog.html.SafeScript).initSecurityPrivateDoNotAccessOrElse_(a)};
	goog.html.SafeScript.prototype.initSecurityPrivateDoNotAccessOrElse_=function(a){this.privateDoNotAccessOrElseSafeScriptWrappedValue_=goog.html.trustedtypes.PRIVATE_DO_NOT_ACCESS_OR_ELSE_POLICY?goog.html.trustedtypes.PRIVATE_DO_NOT_ACCESS_OR_ELSE_POLICY.createScript(a):a;return this};goog.html.SafeScript.EMPTY=goog.html.SafeScript.createSafeScriptSecurityPrivateDoNotAccessOrElse("");goog.fs={};goog.fs.url={};goog.fs.url.createObjectUrl=function(a){return goog.fs.url.getUrlObject_().createObjectURL(a)};goog.fs.url.revokeObjectUrl=function(a){goog.fs.url.getUrlObject_().revokeObjectURL(a);};goog.fs.url.getUrlObject_=function(){var a=goog.fs.url.findUrlObject_();if(null!=a)return a;throw Error("This browser doesn't seem to support blob URLs");};
	goog.fs.url.findUrlObject_=function(){return goog.isDef(goog.global.URL)&&goog.isDef(goog.global.URL.createObjectURL)?goog.global.URL:goog.isDef(goog.global.webkitURL)&&goog.isDef(goog.global.webkitURL.createObjectURL)?goog.global.webkitURL:goog.isDef(goog.global.createObjectURL)?goog.global:null};goog.fs.url.browserSupportsObjectUrls=function(){return null!=goog.fs.url.findUrlObject_()};goog.i18n={};goog.i18n.bidi={};goog.i18n.bidi.FORCE_RTL=!1;
	goog.i18n.bidi.IS_RTL=goog.i18n.bidi.FORCE_RTL||("ar"==goog.LOCALE.substring(0,2).toLowerCase()||"fa"==goog.LOCALE.substring(0,2).toLowerCase()||"he"==goog.LOCALE.substring(0,2).toLowerCase()||"iw"==goog.LOCALE.substring(0,2).toLowerCase()||"ps"==goog.LOCALE.substring(0,2).toLowerCase()||"sd"==goog.LOCALE.substring(0,2).toLowerCase()||"ug"==goog.LOCALE.substring(0,2).toLowerCase()||"ur"==goog.LOCALE.substring(0,2).toLowerCase()||"yi"==goog.LOCALE.substring(0,2).toLowerCase())&&(2==goog.LOCALE.length||
	"-"==goog.LOCALE.substring(2,3)||"_"==goog.LOCALE.substring(2,3))||3<=goog.LOCALE.length&&"ckb"==goog.LOCALE.substring(0,3).toLowerCase()&&(3==goog.LOCALE.length||"-"==goog.LOCALE.substring(3,4)||"_"==goog.LOCALE.substring(3,4))||7<=goog.LOCALE.length&&("-"==goog.LOCALE.substring(2,3)||"_"==goog.LOCALE.substring(2,3))&&("adlm"==goog.LOCALE.substring(3,7).toLowerCase()||"arab"==goog.LOCALE.substring(3,7).toLowerCase()||"hebr"==goog.LOCALE.substring(3,7).toLowerCase()||"nkoo"==goog.LOCALE.substring(3,
	7).toLowerCase()||"rohg"==goog.LOCALE.substring(3,7).toLowerCase()||"thaa"==goog.LOCALE.substring(3,7).toLowerCase())||8<=goog.LOCALE.length&&("-"==goog.LOCALE.substring(3,4)||"_"==goog.LOCALE.substring(3,4))&&("adlm"==goog.LOCALE.substring(4,8).toLowerCase()||"arab"==goog.LOCALE.substring(4,8).toLowerCase()||"hebr"==goog.LOCALE.substring(4,8).toLowerCase()||"nkoo"==goog.LOCALE.substring(4,8).toLowerCase()||"rohg"==goog.LOCALE.substring(4,8).toLowerCase()||"thaa"==goog.LOCALE.substring(4,8).toLowerCase());
	goog.i18n.bidi.Format={LRE:"\u202a",RLE:"\u202b",PDF:"\u202c",LRM:"\u200e",RLM:"\u200f"};goog.i18n.bidi.Dir={LTR:1,RTL:-1,NEUTRAL:0};goog.i18n.bidi.RIGHT="right";goog.i18n.bidi.LEFT="left";goog.i18n.bidi.I18N_RIGHT=goog.i18n.bidi.IS_RTL?goog.i18n.bidi.LEFT:goog.i18n.bidi.RIGHT;goog.i18n.bidi.I18N_LEFT=goog.i18n.bidi.IS_RTL?goog.i18n.bidi.RIGHT:goog.i18n.bidi.LEFT;
	goog.i18n.bidi.toDir=function(a,b){return "number"==typeof a?0<a?goog.i18n.bidi.Dir.LTR:0>a?goog.i18n.bidi.Dir.RTL:b?null:goog.i18n.bidi.Dir.NEUTRAL:null==a?null:a?goog.i18n.bidi.Dir.RTL:goog.i18n.bidi.Dir.LTR};goog.i18n.bidi.ltrChars_="A-Za-z\u00c0-\u00d6\u00d8-\u00f6\u00f8-\u02b8\u0300-\u0590\u0900-\u1fff\u200e\u2c00-\ud801\ud804-\ud839\ud83c-\udbff\uf900-\ufb1c\ufe00-\ufe6f\ufefd-\uffff";goog.i18n.bidi.rtlChars_="\u0591-\u06ef\u06fa-\u08ff\u200f\ud802-\ud803\ud83a-\ud83b\ufb1d-\ufdff\ufe70-\ufefc";
	goog.i18n.bidi.htmlSkipReg_=/<[^>]*>|&[^;]+;/g;goog.i18n.bidi.stripHtmlIfNeeded_=function(a,b){return b?a.replace(goog.i18n.bidi.htmlSkipReg_,""):a};goog.i18n.bidi.rtlCharReg_=new RegExp("["+goog.i18n.bidi.rtlChars_+"]");goog.i18n.bidi.ltrCharReg_=new RegExp("["+goog.i18n.bidi.ltrChars_+"]");goog.i18n.bidi.hasAnyRtl=function(a,b){return goog.i18n.bidi.rtlCharReg_.test(goog.i18n.bidi.stripHtmlIfNeeded_(a,b))};goog.i18n.bidi.hasRtlChar=goog.i18n.bidi.hasAnyRtl;
	goog.i18n.bidi.hasAnyLtr=function(a,b){return goog.i18n.bidi.ltrCharReg_.test(goog.i18n.bidi.stripHtmlIfNeeded_(a,b))};goog.i18n.bidi.ltrRe_=new RegExp("^["+goog.i18n.bidi.ltrChars_+"]");goog.i18n.bidi.rtlRe_=new RegExp("^["+goog.i18n.bidi.rtlChars_+"]");goog.i18n.bidi.isRtlChar=function(a){return goog.i18n.bidi.rtlRe_.test(a)};goog.i18n.bidi.isLtrChar=function(a){return goog.i18n.bidi.ltrRe_.test(a)};goog.i18n.bidi.isNeutralChar=function(a){return !goog.i18n.bidi.isLtrChar(a)&&!goog.i18n.bidi.isRtlChar(a)};
	goog.i18n.bidi.ltrDirCheckRe_=new RegExp("^[^"+goog.i18n.bidi.rtlChars_+"]*["+goog.i18n.bidi.ltrChars_+"]");goog.i18n.bidi.rtlDirCheckRe_=new RegExp("^[^"+goog.i18n.bidi.ltrChars_+"]*["+goog.i18n.bidi.rtlChars_+"]");goog.i18n.bidi.startsWithRtl=function(a,b){return goog.i18n.bidi.rtlDirCheckRe_.test(goog.i18n.bidi.stripHtmlIfNeeded_(a,b))};goog.i18n.bidi.isRtlText=goog.i18n.bidi.startsWithRtl;
	goog.i18n.bidi.startsWithLtr=function(a,b){return goog.i18n.bidi.ltrDirCheckRe_.test(goog.i18n.bidi.stripHtmlIfNeeded_(a,b))};goog.i18n.bidi.isLtrText=goog.i18n.bidi.startsWithLtr;goog.i18n.bidi.isRequiredLtrRe_=/^http:\/\/.*/;goog.i18n.bidi.isNeutralText=function(a,b){a=goog.i18n.bidi.stripHtmlIfNeeded_(a,b);return goog.i18n.bidi.isRequiredLtrRe_.test(a)||!goog.i18n.bidi.hasAnyLtr(a)&&!goog.i18n.bidi.hasAnyRtl(a)};
	goog.i18n.bidi.ltrExitDirCheckRe_=new RegExp("["+goog.i18n.bidi.ltrChars_+"][^"+goog.i18n.bidi.rtlChars_+"]*$");goog.i18n.bidi.rtlExitDirCheckRe_=new RegExp("["+goog.i18n.bidi.rtlChars_+"][^"+goog.i18n.bidi.ltrChars_+"]*$");goog.i18n.bidi.endsWithLtr=function(a,b){return goog.i18n.bidi.ltrExitDirCheckRe_.test(goog.i18n.bidi.stripHtmlIfNeeded_(a,b))};goog.i18n.bidi.isLtrExitText=goog.i18n.bidi.endsWithLtr;
	goog.i18n.bidi.endsWithRtl=function(a,b){return goog.i18n.bidi.rtlExitDirCheckRe_.test(goog.i18n.bidi.stripHtmlIfNeeded_(a,b))};goog.i18n.bidi.isRtlExitText=goog.i18n.bidi.endsWithRtl;goog.i18n.bidi.rtlLocalesRe_=/^(ar|ckb|dv|he|iw|fa|nqo|ps|sd|ug|ur|yi|.*[-_](Adlm|Arab|Hebr|Nkoo|Rohg|Thaa))(?!.*[-_](Latn|Cyrl)($|-|_))($|-|_)/i;goog.i18n.bidi.isRtlLanguage=function(a){return goog.i18n.bidi.rtlLocalesRe_.test(a)};goog.i18n.bidi.bracketGuardTextRe_=/(\(.*?\)+)|(\[.*?\]+)|(\{.*?\}+)|(<.*?>+)/g;
	goog.i18n.bidi.guardBracketInText=function(a,b){b=(void 0===b?goog.i18n.bidi.hasAnyRtl(a):b)?goog.i18n.bidi.Format.RLM:goog.i18n.bidi.Format.LRM;return a.replace(goog.i18n.bidi.bracketGuardTextRe_,b+"$&"+b)};goog.i18n.bidi.enforceRtlInHtml=function(a){return "<"==a.charAt(0)?a.replace(/<\w+/,"$& dir=rtl"):"\n<span dir=rtl>"+a+"</span>"};goog.i18n.bidi.enforceRtlInText=function(a){return goog.i18n.bidi.Format.RLE+a+goog.i18n.bidi.Format.PDF};
	goog.i18n.bidi.enforceLtrInHtml=function(a){return "<"==a.charAt(0)?a.replace(/<\w+/,"$& dir=ltr"):"\n<span dir=ltr>"+a+"</span>"};goog.i18n.bidi.enforceLtrInText=function(a){return goog.i18n.bidi.Format.LRE+a+goog.i18n.bidi.Format.PDF};goog.i18n.bidi.dimensionsRe_=/:\s*([.\d][.\w]*)\s+([.\d][.\w]*)\s+([.\d][.\w]*)\s+([.\d][.\w]*)/g;goog.i18n.bidi.leftRe_=/left/gi;goog.i18n.bidi.rightRe_=/right/gi;goog.i18n.bidi.tempRe_=/%%%%/g;
	goog.i18n.bidi.mirrorCSS=function(a){return a.replace(goog.i18n.bidi.dimensionsRe_,":$1 $4 $3 $2").replace(goog.i18n.bidi.leftRe_,"%%%%").replace(goog.i18n.bidi.rightRe_,goog.i18n.bidi.LEFT).replace(goog.i18n.bidi.tempRe_,goog.i18n.bidi.RIGHT)};goog.i18n.bidi.doubleQuoteSubstituteRe_=/([\u0591-\u05f2])"/g;goog.i18n.bidi.singleQuoteSubstituteRe_=/([\u0591-\u05f2])'/g;
	goog.i18n.bidi.normalizeHebrewQuote=function(a){return a.replace(goog.i18n.bidi.doubleQuoteSubstituteRe_,"$1\u05f4").replace(goog.i18n.bidi.singleQuoteSubstituteRe_,"$1\u05f3")};goog.i18n.bidi.wordSeparatorRe_=/\s+/;goog.i18n.bidi.hasNumeralsRe_=/[\d\u06f0-\u06f9]/;goog.i18n.bidi.rtlDetectionThreshold_=.4;
	goog.i18n.bidi.estimateDirection=function(a,b){var c=0,d=0,e=!1;a=goog.i18n.bidi.stripHtmlIfNeeded_(a,b).split(goog.i18n.bidi.wordSeparatorRe_);for(b=0;b<a.length;b++){var f=a[b];goog.i18n.bidi.startsWithRtl(f)?(c++,d++):goog.i18n.bidi.isRequiredLtrRe_.test(f)?e=!0:goog.i18n.bidi.hasAnyLtr(f)?d++:goog.i18n.bidi.hasNumeralsRe_.test(f)&&(e=!0);}return 0==d?e?goog.i18n.bidi.Dir.LTR:goog.i18n.bidi.Dir.NEUTRAL:c/d>goog.i18n.bidi.rtlDetectionThreshold_?goog.i18n.bidi.Dir.RTL:goog.i18n.bidi.Dir.LTR};
	goog.i18n.bidi.detectRtlDirectionality=function(a,b){return goog.i18n.bidi.estimateDirection(a,b)==goog.i18n.bidi.Dir.RTL};goog.i18n.bidi.setElementDirAndAlign=function(a,b){a&&(b=goog.i18n.bidi.toDir(b))&&(a.style.textAlign=b==goog.i18n.bidi.Dir.RTL?goog.i18n.bidi.RIGHT:goog.i18n.bidi.LEFT,a.dir=b==goog.i18n.bidi.Dir.RTL?"rtl":"ltr");};
	goog.i18n.bidi.setElementDirByTextDirectionality=function(a,b){switch(goog.i18n.bidi.estimateDirection(b)){case goog.i18n.bidi.Dir.LTR:a.dir="ltr";break;case goog.i18n.bidi.Dir.RTL:a.dir="rtl";break;default:a.removeAttribute("dir");}};goog.i18n.bidi.DirectionalString=function(){};goog.html.TrustedResourceUrl=function(){this.privateDoNotAccessOrElseTrustedResourceUrlWrappedValue_="";this.trustedURL_=null;this.TRUSTED_RESOURCE_URL_TYPE_MARKER_GOOG_HTML_SECURITY_PRIVATE_=goog.html.TrustedResourceUrl.TYPE_MARKER_GOOG_HTML_SECURITY_PRIVATE_;};goog.html.TrustedResourceUrl.prototype.implementsGoogStringTypedString=!0;goog.html.TrustedResourceUrl.prototype.getTypedStringValue=function(){return this.privateDoNotAccessOrElseTrustedResourceUrlWrappedValue_.toString()};
	goog.html.TrustedResourceUrl.prototype.implementsGoogI18nBidiDirectionalString=!0;goog.html.TrustedResourceUrl.prototype.getDirection=function(){return goog.i18n.bidi.Dir.LTR};
	goog.html.TrustedResourceUrl.prototype.cloneWithParams=function(a,b){var c=goog.html.TrustedResourceUrl.unwrap(this);c=goog.html.TrustedResourceUrl.URL_PARAM_PARSER_.exec(c);var d=c[3]||"";return goog.html.TrustedResourceUrl.createTrustedResourceUrlSecurityPrivateDoNotAccessOrElse(c[1]+goog.html.TrustedResourceUrl.stringifyParams_("?",c[2]||"",a)+goog.html.TrustedResourceUrl.stringifyParams_("#",d,b))};
	goog.DEBUG&&(goog.html.TrustedResourceUrl.prototype.toString=function(){return "TrustedResourceUrl{"+this.privateDoNotAccessOrElseTrustedResourceUrlWrappedValue_+"}"});goog.html.TrustedResourceUrl.unwrap=function(a){return goog.html.TrustedResourceUrl.unwrapTrustedScriptURL(a).toString()};
	goog.html.TrustedResourceUrl.unwrapTrustedScriptURL=function(a){if(a instanceof goog.html.TrustedResourceUrl&&a.constructor===goog.html.TrustedResourceUrl&&a.TRUSTED_RESOURCE_URL_TYPE_MARKER_GOOG_HTML_SECURITY_PRIVATE_===goog.html.TrustedResourceUrl.TYPE_MARKER_GOOG_HTML_SECURITY_PRIVATE_)return a.privateDoNotAccessOrElseTrustedResourceUrlWrappedValue_;goog.asserts.fail("expected object of type TrustedResourceUrl, got '"+a+"' of type "+goog.typeOf(a));return "type_error:TrustedResourceUrl"};
	goog.html.TrustedResourceUrl.unwrapTrustedURL=function(a){return a.trustedURL_?a.trustedURL_:goog.html.TrustedResourceUrl.unwrap(a)};
	goog.html.TrustedResourceUrl.format=function(a,b){var c=goog.string.Const.unwrap(a);if(!goog.html.TrustedResourceUrl.BASE_URL_.test(c))throw Error("Invalid TrustedResourceUrl format: "+c);a=c.replace(goog.html.TrustedResourceUrl.FORMAT_MARKER_,function(a,e){if(!Object.prototype.hasOwnProperty.call(b,e))throw Error('Found marker, "'+e+'", in format string, "'+c+'", but no valid label mapping found in args: '+JSON.stringify(b));a=b[e];return a instanceof goog.string.Const?goog.string.Const.unwrap(a):
	encodeURIComponent(String(a))});return goog.html.TrustedResourceUrl.createTrustedResourceUrlSecurityPrivateDoNotAccessOrElse(a)};goog.html.TrustedResourceUrl.FORMAT_MARKER_=/%{(\w+)}/g;goog.html.TrustedResourceUrl.BASE_URL_=/^((https:)?\/\/[0-9a-z.:[\]-]+\/|\/[^/\\]|[^:/\\%]+\/|[^:/\\%]*[?#]|about:blank#)/i;goog.html.TrustedResourceUrl.URL_PARAM_PARSER_=/^([^?#]*)(\?[^#]*)?(#[\s\S]*)?/;
	goog.html.TrustedResourceUrl.formatWithParams=function(a,b,c,d){return goog.html.TrustedResourceUrl.format(a,b).cloneWithParams(c,d)};goog.html.TrustedResourceUrl.fromConstant=function(a){return goog.html.TrustedResourceUrl.createTrustedResourceUrlSecurityPrivateDoNotAccessOrElse(goog.string.Const.unwrap(a))};goog.html.TrustedResourceUrl.fromConstants=function(a){for(var b="",c=0;c<a.length;c++)b+=goog.string.Const.unwrap(a[c]);return goog.html.TrustedResourceUrl.createTrustedResourceUrlSecurityPrivateDoNotAccessOrElse(b)};
	goog.html.TrustedResourceUrl.TYPE_MARKER_GOOG_HTML_SECURITY_PRIVATE_={};
	goog.html.TrustedResourceUrl.createTrustedResourceUrlSecurityPrivateDoNotAccessOrElse=function(a){var b=new goog.html.TrustedResourceUrl;b.privateDoNotAccessOrElseTrustedResourceUrlWrappedValue_=goog.html.trustedtypes.PRIVATE_DO_NOT_ACCESS_OR_ELSE_POLICY?goog.html.trustedtypes.PRIVATE_DO_NOT_ACCESS_OR_ELSE_POLICY.createScriptURL(a):a;goog.html.trustedtypes.PRIVATE_DO_NOT_ACCESS_OR_ELSE_POLICY&&(b.trustedURL_=goog.html.trustedtypes.PRIVATE_DO_NOT_ACCESS_OR_ELSE_POLICY.createURL(a));return b};
	goog.html.TrustedResourceUrl.stringifyParams_=function(a,b,c){if(null==c)return b;if(goog.isString(c))return c?a+encodeURIComponent(c):"";for(var d in c){var e=c[d];e=goog.isArray(e)?e:[e];for(var f=0;f<e.length;f++){var g=e[f];null!=g&&(b||(b=a),b+=(b.length>a.length?"&":"")+encodeURIComponent(d)+"="+encodeURIComponent(String(g)));}}return b};goog.string.internal={};goog.string.internal.startsWith=function(a,b){return 0==a.lastIndexOf(b,0)};goog.string.internal.endsWith=function(a,b){var c=a.length-b.length;return 0<=c&&a.indexOf(b,c)==c};goog.string.internal.caseInsensitiveStartsWith=function(a,b){return 0==goog.string.internal.caseInsensitiveCompare(b,a.substr(0,b.length))};goog.string.internal.caseInsensitiveEndsWith=function(a,b){return 0==goog.string.internal.caseInsensitiveCompare(b,a.substr(a.length-b.length,b.length))};
	goog.string.internal.caseInsensitiveEquals=function(a,b){return a.toLowerCase()==b.toLowerCase()};goog.string.internal.isEmptyOrWhitespace=function(a){return /^[\s\xa0]*$/.test(a)};goog.string.internal.trim=goog.TRUSTED_SITE&&String.prototype.trim?function(a){return a.trim()}:function(a){return /^[\s\xa0]*([\s\S]*?)[\s\xa0]*$/.exec(a)[1]};goog.string.internal.caseInsensitiveCompare=function(a,b){a=String(a).toLowerCase();b=String(b).toLowerCase();return a<b?-1:a==b?0:1};
	goog.string.internal.newLineToBr=function(a,b){return a.replace(/(\r\n|\r|\n)/g,b?"<br />":"<br>")};
	goog.string.internal.htmlEscape=function(a,b){if(b)a=a.replace(goog.string.internal.AMP_RE_,"&amp;").replace(goog.string.internal.LT_RE_,"&lt;").replace(goog.string.internal.GT_RE_,"&gt;").replace(goog.string.internal.QUOT_RE_,"&quot;").replace(goog.string.internal.SINGLE_QUOTE_RE_,"&#39;").replace(goog.string.internal.NULL_RE_,"&#0;");else {if(!goog.string.internal.ALL_RE_.test(a))return a;-1!=a.indexOf("&")&&(a=a.replace(goog.string.internal.AMP_RE_,"&amp;"));-1!=a.indexOf("<")&&(a=a.replace(goog.string.internal.LT_RE_,
	"&lt;"));-1!=a.indexOf(">")&&(a=a.replace(goog.string.internal.GT_RE_,"&gt;"));-1!=a.indexOf('"')&&(a=a.replace(goog.string.internal.QUOT_RE_,"&quot;"));-1!=a.indexOf("'")&&(a=a.replace(goog.string.internal.SINGLE_QUOTE_RE_,"&#39;"));-1!=a.indexOf("\x00")&&(a=a.replace(goog.string.internal.NULL_RE_,"&#0;"));}return a};goog.string.internal.AMP_RE_=/&/g;goog.string.internal.LT_RE_=/</g;goog.string.internal.GT_RE_=/>/g;goog.string.internal.QUOT_RE_=/"/g;goog.string.internal.SINGLE_QUOTE_RE_=/'/g;
	goog.string.internal.NULL_RE_=/\x00/g;goog.string.internal.ALL_RE_=/[\x00&<>"']/;goog.string.internal.whitespaceEscape=function(a,b){return goog.string.internal.newLineToBr(a.replace(/  /g," &#160;"),b)};goog.string.internal.contains=function(a,b){return -1!=a.indexOf(b)};goog.string.internal.caseInsensitiveContains=function(a,b){return goog.string.internal.contains(a.toLowerCase(),b.toLowerCase())};
	goog.string.internal.compareVersions=function(a,b){var c=0;a=goog.string.internal.trim(String(a)).split(".");b=goog.string.internal.trim(String(b)).split(".");for(var d=Math.max(a.length,b.length),e=0;0==c&&e<d;e++){var f=a[e]||"",g=b[e]||"";do{f=/(\d*)(\D*)(.*)/.exec(f)||["","","",""];g=/(\d*)(\D*)(.*)/.exec(g)||["","","",""];if(0==f[0].length&&0==g[0].length)break;c=0==f[1].length?0:parseInt(f[1],10);var h=0==g[1].length?0:parseInt(g[1],10);c=goog.string.internal.compareElements_(c,h)||goog.string.internal.compareElements_(0==
	f[2].length,0==g[2].length)||goog.string.internal.compareElements_(f[2],g[2]);f=f[3];g=g[3];}while(0==c)}return c};goog.string.internal.compareElements_=function(a,b){return a<b?-1:a>b?1:0};goog.html.SafeUrl=function(){this.privateDoNotAccessOrElseSafeUrlWrappedValue_="";this.SAFE_URL_TYPE_MARKER_GOOG_HTML_SECURITY_PRIVATE_=goog.html.SafeUrl.TYPE_MARKER_GOOG_HTML_SECURITY_PRIVATE_;};goog.html.SafeUrl.INNOCUOUS_STRING="about:invalid#zClosurez";goog.html.SafeUrl.prototype.implementsGoogStringTypedString=!0;goog.html.SafeUrl.prototype.getTypedStringValue=function(){return this.privateDoNotAccessOrElseSafeUrlWrappedValue_.toString()};
	goog.html.SafeUrl.prototype.implementsGoogI18nBidiDirectionalString=!0;goog.html.SafeUrl.prototype.getDirection=function(){return goog.i18n.bidi.Dir.LTR};goog.DEBUG&&(goog.html.SafeUrl.prototype.toString=function(){return "SafeUrl{"+this.privateDoNotAccessOrElseSafeUrlWrappedValue_+"}"});goog.html.SafeUrl.unwrap=function(a){return goog.html.SafeUrl.unwrapTrustedURL(a).toString()};
	goog.html.SafeUrl.unwrapTrustedURL=function(a){if(a instanceof goog.html.SafeUrl&&a.constructor===goog.html.SafeUrl&&a.SAFE_URL_TYPE_MARKER_GOOG_HTML_SECURITY_PRIVATE_===goog.html.SafeUrl.TYPE_MARKER_GOOG_HTML_SECURITY_PRIVATE_)return a.privateDoNotAccessOrElseSafeUrlWrappedValue_;goog.asserts.fail("expected object of type SafeUrl, got '"+a+"' of type "+goog.typeOf(a));return "type_error:SafeUrl"};goog.html.SafeUrl.fromConstant=function(a){return goog.html.SafeUrl.createSafeUrlSecurityPrivateDoNotAccessOrElse(goog.string.Const.unwrap(a))};
	goog.html.SAFE_MIME_TYPE_PATTERN_=/^(?:audio\/(?:3gpp2|3gpp|aac|L16|midi|mp3|mp4|mpeg|oga|ogg|opus|x-m4a|x-wav|wav|webm)|image\/(?:bmp|gif|jpeg|jpg|png|tiff|webp|x-icon)|text\/csv|video\/(?:mpeg|mp4|ogg|webm|quicktime))(?:;\w+=(?:\w+|"[\w;=]+"))*$/i;goog.html.SafeUrl.isSafeMimeType=function(a){return goog.html.SAFE_MIME_TYPE_PATTERN_.test(a)};goog.html.SafeUrl.fromBlob=function(a){a=goog.html.SAFE_MIME_TYPE_PATTERN_.test(a.type)?goog.fs.url.createObjectUrl(a):goog.html.SafeUrl.INNOCUOUS_STRING;return goog.html.SafeUrl.createSafeUrlSecurityPrivateDoNotAccessOrElse(a)};
	goog.html.DATA_URL_PATTERN_=/^data:([^,]*);base64,[a-z0-9+\/]+=*$/i;goog.html.SafeUrl.fromDataUrl=function(a){a=a.replace(/(%0A|%0D)/g,"");var b=a.match(goog.html.DATA_URL_PATTERN_);b=b&&goog.html.SAFE_MIME_TYPE_PATTERN_.test(b[1]);return goog.html.SafeUrl.createSafeUrlSecurityPrivateDoNotAccessOrElse(b?a:goog.html.SafeUrl.INNOCUOUS_STRING)};goog.html.SafeUrl.fromTelUrl=function(a){goog.string.internal.caseInsensitiveStartsWith(a,"tel:")||(a=goog.html.SafeUrl.INNOCUOUS_STRING);return goog.html.SafeUrl.createSafeUrlSecurityPrivateDoNotAccessOrElse(a)};
	goog.html.SIP_URL_PATTERN_=/^sip[s]?:[+a-z0-9_.!$%&'*\/=^`{|}~-]+@([a-z0-9-]+\.)+[a-z0-9]{2,63}$/i;goog.html.SafeUrl.fromSipUrl=function(a){goog.html.SIP_URL_PATTERN_.test(decodeURIComponent(a))||(a=goog.html.SafeUrl.INNOCUOUS_STRING);return goog.html.SafeUrl.createSafeUrlSecurityPrivateDoNotAccessOrElse(a)};goog.html.SafeUrl.fromFacebookMessengerUrl=function(a){goog.string.internal.caseInsensitiveStartsWith(a,"fb-messenger://share")||(a=goog.html.SafeUrl.INNOCUOUS_STRING);return goog.html.SafeUrl.createSafeUrlSecurityPrivateDoNotAccessOrElse(a)};
	goog.html.SafeUrl.fromWhatsAppUrl=function(a){goog.string.internal.caseInsensitiveStartsWith(a,"whatsapp://send")||(a=goog.html.SafeUrl.INNOCUOUS_STRING);return goog.html.SafeUrl.createSafeUrlSecurityPrivateDoNotAccessOrElse(a)};goog.html.SafeUrl.fromSmsUrl=function(a){goog.string.internal.caseInsensitiveStartsWith(a,"sms:")&&goog.html.SafeUrl.isSmsUrlBodyValid_(a)||(a=goog.html.SafeUrl.INNOCUOUS_STRING);return goog.html.SafeUrl.createSafeUrlSecurityPrivateDoNotAccessOrElse(a)};
	goog.html.SafeUrl.isSmsUrlBodyValid_=function(a){var b=a.indexOf("#");0<b&&(a=a.substring(0,b));b=a.match(/[?&]body=/gi);if(!b)return !0;if(1<b.length)return !1;a=a.match(/[?&]body=([^&]*)/)[1];if(!a)return !0;try{decodeURIComponent(a);}catch(c){return !1}return /^(?:[a-z0-9\-_.~]|%[0-9a-f]{2})+$/i.test(a)};goog.html.SafeUrl.fromSshUrl=function(a){goog.string.internal.caseInsensitiveStartsWith(a,"ssh://")||(a=goog.html.SafeUrl.INNOCUOUS_STRING);return goog.html.SafeUrl.createSafeUrlSecurityPrivateDoNotAccessOrElse(a)};
	goog.html.SafeUrl.sanitizeChromeExtensionUrl=function(a,b){return goog.html.SafeUrl.sanitizeExtensionUrl_(/^chrome-extension:\/\/([^\/]+)\//,a,b)};goog.html.SafeUrl.sanitizeFirefoxExtensionUrl=function(a,b){return goog.html.SafeUrl.sanitizeExtensionUrl_(/^moz-extension:\/\/([^\/]+)\//,a,b)};goog.html.SafeUrl.sanitizeEdgeExtensionUrl=function(a,b){return goog.html.SafeUrl.sanitizeExtensionUrl_(/^ms-browser-extension:\/\/([^\/]+)\//,a,b)};
	goog.html.SafeUrl.sanitizeExtensionUrl_=function(a,b,c){(a=a.exec(b))?(a=a[1],-1==(c instanceof goog.string.Const?[goog.string.Const.unwrap(c)]:c.map(function(a){return goog.string.Const.unwrap(a)})).indexOf(a)&&(b=goog.html.SafeUrl.INNOCUOUS_STRING)):b=goog.html.SafeUrl.INNOCUOUS_STRING;return goog.html.SafeUrl.createSafeUrlSecurityPrivateDoNotAccessOrElse(b)};goog.html.SafeUrl.fromTrustedResourceUrl=function(a){return goog.html.SafeUrl.createSafeUrlSecurityPrivateDoNotAccessOrElse(goog.html.TrustedResourceUrl.unwrap(a))};
	goog.html.SAFE_URL_PATTERN_=/^(?:(?:https?|mailto|ftp):|[^:/?#]*(?:[/?#]|$))/i;goog.html.SafeUrl.SAFE_URL_PATTERN=goog.html.SAFE_URL_PATTERN_;goog.html.SafeUrl.sanitize=function(a){if(a instanceof goog.html.SafeUrl)return a;a="object"==typeof a&&a.implementsGoogStringTypedString?a.getTypedStringValue():String(a);goog.html.SAFE_URL_PATTERN_.test(a)||(a=goog.html.SafeUrl.INNOCUOUS_STRING);return goog.html.SafeUrl.createSafeUrlSecurityPrivateDoNotAccessOrElse(a)};
	goog.html.SafeUrl.sanitizeAssertUnchanged=function(a,b){if(a instanceof goog.html.SafeUrl)return a;a="object"==typeof a&&a.implementsGoogStringTypedString?a.getTypedStringValue():String(a);if(b&&/^data:/i.test(a)&&(b=goog.html.SafeUrl.fromDataUrl(a),b.getTypedStringValue()==a))return b;goog.asserts.assert(goog.html.SAFE_URL_PATTERN_.test(a),"%s does not match the safe URL pattern",a)||(a=goog.html.SafeUrl.INNOCUOUS_STRING);return goog.html.SafeUrl.createSafeUrlSecurityPrivateDoNotAccessOrElse(a)};
	goog.html.SafeUrl.TYPE_MARKER_GOOG_HTML_SECURITY_PRIVATE_={};goog.html.SafeUrl.createSafeUrlSecurityPrivateDoNotAccessOrElse=function(a){var b=new goog.html.SafeUrl;b.privateDoNotAccessOrElseSafeUrlWrappedValue_=goog.html.trustedtypes.PRIVATE_DO_NOT_ACCESS_OR_ELSE_POLICY?goog.html.trustedtypes.PRIVATE_DO_NOT_ACCESS_OR_ELSE_POLICY.createURL(a):a;return b};goog.html.SafeUrl.ABOUT_BLANK=goog.html.SafeUrl.createSafeUrlSecurityPrivateDoNotAccessOrElse("about:blank");goog.html.SafeStyle=function(){this.privateDoNotAccessOrElseSafeStyleWrappedValue_="";this.SAFE_STYLE_TYPE_MARKER_GOOG_HTML_SECURITY_PRIVATE_=goog.html.SafeStyle.TYPE_MARKER_GOOG_HTML_SECURITY_PRIVATE_;};goog.html.SafeStyle.prototype.implementsGoogStringTypedString=!0;goog.html.SafeStyle.TYPE_MARKER_GOOG_HTML_SECURITY_PRIVATE_={};
	goog.html.SafeStyle.fromConstant=function(a){a=goog.string.Const.unwrap(a);if(0===a.length)return goog.html.SafeStyle.EMPTY;goog.asserts.assert(goog.string.internal.endsWith(a,";"),"Last character of style string is not ';': "+a);goog.asserts.assert(goog.string.internal.contains(a,":"),"Style string must contain at least one ':', to specify a \"name: value\" pair: "+a);return goog.html.SafeStyle.createSafeStyleSecurityPrivateDoNotAccessOrElse(a)};
	goog.html.SafeStyle.prototype.getTypedStringValue=function(){return this.privateDoNotAccessOrElseSafeStyleWrappedValue_};goog.DEBUG&&(goog.html.SafeStyle.prototype.toString=function(){return "SafeStyle{"+this.privateDoNotAccessOrElseSafeStyleWrappedValue_+"}"});
	goog.html.SafeStyle.unwrap=function(a){if(a instanceof goog.html.SafeStyle&&a.constructor===goog.html.SafeStyle&&a.SAFE_STYLE_TYPE_MARKER_GOOG_HTML_SECURITY_PRIVATE_===goog.html.SafeStyle.TYPE_MARKER_GOOG_HTML_SECURITY_PRIVATE_)return a.privateDoNotAccessOrElseSafeStyleWrappedValue_;goog.asserts.fail("expected object of type SafeStyle, got '"+a+"' of type "+goog.typeOf(a));return "type_error:SafeStyle"};goog.html.SafeStyle.createSafeStyleSecurityPrivateDoNotAccessOrElse=function(a){return (new goog.html.SafeStyle).initSecurityPrivateDoNotAccessOrElse_(a)};
	goog.html.SafeStyle.prototype.initSecurityPrivateDoNotAccessOrElse_=function(a){this.privateDoNotAccessOrElseSafeStyleWrappedValue_=a;return this};goog.html.SafeStyle.EMPTY=goog.html.SafeStyle.createSafeStyleSecurityPrivateDoNotAccessOrElse("");goog.html.SafeStyle.INNOCUOUS_STRING="zClosurez";
	goog.html.SafeStyle.create=function(a){var b="",c;for(c in a){if(!/^[-_a-zA-Z0-9]+$/.test(c))throw Error("Name allows only [-_a-zA-Z0-9], got: "+c);var d=a[c];null!=d&&(d=goog.isArray(d)?goog.array.map(d,goog.html.SafeStyle.sanitizePropertyValue_).join(" "):goog.html.SafeStyle.sanitizePropertyValue_(d),b+=c+":"+d+";");}return b?goog.html.SafeStyle.createSafeStyleSecurityPrivateDoNotAccessOrElse(b):goog.html.SafeStyle.EMPTY};
	goog.html.SafeStyle.sanitizePropertyValue_=function(a){if(a instanceof goog.html.SafeUrl)return 'url("'+goog.html.SafeUrl.unwrap(a).replace(/</g,"%3c").replace(/[\\"]/g,"\\$&")+'")';a=a instanceof goog.string.Const?goog.string.Const.unwrap(a):goog.html.SafeStyle.sanitizePropertyValueString_(String(a));if(/[{;}]/.test(a))throw new goog.asserts.AssertionError("Value does not allow [{;}], got: %s.",[a]);return a};
	goog.html.SafeStyle.sanitizePropertyValueString_=function(a){var b=a.replace(goog.html.SafeStyle.FUNCTIONS_RE_,"$1").replace(goog.html.SafeStyle.FUNCTIONS_RE_,"$1").replace(goog.html.SafeStyle.URL_RE_,"url");if(goog.html.SafeStyle.VALUE_RE_.test(b)){if(goog.html.SafeStyle.COMMENT_RE_.test(a))return goog.asserts.fail("String value disallows comments, got: "+a),goog.html.SafeStyle.INNOCUOUS_STRING;if(!goog.html.SafeStyle.hasBalancedQuotes_(a))return goog.asserts.fail("String value requires balanced quotes, got: "+
	a),goog.html.SafeStyle.INNOCUOUS_STRING;if(!goog.html.SafeStyle.hasBalancedSquareBrackets_(a))return goog.asserts.fail("String value requires balanced square brackets and one identifier per pair of brackets, got: "+a),goog.html.SafeStyle.INNOCUOUS_STRING}else return goog.asserts.fail("String value allows only "+goog.html.SafeStyle.VALUE_ALLOWED_CHARS_+" and simple functions, got: "+a),goog.html.SafeStyle.INNOCUOUS_STRING;return goog.html.SafeStyle.sanitizeUrl_(a)};
	goog.html.SafeStyle.hasBalancedQuotes_=function(a){for(var b=!0,c=!0,d=0;d<a.length;d++){var e=a.charAt(d);"'"==e&&c?b=!b:'"'==e&&b&&(c=!c);}return b&&c};goog.html.SafeStyle.hasBalancedSquareBrackets_=function(a){for(var b=!0,c=/^[-_a-zA-Z0-9]$/,d=0;d<a.length;d++){var e=a.charAt(d);if("]"==e){if(b)return !1;b=!0;}else if("["==e){if(!b)return !1;b=!1;}else if(!b&&!c.test(e))return !1}return b};goog.html.SafeStyle.VALUE_ALLOWED_CHARS_="[-,.\"'%_!# a-zA-Z0-9\\[\\]]";
	goog.html.SafeStyle.VALUE_RE_=new RegExp("^"+goog.html.SafeStyle.VALUE_ALLOWED_CHARS_+"+$");goog.html.SafeStyle.URL_RE_=/\b(url\([ \t\n]*)('[ -&(-\[\]-~]*'|"[ !#-\[\]-~]*"|[!#-&*-\[\]-~]*)([ \t\n]*\))/g;goog.html.SafeStyle.FUNCTIONS_RE_=/\b(hsl|hsla|rgb|rgba|matrix|calc|minmax|fit-content|repeat|(rotate|scale|translate)(X|Y|Z|3d)?)\([-+*/0-9a-z.%\[\], ]+\)/g;goog.html.SafeStyle.COMMENT_RE_=/\/\*/;
	goog.html.SafeStyle.sanitizeUrl_=function(a){return a.replace(goog.html.SafeStyle.URL_RE_,function(a,c,d,e){var b="";d=d.replace(/^(['"])(.*)\1$/,function(a,c,d){b=c;return d});a=goog.html.SafeUrl.sanitize(d).getTypedStringValue();return c+b+a+b+e})};goog.html.SafeStyle.concat=function(a){var b="",c=function(a){goog.isArray(a)?goog.array.forEach(a,c):b+=goog.html.SafeStyle.unwrap(a);};goog.array.forEach(arguments,c);return b?goog.html.SafeStyle.createSafeStyleSecurityPrivateDoNotAccessOrElse(b):goog.html.SafeStyle.EMPTY};goog.html.SafeStyleSheet=function(){this.privateDoNotAccessOrElseSafeStyleSheetWrappedValue_="";this.SAFE_STYLE_SHEET_TYPE_MARKER_GOOG_HTML_SECURITY_PRIVATE_=goog.html.SafeStyleSheet.TYPE_MARKER_GOOG_HTML_SECURITY_PRIVATE_;};goog.html.SafeStyleSheet.prototype.implementsGoogStringTypedString=!0;goog.html.SafeStyleSheet.TYPE_MARKER_GOOG_HTML_SECURITY_PRIVATE_={};
	goog.html.SafeStyleSheet.createRule=function(a,b){if(goog.string.internal.contains(a,"<"))throw Error("Selector does not allow '<', got: "+a);var c=a.replace(/('|")((?!\1)[^\r\n\f\\]|\\[\s\S])*\1/g,"");if(!/^[-_a-zA-Z0-9#.:* ,>+~[\]()=^$|]+$/.test(c))throw Error("Selector allows only [-_a-zA-Z0-9#.:* ,>+~[\\]()=^$|] and strings, got: "+a);if(!goog.html.SafeStyleSheet.hasBalancedBrackets_(c))throw Error("() and [] in selector must be balanced, got: "+a);b instanceof goog.html.SafeStyle||(b=goog.html.SafeStyle.create(b));
	a=a+"{"+goog.html.SafeStyle.unwrap(b).replace(/</g,"\\3C ")+"}";return goog.html.SafeStyleSheet.createSafeStyleSheetSecurityPrivateDoNotAccessOrElse(a)};goog.html.SafeStyleSheet.hasBalancedBrackets_=function(a){for(var b={"(":")","[":"]"},c=[],d=0;d<a.length;d++){var e=a[d];if(b[e])c.push(b[e]);else if(goog.object.contains(b,e)&&c.pop()!=e)return !1}return 0==c.length};
	goog.html.SafeStyleSheet.concat=function(a){var b="",c=function(a){goog.isArray(a)?goog.array.forEach(a,c):b+=goog.html.SafeStyleSheet.unwrap(a);};goog.array.forEach(arguments,c);return goog.html.SafeStyleSheet.createSafeStyleSheetSecurityPrivateDoNotAccessOrElse(b)};
	goog.html.SafeStyleSheet.fromConstant=function(a){a=goog.string.Const.unwrap(a);if(0===a.length)return goog.html.SafeStyleSheet.EMPTY;goog.asserts.assert(!goog.string.internal.contains(a,"<"),"Forbidden '<' character in style sheet string: "+a);return goog.html.SafeStyleSheet.createSafeStyleSheetSecurityPrivateDoNotAccessOrElse(a)};goog.html.SafeStyleSheet.prototype.getTypedStringValue=function(){return this.privateDoNotAccessOrElseSafeStyleSheetWrappedValue_};
	goog.DEBUG&&(goog.html.SafeStyleSheet.prototype.toString=function(){return "SafeStyleSheet{"+this.privateDoNotAccessOrElseSafeStyleSheetWrappedValue_+"}"});
	goog.html.SafeStyleSheet.unwrap=function(a){if(a instanceof goog.html.SafeStyleSheet&&a.constructor===goog.html.SafeStyleSheet&&a.SAFE_STYLE_SHEET_TYPE_MARKER_GOOG_HTML_SECURITY_PRIVATE_===goog.html.SafeStyleSheet.TYPE_MARKER_GOOG_HTML_SECURITY_PRIVATE_)return a.privateDoNotAccessOrElseSafeStyleSheetWrappedValue_;goog.asserts.fail("expected object of type SafeStyleSheet, got '"+a+"' of type "+goog.typeOf(a));return "type_error:SafeStyleSheet"};
	goog.html.SafeStyleSheet.createSafeStyleSheetSecurityPrivateDoNotAccessOrElse=function(a){return (new goog.html.SafeStyleSheet).initSecurityPrivateDoNotAccessOrElse_(a)};goog.html.SafeStyleSheet.prototype.initSecurityPrivateDoNotAccessOrElse_=function(a){this.privateDoNotAccessOrElseSafeStyleSheetWrappedValue_=a;return this};goog.html.SafeStyleSheet.EMPTY=goog.html.SafeStyleSheet.createSafeStyleSheetSecurityPrivateDoNotAccessOrElse("");goog.labs={};goog.labs.userAgent={};goog.labs.userAgent.util={};goog.labs.userAgent.util.getNativeUserAgentString_=function(){var a=goog.labs.userAgent.util.getNavigator_();return a&&(a=a.userAgent)?a:""};goog.labs.userAgent.util.getNavigator_=function(){return goog.global.navigator};goog.labs.userAgent.util.userAgent_=goog.labs.userAgent.util.getNativeUserAgentString_();goog.labs.userAgent.util.setUserAgent=function(a){goog.labs.userAgent.util.userAgent_=a||goog.labs.userAgent.util.getNativeUserAgentString_();};
	goog.labs.userAgent.util.getUserAgent=function(){return goog.labs.userAgent.util.userAgent_};goog.labs.userAgent.util.matchUserAgent=function(a){var b=goog.labs.userAgent.util.getUserAgent();return goog.string.internal.contains(b,a)};goog.labs.userAgent.util.matchUserAgentIgnoreCase=function(a){var b=goog.labs.userAgent.util.getUserAgent();return goog.string.internal.caseInsensitiveContains(b,a)};
	goog.labs.userAgent.util.extractVersionTuples=function(a){for(var b=/(\w[\w ]+)\/([^\s]+)\s*(?:\((.*?)\))?/g,c=[],d;d=b.exec(a);)c.push([d[1],d[2],d[3]||void 0]);return c};goog.labs.userAgent.browser={};goog.labs.userAgent.browser.matchOpera_=function(){return goog.labs.userAgent.util.matchUserAgent("Opera")};goog.labs.userAgent.browser.matchIE_=function(){return goog.labs.userAgent.util.matchUserAgent("Trident")||goog.labs.userAgent.util.matchUserAgent("MSIE")};goog.labs.userAgent.browser.matchEdgeHtml_=function(){return goog.labs.userAgent.util.matchUserAgent("Edge")};goog.labs.userAgent.browser.matchEdgeChromium_=function(){return goog.labs.userAgent.util.matchUserAgent("Edg/")};
	goog.labs.userAgent.browser.matchOperaChromium_=function(){return goog.labs.userAgent.util.matchUserAgent("OPR")};goog.labs.userAgent.browser.matchFirefox_=function(){return goog.labs.userAgent.util.matchUserAgent("Firefox")||goog.labs.userAgent.util.matchUserAgent("FxiOS")};
	goog.labs.userAgent.browser.matchSafari_=function(){return goog.labs.userAgent.util.matchUserAgent("Safari")&&!(goog.labs.userAgent.browser.matchChrome_()||goog.labs.userAgent.browser.matchCoast_()||goog.labs.userAgent.browser.matchOpera_()||goog.labs.userAgent.browser.matchEdgeHtml_()||goog.labs.userAgent.browser.matchEdgeChromium_()||goog.labs.userAgent.browser.matchOperaChromium_()||goog.labs.userAgent.browser.matchFirefox_()||goog.labs.userAgent.browser.isSilk()||goog.labs.userAgent.util.matchUserAgent("Android"))};
	goog.labs.userAgent.browser.matchCoast_=function(){return goog.labs.userAgent.util.matchUserAgent("Coast")};goog.labs.userAgent.browser.matchIosWebview_=function(){return (goog.labs.userAgent.util.matchUserAgent("iPad")||goog.labs.userAgent.util.matchUserAgent("iPhone"))&&!goog.labs.userAgent.browser.matchSafari_()&&!goog.labs.userAgent.browser.matchChrome_()&&!goog.labs.userAgent.browser.matchCoast_()&&!goog.labs.userAgent.browser.matchFirefox_()&&goog.labs.userAgent.util.matchUserAgent("AppleWebKit")};
	goog.labs.userAgent.browser.matchChrome_=function(){return (goog.labs.userAgent.util.matchUserAgent("Chrome")||goog.labs.userAgent.util.matchUserAgent("CriOS"))&&!goog.labs.userAgent.browser.matchEdgeHtml_()};goog.labs.userAgent.browser.matchAndroidBrowser_=function(){return goog.labs.userAgent.util.matchUserAgent("Android")&&!(goog.labs.userAgent.browser.isChrome()||goog.labs.userAgent.browser.isFirefox()||goog.labs.userAgent.browser.isOpera()||goog.labs.userAgent.browser.isSilk())};
	goog.labs.userAgent.browser.isOpera=goog.labs.userAgent.browser.matchOpera_;goog.labs.userAgent.browser.isIE=goog.labs.userAgent.browser.matchIE_;goog.labs.userAgent.browser.isEdge=goog.labs.userAgent.browser.matchEdgeHtml_;goog.labs.userAgent.browser.isEdgeChromium=goog.labs.userAgent.browser.matchEdgeChromium_;goog.labs.userAgent.browser.isOperaChromium=goog.labs.userAgent.browser.matchOperaChromium_;goog.labs.userAgent.browser.isFirefox=goog.labs.userAgent.browser.matchFirefox_;
	goog.labs.userAgent.browser.isSafari=goog.labs.userAgent.browser.matchSafari_;goog.labs.userAgent.browser.isCoast=goog.labs.userAgent.browser.matchCoast_;goog.labs.userAgent.browser.isIosWebview=goog.labs.userAgent.browser.matchIosWebview_;goog.labs.userAgent.browser.isChrome=goog.labs.userAgent.browser.matchChrome_;goog.labs.userAgent.browser.isAndroidBrowser=goog.labs.userAgent.browser.matchAndroidBrowser_;goog.labs.userAgent.browser.isSilk=function(){return goog.labs.userAgent.util.matchUserAgent("Silk")};
	goog.labs.userAgent.browser.getVersion=function(){function a(a){a=goog.array.find(a,d);return c[a]||""}var b=goog.labs.userAgent.util.getUserAgent();if(goog.labs.userAgent.browser.isIE())return goog.labs.userAgent.browser.getIEVersion_(b);b=goog.labs.userAgent.util.extractVersionTuples(b);var c={};goog.array.forEach(b,function(a){c[a[0]]=a[1];});var d=goog.partial(goog.object.containsKey,c);return goog.labs.userAgent.browser.isOpera()?a(["Version","Opera"]):goog.labs.userAgent.browser.isEdge()?a(["Edge"]):
	goog.labs.userAgent.browser.isEdgeChromium()?a(["Edg"]):goog.labs.userAgent.browser.isChrome()?a(["Chrome","CriOS"]):(b=b[2])&&b[1]||""};goog.labs.userAgent.browser.isVersionOrHigher=function(a){return 0<=goog.string.internal.compareVersions(goog.labs.userAgent.browser.getVersion(),a)};
	goog.labs.userAgent.browser.getIEVersion_=function(a){var b=/rv: *([\d\.]*)/.exec(a);if(b&&b[1])return b[1];b="";var c=/MSIE +([\d\.]+)/.exec(a);if(c&&c[1])if(a=/Trident\/(\d.\d)/.exec(a),"7.0"==c[1])if(a&&a[1])switch(a[1]){case "4.0":b="8.0";break;case "5.0":b="9.0";break;case "6.0":b="10.0";break;case "7.0":b="11.0";}else b="7.0";else b=c[1];return b};goog.html.SafeHtml=function(){this.privateDoNotAccessOrElseSafeHtmlWrappedValue_="";this.SAFE_HTML_TYPE_MARKER_GOOG_HTML_SECURITY_PRIVATE_=goog.html.SafeHtml.TYPE_MARKER_GOOG_HTML_SECURITY_PRIVATE_;this.dir_=null;};goog.html.SafeHtml.prototype.implementsGoogI18nBidiDirectionalString=!0;goog.html.SafeHtml.prototype.getDirection=function(){return this.dir_};goog.html.SafeHtml.prototype.implementsGoogStringTypedString=!0;goog.html.SafeHtml.prototype.getTypedStringValue=function(){return this.privateDoNotAccessOrElseSafeHtmlWrappedValue_.toString()};
	goog.DEBUG&&(goog.html.SafeHtml.prototype.toString=function(){return "SafeHtml{"+this.privateDoNotAccessOrElseSafeHtmlWrappedValue_+"}"});goog.html.SafeHtml.unwrap=function(a){return goog.html.SafeHtml.unwrapTrustedHTML(a).toString()};
	goog.html.SafeHtml.unwrapTrustedHTML=function(a){if(a instanceof goog.html.SafeHtml&&a.constructor===goog.html.SafeHtml&&a.SAFE_HTML_TYPE_MARKER_GOOG_HTML_SECURITY_PRIVATE_===goog.html.SafeHtml.TYPE_MARKER_GOOG_HTML_SECURITY_PRIVATE_)return a.privateDoNotAccessOrElseSafeHtmlWrappedValue_;goog.asserts.fail("expected object of type SafeHtml, got '"+a+"' of type "+goog.typeOf(a));return "type_error:SafeHtml"};
	goog.html.SafeHtml.htmlEscape=function(a){if(a instanceof goog.html.SafeHtml)return a;var b="object"==typeof a,c=null;b&&a.implementsGoogI18nBidiDirectionalString&&(c=a.getDirection());a=b&&a.implementsGoogStringTypedString?a.getTypedStringValue():String(a);return goog.html.SafeHtml.createSafeHtmlSecurityPrivateDoNotAccessOrElse(goog.string.internal.htmlEscape(a),c)};
	goog.html.SafeHtml.htmlEscapePreservingNewlines=function(a){if(a instanceof goog.html.SafeHtml)return a;a=goog.html.SafeHtml.htmlEscape(a);return goog.html.SafeHtml.createSafeHtmlSecurityPrivateDoNotAccessOrElse(goog.string.internal.newLineToBr(goog.html.SafeHtml.unwrap(a)),a.getDirection())};
	goog.html.SafeHtml.htmlEscapePreservingNewlinesAndSpaces=function(a){if(a instanceof goog.html.SafeHtml)return a;a=goog.html.SafeHtml.htmlEscape(a);return goog.html.SafeHtml.createSafeHtmlSecurityPrivateDoNotAccessOrElse(goog.string.internal.whitespaceEscape(goog.html.SafeHtml.unwrap(a)),a.getDirection())};goog.html.SafeHtml.from=goog.html.SafeHtml.htmlEscape;goog.html.SafeHtml.VALID_NAMES_IN_TAG_=/^[a-zA-Z0-9-]+$/;
	goog.html.SafeHtml.URL_ATTRIBUTES_={action:!0,cite:!0,data:!0,formaction:!0,href:!0,manifest:!0,poster:!0,src:!0};goog.html.SafeHtml.NOT_ALLOWED_TAG_NAMES_={APPLET:!0,BASE:!0,EMBED:!0,IFRAME:!0,LINK:!0,MATH:!0,META:!0,OBJECT:!0,SCRIPT:!0,STYLE:!0,SVG:!0,TEMPLATE:!0};goog.html.SafeHtml.create=function(a,b,c){goog.html.SafeHtml.verifyTagName(String(a));return goog.html.SafeHtml.createSafeHtmlTagSecurityPrivateDoNotAccessOrElse(String(a),b,c)};
	goog.html.SafeHtml.verifyTagName=function(a){if(!goog.html.SafeHtml.VALID_NAMES_IN_TAG_.test(a))throw Error("Invalid tag name <"+a+">.");if(a.toUpperCase()in goog.html.SafeHtml.NOT_ALLOWED_TAG_NAMES_)throw Error("Tag name <"+a+"> is not allowed for SafeHtml.");};
	goog.html.SafeHtml.createIframe=function(a,b,c,d){a&&goog.html.TrustedResourceUrl.unwrap(a);var e={};e.src=a||null;e.srcdoc=b&&goog.html.SafeHtml.unwrap(b);a=goog.html.SafeHtml.combineAttributes(e,{sandbox:""},c);return goog.html.SafeHtml.createSafeHtmlTagSecurityPrivateDoNotAccessOrElse("iframe",a,d)};
	goog.html.SafeHtml.createSandboxIframe=function(a,b,c,d){if(!goog.html.SafeHtml.canUseSandboxIframe())throw Error("The browser does not support sandboxed iframes.");var e={};e.src=a?goog.html.SafeUrl.unwrap(goog.html.SafeUrl.sanitize(a)):null;e.srcdoc=b||null;e.sandbox="";a=goog.html.SafeHtml.combineAttributes(e,{},c);return goog.html.SafeHtml.createSafeHtmlTagSecurityPrivateDoNotAccessOrElse("iframe",a,d)};
	goog.html.SafeHtml.canUseSandboxIframe=function(){return goog.global.HTMLIFrameElement&&"sandbox"in goog.global.HTMLIFrameElement.prototype};goog.html.SafeHtml.createScriptSrc=function(a,b){goog.html.TrustedResourceUrl.unwrap(a);a=goog.html.SafeHtml.combineAttributes({src:a},{},b);return goog.html.SafeHtml.createSafeHtmlTagSecurityPrivateDoNotAccessOrElse("script",a)};
	goog.html.SafeHtml.createScript=function(a,b){for(var c in b){var d=c.toLowerCase();if("language"==d||"src"==d||"text"==d||"type"==d)throw Error('Cannot set "'+d+'" attribute');}c="";a=goog.array.concat(a);for(d=0;d<a.length;d++)c+=goog.html.SafeScript.unwrap(a[d]);a=goog.html.SafeHtml.createSafeHtmlSecurityPrivateDoNotAccessOrElse(c,goog.i18n.bidi.Dir.NEUTRAL);return goog.html.SafeHtml.createSafeHtmlTagSecurityPrivateDoNotAccessOrElse("script",b,a)};
	goog.html.SafeHtml.createStyle=function(a,b){b=goog.html.SafeHtml.combineAttributes({type:"text/css"},{},b);var c="";a=goog.array.concat(a);for(var d=0;d<a.length;d++)c+=goog.html.SafeStyleSheet.unwrap(a[d]);a=goog.html.SafeHtml.createSafeHtmlSecurityPrivateDoNotAccessOrElse(c,goog.i18n.bidi.Dir.NEUTRAL);return goog.html.SafeHtml.createSafeHtmlTagSecurityPrivateDoNotAccessOrElse("style",b,a)};
	goog.html.SafeHtml.createMetaRefresh=function(a,b){a=goog.html.SafeUrl.unwrap(goog.html.SafeUrl.sanitize(a));(goog.labs.userAgent.browser.isIE()||goog.labs.userAgent.browser.isEdge())&&goog.string.internal.contains(a,";")&&(a="'"+a.replace(/'/g,"%27")+"'");return goog.html.SafeHtml.createSafeHtmlTagSecurityPrivateDoNotAccessOrElse("meta",{"http-equiv":"refresh",content:(b||0)+"; url="+a})};
	goog.html.SafeHtml.getAttrNameAndValue_=function(a,b,c){if(c instanceof goog.string.Const)c=goog.string.Const.unwrap(c);else if("style"==b.toLowerCase())c=goog.html.SafeHtml.getStyleValue_(c);else {if(/^on/i.test(b))throw Error('Attribute "'+b+'" requires goog.string.Const value, "'+c+'" given.');if(b.toLowerCase()in goog.html.SafeHtml.URL_ATTRIBUTES_)if(c instanceof goog.html.TrustedResourceUrl)c=goog.html.TrustedResourceUrl.unwrap(c);else if(c instanceof goog.html.SafeUrl)c=goog.html.SafeUrl.unwrap(c);
	else if(goog.isString(c))c=goog.html.SafeUrl.sanitize(c).getTypedStringValue();else throw Error('Attribute "'+b+'" on tag "'+a+'" requires goog.html.SafeUrl, goog.string.Const, or string, value "'+c+'" given.');}c.implementsGoogStringTypedString&&(c=c.getTypedStringValue());goog.asserts.assert(goog.isString(c)||goog.isNumber(c),"String or number value expected, got "+typeof c+" with value: "+c);return b+'="'+goog.string.internal.htmlEscape(String(c))+'"'};
	goog.html.SafeHtml.getStyleValue_=function(a){if(!goog.isObject(a))throw Error('The "style" attribute requires goog.html.SafeStyle or map of style properties, '+typeof a+" given: "+a);a instanceof goog.html.SafeStyle||(a=goog.html.SafeStyle.create(a));return goog.html.SafeStyle.unwrap(a)};goog.html.SafeHtml.createWithDir=function(a,b,c,d){b=goog.html.SafeHtml.create(b,c,d);b.dir_=a;return b};
	goog.html.SafeHtml.join=function(a,b){a=goog.html.SafeHtml.htmlEscape(a);var c=a.getDirection(),d=[],e=function(a){goog.isArray(a)?goog.array.forEach(a,e):(a=goog.html.SafeHtml.htmlEscape(a),d.push(goog.html.SafeHtml.unwrap(a)),a=a.getDirection(),c==goog.i18n.bidi.Dir.NEUTRAL?c=a:a!=goog.i18n.bidi.Dir.NEUTRAL&&c!=a&&(c=null));};goog.array.forEach(b,e);return goog.html.SafeHtml.createSafeHtmlSecurityPrivateDoNotAccessOrElse(d.join(goog.html.SafeHtml.unwrap(a)),c)};
	goog.html.SafeHtml.concat=function(a){return goog.html.SafeHtml.join(goog.html.SafeHtml.EMPTY,Array.prototype.slice.call(arguments))};goog.html.SafeHtml.concatWithDir=function(a,b){var c=goog.html.SafeHtml.concat(goog.array.slice(arguments,1));c.dir_=a;return c};goog.html.SafeHtml.TYPE_MARKER_GOOG_HTML_SECURITY_PRIVATE_={};goog.html.SafeHtml.createSafeHtmlSecurityPrivateDoNotAccessOrElse=function(a,b){return (new goog.html.SafeHtml).initSecurityPrivateDoNotAccessOrElse_(a,b)};
	goog.html.SafeHtml.prototype.initSecurityPrivateDoNotAccessOrElse_=function(a,b){this.privateDoNotAccessOrElseSafeHtmlWrappedValue_=goog.html.trustedtypes.PRIVATE_DO_NOT_ACCESS_OR_ELSE_POLICY?goog.html.trustedtypes.PRIVATE_DO_NOT_ACCESS_OR_ELSE_POLICY.createHTML(a):a;this.dir_=b;return this};
	goog.html.SafeHtml.createSafeHtmlTagSecurityPrivateDoNotAccessOrElse=function(a,b,c){var d=null;var e="<"+a+goog.html.SafeHtml.stringifyAttributes(a,b);goog.isDefAndNotNull(c)?goog.isArray(c)||(c=[c]):c=[];goog.dom.tags.isVoidTag(a.toLowerCase())?(goog.asserts.assert(!c.length,"Void tag <"+a+"> does not allow content."),e+=">"):(d=goog.html.SafeHtml.concat(c),e+=">"+goog.html.SafeHtml.unwrap(d)+"</"+a+">",d=d.getDirection());(a=b&&b.dir)&&(d=/^(ltr|rtl|auto)$/i.test(a)?goog.i18n.bidi.Dir.NEUTRAL:
	null);return goog.html.SafeHtml.createSafeHtmlSecurityPrivateDoNotAccessOrElse(e,d)};goog.html.SafeHtml.stringifyAttributes=function(a,b){var c="";if(b)for(var d in b){if(!goog.html.SafeHtml.VALID_NAMES_IN_TAG_.test(d))throw Error('Invalid attribute name "'+d+'".');var e=b[d];goog.isDefAndNotNull(e)&&(c+=" "+goog.html.SafeHtml.getAttrNameAndValue_(a,d,e));}return c};
	goog.html.SafeHtml.combineAttributes=function(a,b,c){var d={},e;for(e in a)goog.asserts.assert(e.toLowerCase()==e,"Must be lower case"),d[e]=a[e];for(e in b)goog.asserts.assert(e.toLowerCase()==e,"Must be lower case"),d[e]=b[e];for(e in c){var f=e.toLowerCase();if(f in a)throw Error('Cannot override "'+f+'" attribute, got "'+e+'" with value "'+c[e]+'"');f in b&&delete d[f];d[e]=c[e];}return d};
	goog.html.SafeHtml.DOCTYPE_HTML=goog.html.SafeHtml.createSafeHtmlSecurityPrivateDoNotAccessOrElse("<!DOCTYPE html>",goog.i18n.bidi.Dir.NEUTRAL);goog.html.SafeHtml.EMPTY=goog.html.SafeHtml.createSafeHtmlSecurityPrivateDoNotAccessOrElse("",goog.i18n.bidi.Dir.NEUTRAL);goog.html.SafeHtml.BR=goog.html.SafeHtml.createSafeHtmlSecurityPrivateDoNotAccessOrElse("<br>",goog.i18n.bidi.Dir.NEUTRAL);goog.html.uncheckedconversions={};goog.html.uncheckedconversions.safeHtmlFromStringKnownToSatisfyTypeContract=function(a,b,c){goog.asserts.assertString(goog.string.Const.unwrap(a),"must provide justification");goog.asserts.assert(!goog.string.internal.isEmptyOrWhitespace(goog.string.Const.unwrap(a)),"must provide non-empty justification");return goog.html.SafeHtml.createSafeHtmlSecurityPrivateDoNotAccessOrElse(b,c||null)};
	goog.html.uncheckedconversions.safeScriptFromStringKnownToSatisfyTypeContract=function(a,b){goog.asserts.assertString(goog.string.Const.unwrap(a),"must provide justification");goog.asserts.assert(!goog.string.internal.isEmptyOrWhitespace(goog.string.Const.unwrap(a)),"must provide non-empty justification");return goog.html.SafeScript.createSafeScriptSecurityPrivateDoNotAccessOrElse(b)};
	goog.html.uncheckedconversions.safeStyleFromStringKnownToSatisfyTypeContract=function(a,b){goog.asserts.assertString(goog.string.Const.unwrap(a),"must provide justification");goog.asserts.assert(!goog.string.internal.isEmptyOrWhitespace(goog.string.Const.unwrap(a)),"must provide non-empty justification");return goog.html.SafeStyle.createSafeStyleSecurityPrivateDoNotAccessOrElse(b)};
	goog.html.uncheckedconversions.safeStyleSheetFromStringKnownToSatisfyTypeContract=function(a,b){goog.asserts.assertString(goog.string.Const.unwrap(a),"must provide justification");goog.asserts.assert(!goog.string.internal.isEmptyOrWhitespace(goog.string.Const.unwrap(a)),"must provide non-empty justification");return goog.html.SafeStyleSheet.createSafeStyleSheetSecurityPrivateDoNotAccessOrElse(b)};
	goog.html.uncheckedconversions.safeUrlFromStringKnownToSatisfyTypeContract=function(a,b){goog.asserts.assertString(goog.string.Const.unwrap(a),"must provide justification");goog.asserts.assert(!goog.string.internal.isEmptyOrWhitespace(goog.string.Const.unwrap(a)),"must provide non-empty justification");return goog.html.SafeUrl.createSafeUrlSecurityPrivateDoNotAccessOrElse(b)};
	goog.html.uncheckedconversions.trustedResourceUrlFromStringKnownToSatisfyTypeContract=function(a,b){goog.asserts.assertString(goog.string.Const.unwrap(a),"must provide justification");goog.asserts.assert(!goog.string.internal.isEmptyOrWhitespace(goog.string.Const.unwrap(a)),"must provide non-empty justification");return goog.html.TrustedResourceUrl.createTrustedResourceUrlSecurityPrivateDoNotAccessOrElse(b)};goog.dom.safe={};goog.dom.safe.InsertAdjacentHtmlPosition={AFTERBEGIN:"afterbegin",AFTEREND:"afterend",BEFOREBEGIN:"beforebegin",BEFOREEND:"beforeend"};goog.dom.safe.insertAdjacentHtml=function(a,b,c){a.insertAdjacentHTML(b,goog.html.SafeHtml.unwrapTrustedHTML(c));};goog.dom.safe.SET_INNER_HTML_DISALLOWED_TAGS_={MATH:!0,SCRIPT:!0,STYLE:!0,SVG:!0,TEMPLATE:!0};
	goog.dom.safe.isInnerHtmlCleanupRecursive_=goog.functions.cacheReturnValue(function(){if(goog.DEBUG&&"undefined"===typeof document)return !1;var a=document.createElement("div"),b=document.createElement("div");b.appendChild(document.createElement("div"));a.appendChild(b);if(goog.DEBUG&&!a.firstChild)return !1;b=a.firstChild.firstChild;a.innerHTML=goog.html.SafeHtml.unwrapTrustedHTML(goog.html.SafeHtml.EMPTY);return !b.parentElement});
	goog.dom.safe.unsafeSetInnerHtmlDoNotUseOrElse=function(a,b){if(goog.dom.safe.isInnerHtmlCleanupRecursive_())for(;a.lastChild;)a.removeChild(a.lastChild);a.innerHTML=goog.html.SafeHtml.unwrapTrustedHTML(b);};
	goog.dom.safe.setInnerHtml=function(a,b){if(goog.asserts.ENABLE_ASSERTS){var c=a.tagName.toUpperCase();if(goog.dom.safe.SET_INNER_HTML_DISALLOWED_TAGS_[c])throw Error("goog.dom.safe.setInnerHtml cannot be used to set content of "+a.tagName+".");}goog.dom.safe.unsafeSetInnerHtmlDoNotUseOrElse(a,b);};goog.dom.safe.setOuterHtml=function(a,b){a.outerHTML=goog.html.SafeHtml.unwrapTrustedHTML(b);};
	goog.dom.safe.setFormElementAction=function(a,b){b=b instanceof goog.html.SafeUrl?b:goog.html.SafeUrl.sanitizeAssertUnchanged(b);goog.dom.asserts.assertIsHTMLFormElement(a).action=goog.html.SafeUrl.unwrapTrustedURL(b);};goog.dom.safe.setButtonFormAction=function(a,b){b=b instanceof goog.html.SafeUrl?b:goog.html.SafeUrl.sanitizeAssertUnchanged(b);goog.dom.asserts.assertIsHTMLButtonElement(a).formAction=goog.html.SafeUrl.unwrapTrustedURL(b);};
	goog.dom.safe.setInputFormAction=function(a,b){b=b instanceof goog.html.SafeUrl?b:goog.html.SafeUrl.sanitizeAssertUnchanged(b);goog.dom.asserts.assertIsHTMLInputElement(a).formAction=goog.html.SafeUrl.unwrapTrustedURL(b);};goog.dom.safe.setStyle=function(a,b){a.style.cssText=goog.html.SafeStyle.unwrap(b);};goog.dom.safe.documentWrite=function(a,b){a.write(goog.html.SafeHtml.unwrapTrustedHTML(b));};
	goog.dom.safe.setAnchorHref=function(a,b){goog.dom.asserts.assertIsHTMLAnchorElement(a);b=b instanceof goog.html.SafeUrl?b:goog.html.SafeUrl.sanitizeAssertUnchanged(b);a.href=goog.html.SafeUrl.unwrapTrustedURL(b);};goog.dom.safe.setImageSrc=function(a,b){goog.dom.asserts.assertIsHTMLImageElement(a);if(!(b instanceof goog.html.SafeUrl)){var c=/^data:image\//i.test(b);b=goog.html.SafeUrl.sanitizeAssertUnchanged(b,c);}a.src=goog.html.SafeUrl.unwrapTrustedURL(b);};
	goog.dom.safe.setAudioSrc=function(a,b){goog.dom.asserts.assertIsHTMLAudioElement(a);if(!(b instanceof goog.html.SafeUrl)){var c=/^data:audio\//i.test(b);b=goog.html.SafeUrl.sanitizeAssertUnchanged(b,c);}a.src=goog.html.SafeUrl.unwrapTrustedURL(b);};goog.dom.safe.setVideoSrc=function(a,b){goog.dom.asserts.assertIsHTMLVideoElement(a);if(!(b instanceof goog.html.SafeUrl)){var c=/^data:video\//i.test(b);b=goog.html.SafeUrl.sanitizeAssertUnchanged(b,c);}a.src=goog.html.SafeUrl.unwrapTrustedURL(b);};
	goog.dom.safe.setEmbedSrc=function(a,b){goog.dom.asserts.assertIsHTMLEmbedElement(a);a.src=goog.html.TrustedResourceUrl.unwrapTrustedScriptURL(b);};goog.dom.safe.setFrameSrc=function(a,b){goog.dom.asserts.assertIsHTMLFrameElement(a);a.src=goog.html.TrustedResourceUrl.unwrapTrustedURL(b);};goog.dom.safe.setIframeSrc=function(a,b){goog.dom.asserts.assertIsHTMLIFrameElement(a);a.src=goog.html.TrustedResourceUrl.unwrapTrustedURL(b);};
	goog.dom.safe.setIframeSrcdoc=function(a,b){goog.dom.asserts.assertIsHTMLIFrameElement(a);a.srcdoc=goog.html.SafeHtml.unwrapTrustedHTML(b);};
	goog.dom.safe.setLinkHrefAndRel=function(a,b,c){goog.dom.asserts.assertIsHTMLLinkElement(a);a.rel=c;goog.string.internal.caseInsensitiveContains(c,"stylesheet")?(goog.asserts.assert(b instanceof goog.html.TrustedResourceUrl,'URL must be TrustedResourceUrl because "rel" contains "stylesheet"'),a.href=goog.html.TrustedResourceUrl.unwrapTrustedURL(b)):a.href=b instanceof goog.html.TrustedResourceUrl?goog.html.TrustedResourceUrl.unwrapTrustedURL(b):b instanceof goog.html.SafeUrl?goog.html.SafeUrl.unwrapTrustedURL(b):
	goog.html.SafeUrl.unwrapTrustedURL(goog.html.SafeUrl.sanitizeAssertUnchanged(b));};goog.dom.safe.setObjectData=function(a,b){goog.dom.asserts.assertIsHTMLObjectElement(a);a.data=goog.html.TrustedResourceUrl.unwrapTrustedScriptURL(b);};goog.dom.safe.setScriptSrc=function(a,b){goog.dom.asserts.assertIsHTMLScriptElement(a);a.src=goog.html.TrustedResourceUrl.unwrapTrustedScriptURL(b);(b=goog.getScriptNonce())&&a.setAttribute("nonce",b);};
	goog.dom.safe.setScriptContent=function(a,b){goog.dom.asserts.assertIsHTMLScriptElement(a);a.text=goog.html.SafeScript.unwrapTrustedScript(b);(b=goog.getScriptNonce())&&a.setAttribute("nonce",b);};goog.dom.safe.setLocationHref=function(a,b){goog.dom.asserts.assertIsLocation(a);b=b instanceof goog.html.SafeUrl?b:goog.html.SafeUrl.sanitizeAssertUnchanged(b);a.href=goog.html.SafeUrl.unwrapTrustedURL(b);};
	goog.dom.safe.assignLocation=function(a,b){goog.dom.asserts.assertIsLocation(a);b=b instanceof goog.html.SafeUrl?b:goog.html.SafeUrl.sanitizeAssertUnchanged(b);a.assign(goog.html.SafeUrl.unwrapTrustedURL(b));};goog.dom.safe.replaceLocation=function(a,b){goog.dom.asserts.assertIsLocation(a);b=b instanceof goog.html.SafeUrl?b:goog.html.SafeUrl.sanitizeAssertUnchanged(b);a.replace(goog.html.SafeUrl.unwrapTrustedURL(b));};
	goog.dom.safe.openInWindow=function(a,b,c,d,e){a=a instanceof goog.html.SafeUrl?a:goog.html.SafeUrl.sanitizeAssertUnchanged(a);return (b||goog.global).open(goog.html.SafeUrl.unwrapTrustedURL(a),c?goog.string.Const.unwrap(c):"",d,e)};goog.dom.safe.parseFromStringHtml=function(a,b){return goog.dom.safe.parseFromString(a,b,"text/html")};goog.dom.safe.parseFromString=function(a,b,c){return a.parseFromString(goog.html.SafeHtml.unwrapTrustedHTML(b),c)};
	goog.dom.safe.createImageFromBlob=function(a){if(!/^image\/.*/g.test(a.type))throw Error("goog.dom.safe.createImageFromBlob only accepts MIME type image/.*.");var b=goog.global.URL.createObjectURL(a);a=new goog.global.Image;a.onload=function(){goog.global.URL.revokeObjectURL(b);};goog.dom.safe.setImageSrc(a,goog.html.uncheckedconversions.safeUrlFromStringKnownToSatisfyTypeContract(goog.string.Const.from("Image blob URL."),b));return a};goog.string.DETECT_DOUBLE_ESCAPING=!1;goog.string.FORCE_NON_DOM_HTML_UNESCAPING=!1;goog.string.Unicode={NBSP:"\u00a0"};goog.string.startsWith=goog.string.internal.startsWith;goog.string.endsWith=goog.string.internal.endsWith;goog.string.caseInsensitiveStartsWith=goog.string.internal.caseInsensitiveStartsWith;goog.string.caseInsensitiveEndsWith=goog.string.internal.caseInsensitiveEndsWith;goog.string.caseInsensitiveEquals=goog.string.internal.caseInsensitiveEquals;
	goog.string.subs=function(a,b){for(var c=a.split("%s"),d="",e=Array.prototype.slice.call(arguments,1);e.length&&1<c.length;)d+=c.shift()+e.shift();return d+c.join("%s")};goog.string.collapseWhitespace=function(a){return a.replace(/[\s\xa0]+/g," ").replace(/^\s+|\s+$/g,"")};goog.string.isEmptyOrWhitespace=goog.string.internal.isEmptyOrWhitespace;goog.string.isEmptyString=function(a){return 0==a.length};goog.string.isEmpty=goog.string.isEmptyOrWhitespace;goog.string.isEmptyOrWhitespaceSafe=function(a){return goog.string.isEmptyOrWhitespace(goog.string.makeSafe(a))};
	goog.string.isEmptySafe=goog.string.isEmptyOrWhitespaceSafe;goog.string.isBreakingWhitespace=function(a){return !/[^\t\n\r ]/.test(a)};goog.string.isAlpha=function(a){return !/[^a-zA-Z]/.test(a)};goog.string.isNumeric=function(a){return !/[^0-9]/.test(a)};goog.string.isAlphaNumeric=function(a){return !/[^a-zA-Z0-9]/.test(a)};goog.string.isSpace=function(a){return " "==a};goog.string.isUnicodeChar=function(a){return 1==a.length&&" "<=a&&"~">=a||"\u0080"<=a&&"\ufffd">=a};
	goog.string.stripNewlines=function(a){return a.replace(/(\r\n|\r|\n)+/g," ")};goog.string.canonicalizeNewlines=function(a){return a.replace(/(\r\n|\r|\n)/g,"\n")};goog.string.normalizeWhitespace=function(a){return a.replace(/\xa0|\s/g," ")};goog.string.normalizeSpaces=function(a){return a.replace(/\xa0|[ \t]+/g," ")};goog.string.collapseBreakingSpaces=function(a){return a.replace(/[\t\r\n ]+/g," ").replace(/^[\t\r\n ]+|[\t\r\n ]+$/g,"")};goog.string.trim=goog.string.internal.trim;
	goog.string.trimLeft=function(a){return a.replace(/^[\s\xa0]+/,"")};goog.string.trimRight=function(a){return a.replace(/[\s\xa0]+$/,"")};goog.string.caseInsensitiveCompare=goog.string.internal.caseInsensitiveCompare;
	goog.string.numberAwareCompare_=function(a,b,c){if(a==b)return 0;if(!a)return -1;if(!b)return 1;for(var d=a.toLowerCase().match(c),e=b.toLowerCase().match(c),f=Math.min(d.length,e.length),g=0;g<f;g++){c=d[g];var h=e[g];if(c!=h)return a=parseInt(c,10),!isNaN(a)&&(b=parseInt(h,10),!isNaN(b)&&a-b)?a-b:c<h?-1:1}return d.length!=e.length?d.length-e.length:a<b?-1:1};goog.string.intAwareCompare=function(a,b){return goog.string.numberAwareCompare_(a,b,/\d+|\D+/g)};
	goog.string.floatAwareCompare=function(a,b){return goog.string.numberAwareCompare_(a,b,/\d+|\.\d+|\D+/g)};goog.string.numerateCompare=goog.string.floatAwareCompare;goog.string.urlEncode=function(a){return encodeURIComponent(String(a))};goog.string.urlDecode=function(a){return decodeURIComponent(a.replace(/\+/g," "))};goog.string.newLineToBr=goog.string.internal.newLineToBr;
	goog.string.htmlEscape=function(a,b){a=goog.string.internal.htmlEscape(a,b);goog.string.DETECT_DOUBLE_ESCAPING&&(a=a.replace(goog.string.E_RE_,"&#101;"));return a};goog.string.E_RE_=/e/g;goog.string.unescapeEntities=function(a){return goog.string.contains(a,"&")?!goog.string.FORCE_NON_DOM_HTML_UNESCAPING&&"document"in goog.global?goog.string.unescapeEntitiesUsingDom_(a):goog.string.unescapePureXmlEntities_(a):a};
	goog.string.unescapeEntitiesWithDocument=function(a,b){return goog.string.contains(a,"&")?goog.string.unescapeEntitiesUsingDom_(a,b):a};
	goog.string.unescapeEntitiesUsingDom_=function(a,b){var c={"&amp;":"&","&lt;":"<","&gt;":">","&quot;":'"'};var d=b?b.createElement("div"):goog.global.document.createElement("div");return a.replace(goog.string.HTML_ENTITY_PATTERN_,function(a,b){var e=c[a];if(e)return e;"#"==b.charAt(0)&&(b=Number("0"+b.substr(1)),isNaN(b)||(e=String.fromCharCode(b)));e||(goog.dom.safe.setInnerHtml(d,goog.html.uncheckedconversions.safeHtmlFromStringKnownToSatisfyTypeContract(goog.string.Const.from("Single HTML entity."),
	a+" ")),e=d.firstChild.nodeValue.slice(0,-1));return c[a]=e})};goog.string.unescapePureXmlEntities_=function(a){return a.replace(/&([^;]+);/g,function(a,c){switch(c){case "amp":return "&";case "lt":return "<";case "gt":return ">";case "quot":return '"';default:return "#"!=c.charAt(0)||(c=Number("0"+c.substr(1)),isNaN(c))?a:String.fromCharCode(c)}})};goog.string.HTML_ENTITY_PATTERN_=/&([^;\s<&]+);?/g;goog.string.whitespaceEscape=function(a,b){return goog.string.newLineToBr(a.replace(/  /g," &#160;"),b)};
	goog.string.preserveSpaces=function(a){return a.replace(/(^|[\n ]) /g,"$1"+goog.string.Unicode.NBSP)};goog.string.stripQuotes=function(a,b){for(var c=b.length,d=0;d<c;d++){var e=1==c?b:b.charAt(d);if(a.charAt(0)==e&&a.charAt(a.length-1)==e)return a.substring(1,a.length-1)}return a};goog.string.truncate=function(a,b,c){c&&(a=goog.string.unescapeEntities(a));a.length>b&&(a=a.substring(0,b-3)+"...");c&&(a=goog.string.htmlEscape(a));return a};
	goog.string.truncateMiddle=function(a,b,c,d){c&&(a=goog.string.unescapeEntities(a));if(d&&a.length>b){d>b&&(d=b);var e=a.length-d;a=a.substring(0,b-d)+"..."+a.substring(e);}else a.length>b&&(d=Math.floor(b/2),e=a.length-d,a=a.substring(0,d+b%2)+"..."+a.substring(e));c&&(a=goog.string.htmlEscape(a));return a};goog.string.specialEscapeChars_={"\x00":"\\0","\b":"\\b","\f":"\\f","\n":"\\n","\r":"\\r","\t":"\\t","\x0B":"\\x0B",'"':'\\"',"\\":"\\\\","<":"\\u003C"};goog.string.jsEscapeCache_={"'":"\\'"};
	goog.string.quote=function(a){a=String(a);for(var b=['"'],c=0;c<a.length;c++){var d=a.charAt(c),e=d.charCodeAt(0);b[c+1]=goog.string.specialEscapeChars_[d]||(31<e&&127>e?d:goog.string.escapeChar(d));}b.push('"');return b.join("")};goog.string.escapeString=function(a){for(var b=[],c=0;c<a.length;c++)b[c]=goog.string.escapeChar(a.charAt(c));return b.join("")};
	goog.string.escapeChar=function(a){if(a in goog.string.jsEscapeCache_)return goog.string.jsEscapeCache_[a];if(a in goog.string.specialEscapeChars_)return goog.string.jsEscapeCache_[a]=goog.string.specialEscapeChars_[a];var b=a.charCodeAt(0);if(31<b&&127>b)var c=a;else {if(256>b){if(c="\\x",16>b||256<b)c+="0";}else c="\\u",4096>b&&(c+="0");c+=b.toString(16).toUpperCase();}return goog.string.jsEscapeCache_[a]=c};goog.string.contains=goog.string.internal.contains;goog.string.caseInsensitiveContains=goog.string.internal.caseInsensitiveContains;
	goog.string.countOf=function(a,b){return a&&b?a.split(b).length-1:0};goog.string.removeAt=function(a,b,c){var d=a;0<=b&&b<a.length&&0<c&&(d=a.substr(0,b)+a.substr(b+c,a.length-b-c));return d};goog.string.remove=function(a,b){return a.replace(b,"")};goog.string.removeAll=function(a,b){b=new RegExp(goog.string.regExpEscape(b),"g");return a.replace(b,"")};goog.string.replaceAll=function(a,b,c){b=new RegExp(goog.string.regExpEscape(b),"g");return a.replace(b,c.replace(/\$/g,"$$$$"))};
	goog.string.regExpEscape=function(a){return String(a).replace(/([-()\[\]{}+?*.$\^|,:#<!\\])/g,"\\$1").replace(/\x08/g,"\\x08")};goog.string.repeat=String.prototype.repeat?function(a,b){return a.repeat(b)}:function(a,b){return Array(b+1).join(a)};goog.string.padNumber=function(a,b,c){a=goog.isDef(c)?a.toFixed(c):String(a);c=a.indexOf(".");-1==c&&(c=a.length);return goog.string.repeat("0",Math.max(0,b-c))+a};goog.string.makeSafe=function(a){return null==a?"":String(a)};
	goog.string.buildString=function(a){return Array.prototype.join.call(arguments,"")};goog.string.getRandomString=function(){return Math.floor(2147483648*Math.random()).toString(36)+Math.abs(Math.floor(2147483648*Math.random())^goog.now()).toString(36)};goog.string.compareVersions=goog.string.internal.compareVersions;goog.string.hashCode=function(a){for(var b=0,c=0;c<a.length;++c)b=31*b+a.charCodeAt(c)>>>0;return b};goog.string.uniqueStringCounter_=2147483648*Math.random()|0;
	goog.string.createUniqueString=function(){return "goog_"+goog.string.uniqueStringCounter_++};goog.string.toNumber=function(a){var b=Number(a);return 0==b&&goog.string.isEmptyOrWhitespace(a)?NaN:b};goog.string.isLowerCamelCase=function(a){return /^[a-z]+([A-Z][a-z]*)*$/.test(a)};goog.string.isUpperCamelCase=function(a){return /^([A-Z][a-z]*)+$/.test(a)};goog.string.toCamelCase=function(a){return String(a).replace(/\-([a-z])/g,function(a,c){return c.toUpperCase()})};
	goog.string.toSelectorCase=function(a){return String(a).replace(/([A-Z])/g,"-$1").toLowerCase()};goog.string.toTitleCase=function(a,b){b=goog.isString(b)?goog.string.regExpEscape(b):"\\s";return a.replace(new RegExp("(^"+(b?"|["+b+"]+":"")+")([a-z])","g"),function(a,b,e){return b+e.toUpperCase()})};goog.string.capitalize=function(a){return String(a.charAt(0)).toUpperCase()+String(a.substr(1)).toLowerCase()};
	goog.string.parseInt=function(a){isFinite(a)&&(a=String(a));return goog.isString(a)?/^\s*-?0x/i.test(a)?parseInt(a,16):parseInt(a,10):NaN};goog.string.splitLimit=function(a,b,c){a=a.split(b);for(var d=[];0<c&&a.length;)d.push(a.shift()),c--;a.length&&d.push(a.join(b));return d};goog.string.lastComponent=function(a,b){if(b)"string"==typeof b&&(b=[b]);else return a;for(var c=-1,d=0;d<b.length;d++)if(""!=b[d]){var e=a.lastIndexOf(b[d]);e>c&&(c=e);}return -1==c?a:a.slice(c+1)};
	goog.string.editDistance=function(a,b){var c=[],d=[];if(a==b)return 0;if(!a.length||!b.length)return Math.max(a.length,b.length);for(var e=0;e<b.length+1;e++)c[e]=e;for(e=0;e<a.length;e++){d[0]=e+1;for(var f=0;f<b.length;f++)d[f+1]=Math.min(d[f]+1,c[f+1]+1,c[f]+Number(a[e]!=b[f]));for(f=0;f<c.length;f++)c[f]=d[f];}return d[b.length]};goog.labs.userAgent.engine={};goog.labs.userAgent.engine.isPresto=function(){return goog.labs.userAgent.util.matchUserAgent("Presto")};goog.labs.userAgent.engine.isTrident=function(){return goog.labs.userAgent.util.matchUserAgent("Trident")||goog.labs.userAgent.util.matchUserAgent("MSIE")};goog.labs.userAgent.engine.isEdge=function(){return goog.labs.userAgent.util.matchUserAgent("Edge")};
	goog.labs.userAgent.engine.isWebKit=function(){return goog.labs.userAgent.util.matchUserAgentIgnoreCase("WebKit")&&!goog.labs.userAgent.engine.isEdge()};goog.labs.userAgent.engine.isGecko=function(){return goog.labs.userAgent.util.matchUserAgent("Gecko")&&!goog.labs.userAgent.engine.isWebKit()&&!goog.labs.userAgent.engine.isTrident()&&!goog.labs.userAgent.engine.isEdge()};
	goog.labs.userAgent.engine.getVersion=function(){var a=goog.labs.userAgent.util.getUserAgent();if(a){a=goog.labs.userAgent.util.extractVersionTuples(a);var b=goog.labs.userAgent.engine.getEngineTuple_(a);if(b)return "Gecko"==b[0]?goog.labs.userAgent.engine.getVersionForKey_(a,"Firefox"):b[1];a=a[0];var c;if(a&&(c=a[2])&&(c=/Trident\/([^\s;]+)/.exec(c)))return c[1]}return ""};
	goog.labs.userAgent.engine.getEngineTuple_=function(a){if(!goog.labs.userAgent.engine.isEdge())return a[1];for(var b=0;b<a.length;b++){var c=a[b];if("Edge"==c[0])return c}};goog.labs.userAgent.engine.isVersionOrHigher=function(a){return 0<=goog.string.compareVersions(goog.labs.userAgent.engine.getVersion(),a)};goog.labs.userAgent.engine.getVersionForKey_=function(a,b){return (a=goog.array.find(a,function(a){return b==a[0]}))&&a[1]||""};goog.labs.userAgent.platform={};goog.labs.userAgent.platform.isAndroid=function(){return goog.labs.userAgent.util.matchUserAgent("Android")};goog.labs.userAgent.platform.isIpod=function(){return goog.labs.userAgent.util.matchUserAgent("iPod")};goog.labs.userAgent.platform.isIphone=function(){return goog.labs.userAgent.util.matchUserAgent("iPhone")&&!goog.labs.userAgent.util.matchUserAgent("iPod")&&!goog.labs.userAgent.util.matchUserAgent("iPad")};goog.labs.userAgent.platform.isIpad=function(){return goog.labs.userAgent.util.matchUserAgent("iPad")};
	goog.labs.userAgent.platform.isIos=function(){return goog.labs.userAgent.platform.isIphone()||goog.labs.userAgent.platform.isIpad()||goog.labs.userAgent.platform.isIpod()};goog.labs.userAgent.platform.isMacintosh=function(){return goog.labs.userAgent.util.matchUserAgent("Macintosh")};goog.labs.userAgent.platform.isLinux=function(){return goog.labs.userAgent.util.matchUserAgent("Linux")};goog.labs.userAgent.platform.isWindows=function(){return goog.labs.userAgent.util.matchUserAgent("Windows")};
	goog.labs.userAgent.platform.isChromeOS=function(){return goog.labs.userAgent.util.matchUserAgent("CrOS")};goog.labs.userAgent.platform.isChromecast=function(){return goog.labs.userAgent.util.matchUserAgent("CrKey")};goog.labs.userAgent.platform.isKaiOS=function(){return goog.labs.userAgent.util.matchUserAgentIgnoreCase("KaiOS")};goog.labs.userAgent.platform.isGo2Phone=function(){return goog.labs.userAgent.util.matchUserAgentIgnoreCase("GAFP")};
	goog.labs.userAgent.platform.getVersion=function(){var a=goog.labs.userAgent.util.getUserAgent(),b="";goog.labs.userAgent.platform.isWindows()?(b=/Windows (?:NT|Phone) ([0-9.]+)/,b=(a=b.exec(a))?a[1]:"0.0"):goog.labs.userAgent.platform.isIos()?(b=/(?:iPhone|iPod|iPad|CPU)\s+OS\s+(\S+)/,b=(a=b.exec(a))&&a[1].replace(/_/g,".")):goog.labs.userAgent.platform.isMacintosh()?(b=/Mac OS X ([0-9_.]+)/,b=(a=b.exec(a))?a[1].replace(/_/g,"."):"10"):goog.labs.userAgent.platform.isKaiOS()?(b=/(?:KaiOS)\/(\S+)/i,
	b=(a=b.exec(a))&&a[1]):goog.labs.userAgent.platform.isAndroid()?(b=/Android\s+([^\);]+)(\)|;)/,b=(a=b.exec(a))&&a[1]):goog.labs.userAgent.platform.isChromeOS()&&(b=/(?:CrOS\s+(?:i686|x86_64)\s+([0-9.]+))/,b=(a=b.exec(a))&&a[1]);return b||""};goog.labs.userAgent.platform.isVersionOrHigher=function(a){return 0<=goog.string.compareVersions(goog.labs.userAgent.platform.getVersion(),a)};goog.reflect={};goog.reflect.object=function(a,b){return b};goog.reflect.objectProperty=function(a,b){return a};goog.reflect.sinkValue=function(a){goog.reflect.sinkValue[" "](a);return a};goog.reflect.sinkValue[" "]=goog.nullFunction;goog.reflect.canAccessProperty=function(a,b){try{return goog.reflect.sinkValue(a[b]),!0}catch(c){}return !1};goog.reflect.cache=function(a,b,c,d){d=d?d(b):b;return Object.prototype.hasOwnProperty.call(a,d)?a[d]:a[d]=c(b)};goog.userAgent={};goog.userAgent.ASSUME_IE=!1;goog.userAgent.ASSUME_EDGE=!1;goog.userAgent.ASSUME_GECKO=!1;goog.userAgent.ASSUME_WEBKIT=!1;goog.userAgent.ASSUME_MOBILE_WEBKIT=!1;goog.userAgent.ASSUME_OPERA=!1;goog.userAgent.ASSUME_ANY_VERSION=!1;goog.userAgent.BROWSER_KNOWN_=goog.userAgent.ASSUME_IE||goog.userAgent.ASSUME_EDGE||goog.userAgent.ASSUME_GECKO||goog.userAgent.ASSUME_MOBILE_WEBKIT||goog.userAgent.ASSUME_WEBKIT||goog.userAgent.ASSUME_OPERA;goog.userAgent.getUserAgentString=function(){return goog.labs.userAgent.util.getUserAgent()};
	goog.userAgent.getNavigatorTyped=function(){return goog.global.navigator||null};goog.userAgent.getNavigator=function(){return goog.userAgent.getNavigatorTyped()};goog.userAgent.OPERA=goog.userAgent.BROWSER_KNOWN_?goog.userAgent.ASSUME_OPERA:goog.labs.userAgent.browser.isOpera();goog.userAgent.IE=goog.userAgent.BROWSER_KNOWN_?goog.userAgent.ASSUME_IE:goog.labs.userAgent.browser.isIE();goog.userAgent.EDGE=goog.userAgent.BROWSER_KNOWN_?goog.userAgent.ASSUME_EDGE:goog.labs.userAgent.engine.isEdge();
	goog.userAgent.EDGE_OR_IE=goog.userAgent.EDGE||goog.userAgent.IE;goog.userAgent.GECKO=goog.userAgent.BROWSER_KNOWN_?goog.userAgent.ASSUME_GECKO:goog.labs.userAgent.engine.isGecko();goog.userAgent.WEBKIT=goog.userAgent.BROWSER_KNOWN_?goog.userAgent.ASSUME_WEBKIT||goog.userAgent.ASSUME_MOBILE_WEBKIT:goog.labs.userAgent.engine.isWebKit();goog.userAgent.isMobile_=function(){return goog.userAgent.WEBKIT&&goog.labs.userAgent.util.matchUserAgent("Mobile")};
	goog.userAgent.MOBILE=goog.userAgent.ASSUME_MOBILE_WEBKIT||goog.userAgent.isMobile_();goog.userAgent.SAFARI=goog.userAgent.WEBKIT;goog.userAgent.determinePlatform_=function(){var a=goog.userAgent.getNavigatorTyped();return a&&a.platform||""};goog.userAgent.PLATFORM=goog.userAgent.determinePlatform_();goog.userAgent.ASSUME_MAC=!1;goog.userAgent.ASSUME_WINDOWS=!1;goog.userAgent.ASSUME_LINUX=!1;goog.userAgent.ASSUME_X11=!1;goog.userAgent.ASSUME_ANDROID=!1;goog.userAgent.ASSUME_IPHONE=!1;
	goog.userAgent.ASSUME_IPAD=!1;goog.userAgent.ASSUME_IPOD=!1;goog.userAgent.ASSUME_KAIOS=!1;goog.userAgent.ASSUME_GO2PHONE=!1;goog.userAgent.PLATFORM_KNOWN_=goog.userAgent.ASSUME_MAC||goog.userAgent.ASSUME_WINDOWS||goog.userAgent.ASSUME_LINUX||goog.userAgent.ASSUME_X11||goog.userAgent.ASSUME_ANDROID||goog.userAgent.ASSUME_IPHONE||goog.userAgent.ASSUME_IPAD||goog.userAgent.ASSUME_IPOD;goog.userAgent.MAC=goog.userAgent.PLATFORM_KNOWN_?goog.userAgent.ASSUME_MAC:goog.labs.userAgent.platform.isMacintosh();
	goog.userAgent.WINDOWS=goog.userAgent.PLATFORM_KNOWN_?goog.userAgent.ASSUME_WINDOWS:goog.labs.userAgent.platform.isWindows();goog.userAgent.isLegacyLinux_=function(){return goog.labs.userAgent.platform.isLinux()||goog.labs.userAgent.platform.isChromeOS()};goog.userAgent.LINUX=goog.userAgent.PLATFORM_KNOWN_?goog.userAgent.ASSUME_LINUX:goog.userAgent.isLegacyLinux_();goog.userAgent.isX11_=function(){var a=goog.userAgent.getNavigatorTyped();return !!a&&goog.string.contains(a.appVersion||"","X11")};
	goog.userAgent.X11=goog.userAgent.PLATFORM_KNOWN_?goog.userAgent.ASSUME_X11:goog.userAgent.isX11_();goog.userAgent.ANDROID=goog.userAgent.PLATFORM_KNOWN_?goog.userAgent.ASSUME_ANDROID:goog.labs.userAgent.platform.isAndroid();goog.userAgent.IPHONE=goog.userAgent.PLATFORM_KNOWN_?goog.userAgent.ASSUME_IPHONE:goog.labs.userAgent.platform.isIphone();goog.userAgent.IPAD=goog.userAgent.PLATFORM_KNOWN_?goog.userAgent.ASSUME_IPAD:goog.labs.userAgent.platform.isIpad();
	goog.userAgent.IPOD=goog.userAgent.PLATFORM_KNOWN_?goog.userAgent.ASSUME_IPOD:goog.labs.userAgent.platform.isIpod();goog.userAgent.IOS=goog.userAgent.PLATFORM_KNOWN_?goog.userAgent.ASSUME_IPHONE||goog.userAgent.ASSUME_IPAD||goog.userAgent.ASSUME_IPOD:goog.labs.userAgent.platform.isIos();goog.userAgent.KAIOS=goog.userAgent.PLATFORM_KNOWN_?goog.userAgent.ASSUME_KAIOS:goog.labs.userAgent.platform.isKaiOS();goog.userAgent.GO2PHONE=goog.userAgent.PLATFORM_KNOWN_?goog.userAgent.ASSUME_GO2PHONE:goog.labs.userAgent.platform.isGo2Phone();
	goog.userAgent.determineVersion_=function(){var a="",b=goog.userAgent.getVersionRegexResult_();b&&(a=b?b[1]:"");return goog.userAgent.IE&&(b=goog.userAgent.getDocumentMode_(),null!=b&&b>parseFloat(a))?String(b):a};
	goog.userAgent.getVersionRegexResult_=function(){var a=goog.userAgent.getUserAgentString();if(goog.userAgent.GECKO)return /rv:([^\);]+)(\)|;)/.exec(a);if(goog.userAgent.EDGE)return /Edge\/([\d\.]+)/.exec(a);if(goog.userAgent.IE)return /\b(?:MSIE|rv)[: ]([^\);]+)(\)|;)/.exec(a);if(goog.userAgent.WEBKIT)return /WebKit\/(\S+)/.exec(a);if(goog.userAgent.OPERA)return /(?:Version)[ \/]?(\S+)/.exec(a)};goog.userAgent.getDocumentMode_=function(){var a=goog.global.document;return a?a.documentMode:void 0};
	goog.userAgent.VERSION=goog.userAgent.determineVersion_();goog.userAgent.compare=function(a,b){return goog.string.compareVersions(a,b)};goog.userAgent.isVersionOrHigherCache_={};goog.userAgent.isVersionOrHigher=function(a){return goog.userAgent.ASSUME_ANY_VERSION||goog.reflect.cache(goog.userAgent.isVersionOrHigherCache_,a,function(){return 0<=goog.string.compareVersions(goog.userAgent.VERSION,a)})};goog.userAgent.isVersion=goog.userAgent.isVersionOrHigher;
	goog.userAgent.isDocumentModeOrHigher=function(a){return Number(goog.userAgent.DOCUMENT_MODE)>=a};goog.userAgent.isDocumentMode=goog.userAgent.isDocumentModeOrHigher;goog.userAgent.DOCUMENT_MODE=function(){if(goog.global.document&&goog.userAgent.IE)return goog.userAgent.getDocumentMode_()}();goog.userAgent.product={};goog.userAgent.product.ASSUME_FIREFOX=!1;goog.userAgent.product.ASSUME_IPHONE=!1;goog.userAgent.product.ASSUME_IPAD=!1;goog.userAgent.product.ASSUME_ANDROID=!1;goog.userAgent.product.ASSUME_CHROME=!1;goog.userAgent.product.ASSUME_SAFARI=!1;
	goog.userAgent.product.PRODUCT_KNOWN_=goog.userAgent.ASSUME_IE||goog.userAgent.ASSUME_EDGE||goog.userAgent.ASSUME_OPERA||goog.userAgent.product.ASSUME_FIREFOX||goog.userAgent.product.ASSUME_IPHONE||goog.userAgent.product.ASSUME_IPAD||goog.userAgent.product.ASSUME_ANDROID||goog.userAgent.product.ASSUME_CHROME||goog.userAgent.product.ASSUME_SAFARI;goog.userAgent.product.OPERA=goog.userAgent.OPERA;goog.userAgent.product.IE=goog.userAgent.IE;goog.userAgent.product.EDGE=goog.userAgent.EDGE;
	goog.userAgent.product.FIREFOX=goog.userAgent.product.PRODUCT_KNOWN_?goog.userAgent.product.ASSUME_FIREFOX:goog.labs.userAgent.browser.isFirefox();goog.userAgent.product.isIphoneOrIpod_=function(){return goog.labs.userAgent.platform.isIphone()||goog.labs.userAgent.platform.isIpod()};goog.userAgent.product.IPHONE=goog.userAgent.product.PRODUCT_KNOWN_?goog.userAgent.product.ASSUME_IPHONE:goog.userAgent.product.isIphoneOrIpod_();
	goog.userAgent.product.IPAD=goog.userAgent.product.PRODUCT_KNOWN_?goog.userAgent.product.ASSUME_IPAD:goog.labs.userAgent.platform.isIpad();goog.userAgent.product.ANDROID=goog.userAgent.product.PRODUCT_KNOWN_?goog.userAgent.product.ASSUME_ANDROID:goog.labs.userAgent.browser.isAndroidBrowser();goog.userAgent.product.CHROME=goog.userAgent.product.PRODUCT_KNOWN_?goog.userAgent.product.ASSUME_CHROME:goog.labs.userAgent.browser.isChrome();
	goog.userAgent.product.isSafariDesktop_=function(){return goog.labs.userAgent.browser.isSafari()&&!goog.labs.userAgent.platform.isIos()};goog.userAgent.product.SAFARI=goog.userAgent.product.PRODUCT_KNOWN_?goog.userAgent.product.ASSUME_SAFARI:goog.userAgent.product.isSafariDesktop_();goog.crypt.base64={};goog.crypt.base64.DEFAULT_ALPHABET_COMMON_="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";goog.crypt.base64.ENCODED_VALS=goog.crypt.base64.DEFAULT_ALPHABET_COMMON_+"+/=";goog.crypt.base64.ENCODED_VALS_WEBSAFE=goog.crypt.base64.DEFAULT_ALPHABET_COMMON_+"-_.";goog.crypt.base64.Alphabet={DEFAULT:0,NO_PADDING:1,WEBSAFE:2,WEBSAFE_DOT_PADDING:3,WEBSAFE_NO_PADDING:4};goog.crypt.base64.paddingChars_="=.";
	goog.crypt.base64.isPadding_=function(a){return goog.string.contains(goog.crypt.base64.paddingChars_,a)};goog.crypt.base64.byteToCharMaps_={};goog.crypt.base64.charToByteMap_=null;goog.crypt.base64.ASSUME_NATIVE_SUPPORT_=goog.userAgent.GECKO||goog.userAgent.WEBKIT&&!goog.userAgent.product.SAFARI||goog.userAgent.OPERA;goog.crypt.base64.HAS_NATIVE_ENCODE_=goog.crypt.base64.ASSUME_NATIVE_SUPPORT_||"function"==typeof goog.global.btoa;
	goog.crypt.base64.HAS_NATIVE_DECODE_=goog.crypt.base64.ASSUME_NATIVE_SUPPORT_||!goog.userAgent.product.SAFARI&&!goog.userAgent.IE&&"function"==typeof goog.global.atob;
	goog.crypt.base64.encodeByteArray=function(a,b){goog.asserts.assert(goog.isArrayLike(a),"encodeByteArray takes an array as a parameter");void 0===b&&(b=goog.crypt.base64.Alphabet.DEFAULT);goog.crypt.base64.init_();b=goog.crypt.base64.byteToCharMaps_[b];for(var c=[],d=0;d<a.length;d+=3){var e=a[d],f=d+1<a.length,g=f?a[d+1]:0,h=d+2<a.length,k=h?a[d+2]:0,l=e>>2;e=(e&3)<<4|g>>4;g=(g&15)<<2|k>>6;k&=63;h||(k=64,f||(g=64));c.push(b[l],b[e],b[g]||"",b[k]||"");}return c.join("")};
	goog.crypt.base64.encodeString=function(a,b){return goog.crypt.base64.HAS_NATIVE_ENCODE_&&!b?goog.global.btoa(a):goog.crypt.base64.encodeByteArray(goog.crypt.stringToByteArray(a),b)};goog.crypt.base64.decodeString=function(a,b){if(goog.crypt.base64.HAS_NATIVE_DECODE_&&!b)return goog.global.atob(a);var c="";goog.crypt.base64.decodeStringInternal_(a,function(a){c+=String.fromCharCode(a);});return c};
	goog.crypt.base64.decodeStringToByteArray=function(a,b){var c=[];goog.crypt.base64.decodeStringInternal_(a,function(a){c.push(a);});return c};
	goog.crypt.base64.decodeStringToUint8Array=function(a){goog.asserts.assert(!goog.userAgent.IE||goog.userAgent.isVersionOrHigher("10"),"Browser does not support typed arrays");var b=a.length,c=3*b/4;c%3?c=Math.floor(c):goog.crypt.base64.isPadding_(a[b-1])&&(c=goog.crypt.base64.isPadding_(a[b-2])?c-2:c-1);var d=new Uint8Array(c),e=0;goog.crypt.base64.decodeStringInternal_(a,function(a){d[e++]=a;});return d.subarray(0,e)};
	goog.crypt.base64.decodeStringInternal_=function(a,b){function c(b){for(;d<a.length;){var c=a.charAt(d++),e=goog.crypt.base64.charToByteMap_[c];if(null!=e)return e;if(!goog.string.isEmptyOrWhitespace(c))throw Error("Unknown base64 encoding at char: "+c);}return b}goog.crypt.base64.init_();for(var d=0;;){var e=c(-1),f=c(0),g=c(64),h=c(64);if(64===h&&-1===e)break;b(e<<2|f>>4);64!=g&&(b(f<<4&240|g>>2),64!=h&&b(g<<6&192|h));}};
	goog.crypt.base64.init_=function(){if(!goog.crypt.base64.charToByteMap_){goog.crypt.base64.charToByteMap_={};for(var a=goog.crypt.base64.DEFAULT_ALPHABET_COMMON_.split(""),b=["+/=","+/","-_=","-_.","-_"],c=0;5>c;c++){var d=a.concat(b[c].split(""));goog.crypt.base64.byteToCharMaps_[c]=d;for(var e=0;e<d.length;e++){var f=d[e],g=goog.crypt.base64.charToByteMap_[f];void 0===g?goog.crypt.base64.charToByteMap_[f]=e:goog.asserts.assert(g===e);}}}};jspb.utils={};jspb.utils.split64Low=0;jspb.utils.split64High=0;jspb.utils.splitUint64=function(a){var b=a>>>0;a=Math.floor((a-b)/jspb.BinaryConstants.TWO_TO_32)>>>0;jspb.utils.split64Low=b;jspb.utils.split64High=a;};jspb.utils.splitInt64=function(a){var b=0>a;a=Math.abs(a);var c=a>>>0;a=Math.floor((a-c)/jspb.BinaryConstants.TWO_TO_32);a>>>=0;b&&(a=~a>>>0,c=(~c>>>0)+1,4294967295<c&&(c=0,a++,4294967295<a&&(a=0)));jspb.utils.split64Low=c;jspb.utils.split64High=a;};
	jspb.utils.splitZigzag64=function(a){var b=0>a;a=2*Math.abs(a);jspb.utils.splitUint64(a);a=jspb.utils.split64Low;var c=jspb.utils.split64High;b&&(0==a?0==c?c=a=4294967295:(c--,a=4294967295):a--);jspb.utils.split64Low=a;jspb.utils.split64High=c;};
	jspb.utils.splitFloat32=function(a){var b=0>a?1:0;a=b?-a:a;if(0===a)0<1/a?(jspb.utils.split64High=0,jspb.utils.split64Low=0):(jspb.utils.split64High=0,jspb.utils.split64Low=2147483648);else if(isNaN(a))jspb.utils.split64High=0,jspb.utils.split64Low=2147483647;else if(a>jspb.BinaryConstants.FLOAT32_MAX)jspb.utils.split64High=0,jspb.utils.split64Low=(b<<31|2139095040)>>>0;else if(a<jspb.BinaryConstants.FLOAT32_MIN)a=Math.round(a/Math.pow(2,-149)),jspb.utils.split64High=0,jspb.utils.split64Low=(b<<31|
	a)>>>0;else {var c=Math.floor(Math.log(a)/Math.LN2);a*=Math.pow(2,-c);a=Math.round(a*jspb.BinaryConstants.TWO_TO_23)&8388607;jspb.utils.split64High=0;jspb.utils.split64Low=(b<<31|c+127<<23|a)>>>0;}};
	jspb.utils.splitFloat64=function(a){var b=0>a?1:0;a=b?-a:a;if(0===a)jspb.utils.split64High=0<1/a?0:2147483648,jspb.utils.split64Low=0;else if(isNaN(a))jspb.utils.split64High=2147483647,jspb.utils.split64Low=4294967295;else if(a>jspb.BinaryConstants.FLOAT64_MAX)jspb.utils.split64High=(b<<31|2146435072)>>>0,jspb.utils.split64Low=0;else if(a<jspb.BinaryConstants.FLOAT64_MIN){var c=a/Math.pow(2,-1074);a=c/jspb.BinaryConstants.TWO_TO_32;jspb.utils.split64High=(b<<31|a)>>>0;jspb.utils.split64Low=c>>>0;}else {c=
	a;var d=0;if(2<=c)for(;2<=c&&1023>d;)d++,c/=2;else for(;1>c&&-1022<d;)c*=2,d--;c=a*Math.pow(2,-d);a=c*jspb.BinaryConstants.TWO_TO_20&1048575;c=c*jspb.BinaryConstants.TWO_TO_52>>>0;jspb.utils.split64High=(b<<31|d+1023<<20|a)>>>0;jspb.utils.split64Low=c;}};
	jspb.utils.splitHash64=function(a){var b=a.charCodeAt(0),c=a.charCodeAt(1),d=a.charCodeAt(2),e=a.charCodeAt(3),f=a.charCodeAt(4),g=a.charCodeAt(5),h=a.charCodeAt(6);a=a.charCodeAt(7);jspb.utils.split64Low=b+(c<<8)+(d<<16)+(e<<24)>>>0;jspb.utils.split64High=f+(g<<8)+(h<<16)+(a<<24)>>>0;};jspb.utils.joinUint64=function(a,b){return b*jspb.BinaryConstants.TWO_TO_32+(a>>>0)};
	jspb.utils.joinInt64=function(a,b){var c=b&2147483648;c&&(a=~a+1>>>0,b=~b>>>0,0==a&&(b=b+1>>>0));a=jspb.utils.joinUint64(a,b);return c?-a:a};jspb.utils.toZigzag64=function(a,b,c){var d=b>>31;return c(a<<1^d,(b<<1|a>>>31)^d)};jspb.utils.joinZigzag64=function(a,b){return jspb.utils.fromZigzag64(a,b,jspb.utils.joinInt64)};jspb.utils.fromZigzag64=function(a,b,c){var d=-(a&1);return c((a>>>1|b<<31)^d,b>>>1^d)};
	jspb.utils.joinFloat32=function(a,b){b=2*(a>>31)+1;var c=a>>>23&255;a&=8388607;return 255==c?a?NaN:Infinity*b:0==c?b*Math.pow(2,-149)*a:b*Math.pow(2,c-150)*(a+Math.pow(2,23))};jspb.utils.joinFloat64=function(a,b){var c=2*(b>>31)+1,d=b>>>20&2047;a=jspb.BinaryConstants.TWO_TO_32*(b&1048575)+a;return 2047==d?a?NaN:Infinity*c:0==d?c*Math.pow(2,-1074)*a:c*Math.pow(2,d-1075)*(a+jspb.BinaryConstants.TWO_TO_52)};
	jspb.utils.joinHash64=function(a,b){return String.fromCharCode(a>>>0&255,a>>>8&255,a>>>16&255,a>>>24&255,b>>>0&255,b>>>8&255,b>>>16&255,b>>>24&255)};jspb.utils.DIGITS="0123456789abcdef".split("");jspb.utils.ZERO_CHAR_CODE_=48;jspb.utils.A_CHAR_CODE_=97;
	jspb.utils.joinUnsignedDecimalString=function(a,b){function c(a,b){a=a?String(a):"";return b?"0000000".slice(a.length)+a:a}if(2097151>=b)return ""+jspb.utils.joinUint64(a,b);var d=(a>>>24|b<<8)>>>0&16777215;b=b>>16&65535;a=(a&16777215)+6777216*d+6710656*b;d+=8147497*b;b*=2;1E7<=a&&(d+=Math.floor(a/1E7),a%=1E7);1E7<=d&&(b+=Math.floor(d/1E7),d%=1E7);return c(b,0)+c(d,b)+c(a,1)};
	jspb.utils.joinSignedDecimalString=function(a,b){var c=b&2147483648;c&&(a=~a+1>>>0,b=~b+(0==a?1:0)>>>0);a=jspb.utils.joinUnsignedDecimalString(a,b);return c?"-"+a:a};jspb.utils.hash64ToDecimalString=function(a,b){jspb.utils.splitHash64(a);a=jspb.utils.split64Low;var c=jspb.utils.split64High;return b?jspb.utils.joinSignedDecimalString(a,c):jspb.utils.joinUnsignedDecimalString(a,c)};
	jspb.utils.hash64ArrayToDecimalStrings=function(a,b){for(var c=Array(a.length),d=0;d<a.length;d++)c[d]=jspb.utils.hash64ToDecimalString(a[d],b);return c};
	jspb.utils.decimalStringToHash64=function(a){function b(a,b){for(var c=0;8>c&&(1!==a||0<b);c++)b=a*e[c]+b,e[c]=b&255,b>>>=8;}function c(){for(var a=0;8>a;a++)e[a]=~e[a]&255;}goog.asserts.assert(0<a.length);var d=!1;"-"===a[0]&&(d=!0,a=a.slice(1));for(var e=[0,0,0,0,0,0,0,0],f=0;f<a.length;f++)b(10,a.charCodeAt(f)-jspb.utils.ZERO_CHAR_CODE_);d&&(c(),b(1,1));return goog.crypt.byteArrayToString(e)};jspb.utils.splitDecimalString=function(a){jspb.utils.splitHash64(jspb.utils.decimalStringToHash64(a));};
	jspb.utils.toHexDigit_=function(a){return String.fromCharCode(10>a?jspb.utils.ZERO_CHAR_CODE_+a:jspb.utils.A_CHAR_CODE_-10+a)};jspb.utils.fromHexCharCode_=function(a){return a>=jspb.utils.A_CHAR_CODE_?a-jspb.utils.A_CHAR_CODE_+10:a-jspb.utils.ZERO_CHAR_CODE_};jspb.utils.hash64ToHexString=function(a){var b=Array(18);b[0]="0";b[1]="x";for(var c=0;8>c;c++){var d=a.charCodeAt(7-c);b[2*c+2]=jspb.utils.toHexDigit_(d>>4);b[2*c+3]=jspb.utils.toHexDigit_(d&15);}return b.join("")};
	jspb.utils.hexStringToHash64=function(a){a=a.toLowerCase();goog.asserts.assert(18==a.length);goog.asserts.assert("0"==a[0]);goog.asserts.assert("x"==a[1]);for(var b="",c=0;8>c;c++){var d=jspb.utils.fromHexCharCode_(a.charCodeAt(2*c+2)),e=jspb.utils.fromHexCharCode_(a.charCodeAt(2*c+3));b=String.fromCharCode(16*d+e)+b;}return b};
	jspb.utils.hash64ToNumber=function(a,b){jspb.utils.splitHash64(a);a=jspb.utils.split64Low;var c=jspb.utils.split64High;return b?jspb.utils.joinInt64(a,c):jspb.utils.joinUint64(a,c)};jspb.utils.numberToHash64=function(a){jspb.utils.splitInt64(a);return jspb.utils.joinHash64(jspb.utils.split64Low,jspb.utils.split64High)};jspb.utils.countVarints=function(a,b,c){for(var d=0,e=b;e<c;e++)d+=a[e]>>7;return c-b-d};
	jspb.utils.countVarintFields=function(a,b,c,d){var e=0;d=8*d+jspb.BinaryConstants.WireType.VARINT;if(128>d)for(;b<c&&a[b++]==d;)for(e++;;){var f=a[b++];if(0==(f&128))break}else for(;b<c;){for(f=d;128<f;){if(a[b]!=(f&127|128))return e;b++;f>>=7;}if(a[b++]!=f)break;for(e++;f=a[b++],0!=(f&128););}return e};jspb.utils.countFixedFields_=function(a,b,c,d,e){var f=0;if(128>d)for(;b<c&&a[b++]==d;)f++,b+=e;else for(;b<c;){for(var g=d;128<g;){if(a[b++]!=(g&127|128))return f;g>>=7;}if(a[b++]!=g)break;f++;b+=e;}return f};
	jspb.utils.countFixed32Fields=function(a,b,c,d){return jspb.utils.countFixedFields_(a,b,c,8*d+jspb.BinaryConstants.WireType.FIXED32,4)};jspb.utils.countFixed64Fields=function(a,b,c,d){return jspb.utils.countFixedFields_(a,b,c,8*d+jspb.BinaryConstants.WireType.FIXED64,8)};
	jspb.utils.countDelimitedFields=function(a,b,c,d){var e=0;for(d=8*d+jspb.BinaryConstants.WireType.DELIMITED;b<c;){for(var f=d;128<f;){if(a[b++]!=(f&127|128))return e;f>>=7;}if(a[b++]!=f)break;e++;for(var g=0,h=1;f=a[b++],g+=(f&127)*h,h*=128,0!=(f&128););b+=g;}return e};jspb.utils.debugBytesToTextFormat=function(a){var b='"';if(a){a=jspb.utils.byteSourceToUint8Array(a);for(var c=0;c<a.length;c++)b+="\\x",16>a[c]&&(b+="0"),b+=a[c].toString(16);}return b+'"'};
	jspb.utils.debugScalarToTextFormat=function(a){return "string"===typeof a?goog.string.quote(a):a.toString()};jspb.utils.stringToByteArray=function(a){for(var b=new Uint8Array(a.length),c=0;c<a.length;c++){var d=a.charCodeAt(c);if(255<d)throw Error("Conversion error: string contains codepoint outside of byte range");b[c]=d;}return b};
	jspb.utils.byteSourceToUint8Array=function(a){if(a.constructor===Uint8Array)return a;if(a.constructor===ArrayBuffer||"undefined"!=typeof Buffer&&a.constructor===Buffer||a.constructor===Array)return new Uint8Array(a);if(a.constructor===String)return goog.crypt.base64.decodeStringToUint8Array(a);goog.asserts.fail("Type not convertible to Uint8Array.");return new Uint8Array(0)};jspb.BinaryDecoder=function(a,b,c){this.bytes_=null;this.cursor_=this.end_=this.start_=0;this.error_=!1;a&&this.setBlock(a,b,c);};jspb.BinaryDecoder.instanceCache_=[];jspb.BinaryDecoder.alloc=function(a,b,c){if(jspb.BinaryDecoder.instanceCache_.length){var d=jspb.BinaryDecoder.instanceCache_.pop();a&&d.setBlock(a,b,c);return d}return new jspb.BinaryDecoder(a,b,c)};jspb.BinaryDecoder.prototype.free=function(){this.clear();100>jspb.BinaryDecoder.instanceCache_.length&&jspb.BinaryDecoder.instanceCache_.push(this);};
	jspb.BinaryDecoder.prototype.clone=function(){return jspb.BinaryDecoder.alloc(this.bytes_,this.start_,this.end_-this.start_)};jspb.BinaryDecoder.prototype.clear=function(){this.bytes_=null;this.cursor_=this.end_=this.start_=0;this.error_=!1;};jspb.BinaryDecoder.prototype.getBuffer=function(){return this.bytes_};
	jspb.BinaryDecoder.prototype.setBlock=function(a,b,c){this.bytes_=jspb.utils.byteSourceToUint8Array(a);this.start_=void 0!==b?b:0;this.end_=void 0!==c?this.start_+c:this.bytes_.length;this.cursor_=this.start_;};jspb.BinaryDecoder.prototype.getEnd=function(){return this.end_};jspb.BinaryDecoder.prototype.setEnd=function(a){this.end_=a;};jspb.BinaryDecoder.prototype.reset=function(){this.cursor_=this.start_;};jspb.BinaryDecoder.prototype.getCursor=function(){return this.cursor_};
	jspb.BinaryDecoder.prototype.setCursor=function(a){this.cursor_=a;};jspb.BinaryDecoder.prototype.advance=function(a){this.cursor_+=a;goog.asserts.assert(this.cursor_<=this.end_);};jspb.BinaryDecoder.prototype.atEnd=function(){return this.cursor_==this.end_};jspb.BinaryDecoder.prototype.pastEnd=function(){return this.cursor_>this.end_};jspb.BinaryDecoder.prototype.getError=function(){return this.error_||0>this.cursor_||this.cursor_>this.end_};
	jspb.BinaryDecoder.prototype.readSplitVarint64=function(a){for(var b=128,c=0,d=0,e=0;4>e&&128<=b;e++)b=this.bytes_[this.cursor_++],c|=(b&127)<<7*e;128<=b&&(b=this.bytes_[this.cursor_++],c|=(b&127)<<28,d|=(b&127)>>4);if(128<=b)for(e=0;5>e&&128<=b;e++)b=this.bytes_[this.cursor_++],d|=(b&127)<<7*e+3;if(128>b)return a(c>>>0,d>>>0);goog.asserts.fail("Failed to read varint, encoding is invalid.");this.error_=!0;};
	jspb.BinaryDecoder.prototype.readSplitZigzagVarint64=function(a){return this.readSplitVarint64(function(b,c){return jspb.utils.fromZigzag64(b,c,a)})};jspb.BinaryDecoder.prototype.readSplitFixed64=function(a){var b=this.bytes_,c=this.cursor_;this.cursor_+=8;for(var d=0,e=0,f=c+7;f>=c;f--)d=d<<8|b[f],e=e<<8|b[f+4];return a(d,e)};jspb.BinaryDecoder.prototype.skipVarint=function(){for(;this.bytes_[this.cursor_]&128;)this.cursor_++;this.cursor_++;};
	jspb.BinaryDecoder.prototype.unskipVarint=function(a){for(;128<a;)this.cursor_--,a>>>=7;this.cursor_--;};
	jspb.BinaryDecoder.prototype.readUnsignedVarint32=function(){var a=this.bytes_;var b=a[this.cursor_+0];var c=b&127;if(128>b)return this.cursor_+=1,goog.asserts.assert(this.cursor_<=this.end_),c;b=a[this.cursor_+1];c|=(b&127)<<7;if(128>b)return this.cursor_+=2,goog.asserts.assert(this.cursor_<=this.end_),c;b=a[this.cursor_+2];c|=(b&127)<<14;if(128>b)return this.cursor_+=3,goog.asserts.assert(this.cursor_<=this.end_),c;b=a[this.cursor_+3];c|=(b&127)<<21;if(128>b)return this.cursor_+=4,goog.asserts.assert(this.cursor_<=
	this.end_),c;b=a[this.cursor_+4];c|=(b&15)<<28;if(128>b)return this.cursor_+=5,goog.asserts.assert(this.cursor_<=this.end_),c>>>0;this.cursor_+=5;128<=a[this.cursor_++]&&128<=a[this.cursor_++]&&128<=a[this.cursor_++]&&128<=a[this.cursor_++]&&128<=a[this.cursor_++]&&goog.asserts.assert(!1);goog.asserts.assert(this.cursor_<=this.end_);return c};jspb.BinaryDecoder.prototype.readSignedVarint32=jspb.BinaryDecoder.prototype.readUnsignedVarint32;jspb.BinaryDecoder.prototype.readUnsignedVarint32String=function(){return this.readUnsignedVarint32().toString()};
	jspb.BinaryDecoder.prototype.readSignedVarint32String=function(){return this.readSignedVarint32().toString()};jspb.BinaryDecoder.prototype.readZigzagVarint32=function(){var a=this.readUnsignedVarint32();return a>>>1^-(a&1)};jspb.BinaryDecoder.prototype.readUnsignedVarint64=function(){return this.readSplitVarint64(jspb.utils.joinUint64)};jspb.BinaryDecoder.prototype.readUnsignedVarint64String=function(){return this.readSplitVarint64(jspb.utils.joinUnsignedDecimalString)};
	jspb.BinaryDecoder.prototype.readSignedVarint64=function(){return this.readSplitVarint64(jspb.utils.joinInt64)};jspb.BinaryDecoder.prototype.readSignedVarint64String=function(){return this.readSplitVarint64(jspb.utils.joinSignedDecimalString)};jspb.BinaryDecoder.prototype.readZigzagVarint64=function(){return this.readSplitVarint64(jspb.utils.joinZigzag64)};jspb.BinaryDecoder.prototype.readZigzagVarintHash64=function(){return this.readSplitZigzagVarint64(jspb.utils.joinHash64)};
	jspb.BinaryDecoder.prototype.readZigzagVarint64String=function(){return this.readSplitZigzagVarint64(jspb.utils.joinSignedDecimalString)};jspb.BinaryDecoder.prototype.readUint8=function(){var a=this.bytes_[this.cursor_+0];this.cursor_+=1;goog.asserts.assert(this.cursor_<=this.end_);return a};jspb.BinaryDecoder.prototype.readUint16=function(){var a=this.bytes_[this.cursor_+0],b=this.bytes_[this.cursor_+1];this.cursor_+=2;goog.asserts.assert(this.cursor_<=this.end_);return a<<0|b<<8};
	jspb.BinaryDecoder.prototype.readUint32=function(){var a=this.bytes_[this.cursor_+0],b=this.bytes_[this.cursor_+1],c=this.bytes_[this.cursor_+2],d=this.bytes_[this.cursor_+3];this.cursor_+=4;goog.asserts.assert(this.cursor_<=this.end_);return (a<<0|b<<8|c<<16|d<<24)>>>0};jspb.BinaryDecoder.prototype.readUint64=function(){var a=this.readUint32(),b=this.readUint32();return jspb.utils.joinUint64(a,b)};
	jspb.BinaryDecoder.prototype.readUint64String=function(){var a=this.readUint32(),b=this.readUint32();return jspb.utils.joinUnsignedDecimalString(a,b)};jspb.BinaryDecoder.prototype.readInt8=function(){var a=this.bytes_[this.cursor_+0];this.cursor_+=1;goog.asserts.assert(this.cursor_<=this.end_);return a<<24>>24};
	jspb.BinaryDecoder.prototype.readInt16=function(){var a=this.bytes_[this.cursor_+0],b=this.bytes_[this.cursor_+1];this.cursor_+=2;goog.asserts.assert(this.cursor_<=this.end_);return (a<<0|b<<8)<<16>>16};jspb.BinaryDecoder.prototype.readInt32=function(){var a=this.bytes_[this.cursor_+0],b=this.bytes_[this.cursor_+1],c=this.bytes_[this.cursor_+2],d=this.bytes_[this.cursor_+3];this.cursor_+=4;goog.asserts.assert(this.cursor_<=this.end_);return a<<0|b<<8|c<<16|d<<24};
	jspb.BinaryDecoder.prototype.readInt64=function(){var a=this.readUint32(),b=this.readUint32();return jspb.utils.joinInt64(a,b)};jspb.BinaryDecoder.prototype.readInt64String=function(){var a=this.readUint32(),b=this.readUint32();return jspb.utils.joinSignedDecimalString(a,b)};jspb.BinaryDecoder.prototype.readFloat=function(){var a=this.readUint32();return jspb.utils.joinFloat32(a,0)};
	jspb.BinaryDecoder.prototype.readDouble=function(){var a=this.readUint32(),b=this.readUint32();return jspb.utils.joinFloat64(a,b)};jspb.BinaryDecoder.prototype.readBool=function(){return !!this.bytes_[this.cursor_++]};jspb.BinaryDecoder.prototype.readEnum=function(){return this.readSignedVarint32()};
	jspb.BinaryDecoder.prototype.readString=function(a){var b=this.bytes_,c=this.cursor_;a=c+a;for(var d=[],e="";c<a;){var f=b[c++];if(128>f)d.push(f);else if(192>f)continue;else if(224>f){var g=b[c++];d.push((f&31)<<6|g&63);}else if(240>f){g=b[c++];var h=b[c++];d.push((f&15)<<12|(g&63)<<6|h&63);}else if(248>f){g=b[c++];h=b[c++];var k=b[c++];f=(f&7)<<18|(g&63)<<12|(h&63)<<6|k&63;f-=65536;d.push((f>>10&1023)+55296,(f&1023)+56320);}8192<=d.length&&(e+=String.fromCharCode.apply(null,d),d.length=0);}e+=goog.crypt.byteArrayToString(d);
	this.cursor_=c;return e};jspb.BinaryDecoder.prototype.readStringWithLength=function(){var a=this.readUnsignedVarint32();return this.readString(a)};jspb.BinaryDecoder.prototype.readBytes=function(a){if(0>a||this.cursor_+a>this.bytes_.length)return this.error_=!0,goog.asserts.fail("Invalid byte length!"),new Uint8Array(0);var b=this.bytes_.subarray(this.cursor_,this.cursor_+a);this.cursor_+=a;goog.asserts.assert(this.cursor_<=this.end_);return b};jspb.BinaryDecoder.prototype.readVarintHash64=function(){return this.readSplitVarint64(jspb.utils.joinHash64)};
	jspb.BinaryDecoder.prototype.readFixedHash64=function(){var a=this.bytes_,b=this.cursor_,c=a[b+0],d=a[b+1],e=a[b+2],f=a[b+3],g=a[b+4],h=a[b+5],k=a[b+6];a=a[b+7];this.cursor_+=8;return String.fromCharCode(c,d,e,f,g,h,k,a)};jspb.BinaryReader=function(a,b,c){this.decoder_=jspb.BinaryDecoder.alloc(a,b,c);this.fieldCursor_=this.decoder_.getCursor();this.nextField_=jspb.BinaryConstants.INVALID_FIELD_NUMBER;this.nextWireType_=jspb.BinaryConstants.WireType.INVALID;this.error_=!1;this.readCallbacks_=null;};jspb.BinaryReader.instanceCache_=[];
	jspb.BinaryReader.alloc=function(a,b,c){if(jspb.BinaryReader.instanceCache_.length){var d=jspb.BinaryReader.instanceCache_.pop();a&&d.decoder_.setBlock(a,b,c);return d}return new jspb.BinaryReader(a,b,c)};jspb.BinaryReader.prototype.alloc=jspb.BinaryReader.alloc;
	jspb.BinaryReader.prototype.free=function(){this.decoder_.clear();this.nextField_=jspb.BinaryConstants.INVALID_FIELD_NUMBER;this.nextWireType_=jspb.BinaryConstants.WireType.INVALID;this.error_=!1;this.readCallbacks_=null;100>jspb.BinaryReader.instanceCache_.length&&jspb.BinaryReader.instanceCache_.push(this);};jspb.BinaryReader.prototype.getFieldCursor=function(){return this.fieldCursor_};jspb.BinaryReader.prototype.getCursor=function(){return this.decoder_.getCursor()};
	jspb.BinaryReader.prototype.getBuffer=function(){return this.decoder_.getBuffer()};jspb.BinaryReader.prototype.getFieldNumber=function(){return this.nextField_};jspb.BinaryReader.prototype.getWireType=function(){return this.nextWireType_};jspb.BinaryReader.prototype.isDelimited=function(){return this.nextWireType_==jspb.BinaryConstants.WireType.DELIMITED};jspb.BinaryReader.prototype.isEndGroup=function(){return this.nextWireType_==jspb.BinaryConstants.WireType.END_GROUP};
	jspb.BinaryReader.prototype.getError=function(){return this.error_||this.decoder_.getError()};jspb.BinaryReader.prototype.setBlock=function(a,b,c){this.decoder_.setBlock(a,b,c);this.nextField_=jspb.BinaryConstants.INVALID_FIELD_NUMBER;this.nextWireType_=jspb.BinaryConstants.WireType.INVALID;};jspb.BinaryReader.prototype.reset=function(){this.decoder_.reset();this.nextField_=jspb.BinaryConstants.INVALID_FIELD_NUMBER;this.nextWireType_=jspb.BinaryConstants.WireType.INVALID;};
	jspb.BinaryReader.prototype.advance=function(a){this.decoder_.advance(a);};
	jspb.BinaryReader.prototype.nextField=function(){if(this.decoder_.atEnd())return !1;if(this.getError())return goog.asserts.fail("Decoder hit an error"),!1;this.fieldCursor_=this.decoder_.getCursor();var a=this.decoder_.readUnsignedVarint32(),b=a>>>3;a&=7;if(a!=jspb.BinaryConstants.WireType.VARINT&&a!=jspb.BinaryConstants.WireType.FIXED32&&a!=jspb.BinaryConstants.WireType.FIXED64&&a!=jspb.BinaryConstants.WireType.DELIMITED&&a!=jspb.BinaryConstants.WireType.START_GROUP&&a!=jspb.BinaryConstants.WireType.END_GROUP)return goog.asserts.fail("Invalid wire type: %s (at position %s)",
	a,this.fieldCursor_),this.error_=!0,!1;this.nextField_=b;this.nextWireType_=a;return !0};jspb.BinaryReader.prototype.unskipHeader=function(){this.decoder_.unskipVarint(this.nextField_<<3|this.nextWireType_);};jspb.BinaryReader.prototype.skipMatchingFields=function(){var a=this.nextField_;for(this.unskipHeader();this.nextField()&&this.getFieldNumber()==a;)this.skipField();this.decoder_.atEnd()||this.unskipHeader();};
	jspb.BinaryReader.prototype.skipVarintField=function(){this.nextWireType_!=jspb.BinaryConstants.WireType.VARINT?(goog.asserts.fail("Invalid wire type for skipVarintField"),this.skipField()):this.decoder_.skipVarint();};jspb.BinaryReader.prototype.skipDelimitedField=function(){if(this.nextWireType_!=jspb.BinaryConstants.WireType.DELIMITED)goog.asserts.fail("Invalid wire type for skipDelimitedField"),this.skipField();else {var a=this.decoder_.readUnsignedVarint32();this.decoder_.advance(a);}};
	jspb.BinaryReader.prototype.skipFixed32Field=function(){this.nextWireType_!=jspb.BinaryConstants.WireType.FIXED32?(goog.asserts.fail("Invalid wire type for skipFixed32Field"),this.skipField()):this.decoder_.advance(4);};jspb.BinaryReader.prototype.skipFixed64Field=function(){this.nextWireType_!=jspb.BinaryConstants.WireType.FIXED64?(goog.asserts.fail("Invalid wire type for skipFixed64Field"),this.skipField()):this.decoder_.advance(8);};
	jspb.BinaryReader.prototype.skipGroup=function(){var a=this.nextField_;do{if(!this.nextField()){goog.asserts.fail("Unmatched start-group tag: stream EOF");this.error_=!0;break}if(this.nextWireType_==jspb.BinaryConstants.WireType.END_GROUP){this.nextField_!=a&&(goog.asserts.fail("Unmatched end-group tag"),this.error_=!0);break}this.skipField();}while(1)};
	jspb.BinaryReader.prototype.skipField=function(){switch(this.nextWireType_){case jspb.BinaryConstants.WireType.VARINT:this.skipVarintField();break;case jspb.BinaryConstants.WireType.FIXED64:this.skipFixed64Field();break;case jspb.BinaryConstants.WireType.DELIMITED:this.skipDelimitedField();break;case jspb.BinaryConstants.WireType.FIXED32:this.skipFixed32Field();break;case jspb.BinaryConstants.WireType.START_GROUP:this.skipGroup();break;default:goog.asserts.fail("Invalid wire encoding for field.");}};
	jspb.BinaryReader.prototype.registerReadCallback=function(a,b){null===this.readCallbacks_&&(this.readCallbacks_={});goog.asserts.assert(!this.readCallbacks_[a]);this.readCallbacks_[a]=b;};jspb.BinaryReader.prototype.runReadCallback=function(a){goog.asserts.assert(null!==this.readCallbacks_);a=this.readCallbacks_[a];goog.asserts.assert(a);return a(this)};
	jspb.BinaryReader.prototype.readAny=function(a){this.nextWireType_=jspb.BinaryConstants.FieldTypeToWireType(a);var b=jspb.BinaryConstants.FieldType;switch(a){case b.DOUBLE:return this.readDouble();case b.FLOAT:return this.readFloat();case b.INT64:return this.readInt64();case b.UINT64:return this.readUint64();case b.INT32:return this.readInt32();case b.FIXED64:return this.readFixed64();case b.FIXED32:return this.readFixed32();case b.BOOL:return this.readBool();case b.STRING:return this.readString();
	case b.GROUP:goog.asserts.fail("Group field type not supported in readAny()");case b.MESSAGE:goog.asserts.fail("Message field type not supported in readAny()");case b.BYTES:return this.readBytes();case b.UINT32:return this.readUint32();case b.ENUM:return this.readEnum();case b.SFIXED32:return this.readSfixed32();case b.SFIXED64:return this.readSfixed64();case b.SINT32:return this.readSint32();case b.SINT64:return this.readSint64();case b.FHASH64:return this.readFixedHash64();case b.VHASH64:return this.readVarintHash64();
	default:goog.asserts.fail("Invalid field type in readAny()");}return 0};jspb.BinaryReader.prototype.readMessage=function(a,b){goog.asserts.assert(this.nextWireType_==jspb.BinaryConstants.WireType.DELIMITED);var c=this.decoder_.getEnd(),d=this.decoder_.readUnsignedVarint32();d=this.decoder_.getCursor()+d;this.decoder_.setEnd(d);b(a,this);this.decoder_.setCursor(d);this.decoder_.setEnd(c);};
	jspb.BinaryReader.prototype.readGroup=function(a,b,c){goog.asserts.assert(this.nextWireType_==jspb.BinaryConstants.WireType.START_GROUP);goog.asserts.assert(this.nextField_==a);c(b,this);this.error_||this.nextWireType_==jspb.BinaryConstants.WireType.END_GROUP||(goog.asserts.fail("Group submessage did not end with an END_GROUP tag"),this.error_=!0);};
	jspb.BinaryReader.prototype.getFieldDecoder=function(){goog.asserts.assert(this.nextWireType_==jspb.BinaryConstants.WireType.DELIMITED);var a=this.decoder_.readUnsignedVarint32(),b=this.decoder_.getCursor(),c=b+a;a=jspb.BinaryDecoder.alloc(this.decoder_.getBuffer(),b,a);this.decoder_.setCursor(c);return a};jspb.BinaryReader.prototype.readInt32=function(){goog.asserts.assert(this.nextWireType_==jspb.BinaryConstants.WireType.VARINT);return this.decoder_.readSignedVarint32()};
	jspb.BinaryReader.prototype.readInt32String=function(){goog.asserts.assert(this.nextWireType_==jspb.BinaryConstants.WireType.VARINT);return this.decoder_.readSignedVarint32String()};jspb.BinaryReader.prototype.readInt64=function(){goog.asserts.assert(this.nextWireType_==jspb.BinaryConstants.WireType.VARINT);return this.decoder_.readSignedVarint64()};jspb.BinaryReader.prototype.readInt64String=function(){goog.asserts.assert(this.nextWireType_==jspb.BinaryConstants.WireType.VARINT);return this.decoder_.readSignedVarint64String()};
	jspb.BinaryReader.prototype.readUint32=function(){goog.asserts.assert(this.nextWireType_==jspb.BinaryConstants.WireType.VARINT);return this.decoder_.readUnsignedVarint32()};jspb.BinaryReader.prototype.readUint32String=function(){goog.asserts.assert(this.nextWireType_==jspb.BinaryConstants.WireType.VARINT);return this.decoder_.readUnsignedVarint32String()};jspb.BinaryReader.prototype.readUint64=function(){goog.asserts.assert(this.nextWireType_==jspb.BinaryConstants.WireType.VARINT);return this.decoder_.readUnsignedVarint64()};
	jspb.BinaryReader.prototype.readUint64String=function(){goog.asserts.assert(this.nextWireType_==jspb.BinaryConstants.WireType.VARINT);return this.decoder_.readUnsignedVarint64String()};jspb.BinaryReader.prototype.readSint32=function(){goog.asserts.assert(this.nextWireType_==jspb.BinaryConstants.WireType.VARINT);return this.decoder_.readZigzagVarint32()};jspb.BinaryReader.prototype.readSint64=function(){goog.asserts.assert(this.nextWireType_==jspb.BinaryConstants.WireType.VARINT);return this.decoder_.readZigzagVarint64()};
	jspb.BinaryReader.prototype.readSint64String=function(){goog.asserts.assert(this.nextWireType_==jspb.BinaryConstants.WireType.VARINT);return this.decoder_.readZigzagVarint64String()};jspb.BinaryReader.prototype.readFixed32=function(){goog.asserts.assert(this.nextWireType_==jspb.BinaryConstants.WireType.FIXED32);return this.decoder_.readUint32()};jspb.BinaryReader.prototype.readFixed64=function(){goog.asserts.assert(this.nextWireType_==jspb.BinaryConstants.WireType.FIXED64);return this.decoder_.readUint64()};
	jspb.BinaryReader.prototype.readFixed64String=function(){goog.asserts.assert(this.nextWireType_==jspb.BinaryConstants.WireType.FIXED64);return this.decoder_.readUint64String()};jspb.BinaryReader.prototype.readSfixed32=function(){goog.asserts.assert(this.nextWireType_==jspb.BinaryConstants.WireType.FIXED32);return this.decoder_.readInt32()};jspb.BinaryReader.prototype.readSfixed32String=function(){goog.asserts.assert(this.nextWireType_==jspb.BinaryConstants.WireType.FIXED32);return this.decoder_.readInt32().toString()};
	jspb.BinaryReader.prototype.readSfixed64=function(){goog.asserts.assert(this.nextWireType_==jspb.BinaryConstants.WireType.FIXED64);return this.decoder_.readInt64()};jspb.BinaryReader.prototype.readSfixed64String=function(){goog.asserts.assert(this.nextWireType_==jspb.BinaryConstants.WireType.FIXED64);return this.decoder_.readInt64String()};jspb.BinaryReader.prototype.readFloat=function(){goog.asserts.assert(this.nextWireType_==jspb.BinaryConstants.WireType.FIXED32);return this.decoder_.readFloat()};
	jspb.BinaryReader.prototype.readDouble=function(){goog.asserts.assert(this.nextWireType_==jspb.BinaryConstants.WireType.FIXED64);return this.decoder_.readDouble()};jspb.BinaryReader.prototype.readBool=function(){goog.asserts.assert(this.nextWireType_==jspb.BinaryConstants.WireType.VARINT);return !!this.decoder_.readUnsignedVarint32()};jspb.BinaryReader.prototype.readEnum=function(){goog.asserts.assert(this.nextWireType_==jspb.BinaryConstants.WireType.VARINT);return this.decoder_.readSignedVarint64()};
	jspb.BinaryReader.prototype.readString=function(){goog.asserts.assert(this.nextWireType_==jspb.BinaryConstants.WireType.DELIMITED);var a=this.decoder_.readUnsignedVarint32();return this.decoder_.readString(a)};jspb.BinaryReader.prototype.readBytes=function(){goog.asserts.assert(this.nextWireType_==jspb.BinaryConstants.WireType.DELIMITED);var a=this.decoder_.readUnsignedVarint32();return this.decoder_.readBytes(a)};
	jspb.BinaryReader.prototype.readVarintHash64=function(){goog.asserts.assert(this.nextWireType_==jspb.BinaryConstants.WireType.VARINT);return this.decoder_.readVarintHash64()};jspb.BinaryReader.prototype.readSintHash64=function(){goog.asserts.assert(this.nextWireType_==jspb.BinaryConstants.WireType.VARINT);return this.decoder_.readZigzagVarintHash64()};jspb.BinaryReader.prototype.readSplitVarint64=function(a){goog.asserts.assert(this.nextWireType_==jspb.BinaryConstants.WireType.VARINT);return this.decoder_.readSplitVarint64(a)};
	jspb.BinaryReader.prototype.readSplitZigzagVarint64=function(a){goog.asserts.assert(this.nextWireType_==jspb.BinaryConstants.WireType.VARINT);return this.decoder_.readSplitVarint64(function(b,c){return jspb.utils.fromZigzag64(b,c,a)})};jspb.BinaryReader.prototype.readFixedHash64=function(){goog.asserts.assert(this.nextWireType_==jspb.BinaryConstants.WireType.FIXED64);return this.decoder_.readFixedHash64()};
	jspb.BinaryReader.prototype.readSplitFixed64=function(a){goog.asserts.assert(this.nextWireType_==jspb.BinaryConstants.WireType.FIXED64);return this.decoder_.readSplitFixed64(a)};jspb.BinaryReader.prototype.readPackedField_=function(a){goog.asserts.assert(this.nextWireType_==jspb.BinaryConstants.WireType.DELIMITED);var b=this.decoder_.readUnsignedVarint32();b=this.decoder_.getCursor()+b;for(var c=[];this.decoder_.getCursor()<b;)c.push(a.call(this.decoder_));return c};
	jspb.BinaryReader.prototype.readPackedInt32=function(){return this.readPackedField_(this.decoder_.readSignedVarint32)};jspb.BinaryReader.prototype.readPackedInt32String=function(){return this.readPackedField_(this.decoder_.readSignedVarint32String)};jspb.BinaryReader.prototype.readPackedInt64=function(){return this.readPackedField_(this.decoder_.readSignedVarint64)};jspb.BinaryReader.prototype.readPackedInt64String=function(){return this.readPackedField_(this.decoder_.readSignedVarint64String)};
	jspb.BinaryReader.prototype.readPackedUint32=function(){return this.readPackedField_(this.decoder_.readUnsignedVarint32)};jspb.BinaryReader.prototype.readPackedUint32String=function(){return this.readPackedField_(this.decoder_.readUnsignedVarint32String)};jspb.BinaryReader.prototype.readPackedUint64=function(){return this.readPackedField_(this.decoder_.readUnsignedVarint64)};jspb.BinaryReader.prototype.readPackedUint64String=function(){return this.readPackedField_(this.decoder_.readUnsignedVarint64String)};
	jspb.BinaryReader.prototype.readPackedSint32=function(){return this.readPackedField_(this.decoder_.readZigzagVarint32)};jspb.BinaryReader.prototype.readPackedSint64=function(){return this.readPackedField_(this.decoder_.readZigzagVarint64)};jspb.BinaryReader.prototype.readPackedSint64String=function(){return this.readPackedField_(this.decoder_.readZigzagVarint64String)};jspb.BinaryReader.prototype.readPackedFixed32=function(){return this.readPackedField_(this.decoder_.readUint32)};
	jspb.BinaryReader.prototype.readPackedFixed64=function(){return this.readPackedField_(this.decoder_.readUint64)};jspb.BinaryReader.prototype.readPackedFixed64String=function(){return this.readPackedField_(this.decoder_.readUint64String)};jspb.BinaryReader.prototype.readPackedSfixed32=function(){return this.readPackedField_(this.decoder_.readInt32)};jspb.BinaryReader.prototype.readPackedSfixed64=function(){return this.readPackedField_(this.decoder_.readInt64)};
	jspb.BinaryReader.prototype.readPackedSfixed64String=function(){return this.readPackedField_(this.decoder_.readInt64String)};jspb.BinaryReader.prototype.readPackedFloat=function(){return this.readPackedField_(this.decoder_.readFloat)};jspb.BinaryReader.prototype.readPackedDouble=function(){return this.readPackedField_(this.decoder_.readDouble)};jspb.BinaryReader.prototype.readPackedBool=function(){return this.readPackedField_(this.decoder_.readBool)};jspb.BinaryReader.prototype.readPackedEnum=function(){return this.readPackedField_(this.decoder_.readEnum)};
	jspb.BinaryReader.prototype.readPackedVarintHash64=function(){return this.readPackedField_(this.decoder_.readVarintHash64)};jspb.BinaryReader.prototype.readPackedFixedHash64=function(){return this.readPackedField_(this.decoder_.readFixedHash64)};jspb.BinaryEncoder=function(){this.buffer_=[];};jspb.BinaryEncoder.prototype.length=function(){return this.buffer_.length};jspb.BinaryEncoder.prototype.end=function(){var a=this.buffer_;this.buffer_=[];return a};
	jspb.BinaryEncoder.prototype.writeSplitVarint64=function(a,b){goog.asserts.assert(a==Math.floor(a));goog.asserts.assert(b==Math.floor(b));goog.asserts.assert(0<=a&&a<jspb.BinaryConstants.TWO_TO_32);for(goog.asserts.assert(0<=b&&b<jspb.BinaryConstants.TWO_TO_32);0<b||127<a;)this.buffer_.push(a&127|128),a=(a>>>7|b<<25)>>>0,b>>>=7;this.buffer_.push(a);};
	jspb.BinaryEncoder.prototype.writeSplitFixed64=function(a,b){goog.asserts.assert(a==Math.floor(a));goog.asserts.assert(b==Math.floor(b));goog.asserts.assert(0<=a&&a<jspb.BinaryConstants.TWO_TO_32);goog.asserts.assert(0<=b&&b<jspb.BinaryConstants.TWO_TO_32);this.writeUint32(a);this.writeUint32(b);};
	jspb.BinaryEncoder.prototype.writeUnsignedVarint32=function(a){goog.asserts.assert(a==Math.floor(a));for(goog.asserts.assert(0<=a&&a<jspb.BinaryConstants.TWO_TO_32);127<a;)this.buffer_.push(a&127|128),a>>>=7;this.buffer_.push(a);};
	jspb.BinaryEncoder.prototype.writeSignedVarint32=function(a){goog.asserts.assert(a==Math.floor(a));goog.asserts.assert(a>=-jspb.BinaryConstants.TWO_TO_31&&a<jspb.BinaryConstants.TWO_TO_31);if(0<=a)this.writeUnsignedVarint32(a);else {for(var b=0;9>b;b++)this.buffer_.push(a&127|128),a>>=7;this.buffer_.push(1);}};
	jspb.BinaryEncoder.prototype.writeUnsignedVarint64=function(a){goog.asserts.assert(a==Math.floor(a));goog.asserts.assert(0<=a&&a<jspb.BinaryConstants.TWO_TO_64);jspb.utils.splitInt64(a);this.writeSplitVarint64(jspb.utils.split64Low,jspb.utils.split64High);};
	jspb.BinaryEncoder.prototype.writeSignedVarint64=function(a){goog.asserts.assert(a==Math.floor(a));goog.asserts.assert(a>=-jspb.BinaryConstants.TWO_TO_63&&a<jspb.BinaryConstants.TWO_TO_63);jspb.utils.splitInt64(a);this.writeSplitVarint64(jspb.utils.split64Low,jspb.utils.split64High);};
	jspb.BinaryEncoder.prototype.writeZigzagVarint32=function(a){goog.asserts.assert(a==Math.floor(a));goog.asserts.assert(a>=-jspb.BinaryConstants.TWO_TO_31&&a<jspb.BinaryConstants.TWO_TO_31);this.writeUnsignedVarint32((a<<1^a>>31)>>>0);};jspb.BinaryEncoder.prototype.writeZigzagVarint64=function(a){goog.asserts.assert(a==Math.floor(a));goog.asserts.assert(a>=-jspb.BinaryConstants.TWO_TO_63&&a<jspb.BinaryConstants.TWO_TO_63);jspb.utils.splitZigzag64(a);this.writeSplitVarint64(jspb.utils.split64Low,jspb.utils.split64High);};
	jspb.BinaryEncoder.prototype.writeZigzagVarint64String=function(a){this.writeZigzagVarintHash64(jspb.utils.decimalStringToHash64(a));};jspb.BinaryEncoder.prototype.writeZigzagVarintHash64=function(a){var b=this;jspb.utils.splitHash64(a);jspb.utils.toZigzag64(jspb.utils.split64Low,jspb.utils.split64High,function(a,d){b.writeSplitVarint64(a>>>0,d>>>0);});};
	jspb.BinaryEncoder.prototype.writeUint8=function(a){goog.asserts.assert(a==Math.floor(a));goog.asserts.assert(0<=a&&256>a);this.buffer_.push(a>>>0&255);};jspb.BinaryEncoder.prototype.writeUint16=function(a){goog.asserts.assert(a==Math.floor(a));goog.asserts.assert(0<=a&&65536>a);this.buffer_.push(a>>>0&255);this.buffer_.push(a>>>8&255);};
	jspb.BinaryEncoder.prototype.writeUint32=function(a){goog.asserts.assert(a==Math.floor(a));goog.asserts.assert(0<=a&&a<jspb.BinaryConstants.TWO_TO_32);this.buffer_.push(a>>>0&255);this.buffer_.push(a>>>8&255);this.buffer_.push(a>>>16&255);this.buffer_.push(a>>>24&255);};jspb.BinaryEncoder.prototype.writeUint64=function(a){goog.asserts.assert(a==Math.floor(a));goog.asserts.assert(0<=a&&a<jspb.BinaryConstants.TWO_TO_64);jspb.utils.splitUint64(a);this.writeUint32(jspb.utils.split64Low);this.writeUint32(jspb.utils.split64High);};
	jspb.BinaryEncoder.prototype.writeInt8=function(a){goog.asserts.assert(a==Math.floor(a));goog.asserts.assert(-128<=a&&128>a);this.buffer_.push(a>>>0&255);};jspb.BinaryEncoder.prototype.writeInt16=function(a){goog.asserts.assert(a==Math.floor(a));goog.asserts.assert(-32768<=a&&32768>a);this.buffer_.push(a>>>0&255);this.buffer_.push(a>>>8&255);};
	jspb.BinaryEncoder.prototype.writeInt32=function(a){goog.asserts.assert(a==Math.floor(a));goog.asserts.assert(a>=-jspb.BinaryConstants.TWO_TO_31&&a<jspb.BinaryConstants.TWO_TO_31);this.buffer_.push(a>>>0&255);this.buffer_.push(a>>>8&255);this.buffer_.push(a>>>16&255);this.buffer_.push(a>>>24&255);};
	jspb.BinaryEncoder.prototype.writeInt64=function(a){goog.asserts.assert(a==Math.floor(a));goog.asserts.assert(a>=-jspb.BinaryConstants.TWO_TO_63&&a<jspb.BinaryConstants.TWO_TO_63);jspb.utils.splitInt64(a);this.writeSplitFixed64(jspb.utils.split64Low,jspb.utils.split64High);};
	jspb.BinaryEncoder.prototype.writeInt64String=function(a){goog.asserts.assert(a==Math.floor(a));goog.asserts.assert(+a>=-jspb.BinaryConstants.TWO_TO_63&&+a<jspb.BinaryConstants.TWO_TO_63);jspb.utils.splitHash64(jspb.utils.decimalStringToHash64(a));this.writeSplitFixed64(jspb.utils.split64Low,jspb.utils.split64High);};
	jspb.BinaryEncoder.prototype.writeFloat=function(a){goog.asserts.assert(Infinity===a||-Infinity===a||isNaN(a)||a>=-jspb.BinaryConstants.FLOAT32_MAX&&a<=jspb.BinaryConstants.FLOAT32_MAX);jspb.utils.splitFloat32(a);this.writeUint32(jspb.utils.split64Low);};
	jspb.BinaryEncoder.prototype.writeDouble=function(a){goog.asserts.assert(Infinity===a||-Infinity===a||isNaN(a)||a>=-jspb.BinaryConstants.FLOAT64_MAX&&a<=jspb.BinaryConstants.FLOAT64_MAX);jspb.utils.splitFloat64(a);this.writeUint32(jspb.utils.split64Low);this.writeUint32(jspb.utils.split64High);};jspb.BinaryEncoder.prototype.writeBool=function(a){goog.asserts.assert("boolean"===typeof a||"number"===typeof a);this.buffer_.push(a?1:0);};
	jspb.BinaryEncoder.prototype.writeEnum=function(a){goog.asserts.assert(a==Math.floor(a));goog.asserts.assert(a>=-jspb.BinaryConstants.TWO_TO_31&&a<jspb.BinaryConstants.TWO_TO_31);this.writeSignedVarint32(a);};jspb.BinaryEncoder.prototype.writeBytes=function(a){this.buffer_.push.apply(this.buffer_,a);};jspb.BinaryEncoder.prototype.writeVarintHash64=function(a){jspb.utils.splitHash64(a);this.writeSplitVarint64(jspb.utils.split64Low,jspb.utils.split64High);};
	jspb.BinaryEncoder.prototype.writeFixedHash64=function(a){jspb.utils.splitHash64(a);this.writeUint32(jspb.utils.split64Low);this.writeUint32(jspb.utils.split64High);};
	jspb.BinaryEncoder.prototype.writeString=function(a){for(var b=this.buffer_.length,c=0;c<a.length;c++){var d=a.charCodeAt(c);if(128>d)this.buffer_.push(d);else if(2048>d)this.buffer_.push(d>>6|192),this.buffer_.push(d&63|128);else if(65536>d)if(55296<=d&&56319>=d&&c+1<a.length){var e=a.charCodeAt(c+1);56320<=e&&57343>=e&&(d=1024*(d-55296)+e-56320+65536,this.buffer_.push(d>>18|240),this.buffer_.push(d>>12&63|128),this.buffer_.push(d>>6&63|128),this.buffer_.push(d&63|128),c++);}else this.buffer_.push(d>>
	12|224),this.buffer_.push(d>>6&63|128),this.buffer_.push(d&63|128);}return this.buffer_.length-b};jspb.arith={};jspb.arith.UInt64=function(a,b){this.lo=a;this.hi=b;};jspb.arith.UInt64.prototype.cmp=function(a){return this.hi<a.hi||this.hi==a.hi&&this.lo<a.lo?-1:this.hi==a.hi&&this.lo==a.lo?0:1};jspb.arith.UInt64.prototype.rightShift=function(){return new jspb.arith.UInt64((this.lo>>>1|(this.hi&1)<<31)>>>0,this.hi>>>1>>>0)};jspb.arith.UInt64.prototype.leftShift=function(){return new jspb.arith.UInt64(this.lo<<1>>>0,(this.hi<<1|this.lo>>>31)>>>0)};
	jspb.arith.UInt64.prototype.msb=function(){return !!(this.hi&2147483648)};jspb.arith.UInt64.prototype.lsb=function(){return !!(this.lo&1)};jspb.arith.UInt64.prototype.zero=function(){return 0==this.lo&&0==this.hi};jspb.arith.UInt64.prototype.add=function(a){return new jspb.arith.UInt64((this.lo+a.lo&4294967295)>>>0>>>0,((this.hi+a.hi&4294967295)>>>0)+(4294967296<=this.lo+a.lo?1:0)>>>0)};
	jspb.arith.UInt64.prototype.sub=function(a){return new jspb.arith.UInt64((this.lo-a.lo&4294967295)>>>0>>>0,((this.hi-a.hi&4294967295)>>>0)-(0>this.lo-a.lo?1:0)>>>0)};jspb.arith.UInt64.mul32x32=function(a,b){var c=a&65535;a>>>=16;var d=b&65535,e=b>>>16;b=c*d+65536*(c*e&65535)+65536*(a*d&65535);for(c=a*e+(c*e>>>16)+(a*d>>>16);4294967296<=b;)b-=4294967296,c+=1;return new jspb.arith.UInt64(b>>>0,c>>>0)};
	jspb.arith.UInt64.prototype.mul=function(a){var b=jspb.arith.UInt64.mul32x32(this.lo,a);a=jspb.arith.UInt64.mul32x32(this.hi,a);a.hi=a.lo;a.lo=0;return b.add(a)};
	jspb.arith.UInt64.prototype.div=function(a){if(0==a)return [];var b=new jspb.arith.UInt64(0,0),c=new jspb.arith.UInt64(this.lo,this.hi);a=new jspb.arith.UInt64(a,0);for(var d=new jspb.arith.UInt64(1,0);!a.msb();)a=a.leftShift(),d=d.leftShift();for(;!d.zero();)0>=a.cmp(c)&&(b=b.add(d),c=c.sub(a)),a=a.rightShift(),d=d.rightShift();return [b,c]};jspb.arith.UInt64.prototype.toString=function(){for(var a="",b=this;!b.zero();){b=b.div(10);var c=b[0];a=b[1].lo+a;b=c;}""==a&&(a="0");return a};
	jspb.arith.UInt64.fromString=function(a){for(var b=new jspb.arith.UInt64(0,0),c=new jspb.arith.UInt64(0,0),d=0;d<a.length;d++){if("0">a[d]||"9"<a[d])return null;var e=parseInt(a[d],10);c.lo=e;b=b.mul(10).add(c);}return b};jspb.arith.UInt64.prototype.clone=function(){return new jspb.arith.UInt64(this.lo,this.hi)};jspb.arith.Int64=function(a,b){this.lo=a;this.hi=b;};
	jspb.arith.Int64.prototype.add=function(a){return new jspb.arith.Int64((this.lo+a.lo&4294967295)>>>0>>>0,((this.hi+a.hi&4294967295)>>>0)+(4294967296<=this.lo+a.lo?1:0)>>>0)};jspb.arith.Int64.prototype.sub=function(a){return new jspb.arith.Int64((this.lo-a.lo&4294967295)>>>0>>>0,((this.hi-a.hi&4294967295)>>>0)-(0>this.lo-a.lo?1:0)>>>0)};jspb.arith.Int64.prototype.clone=function(){return new jspb.arith.Int64(this.lo,this.hi)};
	jspb.arith.Int64.prototype.toString=function(){var a=0!=(this.hi&2147483648),b=new jspb.arith.UInt64(this.lo,this.hi);a&&(b=(new jspb.arith.UInt64(0,0)).sub(b));return (a?"-":"")+b.toString()};jspb.arith.Int64.fromString=function(a){var b=0<a.length&&"-"==a[0];b&&(a=a.substring(1));a=jspb.arith.UInt64.fromString(a);if(null===a)return null;b&&(a=(new jspb.arith.UInt64(0,0)).sub(a));return new jspb.arith.Int64(a.lo,a.hi)};jspb.BinaryWriter=function(){this.blocks_=[];this.totalLength_=0;this.encoder_=new jspb.BinaryEncoder;this.bookmarks_=[];};jspb.BinaryWriter.prototype.appendUint8Array_=function(a){var b=this.encoder_.end();this.blocks_.push(b);this.blocks_.push(a);this.totalLength_+=b.length+a.length;};
	jspb.BinaryWriter.prototype.beginDelimited_=function(a){this.writeFieldHeader_(a,jspb.BinaryConstants.WireType.DELIMITED);a=this.encoder_.end();this.blocks_.push(a);this.totalLength_+=a.length;a.push(this.totalLength_);return a};jspb.BinaryWriter.prototype.endDelimited_=function(a){var b=a.pop();b=this.totalLength_+this.encoder_.length()-b;for(goog.asserts.assert(0<=b);127<b;)a.push(b&127|128),b>>>=7,this.totalLength_++;a.push(b);this.totalLength_++;};
	jspb.BinaryWriter.prototype.writeSerializedMessage=function(a,b,c){this.appendUint8Array_(a.subarray(b,c));};jspb.BinaryWriter.prototype.maybeWriteSerializedMessage=function(a,b,c){null!=a&&null!=b&&null!=c&&this.writeSerializedMessage(a,b,c);};jspb.BinaryWriter.prototype.reset=function(){this.blocks_=[];this.encoder_.end();this.totalLength_=0;this.bookmarks_=[];};
	jspb.BinaryWriter.prototype.getResultBuffer=function(){goog.asserts.assert(0==this.bookmarks_.length);for(var a=new Uint8Array(this.totalLength_+this.encoder_.length()),b=this.blocks_,c=b.length,d=0,e=0;e<c;e++){var f=b[e];a.set(f,d);d+=f.length;}b=this.encoder_.end();a.set(b,d);d+=b.length;goog.asserts.assert(d==a.length);this.blocks_=[a];return a};jspb.BinaryWriter.prototype.getResultBase64String=function(a){return goog.crypt.base64.encodeByteArray(this.getResultBuffer(),a)};
	jspb.BinaryWriter.prototype.beginSubMessage=function(a){this.bookmarks_.push(this.beginDelimited_(a));};jspb.BinaryWriter.prototype.endSubMessage=function(){goog.asserts.assert(0<=this.bookmarks_.length);this.endDelimited_(this.bookmarks_.pop());};jspb.BinaryWriter.prototype.writeFieldHeader_=function(a,b){goog.asserts.assert(1<=a&&a==Math.floor(a));this.encoder_.writeUnsignedVarint32(8*a+b);};
	jspb.BinaryWriter.prototype.writeAny=function(a,b,c){var d=jspb.BinaryConstants.FieldType;switch(a){case d.DOUBLE:this.writeDouble(b,c);break;case d.FLOAT:this.writeFloat(b,c);break;case d.INT64:this.writeInt64(b,c);break;case d.UINT64:this.writeUint64(b,c);break;case d.INT32:this.writeInt32(b,c);break;case d.FIXED64:this.writeFixed64(b,c);break;case d.FIXED32:this.writeFixed32(b,c);break;case d.BOOL:this.writeBool(b,c);break;case d.STRING:this.writeString(b,c);break;case d.GROUP:goog.asserts.fail("Group field type not supported in writeAny()");
	break;case d.MESSAGE:goog.asserts.fail("Message field type not supported in writeAny()");break;case d.BYTES:this.writeBytes(b,c);break;case d.UINT32:this.writeUint32(b,c);break;case d.ENUM:this.writeEnum(b,c);break;case d.SFIXED32:this.writeSfixed32(b,c);break;case d.SFIXED64:this.writeSfixed64(b,c);break;case d.SINT32:this.writeSint32(b,c);break;case d.SINT64:this.writeSint64(b,c);break;case d.FHASH64:this.writeFixedHash64(b,c);break;case d.VHASH64:this.writeVarintHash64(b,c);break;default:goog.asserts.fail("Invalid field type in writeAny()");}};
	jspb.BinaryWriter.prototype.writeUnsignedVarint32_=function(a,b){null!=b&&(this.writeFieldHeader_(a,jspb.BinaryConstants.WireType.VARINT),this.encoder_.writeUnsignedVarint32(b));};jspb.BinaryWriter.prototype.writeSignedVarint32_=function(a,b){null!=b&&(this.writeFieldHeader_(a,jspb.BinaryConstants.WireType.VARINT),this.encoder_.writeSignedVarint32(b));};jspb.BinaryWriter.prototype.writeUnsignedVarint64_=function(a,b){null!=b&&(this.writeFieldHeader_(a,jspb.BinaryConstants.WireType.VARINT),this.encoder_.writeUnsignedVarint64(b));};
	jspb.BinaryWriter.prototype.writeSignedVarint64_=function(a,b){null!=b&&(this.writeFieldHeader_(a,jspb.BinaryConstants.WireType.VARINT),this.encoder_.writeSignedVarint64(b));};jspb.BinaryWriter.prototype.writeZigzagVarint32_=function(a,b){null!=b&&(this.writeFieldHeader_(a,jspb.BinaryConstants.WireType.VARINT),this.encoder_.writeZigzagVarint32(b));};jspb.BinaryWriter.prototype.writeZigzagVarint64_=function(a,b){null!=b&&(this.writeFieldHeader_(a,jspb.BinaryConstants.WireType.VARINT),this.encoder_.writeZigzagVarint64(b));};
	jspb.BinaryWriter.prototype.writeZigzagVarint64String_=function(a,b){null!=b&&(this.writeFieldHeader_(a,jspb.BinaryConstants.WireType.VARINT),this.encoder_.writeZigzagVarint64String(b));};jspb.BinaryWriter.prototype.writeZigzagVarintHash64_=function(a,b){null!=b&&(this.writeFieldHeader_(a,jspb.BinaryConstants.WireType.VARINT),this.encoder_.writeZigzagVarintHash64(b));};
	jspb.BinaryWriter.prototype.writeInt32=function(a,b){null!=b&&(goog.asserts.assert(b>=-jspb.BinaryConstants.TWO_TO_31&&b<jspb.BinaryConstants.TWO_TO_31),this.writeSignedVarint32_(a,b));};jspb.BinaryWriter.prototype.writeInt32String=function(a,b){null!=b&&(b=parseInt(b,10),goog.asserts.assert(b>=-jspb.BinaryConstants.TWO_TO_31&&b<jspb.BinaryConstants.TWO_TO_31),this.writeSignedVarint32_(a,b));};
	jspb.BinaryWriter.prototype.writeInt64=function(a,b){null!=b&&(goog.asserts.assert(b>=-jspb.BinaryConstants.TWO_TO_63&&b<jspb.BinaryConstants.TWO_TO_63),this.writeSignedVarint64_(a,b));};jspb.BinaryWriter.prototype.writeInt64String=function(a,b){null!=b&&(b=jspb.arith.Int64.fromString(b),this.writeFieldHeader_(a,jspb.BinaryConstants.WireType.VARINT),this.encoder_.writeSplitVarint64(b.lo,b.hi));};
	jspb.BinaryWriter.prototype.writeUint32=function(a,b){null!=b&&(goog.asserts.assert(0<=b&&b<jspb.BinaryConstants.TWO_TO_32),this.writeUnsignedVarint32_(a,b));};jspb.BinaryWriter.prototype.writeUint32String=function(a,b){null!=b&&(b=parseInt(b,10),goog.asserts.assert(0<=b&&b<jspb.BinaryConstants.TWO_TO_32),this.writeUnsignedVarint32_(a,b));};jspb.BinaryWriter.prototype.writeUint64=function(a,b){null!=b&&(goog.asserts.assert(0<=b&&b<jspb.BinaryConstants.TWO_TO_64),this.writeUnsignedVarint64_(a,b));};
	jspb.BinaryWriter.prototype.writeUint64String=function(a,b){null!=b&&(b=jspb.arith.UInt64.fromString(b),this.writeFieldHeader_(a,jspb.BinaryConstants.WireType.VARINT),this.encoder_.writeSplitVarint64(b.lo,b.hi));};jspb.BinaryWriter.prototype.writeSint32=function(a,b){null!=b&&(goog.asserts.assert(b>=-jspb.BinaryConstants.TWO_TO_31&&b<jspb.BinaryConstants.TWO_TO_31),this.writeZigzagVarint32_(a,b));};
	jspb.BinaryWriter.prototype.writeSint64=function(a,b){null!=b&&(goog.asserts.assert(b>=-jspb.BinaryConstants.TWO_TO_63&&b<jspb.BinaryConstants.TWO_TO_63),this.writeZigzagVarint64_(a,b));};jspb.BinaryWriter.prototype.writeSintHash64=function(a,b){null!=b&&this.writeZigzagVarintHash64_(a,b);};jspb.BinaryWriter.prototype.writeSint64String=function(a,b){null!=b&&this.writeZigzagVarint64String_(a,b);};
	jspb.BinaryWriter.prototype.writeFixed32=function(a,b){null!=b&&(goog.asserts.assert(0<=b&&b<jspb.BinaryConstants.TWO_TO_32),this.writeFieldHeader_(a,jspb.BinaryConstants.WireType.FIXED32),this.encoder_.writeUint32(b));};jspb.BinaryWriter.prototype.writeFixed64=function(a,b){null!=b&&(goog.asserts.assert(0<=b&&b<jspb.BinaryConstants.TWO_TO_64),this.writeFieldHeader_(a,jspb.BinaryConstants.WireType.FIXED64),this.encoder_.writeUint64(b));};
	jspb.BinaryWriter.prototype.writeFixed64String=function(a,b){null!=b&&(b=jspb.arith.UInt64.fromString(b),this.writeFieldHeader_(a,jspb.BinaryConstants.WireType.FIXED64),this.encoder_.writeSplitFixed64(b.lo,b.hi));};jspb.BinaryWriter.prototype.writeSfixed32=function(a,b){null!=b&&(goog.asserts.assert(b>=-jspb.BinaryConstants.TWO_TO_31&&b<jspb.BinaryConstants.TWO_TO_31),this.writeFieldHeader_(a,jspb.BinaryConstants.WireType.FIXED32),this.encoder_.writeInt32(b));};
	jspb.BinaryWriter.prototype.writeSfixed64=function(a,b){null!=b&&(goog.asserts.assert(b>=-jspb.BinaryConstants.TWO_TO_63&&b<jspb.BinaryConstants.TWO_TO_63),this.writeFieldHeader_(a,jspb.BinaryConstants.WireType.FIXED64),this.encoder_.writeInt64(b));};jspb.BinaryWriter.prototype.writeSfixed64String=function(a,b){null!=b&&(b=jspb.arith.Int64.fromString(b),this.writeFieldHeader_(a,jspb.BinaryConstants.WireType.FIXED64),this.encoder_.writeSplitFixed64(b.lo,b.hi));};
	jspb.BinaryWriter.prototype.writeFloat=function(a,b){null!=b&&(this.writeFieldHeader_(a,jspb.BinaryConstants.WireType.FIXED32),this.encoder_.writeFloat(b));};jspb.BinaryWriter.prototype.writeDouble=function(a,b){null!=b&&(this.writeFieldHeader_(a,jspb.BinaryConstants.WireType.FIXED64),this.encoder_.writeDouble(b));};
	jspb.BinaryWriter.prototype.writeBool=function(a,b){null!=b&&(goog.asserts.assert("boolean"===typeof b||"number"===typeof b),this.writeFieldHeader_(a,jspb.BinaryConstants.WireType.VARINT),this.encoder_.writeBool(b));};jspb.BinaryWriter.prototype.writeEnum=function(a,b){null!=b&&(goog.asserts.assert(b>=-jspb.BinaryConstants.TWO_TO_31&&b<jspb.BinaryConstants.TWO_TO_31),this.writeFieldHeader_(a,jspb.BinaryConstants.WireType.VARINT),this.encoder_.writeSignedVarint32(b));};
	jspb.BinaryWriter.prototype.writeString=function(a,b){null!=b&&(a=this.beginDelimited_(a),this.encoder_.writeString(b),this.endDelimited_(a));};jspb.BinaryWriter.prototype.writeBytes=function(a,b){null!=b&&(b=jspb.utils.byteSourceToUint8Array(b),this.writeFieldHeader_(a,jspb.BinaryConstants.WireType.DELIMITED),this.encoder_.writeUnsignedVarint32(b.length),this.appendUint8Array_(b));};jspb.BinaryWriter.prototype.writeMessage=function(a,b,c){null!=b&&(a=this.beginDelimited_(a),c(b,this),this.endDelimited_(a));};
	jspb.BinaryWriter.prototype.writeMessageSet=function(a,b,c){null!=b&&(this.writeFieldHeader_(1,jspb.BinaryConstants.WireType.START_GROUP),this.writeFieldHeader_(2,jspb.BinaryConstants.WireType.VARINT),this.encoder_.writeSignedVarint32(a),a=this.beginDelimited_(3),c(b,this),this.endDelimited_(a),this.writeFieldHeader_(1,jspb.BinaryConstants.WireType.END_GROUP));};
	jspb.BinaryWriter.prototype.writeGroup=function(a,b,c){null!=b&&(this.writeFieldHeader_(a,jspb.BinaryConstants.WireType.START_GROUP),c(b,this),this.writeFieldHeader_(a,jspb.BinaryConstants.WireType.END_GROUP));};jspb.BinaryWriter.prototype.writeFixedHash64=function(a,b){null!=b&&(goog.asserts.assert(8==b.length),this.writeFieldHeader_(a,jspb.BinaryConstants.WireType.FIXED64),this.encoder_.writeFixedHash64(b));};
	jspb.BinaryWriter.prototype.writeVarintHash64=function(a,b){null!=b&&(goog.asserts.assert(8==b.length),this.writeFieldHeader_(a,jspb.BinaryConstants.WireType.VARINT),this.encoder_.writeVarintHash64(b));};jspb.BinaryWriter.prototype.writeSplitFixed64=function(a,b,c){this.writeFieldHeader_(a,jspb.BinaryConstants.WireType.FIXED64);this.encoder_.writeSplitFixed64(b,c);};
	jspb.BinaryWriter.prototype.writeSplitVarint64=function(a,b,c){this.writeFieldHeader_(a,jspb.BinaryConstants.WireType.VARINT);this.encoder_.writeSplitVarint64(b,c);};jspb.BinaryWriter.prototype.writeSplitZigzagVarint64=function(a,b,c){this.writeFieldHeader_(a,jspb.BinaryConstants.WireType.VARINT);var d=this.encoder_;jspb.utils.toZigzag64(b,c,function(a,b){d.writeSplitVarint64(a>>>0,b>>>0);});};
	jspb.BinaryWriter.prototype.writeRepeatedInt32=function(a,b){if(null!=b)for(var c=0;c<b.length;c++)this.writeSignedVarint32_(a,b[c]);};jspb.BinaryWriter.prototype.writeRepeatedInt32String=function(a,b){if(null!=b)for(var c=0;c<b.length;c++)this.writeInt32String(a,b[c]);};jspb.BinaryWriter.prototype.writeRepeatedInt64=function(a,b){if(null!=b)for(var c=0;c<b.length;c++)this.writeSignedVarint64_(a,b[c]);};
	jspb.BinaryWriter.prototype.writeRepeatedSplitFixed64=function(a,b,c,d){if(null!=b)for(var e=0;e<b.length;e++)this.writeSplitFixed64(a,c(b[e]),d(b[e]));};jspb.BinaryWriter.prototype.writeRepeatedSplitVarint64=function(a,b,c,d){if(null!=b)for(var e=0;e<b.length;e++)this.writeSplitVarint64(a,c(b[e]),d(b[e]));};jspb.BinaryWriter.prototype.writeRepeatedSplitZigzagVarint64=function(a,b,c,d){if(null!=b)for(var e=0;e<b.length;e++)this.writeSplitZigzagVarint64(a,c(b[e]),d(b[e]));};
	jspb.BinaryWriter.prototype.writeRepeatedInt64String=function(a,b){if(null!=b)for(var c=0;c<b.length;c++)this.writeInt64String(a,b[c]);};jspb.BinaryWriter.prototype.writeRepeatedUint32=function(a,b){if(null!=b)for(var c=0;c<b.length;c++)this.writeUnsignedVarint32_(a,b[c]);};jspb.BinaryWriter.prototype.writeRepeatedUint32String=function(a,b){if(null!=b)for(var c=0;c<b.length;c++)this.writeUint32String(a,b[c]);};
	jspb.BinaryWriter.prototype.writeRepeatedUint64=function(a,b){if(null!=b)for(var c=0;c<b.length;c++)this.writeUnsignedVarint64_(a,b[c]);};jspb.BinaryWriter.prototype.writeRepeatedUint64String=function(a,b){if(null!=b)for(var c=0;c<b.length;c++)this.writeUint64String(a,b[c]);};jspb.BinaryWriter.prototype.writeRepeatedSint32=function(a,b){if(null!=b)for(var c=0;c<b.length;c++)this.writeZigzagVarint32_(a,b[c]);};
	jspb.BinaryWriter.prototype.writeRepeatedSint64=function(a,b){if(null!=b)for(var c=0;c<b.length;c++)this.writeZigzagVarint64_(a,b[c]);};jspb.BinaryWriter.prototype.writeRepeatedSint64String=function(a,b){if(null!=b)for(var c=0;c<b.length;c++)this.writeZigzagVarint64String_(a,b[c]);};jspb.BinaryWriter.prototype.writeRepeatedSintHash64=function(a,b){if(null!=b)for(var c=0;c<b.length;c++)this.writeZigzagVarintHash64_(a,b[c]);};
	jspb.BinaryWriter.prototype.writeRepeatedFixed32=function(a,b){if(null!=b)for(var c=0;c<b.length;c++)this.writeFixed32(a,b[c]);};jspb.BinaryWriter.prototype.writeRepeatedFixed64=function(a,b){if(null!=b)for(var c=0;c<b.length;c++)this.writeFixed64(a,b[c]);};jspb.BinaryWriter.prototype.writeRepeatedFixed64String=function(a,b){if(null!=b)for(var c=0;c<b.length;c++)this.writeFixed64String(a,b[c]);};
	jspb.BinaryWriter.prototype.writeRepeatedSfixed32=function(a,b){if(null!=b)for(var c=0;c<b.length;c++)this.writeSfixed32(a,b[c]);};jspb.BinaryWriter.prototype.writeRepeatedSfixed64=function(a,b){if(null!=b)for(var c=0;c<b.length;c++)this.writeSfixed64(a,b[c]);};jspb.BinaryWriter.prototype.writeRepeatedSfixed64String=function(a,b){if(null!=b)for(var c=0;c<b.length;c++)this.writeSfixed64String(a,b[c]);};
	jspb.BinaryWriter.prototype.writeRepeatedFloat=function(a,b){if(null!=b)for(var c=0;c<b.length;c++)this.writeFloat(a,b[c]);};jspb.BinaryWriter.prototype.writeRepeatedDouble=function(a,b){if(null!=b)for(var c=0;c<b.length;c++)this.writeDouble(a,b[c]);};jspb.BinaryWriter.prototype.writeRepeatedBool=function(a,b){if(null!=b)for(var c=0;c<b.length;c++)this.writeBool(a,b[c]);};jspb.BinaryWriter.prototype.writeRepeatedEnum=function(a,b){if(null!=b)for(var c=0;c<b.length;c++)this.writeEnum(a,b[c]);};
	jspb.BinaryWriter.prototype.writeRepeatedString=function(a,b){if(null!=b)for(var c=0;c<b.length;c++)this.writeString(a,b[c]);};jspb.BinaryWriter.prototype.writeRepeatedBytes=function(a,b){if(null!=b)for(var c=0;c<b.length;c++)this.writeBytes(a,b[c]);};jspb.BinaryWriter.prototype.writeRepeatedMessage=function(a,b,c){if(null!=b)for(var d=0;d<b.length;d++){var e=this.beginDelimited_(a);c(b[d],this);this.endDelimited_(e);}};
	jspb.BinaryWriter.prototype.writeRepeatedGroup=function(a,b,c){if(null!=b)for(var d=0;d<b.length;d++)this.writeFieldHeader_(a,jspb.BinaryConstants.WireType.START_GROUP),c(b[d],this),this.writeFieldHeader_(a,jspb.BinaryConstants.WireType.END_GROUP);};jspb.BinaryWriter.prototype.writeRepeatedFixedHash64=function(a,b){if(null!=b)for(var c=0;c<b.length;c++)this.writeFixedHash64(a,b[c]);};
	jspb.BinaryWriter.prototype.writeRepeatedVarintHash64=function(a,b){if(null!=b)for(var c=0;c<b.length;c++)this.writeVarintHash64(a,b[c]);};jspb.BinaryWriter.prototype.writePackedInt32=function(a,b){if(null!=b&&b.length){a=this.beginDelimited_(a);for(var c=0;c<b.length;c++)this.encoder_.writeSignedVarint32(b[c]);this.endDelimited_(a);}};
	jspb.BinaryWriter.prototype.writePackedInt32String=function(a,b){if(null!=b&&b.length){a=this.beginDelimited_(a);for(var c=0;c<b.length;c++)this.encoder_.writeSignedVarint32(parseInt(b[c],10));this.endDelimited_(a);}};jspb.BinaryWriter.prototype.writePackedInt64=function(a,b){if(null!=b&&b.length){a=this.beginDelimited_(a);for(var c=0;c<b.length;c++)this.encoder_.writeSignedVarint64(b[c]);this.endDelimited_(a);}};
	jspb.BinaryWriter.prototype.writePackedSplitFixed64=function(a,b,c,d){if(null!=b){a=this.beginDelimited_(a);for(var e=0;e<b.length;e++)this.encoder_.writeSplitFixed64(c(b[e]),d(b[e]));this.endDelimited_(a);}};jspb.BinaryWriter.prototype.writePackedSplitVarint64=function(a,b,c,d){if(null!=b){a=this.beginDelimited_(a);for(var e=0;e<b.length;e++)this.encoder_.writeSplitVarint64(c(b[e]),d(b[e]));this.endDelimited_(a);}};
	jspb.BinaryWriter.prototype.writePackedSplitZigzagVarint64=function(a,b,c,d){if(null!=b){a=this.beginDelimited_(a);for(var e=this.encoder_,f=0;f<b.length;f++)jspb.utils.toZigzag64(c(b[f]),d(b[f]),function(a,b){e.writeSplitVarint64(a>>>0,b>>>0);});this.endDelimited_(a);}};jspb.BinaryWriter.prototype.writePackedInt64String=function(a,b){if(null!=b&&b.length){a=this.beginDelimited_(a);for(var c=0;c<b.length;c++){var d=jspb.arith.Int64.fromString(b[c]);this.encoder_.writeSplitVarint64(d.lo,d.hi);}this.endDelimited_(a);}};
	jspb.BinaryWriter.prototype.writePackedUint32=function(a,b){if(null!=b&&b.length){a=this.beginDelimited_(a);for(var c=0;c<b.length;c++)this.encoder_.writeUnsignedVarint32(b[c]);this.endDelimited_(a);}};jspb.BinaryWriter.prototype.writePackedUint32String=function(a,b){if(null!=b&&b.length){a=this.beginDelimited_(a);for(var c=0;c<b.length;c++)this.encoder_.writeUnsignedVarint32(parseInt(b[c],10));this.endDelimited_(a);}};
	jspb.BinaryWriter.prototype.writePackedUint64=function(a,b){if(null!=b&&b.length){a=this.beginDelimited_(a);for(var c=0;c<b.length;c++)this.encoder_.writeUnsignedVarint64(b[c]);this.endDelimited_(a);}};jspb.BinaryWriter.prototype.writePackedUint64String=function(a,b){if(null!=b&&b.length){a=this.beginDelimited_(a);for(var c=0;c<b.length;c++){var d=jspb.arith.UInt64.fromString(b[c]);this.encoder_.writeSplitVarint64(d.lo,d.hi);}this.endDelimited_(a);}};
	jspb.BinaryWriter.prototype.writePackedSint32=function(a,b){if(null!=b&&b.length){a=this.beginDelimited_(a);for(var c=0;c<b.length;c++)this.encoder_.writeZigzagVarint32(b[c]);this.endDelimited_(a);}};jspb.BinaryWriter.prototype.writePackedSint64=function(a,b){if(null!=b&&b.length){a=this.beginDelimited_(a);for(var c=0;c<b.length;c++)this.encoder_.writeZigzagVarint64(b[c]);this.endDelimited_(a);}};
	jspb.BinaryWriter.prototype.writePackedSint64String=function(a,b){if(null!=b&&b.length){a=this.beginDelimited_(a);for(var c=0;c<b.length;c++)this.encoder_.writeZigzagVarintHash64(jspb.utils.decimalStringToHash64(b[c]));this.endDelimited_(a);}};jspb.BinaryWriter.prototype.writePackedSintHash64=function(a,b){if(null!=b&&b.length){a=this.beginDelimited_(a);for(var c=0;c<b.length;c++)this.encoder_.writeZigzagVarintHash64(b[c]);this.endDelimited_(a);}};
	jspb.BinaryWriter.prototype.writePackedFixed32=function(a,b){if(null!=b&&b.length)for(this.writeFieldHeader_(a,jspb.BinaryConstants.WireType.DELIMITED),this.encoder_.writeUnsignedVarint32(4*b.length),a=0;a<b.length;a++)this.encoder_.writeUint32(b[a]);};jspb.BinaryWriter.prototype.writePackedFixed64=function(a,b){if(null!=b&&b.length)for(this.writeFieldHeader_(a,jspb.BinaryConstants.WireType.DELIMITED),this.encoder_.writeUnsignedVarint32(8*b.length),a=0;a<b.length;a++)this.encoder_.writeUint64(b[a]);};
	jspb.BinaryWriter.prototype.writePackedFixed64String=function(a,b){if(null!=b&&b.length)for(this.writeFieldHeader_(a,jspb.BinaryConstants.WireType.DELIMITED),this.encoder_.writeUnsignedVarint32(8*b.length),a=0;a<b.length;a++){var c=jspb.arith.UInt64.fromString(b[a]);this.encoder_.writeSplitFixed64(c.lo,c.hi);}};
	jspb.BinaryWriter.prototype.writePackedSfixed32=function(a,b){if(null!=b&&b.length)for(this.writeFieldHeader_(a,jspb.BinaryConstants.WireType.DELIMITED),this.encoder_.writeUnsignedVarint32(4*b.length),a=0;a<b.length;a++)this.encoder_.writeInt32(b[a]);};jspb.BinaryWriter.prototype.writePackedSfixed64=function(a,b){if(null!=b&&b.length)for(this.writeFieldHeader_(a,jspb.BinaryConstants.WireType.DELIMITED),this.encoder_.writeUnsignedVarint32(8*b.length),a=0;a<b.length;a++)this.encoder_.writeInt64(b[a]);};
	jspb.BinaryWriter.prototype.writePackedSfixed64String=function(a,b){if(null!=b&&b.length)for(this.writeFieldHeader_(a,jspb.BinaryConstants.WireType.DELIMITED),this.encoder_.writeUnsignedVarint32(8*b.length),a=0;a<b.length;a++)this.encoder_.writeInt64String(b[a]);};jspb.BinaryWriter.prototype.writePackedFloat=function(a,b){if(null!=b&&b.length)for(this.writeFieldHeader_(a,jspb.BinaryConstants.WireType.DELIMITED),this.encoder_.writeUnsignedVarint32(4*b.length),a=0;a<b.length;a++)this.encoder_.writeFloat(b[a]);};
	jspb.BinaryWriter.prototype.writePackedDouble=function(a,b){if(null!=b&&b.length)for(this.writeFieldHeader_(a,jspb.BinaryConstants.WireType.DELIMITED),this.encoder_.writeUnsignedVarint32(8*b.length),a=0;a<b.length;a++)this.encoder_.writeDouble(b[a]);};jspb.BinaryWriter.prototype.writePackedBool=function(a,b){if(null!=b&&b.length)for(this.writeFieldHeader_(a,jspb.BinaryConstants.WireType.DELIMITED),this.encoder_.writeUnsignedVarint32(b.length),a=0;a<b.length;a++)this.encoder_.writeBool(b[a]);};
	jspb.BinaryWriter.prototype.writePackedEnum=function(a,b){if(null!=b&&b.length){a=this.beginDelimited_(a);for(var c=0;c<b.length;c++)this.encoder_.writeEnum(b[c]);this.endDelimited_(a);}};jspb.BinaryWriter.prototype.writePackedFixedHash64=function(a,b){if(null!=b&&b.length)for(this.writeFieldHeader_(a,jspb.BinaryConstants.WireType.DELIMITED),this.encoder_.writeUnsignedVarint32(8*b.length),a=0;a<b.length;a++)this.encoder_.writeFixedHash64(b[a]);};
	jspb.BinaryWriter.prototype.writePackedVarintHash64=function(a,b){if(null!=b&&b.length){a=this.beginDelimited_(a);for(var c=0;c<b.length;c++)this.encoder_.writeVarintHash64(b[c]);this.endDelimited_(a);}};jspb.Map=function(a,b){this.arr_=a;this.valueCtor_=b;this.map_={};this.arrClean=!0;0<this.arr_.length&&this.loadFromArray_();};jspb.Map.prototype.loadFromArray_=function(){for(var a=0;a<this.arr_.length;a++){var b=this.arr_[a],c=b[0];this.map_[c.toString()]=new jspb.Map.Entry_(c,b[1]);}this.arrClean=!0;};
	jspb.Map.prototype.toArray=function(){if(this.arrClean){if(this.valueCtor_){var a=this.map_,b;for(b in a)if(Object.prototype.hasOwnProperty.call(a,b)){var c=a[b].valueWrapper;c&&c.toArray();}}}else {this.arr_.length=0;a=this.stringKeys_();a.sort();for(b=0;b<a.length;b++){var d=this.map_[a[b]];(c=d.valueWrapper)&&c.toArray();this.arr_.push([d.key,d.value]);}this.arrClean=!0;}return this.arr_};
	jspb.Map.prototype.toObject=function(a,b){for(var c=this.toArray(),d=[],e=0;e<c.length;e++){var f=this.map_[c[e][0].toString()];this.wrapEntry_(f);var g=f.valueWrapper;g?(goog.asserts.assert(b),d.push([f.key,b(a,g)])):d.push([f.key,f.value]);}return d};jspb.Map.fromObject=function(a,b,c){b=new jspb.Map([],b);for(var d=0;d<a.length;d++){var e=a[d][0],f=c(a[d][1]);b.set(e,f);}return b};jspb.Map.ArrayIteratorIterable_=function(a){this.idx_=0;this.arr_=a;};
	jspb.Map.ArrayIteratorIterable_.prototype.next=function(){return this.idx_<this.arr_.length?{done:!1,value:this.arr_[this.idx_++]}:{done:!0,value:void 0}};"undefined"!=typeof Symbol&&(jspb.Map.ArrayIteratorIterable_.prototype[Symbol.iterator]=function(){return this});jspb.Map.prototype.getLength=function(){return this.stringKeys_().length};jspb.Map.prototype.clear=function(){this.map_={};this.arrClean=!1;};
	jspb.Map.prototype.del=function(a){a=a.toString();var b=this.map_.hasOwnProperty(a);delete this.map_[a];this.arrClean=!1;return b};jspb.Map.prototype.getEntryList=function(){var a=[],b=this.stringKeys_();b.sort();for(var c=0;c<b.length;c++){var d=this.map_[b[c]];a.push([d.key,d.value]);}return a};jspb.Map.prototype.entries=function(){var a=[],b=this.stringKeys_();b.sort();for(var c=0;c<b.length;c++){var d=this.map_[b[c]];a.push([d.key,this.wrapEntry_(d)]);}return new jspb.Map.ArrayIteratorIterable_(a)};
	jspb.Map.prototype.keys=function(){var a=[],b=this.stringKeys_();b.sort();for(var c=0;c<b.length;c++)a.push(this.map_[b[c]].key);return new jspb.Map.ArrayIteratorIterable_(a)};jspb.Map.prototype.values=function(){var a=[],b=this.stringKeys_();b.sort();for(var c=0;c<b.length;c++)a.push(this.wrapEntry_(this.map_[b[c]]));return new jspb.Map.ArrayIteratorIterable_(a)};
	jspb.Map.prototype.forEach=function(a,b){var c=this.stringKeys_();c.sort();for(var d=0;d<c.length;d++){var e=this.map_[c[d]];a.call(b,this.wrapEntry_(e),e.key,this);}};jspb.Map.prototype.set=function(a,b){var c=new jspb.Map.Entry_(a);this.valueCtor_?(c.valueWrapper=b,c.value=b.toArray()):c.value=b;this.map_[a.toString()]=c;this.arrClean=!1;return this};jspb.Map.prototype.wrapEntry_=function(a){return this.valueCtor_?(a.valueWrapper||(a.valueWrapper=new this.valueCtor_(a.value)),a.valueWrapper):a.value};
	jspb.Map.prototype.get=function(a){if(a=this.map_[a.toString()])return this.wrapEntry_(a)};jspb.Map.prototype.has=function(a){return a.toString()in this.map_};jspb.Map.prototype.serializeBinary=function(a,b,c,d,e){var f=this.stringKeys_();f.sort();for(var g=0;g<f.length;g++){var h=this.map_[f[g]];b.beginSubMessage(a);c.call(b,1,h.key);this.valueCtor_?d.call(b,2,this.wrapEntry_(h),e):d.call(b,2,h.value);b.endSubMessage();}};
	jspb.Map.deserializeBinary=function(a,b,c,d,e,f,g){for(;b.nextField()&&!b.isEndGroup();){var h=b.getFieldNumber();1==h?f=c.call(b):2==h&&(a.valueCtor_?(goog.asserts.assert(e),g||(g=new a.valueCtor_),d.call(b,g,e)):g=d.call(b));}goog.asserts.assert(void 0!=f);goog.asserts.assert(void 0!=g);a.set(f,g);};jspb.Map.prototype.stringKeys_=function(){var a=this.map_,b=[],c;for(c in a)Object.prototype.hasOwnProperty.call(a,c)&&b.push(c);return b};
	jspb.Map.Entry_=function(a,b){this.key=a;this.value=b;this.valueWrapper=void 0;};jspb.ExtensionFieldInfo=function(a,b,c,d,e){this.fieldIndex=a;this.fieldName=b;this.ctor=c;this.toObjectFn=d;this.isRepeated=e;};jspb.ExtensionFieldBinaryInfo=function(a,b,c,d,e,f){this.fieldInfo=a;this.binaryReaderFn=b;this.binaryWriterFn=c;this.binaryMessageSerializeFn=d;this.binaryMessageDeserializeFn=e;this.isPacked=f;};jspb.ExtensionFieldInfo.prototype.isMessageType=function(){return !!this.ctor};jspb.Message=function(){};jspb.Message.GENERATE_TO_OBJECT=!0;jspb.Message.GENERATE_FROM_OBJECT=!goog.DISALLOW_TEST_ONLY_CODE;
	jspb.Message.GENERATE_TO_STRING=!0;jspb.Message.ASSUME_LOCAL_ARRAYS=!1;jspb.Message.SERIALIZE_EMPTY_TRAILING_FIELDS=!0;jspb.Message.SUPPORTS_UINT8ARRAY_="function"==typeof Uint8Array;jspb.Message.prototype.getJsPbMessageId=function(){return this.messageId_};jspb.Message.getIndex_=function(a,b){return b+a.arrayIndexOffset_};jspb.Message.hiddenES6Property_=function(){};jspb.Message.getFieldNumber_=function(a,b){return b-a.arrayIndexOffset_};
	jspb.Message.initialize=function(a,b,c,d,e,f){a.wrappers_=null;b||(b=c?[c]:[]);a.messageId_=c?String(c):void 0;a.arrayIndexOffset_=0===c?-1:0;a.array=b;jspb.Message.initPivotAndExtensionObject_(a,d);a.convertedPrimitiveFields_={};jspb.Message.SERIALIZE_EMPTY_TRAILING_FIELDS||(a.repeatedFields=e);if(e)for(b=0;b<e.length;b++)c=e[b],c<a.pivot_?(c=jspb.Message.getIndex_(a,c),a.array[c]=a.array[c]||jspb.Message.EMPTY_LIST_SENTINEL_):(jspb.Message.maybeInitEmptyExtensionObject_(a),a.extensionObject_[c]=
	a.extensionObject_[c]||jspb.Message.EMPTY_LIST_SENTINEL_);if(f&&f.length)for(b=0;b<f.length;b++)jspb.Message.computeOneofCase(a,f[b]);};jspb.Message.EMPTY_LIST_SENTINEL_=goog.DEBUG&&Object.freeze?Object.freeze([]):[];jspb.Message.isArray_=function(a){return jspb.Message.ASSUME_LOCAL_ARRAYS?a instanceof Array:Array.isArray(a)};jspb.Message.isExtensionObject_=function(a){return null!==a&&"object"==typeof a&&!jspb.Message.isArray_(a)&&!(jspb.Message.SUPPORTS_UINT8ARRAY_&&a instanceof Uint8Array)};
	jspb.Message.initPivotAndExtensionObject_=function(a,b){var c=a.array.length,d=-1;if(c&&(d=c-1,c=a.array[d],jspb.Message.isExtensionObject_(c))){a.pivot_=jspb.Message.getFieldNumber_(a,d);a.extensionObject_=c;return}-1<b?(a.pivot_=Math.max(b,jspb.Message.getFieldNumber_(a,d+1)),a.extensionObject_=null):a.pivot_=Number.MAX_VALUE;};jspb.Message.maybeInitEmptyExtensionObject_=function(a){var b=jspb.Message.getIndex_(a,a.pivot_);a.array[b]||(a.extensionObject_=a.array[b]={});};
	jspb.Message.toObjectList=function(a,b,c){for(var d=[],e=0;e<a.length;e++)d[e]=b.call(a[e],c,a[e]);return d};jspb.Message.toObjectExtension=function(a,b,c,d,e){for(var f in c){var g=c[f],h=d.call(a,g);if(null!=h){for(var k in g.fieldName)if(g.fieldName.hasOwnProperty(k))break;b[k]=g.toObjectFn?g.isRepeated?jspb.Message.toObjectList(h,g.toObjectFn,e):g.toObjectFn(e,h):h;}}};
	jspb.Message.serializeBinaryExtensions=function(a,b,c,d){for(var e in c){var f=c[e],g=f.fieldInfo;if(!f.binaryWriterFn)throw Error("Message extension present that was generated without binary serialization support");var h=d.call(a,g);if(null!=h)if(g.isMessageType())if(f.binaryMessageSerializeFn)f.binaryWriterFn.call(b,g.fieldIndex,h,f.binaryMessageSerializeFn);else throw Error("Message extension present holding submessage without binary support enabled, and message is being serialized to binary format");
	else f.binaryWriterFn.call(b,g.fieldIndex,h);}};jspb.Message.readBinaryExtension=function(a,b,c,d,e){var f=c[b.getFieldNumber()];if(f){c=f.fieldInfo;if(!f.binaryReaderFn)throw Error("Deserializing extension whose generated code does not support binary format");if(c.isMessageType()){var g=new c.ctor;f.binaryReaderFn.call(b,g,f.binaryMessageDeserializeFn);}else g=f.binaryReaderFn.call(b);c.isRepeated&&!f.isPacked?(b=d.call(a,c))?b.push(g):e.call(a,c,[g]):e.call(a,c,g);}else b.skipField();};
	jspb.Message.getField=function(a,b){if(b<a.pivot_){b=jspb.Message.getIndex_(a,b);var c=a.array[b];return c===jspb.Message.EMPTY_LIST_SENTINEL_?a.array[b]=[]:c}if(a.extensionObject_)return c=a.extensionObject_[b],c===jspb.Message.EMPTY_LIST_SENTINEL_?a.extensionObject_[b]=[]:c};jspb.Message.getRepeatedField=function(a,b){return jspb.Message.getField(a,b)};jspb.Message.getOptionalFloatingPointField=function(a,b){a=jspb.Message.getField(a,b);return null==a?a:+a};
	jspb.Message.getBooleanField=function(a,b){a=jspb.Message.getField(a,b);return null==a?a:!!a};jspb.Message.getRepeatedFloatingPointField=function(a,b){var c=jspb.Message.getRepeatedField(a,b);a.convertedPrimitiveFields_||(a.convertedPrimitiveFields_={});if(!a.convertedPrimitiveFields_[b]){for(var d=0;d<c.length;d++)c[d]=+c[d];a.convertedPrimitiveFields_[b]=!0;}return c};
	jspb.Message.getRepeatedBooleanField=function(a,b){var c=jspb.Message.getRepeatedField(a,b);a.convertedPrimitiveFields_||(a.convertedPrimitiveFields_={});if(!a.convertedPrimitiveFields_[b]){for(var d=0;d<c.length;d++)c[d]=!!c[d];a.convertedPrimitiveFields_[b]=!0;}return c};
	jspb.Message.bytesAsB64=function(a){if(null==a||"string"===typeof a)return a;if(jspb.Message.SUPPORTS_UINT8ARRAY_&&a instanceof Uint8Array)return goog.crypt.base64.encodeByteArray(a);goog.asserts.fail("Cannot coerce to b64 string: "+goog.typeOf(a));return null};jspb.Message.bytesAsU8=function(a){if(null==a||a instanceof Uint8Array)return a;if("string"===typeof a)return goog.crypt.base64.decodeStringToUint8Array(a);goog.asserts.fail("Cannot coerce to Uint8Array: "+goog.typeOf(a));return null};
	jspb.Message.bytesListAsB64=function(a){jspb.Message.assertConsistentTypes_(a);return a.length&&"string"!==typeof a[0]?goog.array.map(a,jspb.Message.bytesAsB64):a};jspb.Message.bytesListAsU8=function(a){jspb.Message.assertConsistentTypes_(a);return !a.length||a[0]instanceof Uint8Array?a:goog.array.map(a,jspb.Message.bytesAsU8)};
	jspb.Message.assertConsistentTypes_=function(a){if(goog.DEBUG&&a&&1<a.length){var b=goog.typeOf(a[0]);goog.array.forEach(a,function(a){goog.typeOf(a)!=b&&goog.asserts.fail("Inconsistent type in JSPB repeated field array. Got "+goog.typeOf(a)+" expected "+b);});}};jspb.Message.getFieldWithDefault=function(a,b,c){a=jspb.Message.getField(a,b);return null==a?c:a};jspb.Message.getBooleanFieldWithDefault=function(a,b,c){a=jspb.Message.getBooleanField(a,b);return null==a?c:a};
	jspb.Message.getFloatingPointFieldWithDefault=function(a,b,c){a=jspb.Message.getOptionalFloatingPointField(a,b);return null==a?c:a};jspb.Message.getFieldProto3=jspb.Message.getFieldWithDefault;jspb.Message.getMapField=function(a,b,c,d){a.wrappers_||(a.wrappers_={});if(b in a.wrappers_)return a.wrappers_[b];var e=jspb.Message.getField(a,b);if(!e){if(c)return;e=[];jspb.Message.setField(a,b,e);}return a.wrappers_[b]=new jspb.Map(e,d)};
	jspb.Message.setField=function(a,b,c){goog.asserts.assertInstanceof(a,jspb.Message);b<a.pivot_?a.array[jspb.Message.getIndex_(a,b)]=c:(jspb.Message.maybeInitEmptyExtensionObject_(a),a.extensionObject_[b]=c);return a};jspb.Message.setProto3IntField=function(a,b,c){return jspb.Message.setFieldIgnoringDefault_(a,b,c,0)};jspb.Message.setProto3FloatField=function(a,b,c){return jspb.Message.setFieldIgnoringDefault_(a,b,c,0)};
	jspb.Message.setProto3BooleanField=function(a,b,c){return jspb.Message.setFieldIgnoringDefault_(a,b,c,!1)};jspb.Message.setProto3StringField=function(a,b,c){return jspb.Message.setFieldIgnoringDefault_(a,b,c,"")};jspb.Message.setProto3BytesField=function(a,b,c){return jspb.Message.setFieldIgnoringDefault_(a,b,c,"")};jspb.Message.setProto3EnumField=function(a,b,c){return jspb.Message.setFieldIgnoringDefault_(a,b,c,0)};
	jspb.Message.setProto3StringIntField=function(a,b,c){return jspb.Message.setFieldIgnoringDefault_(a,b,c,"0")};jspb.Message.setFieldIgnoringDefault_=function(a,b,c,d){goog.asserts.assertInstanceof(a,jspb.Message);c!==d?jspb.Message.setField(a,b,c):b<a.pivot_?a.array[jspb.Message.getIndex_(a,b)]=null:(jspb.Message.maybeInitEmptyExtensionObject_(a),delete a.extensionObject_[b]);return a};
	jspb.Message.addToRepeatedField=function(a,b,c,d){goog.asserts.assertInstanceof(a,jspb.Message);b=jspb.Message.getRepeatedField(a,b);void 0!=d?b.splice(d,0,c):b.push(c);return a};jspb.Message.setOneofField=function(a,b,c,d){goog.asserts.assertInstanceof(a,jspb.Message);(c=jspb.Message.computeOneofCase(a,c))&&c!==b&&void 0!==d&&(a.wrappers_&&c in a.wrappers_&&(a.wrappers_[c]=void 0),jspb.Message.setField(a,c,void 0));return jspb.Message.setField(a,b,d)};
	jspb.Message.computeOneofCase=function(a,b){for(var c,d,e=0;e<b.length;e++){var f=b[e],g=jspb.Message.getField(a,f);null!=g&&(c=f,d=g,jspb.Message.setField(a,f,void 0));}return c?(jspb.Message.setField(a,c,d),c):0};jspb.Message.getWrapperField=function(a,b,c,d){a.wrappers_||(a.wrappers_={});if(!a.wrappers_[c]){var e=jspb.Message.getField(a,c);if(d||e)a.wrappers_[c]=new b(e);}return a.wrappers_[c]};
	jspb.Message.getRepeatedWrapperField=function(a,b,c){jspb.Message.wrapRepeatedField_(a,b,c);b=a.wrappers_[c];b==jspb.Message.EMPTY_LIST_SENTINEL_&&(b=a.wrappers_[c]=[]);return b};jspb.Message.wrapRepeatedField_=function(a,b,c){a.wrappers_||(a.wrappers_={});if(!a.wrappers_[c]){for(var d=jspb.Message.getRepeatedField(a,c),e=[],f=0;f<d.length;f++)e[f]=new b(d[f]);a.wrappers_[c]=e;}};
	jspb.Message.setWrapperField=function(a,b,c){goog.asserts.assertInstanceof(a,jspb.Message);a.wrappers_||(a.wrappers_={});var d=c?c.toArray():c;a.wrappers_[b]=c;return jspb.Message.setField(a,b,d)};jspb.Message.setOneofWrapperField=function(a,b,c,d){goog.asserts.assertInstanceof(a,jspb.Message);a.wrappers_||(a.wrappers_={});var e=d?d.toArray():d;a.wrappers_[b]=d;return jspb.Message.setOneofField(a,b,c,e)};
	jspb.Message.setRepeatedWrapperField=function(a,b,c){goog.asserts.assertInstanceof(a,jspb.Message);a.wrappers_||(a.wrappers_={});c=c||[];for(var d=[],e=0;e<c.length;e++)d[e]=c[e].toArray();a.wrappers_[b]=c;return jspb.Message.setField(a,b,d)};
	jspb.Message.addToRepeatedWrapperField=function(a,b,c,d,e){jspb.Message.wrapRepeatedField_(a,d,b);var f=a.wrappers_[b];f||(f=a.wrappers_[b]=[]);c=c?c:new d;a=jspb.Message.getRepeatedField(a,b);void 0!=e?(f.splice(e,0,c),a.splice(e,0,c.toArray())):(f.push(c),a.push(c.toArray()));return c};jspb.Message.toMap=function(a,b,c,d){for(var e={},f=0;f<a.length;f++)e[b.call(a[f])]=c?c.call(a[f],d,a[f]):a[f];return e};
	jspb.Message.prototype.syncMapFields_=function(){if(this.wrappers_)for(var a in this.wrappers_){var b=this.wrappers_[a];if(Array.isArray(b))for(var c=0;c<b.length;c++)b[c]&&b[c].toArray();else b&&b.toArray();}};jspb.Message.prototype.toArray=function(){this.syncMapFields_();return this.array};jspb.Message.GENERATE_TO_STRING&&(jspb.Message.prototype.toString=function(){this.syncMapFields_();return this.array.toString()});
	jspb.Message.prototype.getExtension=function(a){if(this.extensionObject_){this.wrappers_||(this.wrappers_={});var b=a.fieldIndex;if(a.isRepeated){if(a.isMessageType())return this.wrappers_[b]||(this.wrappers_[b]=goog.array.map(this.extensionObject_[b]||[],function(b){return new a.ctor(b)})),this.wrappers_[b]}else if(a.isMessageType())return !this.wrappers_[b]&&this.extensionObject_[b]&&(this.wrappers_[b]=new a.ctor(this.extensionObject_[b])),this.wrappers_[b];return this.extensionObject_[b]}};
	jspb.Message.prototype.setExtension=function(a,b){this.wrappers_||(this.wrappers_={});jspb.Message.maybeInitEmptyExtensionObject_(this);var c=a.fieldIndex;a.isRepeated?(b=b||[],a.isMessageType()?(this.wrappers_[c]=b,this.extensionObject_[c]=goog.array.map(b,function(a){return a.toArray()})):this.extensionObject_[c]=b):a.isMessageType()?(this.wrappers_[c]=b,this.extensionObject_[c]=b?b.toArray():b):this.extensionObject_[c]=b;return this};
	jspb.Message.difference=function(a,b){if(!(a instanceof b.constructor))throw Error("Messages have different types.");var c=a.toArray();b=b.toArray();var d=[],e=0,f=c.length>b.length?c.length:b.length;a.getJsPbMessageId()&&(d[0]=a.getJsPbMessageId(),e=1);for(;e<f;e++)jspb.Message.compareFields(c[e],b[e])||(d[e]=b[e]);return new a.constructor(d)};jspb.Message.equals=function(a,b){return a==b||!(!a||!b)&&a instanceof b.constructor&&jspb.Message.compareFields(a.toArray(),b.toArray())};
	jspb.Message.compareExtensions=function(a,b){a=a||{};b=b||{};var c={},d;for(d in a)c[d]=0;for(d in b)c[d]=0;for(d in c)if(!jspb.Message.compareFields(a[d],b[d]))return !1;return !0};
	jspb.Message.compareFields=function(a,b){if(a==b)return !0;if(!goog.isObject(a)||!goog.isObject(b))return "number"===typeof a&&isNaN(a)||"number"===typeof b&&isNaN(b)?String(a)==String(b):!1;if(a.constructor!=b.constructor)return !1;if(jspb.Message.SUPPORTS_UINT8ARRAY_&&a.constructor===Uint8Array){if(a.length!=b.length)return !1;for(var c=0;c<a.length;c++)if(a[c]!=b[c])return !1;return !0}if(a.constructor===Array){var d=void 0,e=void 0,f=Math.max(a.length,b.length);for(c=0;c<f;c++){var g=a[c],h=b[c];g&&
	g.constructor==Object&&(goog.asserts.assert(void 0===d),goog.asserts.assert(c===a.length-1),d=g,g=void 0);h&&h.constructor==Object&&(goog.asserts.assert(void 0===e),goog.asserts.assert(c===b.length-1),e=h,h=void 0);if(!jspb.Message.compareFields(g,h))return !1}return d||e?(d=d||{},e=e||{},jspb.Message.compareExtensions(d,e)):!0}if(a.constructor===Object)return jspb.Message.compareExtensions(a,b);throw Error("Invalid type in JSPB array");};jspb.Message.prototype.cloneMessage=function(){return jspb.Message.cloneMessage(this)};
	jspb.Message.prototype.clone=function(){return jspb.Message.cloneMessage(this)};jspb.Message.clone=function(a){return jspb.Message.cloneMessage(a)};jspb.Message.cloneMessage=function(a){return new a.constructor(jspb.Message.clone_(a.toArray()))};
	jspb.Message.copyInto=function(a,b){goog.asserts.assertInstanceof(a,jspb.Message);goog.asserts.assertInstanceof(b,jspb.Message);goog.asserts.assert(a.constructor==b.constructor,"Copy source and target message should have the same type.");a=jspb.Message.clone(a);for(var c=b.toArray(),d=a.toArray(),e=c.length=0;e<d.length;e++)c[e]=d[e];b.wrappers_=a.wrappers_;b.extensionObject_=a.extensionObject_;};
	jspb.Message.clone_=function(a){if(Array.isArray(a)){for(var b=Array(a.length),c=0;c<a.length;c++){var d=a[c];null!=d&&(b[c]="object"==typeof d?jspb.Message.clone_(goog.asserts.assert(d)):d);}return b}if(jspb.Message.SUPPORTS_UINT8ARRAY_&&a instanceof Uint8Array)return new Uint8Array(a);b={};for(c in a)d=a[c],null!=d&&(b[c]="object"==typeof d?jspb.Message.clone_(goog.asserts.assert(d)):d);return b};jspb.Message.registerMessageType=function(a,b){b.messageId=a;};jspb.Message.messageSetExtensions={};
	jspb.Message.messageSetExtensionsBinary={};jspb.Export={};var Map=jspb.Map;var Message=jspb.Message;var BinaryReader=jspb.BinaryReader;var BinaryWriter=jspb.BinaryWriter;var ExtensionFieldInfo=jspb.ExtensionFieldInfo;var ExtensionFieldBinaryInfo=jspb.ExtensionFieldBinaryInfo;var exportSymbol=goog.exportSymbol;var inherits=goog.inherits;var object={extend:goog.object.extend};var typeOf=goog.typeOf;

	var googleProtobuf = {
		Map: Map,
		Message: Message,
		BinaryReader: BinaryReader,
		BinaryWriter: BinaryWriter,
		ExtensionFieldInfo: ExtensionFieldInfo,
		ExtensionFieldBinaryInfo: ExtensionFieldBinaryInfo,
		exportSymbol: exportSymbol,
		inherits: inherits,
		object: object,
		typeOf: typeOf
	};

	var generic_collection_pb = createCommonjsModule(function (module, exports) {
	// source: proto/generic_collection.proto
	/**
	 * @fileoverview
	 * @enhanceable
	 * @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!


	var goog = googleProtobuf;
	var proto = {};

	goog.exportSymbol('cn.leancloud.play.proto.GenericCollection', null, proto);
	goog.exportSymbol(
	'cn.leancloud.play.proto.GenericCollection.MapEntry',
	null,
	proto);

	goog.exportSymbol(
	'cn.leancloud.play.proto.GenericCollectionValue',
	null,
	proto);

	goog.exportSymbol(
	'cn.leancloud.play.proto.GenericCollectionValue.Type',
	null,
	proto);

	goog.exportSymbol(
	'cn.leancloud.play.proto.GenericCollectionValue.ValueCase',
	null,
	proto);

	/**
	         * 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.cn.leancloud.play.proto.GenericCollectionValue = function (opt_data) {
	  googleProtobuf.Message.initialize(
	  this,
	  opt_data,
	  0,
	  -1,
	  null,
	  proto.cn.leancloud.play.proto.GenericCollectionValue.oneofGroups_);

	};
	goog.inherits(
	proto.cn.leancloud.play.proto.GenericCollectionValue,
	googleProtobuf.Message);

	if (goog.DEBUG && !COMPILED) {
	  /**
	                               * @public
	                               * @override
	                               */
	  proto.cn.leancloud.play.proto.GenericCollectionValue.displayName =
	  'proto.cn.leancloud.play.proto.GenericCollectionValue';
	}
	/**
	   * 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.cn.leancloud.play.proto.GenericCollection = function (opt_data) {
	  googleProtobuf.Message.initialize(
	  this,
	  opt_data,
	  0,
	  -1,
	  proto.cn.leancloud.play.proto.GenericCollection.repeatedFields_,
	  null);

	};
	goog.inherits(proto.cn.leancloud.play.proto.GenericCollection, googleProtobuf.Message);
	if (goog.DEBUG && !COMPILED) {
	  /**
	                               * @public
	                               * @override
	                               */
	  proto.cn.leancloud.play.proto.GenericCollection.displayName =
	  'proto.cn.leancloud.play.proto.GenericCollection';
	}
	/**
	   * 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.cn.leancloud.play.proto.GenericCollection.MapEntry = function (opt_data) {
	  googleProtobuf.Message.initialize(this, opt_data, 0, -1, null, null);
	};
	goog.inherits(
	proto.cn.leancloud.play.proto.GenericCollection.MapEntry,
	googleProtobuf.Message);

	if (goog.DEBUG && !COMPILED) {
	  /**
	                               * @public
	                               * @override
	                               */
	  proto.cn.leancloud.play.proto.GenericCollection.MapEntry.displayName =
	  'proto.cn.leancloud.play.proto.GenericCollection.MapEntry';
	}

	/**
	   * Oneof group definitions for this message. Each group defines the field
	   * numbers belonging to that group. When of these fields' value is set, all
	   * other fields in the group are cleared. During deserialization, if multiple
	   * fields are encountered for a group, only the last value seen will be kept.
	   * @private {!Array<!Array<number>>}
	   * @const
	   */
	proto.cn.leancloud.play.proto.GenericCollectionValue.oneofGroups_ = [
	[2, 3, 4, 5, 6, 7, 8]];


	/**
	                         * @enum {number}
	                         */
	proto.cn.leancloud.play.proto.GenericCollectionValue.ValueCase = {
	  VALUE_NOT_SET: 0,
	  INT_VALUE: 2,
	  LONG_INT_VALUE: 3,
	  BOOL_VALUE: 4,
	  STRING_VALUE: 5,
	  BYTES_VALUE: 6,
	  FLOAT_VALUE: 7,
	  DOUBLE_VALUE: 8 };


	/**
	                      * @return {proto.cn.leancloud.play.proto.GenericCollectionValue.ValueCase}
	                      */
	proto.cn.leancloud.play.proto.GenericCollectionValue.prototype.getValueCase = function () {
	  return (/** @type {proto.cn.leancloud.play.proto.GenericCollectionValue.ValueCase} */googleProtobuf.Message.computeOneofCase(
	    this,
	    proto.cn.leancloud.play.proto.GenericCollectionValue.oneofGroups_[0]));

	};

	if (googleProtobuf.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.cn.leancloud.play.proto.GenericCollectionValue.prototype.toObject = function (
	  opt_includeInstance)
	  {
	    return proto.cn.leancloud.play.proto.GenericCollectionValue.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.cn.leancloud.play.proto.GenericCollectionValue} msg The msg instance to transform.
	      * @return {!Object}
	      * @suppress {unusedLocalVariables} f is only used for nested messages
	      */
	  proto.cn.leancloud.play.proto.GenericCollectionValue.toObject = function (
	  includeInstance,
	  msg)
	  {
	    var obj = {
	      type: googleProtobuf.Message.getFieldWithDefault(msg, 1, 0),
	      intValue: googleProtobuf.Message.getFieldWithDefault(msg, 2, 0),
	      longIntValue: googleProtobuf.Message.getFieldWithDefault(msg, 3, 0),
	      boolValue: googleProtobuf.Message.getBooleanFieldWithDefault(msg, 4, false),
	      stringValue: googleProtobuf.Message.getFieldWithDefault(msg, 5, ''),
	      bytesValue: msg.getBytesValue_asB64(),
	      floatValue: googleProtobuf.Message.getFloatingPointFieldWithDefault(msg, 7, 0.0),
	      doubleValue: googleProtobuf.Message.getFloatingPointFieldWithDefault(msg, 8, 0.0),
	      objectTypeId: googleProtobuf.Message.getFieldWithDefault(msg, 9, 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.cn.leancloud.play.proto.GenericCollectionValue}
	   */
	proto.cn.leancloud.play.proto.GenericCollectionValue.deserializeBinary = function (
	bytes)
	{
	  var reader = new googleProtobuf.BinaryReader(bytes);
	  var msg = new proto.cn.leancloud.play.proto.GenericCollectionValue();
	  return proto.cn.leancloud.play.proto.GenericCollectionValue.deserializeBinaryFromReader(
	  msg,
	  reader);

	};

	/**
	    * Deserializes binary data (in protobuf wire format) from the
	    * given reader into the given message object.
	    * @param {!proto.cn.leancloud.play.proto.GenericCollectionValue} msg The message object to deserialize into.
	    * @param {!jspb.BinaryReader} reader The BinaryReader to use.
	    * @return {!proto.cn.leancloud.play.proto.GenericCollectionValue}
	    */
	proto.cn.leancloud.play.proto.GenericCollectionValue.deserializeBinaryFromReader = function (
	msg,
	reader)
	{
	  while (reader.nextField()) {
	    if (reader.isEndGroup()) {
	      break;
	    }
	    var field = reader.getFieldNumber();
	    switch (field) {
	      case 1:
	        var value = /** @type {!proto.cn.leancloud.play.proto.GenericCollectionValue.Type} */reader.readEnum();
	        msg.setType(value);
	        break;
	      case 2:
	        var value = /** @type {number} */reader.readInt32();
	        msg.setIntValue(value);
	        break;
	      case 3:
	        var value = /** @type {number} */reader.readInt64();
	        msg.setLongIntValue(value);
	        break;
	      case 4:
	        var value = /** @type {boolean} */reader.readBool();
	        msg.setBoolValue(value);
	        break;
	      case 5:
	        var value = /** @type {string} */reader.readString();
	        msg.setStringValue(value);
	        break;
	      case 6:
	        var value = /** @type {!Uint8Array} */reader.readBytes();
	        msg.setBytesValue(value);
	        break;
	      case 7:
	        var value = /** @type {number} */reader.readFloat();
	        msg.setFloatValue(value);
	        break;
	      case 8:
	        var value = /** @type {number} */reader.readDouble();
	        msg.setDoubleValue(value);
	        break;
	      case 9:
	        var value = /** @type {number} */reader.readInt32();
	        msg.setObjectTypeId(value);
	        break;
	      default:
	        reader.skipField();
	        break;}

	  }
	  return msg;
	};

	/**
	    * Serializes the message to binary data (in protobuf wire format).
	    * @return {!Uint8Array}
	    */
	proto.cn.leancloud.play.proto.GenericCollectionValue.prototype.serializeBinary = function () {
	  var writer = new googleProtobuf.BinaryWriter();
	  proto.cn.leancloud.play.proto.GenericCollectionValue.serializeBinaryToWriter(
	  this,
	  writer);

	  return writer.getResultBuffer();
	};

	/**
	    * Serializes the given message to binary data (in protobuf wire
	    * format), writing to the given BinaryWriter.
	    * @param {!proto.cn.leancloud.play.proto.GenericCollectionValue} message
	    * @param {!jspb.BinaryWriter} writer
	    * @suppress {unusedLocalVariables} f is only used for nested messages
	    */
	proto.cn.leancloud.play.proto.GenericCollectionValue.serializeBinaryToWriter = function (
	message,
	writer)
	{
	  var f = undefined;
	  f = message.getType();
	  if (f !== 0.0) {
	    writer.writeEnum(1, f);
	  }
	  f = /** @type {number} */googleProtobuf.Message.getField(message, 2);
	  if (f != null) {
	    writer.writeInt32(2, f);
	  }
	  f = /** @type {number} */googleProtobuf.Message.getField(message, 3);
	  if (f != null) {
	    writer.writeInt64(3, f);
	  }
	  f = /** @type {boolean} */googleProtobuf.Message.getField(message, 4);
	  if (f != null) {
	    writer.writeBool(4, f);
	  }
	  f = /** @type {string} */googleProtobuf.Message.getField(message, 5);
	  if (f != null) {
	    writer.writeString(5, f);
	  }
	  f = /** @type {!(string|Uint8Array)} */googleProtobuf.Message.getField(message, 6);
	  if (f != null) {
	    writer.writeBytes(6, f);
	  }
	  f = /** @type {number} */googleProtobuf.Message.getField(message, 7);
	  if (f != null) {
	    writer.writeFloat(7, f);
	  }
	  f = /** @type {number} */googleProtobuf.Message.getField(message, 8);
	  if (f != null) {
	    writer.writeDouble(8, f);
	  }
	  f = message.getObjectTypeId();
	  if (f !== 0) {
	    writer.writeInt32(9, f);
	  }
	};

	/**
	    * @enum {number}
	    */
	proto.cn.leancloud.play.proto.GenericCollectionValue.Type = {
	  NULL: 0,
	  BYTES: 1,
	  BYTE: 2,
	  SHORT: 3,
	  INT: 4,
	  LONG: 5,
	  BOOL: 6,
	  FLOAT: 7,
	  DOUBLE: 8,
	  OBJECT: 9,
	  STRING: 10,
	  MAP: 11,
	  ARRAY: 12 };


	/**
	                * optional Type type = 1;
	                * @return {!proto.cn.leancloud.play.proto.GenericCollectionValue.Type}
	                */
	proto.cn.leancloud.play.proto.GenericCollectionValue.prototype.getType = function () {
	  return (/** @type {!proto.cn.leancloud.play.proto.GenericCollectionValue.Type} */googleProtobuf.Message.getFieldWithDefault(
	    this,
	    1,
	    0));

	};

	/**
	    * @param {!proto.cn.leancloud.play.proto.GenericCollectionValue.Type} value
	    * @return {!proto.cn.leancloud.play.proto.GenericCollectionValue} returns this
	    */
	proto.cn.leancloud.play.proto.GenericCollectionValue.prototype.setType = function (
	value)
	{
	  return googleProtobuf.Message.setProto3EnumField(this, 1, value);
	};

	/**
	    * optional int32 int_value = 2;
	    * @return {number}
	    */
	proto.cn.leancloud.play.proto.GenericCollectionValue.prototype.getIntValue = function () {
	  return (/** @type {number} */googleProtobuf.Message.getFieldWithDefault(this, 2, 0));
	};

	/**
	    * @param {number} value
	    * @return {!proto.cn.leancloud.play.proto.GenericCollectionValue} returns this
	    */
	proto.cn.leancloud.play.proto.GenericCollectionValue.prototype.setIntValue = function (
	value)
	{
	  return googleProtobuf.Message.setOneofField(
	  this,
	  2,
	  proto.cn.leancloud.play.proto.GenericCollectionValue.oneofGroups_[0],
	  value);

	};

	/**
	    * Clears the field making it undefined.
	    * @return {!proto.cn.leancloud.play.proto.GenericCollectionValue} returns this
	    */
	proto.cn.leancloud.play.proto.GenericCollectionValue.prototype.clearIntValue = function () {
	  return googleProtobuf.Message.setOneofField(
	  this,
	  2,
	  proto.cn.leancloud.play.proto.GenericCollectionValue.oneofGroups_[0],
	  undefined);

	};

	/**
	    * Returns whether this field is set.
	    * @return {boolean}
	    */
	proto.cn.leancloud.play.proto.GenericCollectionValue.prototype.hasIntValue = function () {
	  return googleProtobuf.Message.getField(this, 2) != null;
	};

	/**
	    * optional int64 long_int_value = 3;
	    * @return {number}
	    */
	proto.cn.leancloud.play.proto.GenericCollectionValue.prototype.getLongIntValue = function () {
	  return (/** @type {number} */googleProtobuf.Message.getFieldWithDefault(this, 3, 0));
	};

	/**
	    * @param {number} value
	    * @return {!proto.cn.leancloud.play.proto.GenericCollectionValue} returns this
	    */
	proto.cn.leancloud.play.proto.GenericCollectionValue.prototype.setLongIntValue = function (
	value)
	{
	  return googleProtobuf.Message.setOneofField(
	  this,
	  3,
	  proto.cn.leancloud.play.proto.GenericCollectionValue.oneofGroups_[0],
	  value);

	};

	/**
	    * Clears the field making it undefined.
	    * @return {!proto.cn.leancloud.play.proto.GenericCollectionValue} returns this
	    */
	proto.cn.leancloud.play.proto.GenericCollectionValue.prototype.clearLongIntValue = function () {
	  return googleProtobuf.Message.setOneofField(
	  this,
	  3,
	  proto.cn.leancloud.play.proto.GenericCollectionValue.oneofGroups_[0],
	  undefined);

	};

	/**
	    * Returns whether this field is set.
	    * @return {boolean}
	    */
	proto.cn.leancloud.play.proto.GenericCollectionValue.prototype.hasLongIntValue = function () {
	  return googleProtobuf.Message.getField(this, 3) != null;
	};

	/**
	    * optional bool bool_value = 4;
	    * @return {boolean}
	    */
	proto.cn.leancloud.play.proto.GenericCollectionValue.prototype.getBoolValue = function () {
	  return (/** @type {boolean} */googleProtobuf.Message.getBooleanFieldWithDefault(
	    this,
	    4,
	    false));

	};

	/**
	    * @param {boolean} value
	    * @return {!proto.cn.leancloud.play.proto.GenericCollectionValue} returns this
	    */
	proto.cn.leancloud.play.proto.GenericCollectionValue.prototype.setBoolValue = function (
	value)
	{
	  return googleProtobuf.Message.setOneofField(
	  this,
	  4,
	  proto.cn.leancloud.play.proto.GenericCollectionValue.oneofGroups_[0],
	  value);

	};

	/**
	    * Clears the field making it undefined.
	    * @return {!proto.cn.leancloud.play.proto.GenericCollectionValue} returns this
	    */
	proto.cn.leancloud.play.proto.GenericCollectionValue.prototype.clearBoolValue = function () {
	  return googleProtobuf.Message.setOneofField(
	  this,
	  4,
	  proto.cn.leancloud.play.proto.GenericCollectionValue.oneofGroups_[0],
	  undefined);

	};

	/**
	    * Returns whether this field is set.
	    * @return {boolean}
	    */
	proto.cn.leancloud.play.proto.GenericCollectionValue.prototype.hasBoolValue = function () {
	  return googleProtobuf.Message.getField(this, 4) != null;
	};

	/**
	    * optional string string_value = 5;
	    * @return {string}
	    */
	proto.cn.leancloud.play.proto.GenericCollectionValue.prototype.getStringValue = function () {
	  return (/** @type {string} */googleProtobuf.Message.getFieldWithDefault(this, 5, ''));
	};

	/**
	    * @param {string} value
	    * @return {!proto.cn.leancloud.play.proto.GenericCollectionValue} returns this
	    */
	proto.cn.leancloud.play.proto.GenericCollectionValue.prototype.setStringValue = function (
	value)
	{
	  return googleProtobuf.Message.setOneofField(
	  this,
	  5,
	  proto.cn.leancloud.play.proto.GenericCollectionValue.oneofGroups_[0],
	  value);

	};

	/**
	    * Clears the field making it undefined.
	    * @return {!proto.cn.leancloud.play.proto.GenericCollectionValue} returns this
	    */
	proto.cn.leancloud.play.proto.GenericCollectionValue.prototype.clearStringValue = function () {
	  return googleProtobuf.Message.setOneofField(
	  this,
	  5,
	  proto.cn.leancloud.play.proto.GenericCollectionValue.oneofGroups_[0],
	  undefined);

	};

	/**
	    * Returns whether this field is set.
	    * @return {boolean}
	    */
	proto.cn.leancloud.play.proto.GenericCollectionValue.prototype.hasStringValue = function () {
	  return googleProtobuf.Message.getField(this, 5) != null;
	};

	/**
	    * optional bytes bytes_value = 6;
	    * @return {!(string|Uint8Array)}
	    */
	proto.cn.leancloud.play.proto.GenericCollectionValue.prototype.getBytesValue = function () {
	  return (/** @type {!(string|Uint8Array)} */googleProtobuf.Message.getFieldWithDefault(
	    this,
	    6,
	    ''));

	};

	/**
	    * optional bytes bytes_value = 6;
	    * This is a type-conversion wrapper around `getBytesValue()`
	    * @return {string}
	    */
	proto.cn.leancloud.play.proto.GenericCollectionValue.prototype.getBytesValue_asB64 = function () {
	  return (/** @type {string} */googleProtobuf.Message.bytesAsB64(this.getBytesValue()));
	};

	/**
	    * optional bytes bytes_value = 6;
	    * Note that Uint8Array is not supported on all browsers.
	    * @see http://caniuse.com/Uint8Array
	    * This is a type-conversion wrapper around `getBytesValue()`
	    * @return {!Uint8Array}
	    */
	proto.cn.leancloud.play.proto.GenericCollectionValue.prototype.getBytesValue_asU8 = function () {
	  return (/** @type {!Uint8Array} */googleProtobuf.Message.bytesAsU8(
	    this.getBytesValue()));

	};

	/**
	    * @param {!(string|Uint8Array)} value
	    * @return {!proto.cn.leancloud.play.proto.GenericCollectionValue} returns this
	    */
	proto.cn.leancloud.play.proto.GenericCollectionValue.prototype.setBytesValue = function (
	value)
	{
	  return googleProtobuf.Message.setOneofField(
	  this,
	  6,
	  proto.cn.leancloud.play.proto.GenericCollectionValue.oneofGroups_[0],
	  value);

	};

	/**
	    * Clears the field making it undefined.
	    * @return {!proto.cn.leancloud.play.proto.GenericCollectionValue} returns this
	    */
	proto.cn.leancloud.play.proto.GenericCollectionValue.prototype.clearBytesValue = function () {
	  return googleProtobuf.Message.setOneofField(
	  this,
	  6,
	  proto.cn.leancloud.play.proto.GenericCollectionValue.oneofGroups_[0],
	  undefined);

	};

	/**
	    * Returns whether this field is set.
	    * @return {boolean}
	    */
	proto.cn.leancloud.play.proto.GenericCollectionValue.prototype.hasBytesValue = function () {
	  return googleProtobuf.Message.getField(this, 6) != null;
	};

	/**
	    * optional float float_value = 7;
	    * @return {number}
	    */
	proto.cn.leancloud.play.proto.GenericCollectionValue.prototype.getFloatValue = function () {
	  return (/** @type {number} */googleProtobuf.Message.getFloatingPointFieldWithDefault(
	    this,
	    7,
	    0.0));

	};

	/**
	    * @param {number} value
	    * @return {!proto.cn.leancloud.play.proto.GenericCollectionValue} returns this
	    */
	proto.cn.leancloud.play.proto.GenericCollectionValue.prototype.setFloatValue = function (
	value)
	{
	  return googleProtobuf.Message.setOneofField(
	  this,
	  7,
	  proto.cn.leancloud.play.proto.GenericCollectionValue.oneofGroups_[0],
	  value);

	};

	/**
	    * Clears the field making it undefined.
	    * @return {!proto.cn.leancloud.play.proto.GenericCollectionValue} returns this
	    */
	proto.cn.leancloud.play.proto.GenericCollectionValue.prototype.clearFloatValue = function () {
	  return googleProtobuf.Message.setOneofField(
	  this,
	  7,
	  proto.cn.leancloud.play.proto.GenericCollectionValue.oneofGroups_[0],
	  undefined);

	};

	/**
	    * Returns whether this field is set.
	    * @return {boolean}
	    */
	proto.cn.leancloud.play.proto.GenericCollectionValue.prototype.hasFloatValue = function () {
	  return googleProtobuf.Message.getField(this, 7) != null;
	};

	/**
	    * optional double double_value = 8;
	    * @return {number}
	    */
	proto.cn.leancloud.play.proto.GenericCollectionValue.prototype.getDoubleValue = function () {
	  return (/** @type {number} */googleProtobuf.Message.getFloatingPointFieldWithDefault(
	    this,
	    8,
	    0.0));

	};

	/**
	    * @param {number} value
	    * @return {!proto.cn.leancloud.play.proto.GenericCollectionValue} returns this
	    */
	proto.cn.leancloud.play.proto.GenericCollectionValue.prototype.setDoubleValue = function (
	value)
	{
	  return googleProtobuf.Message.setOneofField(
	  this,
	  8,
	  proto.cn.leancloud.play.proto.GenericCollectionValue.oneofGroups_[0],
	  value);

	};

	/**
	    * Clears the field making it undefined.
	    * @return {!proto.cn.leancloud.play.proto.GenericCollectionValue} returns this
	    */
	proto.cn.leancloud.play.proto.GenericCollectionValue.prototype.clearDoubleValue = function () {
	  return googleProtobuf.Message.setOneofField(
	  this,
	  8,
	  proto.cn.leancloud.play.proto.GenericCollectionValue.oneofGroups_[0],
	  undefined);

	};

	/**
	    * Returns whether this field is set.
	    * @return {boolean}
	    */
	proto.cn.leancloud.play.proto.GenericCollectionValue.prototype.hasDoubleValue = function () {
	  return googleProtobuf.Message.getField(this, 8) != null;
	};

	/**
	    * optional int32 object_type_id = 9;
	    * @return {number}
	    */
	proto.cn.leancloud.play.proto.GenericCollectionValue.prototype.getObjectTypeId = function () {
	  return (/** @type {number} */googleProtobuf.Message.getFieldWithDefault(this, 9, 0));
	};

	/**
	    * @param {number} value
	    * @return {!proto.cn.leancloud.play.proto.GenericCollectionValue} returns this
	    */
	proto.cn.leancloud.play.proto.GenericCollectionValue.prototype.setObjectTypeId = function (
	value)
	{
	  return googleProtobuf.Message.setProto3IntField(this, 9, value);
	};

	/**
	    * List of repeated fields within this message type.
	    * @private {!Array<number>}
	    * @const
	    */
	proto.cn.leancloud.play.proto.GenericCollection.repeatedFields_ = [1, 2];

	if (googleProtobuf.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.cn.leancloud.play.proto.GenericCollection.prototype.toObject = function (
	  opt_includeInstance)
	  {
	    return proto.cn.leancloud.play.proto.GenericCollection.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.cn.leancloud.play.proto.GenericCollection} msg The msg instance to transform.
	      * @return {!Object}
	      * @suppress {unusedLocalVariables} f is only used for nested messages
	      */
	  proto.cn.leancloud.play.proto.GenericCollection.toObject = function (
	  includeInstance,
	  msg)
	  {
	    var obj = {
	      listValueList: googleProtobuf.Message.toObjectList(
	      msg.getListValueList(),
	      proto.cn.leancloud.play.proto.GenericCollectionValue.toObject,
	      includeInstance),

	      mapEntryValueList: googleProtobuf.Message.toObjectList(
	      msg.getMapEntryValueList(),
	      proto.cn.leancloud.play.proto.GenericCollection.MapEntry.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.cn.leancloud.play.proto.GenericCollection}
	   */
	proto.cn.leancloud.play.proto.GenericCollection.deserializeBinary = function (
	bytes)
	{
	  var reader = new googleProtobuf.BinaryReader(bytes);
	  var msg = new proto.cn.leancloud.play.proto.GenericCollection();
	  return proto.cn.leancloud.play.proto.GenericCollection.deserializeBinaryFromReader(
	  msg,
	  reader);

	};

	/**
	    * Deserializes binary data (in protobuf wire format) from the
	    * given reader into the given message object.
	    * @param {!proto.cn.leancloud.play.proto.GenericCollection} msg The message object to deserialize into.
	    * @param {!jspb.BinaryReader} reader The BinaryReader to use.
	    * @return {!proto.cn.leancloud.play.proto.GenericCollection}
	    */
	proto.cn.leancloud.play.proto.GenericCollection.deserializeBinaryFromReader = function (
	msg,
	reader)
	{
	  while (reader.nextField()) {
	    if (reader.isEndGroup()) {
	      break;
	    }
	    var field = reader.getFieldNumber();
	    switch (field) {
	      case 1:
	        var value = new proto.cn.leancloud.play.proto.GenericCollectionValue();
	        reader.readMessage(
	        value,
	        proto.cn.leancloud.play.proto.GenericCollectionValue.
	        deserializeBinaryFromReader);

	        msg.addListValue(value);
	        break;
	      case 2:
	        var value = new proto.cn.leancloud.play.proto.GenericCollection.MapEntry();
	        reader.readMessage(
	        value,
	        proto.cn.leancloud.play.proto.GenericCollection.MapEntry.
	        deserializeBinaryFromReader);

	        msg.addMapEntryValue(value);
	        break;
	      default:
	        reader.skipField();
	        break;}

	  }
	  return msg;
	};

	/**
	    * Serializes the message to binary data (in protobuf wire format).
	    * @return {!Uint8Array}
	    */
	proto.cn.leancloud.play.proto.GenericCollection.prototype.serializeBinary = function () {
	  var writer = new googleProtobuf.BinaryWriter();
	  proto.cn.leancloud.play.proto.GenericCollection.serializeBinaryToWriter(
	  this,
	  writer);

	  return writer.getResultBuffer();
	};

	/**
	    * Serializes the given message to binary data (in protobuf wire
	    * format), writing to the given BinaryWriter.
	    * @param {!proto.cn.leancloud.play.proto.GenericCollection} message
	    * @param {!jspb.BinaryWriter} writer
	    * @suppress {unusedLocalVariables} f is only used for nested messages
	    */
	proto.cn.leancloud.play.proto.GenericCollection.serializeBinaryToWriter = function (
	message,
	writer)
	{
	  var f = undefined;
	  f = message.getListValueList();
	  if (f.length > 0) {
	    writer.writeRepeatedMessage(
	    1,
	    f,
	    proto.cn.leancloud.play.proto.GenericCollectionValue.
	    serializeBinaryToWriter);

	  }
	  f = message.getMapEntryValueList();
	  if (f.length > 0) {
	    writer.writeRepeatedMessage(
	    2,
	    f,
	    proto.cn.leancloud.play.proto.GenericCollection.MapEntry.
	    serializeBinaryToWriter);

	  }
	};

	if (googleProtobuf.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.cn.leancloud.play.proto.GenericCollection.MapEntry.prototype.toObject = function (
	  opt_includeInstance)
	  {
	    return proto.cn.leancloud.play.proto.GenericCollection.MapEntry.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.cn.leancloud.play.proto.GenericCollection.MapEntry} msg The msg instance to transform.
	      * @return {!Object}
	      * @suppress {unusedLocalVariables} f is only used for nested messages
	      */
	  proto.cn.leancloud.play.proto.GenericCollection.MapEntry.toObject = function (
	  includeInstance,
	  msg)
	  {
	    var f,
	    obj = {
	      key: googleProtobuf.Message.getFieldWithDefault(msg, 1, ''),
	      val:
	      (f = msg.getVal()) &&
	      proto.cn.leancloud.play.proto.GenericCollectionValue.toObject(
	      includeInstance,
	      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.cn.leancloud.play.proto.GenericCollection.MapEntry}
	   */
	proto.cn.leancloud.play.proto.GenericCollection.MapEntry.deserializeBinary = function (
	bytes)
	{
	  var reader = new googleProtobuf.BinaryReader(bytes);
	  var msg = new proto.cn.leancloud.play.proto.GenericCollection.MapEntry();
	  return proto.cn.leancloud.play.proto.GenericCollection.MapEntry.deserializeBinaryFromReader(
	  msg,
	  reader);

	};

	/**
	    * Deserializes binary data (in protobuf wire format) from the
	    * given reader into the given message object.
	    * @param {!proto.cn.leancloud.play.proto.GenericCollection.MapEntry} msg The message object to deserialize into.
	    * @param {!jspb.BinaryReader} reader The BinaryReader to use.
	    * @return {!proto.cn.leancloud.play.proto.GenericCollection.MapEntry}
	    */
	proto.cn.leancloud.play.proto.GenericCollection.MapEntry.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.setKey(value);
	        break;
	      case 2:
	        var value = new proto.cn.leancloud.play.proto.GenericCollectionValue();
	        reader.readMessage(
	        value,
	        proto.cn.leancloud.play.proto.GenericCollectionValue.
	        deserializeBinaryFromReader);

	        msg.setVal(value);
	        break;
	      default:
	        reader.skipField();
	        break;}

	  }
	  return msg;
	};

	/**
	    * Serializes the message to binary data (in protobuf wire format).
	    * @return {!Uint8Array}
	    */
	proto.cn.leancloud.play.proto.GenericCollection.MapEntry.prototype.serializeBinary = function () {
	  var writer = new googleProtobuf.BinaryWriter();
	  proto.cn.leancloud.play.proto.GenericCollection.MapEntry.serializeBinaryToWriter(
	  this,
	  writer);

	  return writer.getResultBuffer();
	};

	/**
	    * Serializes the given message to binary data (in protobuf wire
	    * format), writing to the given BinaryWriter.
	    * @param {!proto.cn.leancloud.play.proto.GenericCollection.MapEntry} message
	    * @param {!jspb.BinaryWriter} writer
	    * @suppress {unusedLocalVariables} f is only used for nested messages
	    */
	proto.cn.leancloud.play.proto.GenericCollection.MapEntry.serializeBinaryToWriter = function (
	message,
	writer)
	{
	  var f = undefined;
	  f = message.getKey();
	  if (f.length > 0) {
	    writer.writeString(1, f);
	  }
	  f = message.getVal();
	  if (f != null) {
	    writer.writeMessage(
	    2,
	    f,
	    proto.cn.leancloud.play.proto.GenericCollectionValue.
	    serializeBinaryToWriter);

	  }
	};

	/**
	    * optional string key = 1;
	    * @return {string}
	    */
	proto.cn.leancloud.play.proto.GenericCollection.MapEntry.prototype.getKey = function () {
	  return (/** @type {string} */googleProtobuf.Message.getFieldWithDefault(this, 1, ''));
	};

	/**
	    * @param {string} value
	    * @return {!proto.cn.leancloud.play.proto.GenericCollection.MapEntry} returns this
	    */
	proto.cn.leancloud.play.proto.GenericCollection.MapEntry.prototype.setKey = function (
	value)
	{
	  return googleProtobuf.Message.setProto3StringField(this, 1, value);
	};

	/**
	    * optional GenericCollectionValue val = 2;
	    * @return {?proto.cn.leancloud.play.proto.GenericCollectionValue}
	    */
	proto.cn.leancloud.play.proto.GenericCollection.MapEntry.prototype.getVal = function () {
	  return (/** @type{?proto.cn.leancloud.play.proto.GenericCollectionValue} */googleProtobuf.Message.getWrapperField(
	    this,
	    proto.cn.leancloud.play.proto.GenericCollectionValue,
	    2));

	};

	/**
	    * @param {?proto.cn.leancloud.play.proto.GenericCollectionValue|undefined} value
	    * @return {!proto.cn.leancloud.play.proto.GenericCollection.MapEntry} returns this
	    */
	proto.cn.leancloud.play.proto.GenericCollection.MapEntry.prototype.setVal = function (
	value)
	{
	  return googleProtobuf.Message.setWrapperField(this, 2, value);
	};

	/**
	    * Clears the message field making it undefined.
	    * @return {!proto.cn.leancloud.play.proto.GenericCollection.MapEntry} returns this
	    */
	proto.cn.leancloud.play.proto.GenericCollection.MapEntry.prototype.clearVal = function () {
	  return this.setVal(undefined);
	};

	/**
	    * Returns whether this field is set.
	    * @return {boolean}
	    */
	proto.cn.leancloud.play.proto.GenericCollection.MapEntry.prototype.hasVal = function () {
	  return googleProtobuf.Message.getField(this, 2) != null;
	};

	/**
	    * repeated GenericCollectionValue list_value = 1;
	    * @return {!Array<!proto.cn.leancloud.play.proto.GenericCollectionValue>}
	    */
	proto.cn.leancloud.play.proto.GenericCollection.prototype.getListValueList = function () {
	  return (/** @type{!Array<!proto.cn.leancloud.play.proto.GenericCollectionValue>} */googleProtobuf.Message.getRepeatedWrapperField(
	    this,
	    proto.cn.leancloud.play.proto.GenericCollectionValue,
	    1));

	};

	/**
	    * @param {!Array<!proto.cn.leancloud.play.proto.GenericCollectionValue>} value
	    * @return {!proto.cn.leancloud.play.proto.GenericCollection} returns this
	    */
	proto.cn.leancloud.play.proto.GenericCollection.prototype.setListValueList = function (
	value)
	{
	  return googleProtobuf.Message.setRepeatedWrapperField(this, 1, value);
	};

	/**
	    * @param {!proto.cn.leancloud.play.proto.GenericCollectionValue=} opt_value
	    * @param {number=} opt_index
	    * @return {!proto.cn.leancloud.play.proto.GenericCollectionValue}
	    */
	proto.cn.leancloud.play.proto.GenericCollection.prototype.addListValue = function (
	opt_value,
	opt_index)
	{
	  return googleProtobuf.Message.addToRepeatedWrapperField(
	  this,
	  1,
	  opt_value,
	  proto.cn.leancloud.play.proto.GenericCollectionValue,
	  opt_index);

	};

	/**
	    * Clears the list making it empty but non-null.
	    * @return {!proto.cn.leancloud.play.proto.GenericCollection} returns this
	    */
	proto.cn.leancloud.play.proto.GenericCollection.prototype.clearListValueList = function () {
	  return this.setListValueList([]);
	};

	/**
	    * repeated MapEntry map_entry_value = 2;
	    * @return {!Array<!proto.cn.leancloud.play.proto.GenericCollection.MapEntry>}
	    */
	proto.cn.leancloud.play.proto.GenericCollection.prototype.getMapEntryValueList = function () {
	  return (/** @type{!Array<!proto.cn.leancloud.play.proto.GenericCollection.MapEntry>} */googleProtobuf.Message.getRepeatedWrapperField(
	    this,
	    proto.cn.leancloud.play.proto.GenericCollection.MapEntry,
	    2));

	};

	/**
	    * @param {!Array<!proto.cn.leancloud.play.proto.GenericCollection.MapEntry>} value
	    * @return {!proto.cn.leancloud.play.proto.GenericCollection} returns this
	    */
	proto.cn.leancloud.play.proto.GenericCollection.prototype.setMapEntryValueList = function (
	value)
	{
	  return googleProtobuf.Message.setRepeatedWrapperField(this, 2, value);
	};

	/**
	    * @param {!proto.cn.leancloud.play.proto.GenericCollection.MapEntry=} opt_value
	    * @param {number=} opt_index
	    * @return {!proto.cn.leancloud.play.proto.GenericCollection.MapEntry}
	    */
	proto.cn.leancloud.play.proto.GenericCollection.prototype.addMapEntryValue = function (
	opt_value,
	opt_index)
	{
	  return googleProtobuf.Message.addToRepeatedWrapperField(
	  this,
	  2,
	  opt_value,
	  proto.cn.leancloud.play.proto.GenericCollection.MapEntry,
	  opt_index);

	};

	/**
	    * Clears the list making it empty but non-null.
	    * @return {!proto.cn.leancloud.play.proto.GenericCollection} returns this
	    */
	proto.cn.leancloud.play.proto.GenericCollection.prototype.clearMapEntryValueList = function () {
	  return this.setMapEntryValueList([]);
	};

	goog.object.extend(exports, proto);
	});

	var _genericCollection$cn =




	generic_collection_pb.cn.leancloud.play.proto,GenericCollectionValue = _genericCollection$cn.GenericCollectionValue,GenericCollection = _genericCollection$cn.GenericCollection;

	// import {
	//   GenericCollectionValue,
	//   GenericCollection,
	// } from './proto/generic_collection_pb';

	// import './proto/generic_collection_pb';

	var _typeNameMap = {};
	var _typeIdMap = {};

	/**
	                      * 注册自定义类型的序列化
	                      * @param {*} type 类型
	                      * @param {number} typeId 类型 Id
	                      * @param {function} serializeMethod 序列化方法
	                      * @param {function} deserializeMethod 反序列化方法
	                      */
	function registerType(type, typeId, serializeMethod, deserializeMethod) {
	  if (type === undefined || typeof type !== 'function') {
	    throw new TypeError('type must be a class');
	  }
	  if (serializeMethod === undefined || typeof serializeMethod !== 'function') {
	    throw new TypeError('serializeMethod must be a function');
	  }
	  if (
	  deserializeMethod === undefined ||
	  typeof deserializeMethod !== 'function')
	  {
	    throw new TypeError('deserializeMethod must be a function');
	  }
	  var customType = {
	    type: type,
	    typeId: typeId,
	    serializeMethod: serializeMethod,
	    deserializeMethod: deserializeMethod };var

	  typeName = type.name;
	  _typeNameMap[typeName] = customType;
	  _typeIdMap[typeId] = customType;
	}

	/* eslint no-use-before-define: ["error", { "functions": false }] */
	function serialize(val) {
	  var genericVal = new GenericCollectionValue();
	  if (val === null) {
	    genericVal.setType(GenericCollectionValue.Type.NULL);
	  } else if (typeof val === 'boolean') {
	    genericVal.setType(GenericCollectionValue.Type.BOOL);
	    genericVal.setBoolValue(val);
	  } else if (typeof val === 'number') {
	    if (parseInt(val, 10) === val) {
	      genericVal.setType(GenericCollectionValue.Type.INT);
	      genericVal.setIntValue(val);
	    } else {
	      genericVal.setType(GenericCollectionValue.Type.DOUBLE);
	      genericVal.setDoubleValue(val);
	    }
	  } else if (typeof val === 'string') {
	    genericVal.setType(GenericCollectionValue.Type.STRING);
	    genericVal.setStringValue(val);
	  } else if (val instanceof Array) {
	    // 数组
	    genericVal.setType(GenericCollectionValue.Type.ARRAY);
	    var vList = [];
	    val.forEach(function (v) {
	      vList.push(serialize(v));
	    });
	    var list = new GenericCollection();
	    list.setListValueList(vList);
	    genericVal.setBytesValue(list.serializeBinary());
	  } else if (val instanceof Object) {
	    var typeName = val.constructor.name;
	    var customType = _typeNameMap[typeName];
	    if (customType) {
	      // 自定义类型
	      genericVal.setType(GenericCollectionValue.Type.OBJECT);var
	      typeId = customType.typeId,serializeMethod = customType.serializeMethod;
	      genericVal.setObjectTypeId(typeId);
	      genericVal.setBytesValue(serializeMethod(val));
	    } else {
	      // Map
	      genericVal.setType(GenericCollectionValue.Type.MAP);
	      genericVal.setBytesValue(serializeObject(val));
	    }
	  } else {
	    // 其他类型
	    throw new TypeError((typeof val === 'undefined' ? 'undefined' : _typeof(val)) + ' is not supported');
	  }
	  return genericVal;
	}

	function deserialize(genericVal) {
	  var val = null;
	  switch (genericVal.getType()) {
	    case GenericCollectionValue.Type.NULL:
	      // Nothing
	      break;
	    case GenericCollectionValue.Type.BOOL:
	      val = genericVal.getBoolValue();
	      break;
	    case GenericCollectionValue.Type.BYTE:
	      val = genericVal.getByteValue();
	      break;
	    case GenericCollectionValue.Type.SHORT:
	      val = genericVal.getShortValue();
	      break;
	    case GenericCollectionValue.Type.INT:
	      val = genericVal.getIntValue();
	      break;
	    case GenericCollectionValue.Type.LONG:
	      val = genericVal.getLongValue();
	      break;
	    case GenericCollectionValue.Type.FLOAT:
	      val = genericVal.getFloatValue();
	      break;
	    case GenericCollectionValue.Type.DOUBLE:
	      val = genericVal.getDoubleValue();
	      break;
	    case GenericCollectionValue.Type.STRING:
	      val = genericVal.getStringValue();
	      break;
	    case GenericCollectionValue.Type.MAP:
	      {
	        var bytes = genericVal.getBytesValue();
	        val = deserializeObject(bytes);
	      }
	      break;
	    case GenericCollectionValue.Type.ARRAY:
	      {
	        var _bytes = genericVal.getBytesValue();
	        val = [];
	        var list = GenericCollection.deserializeBinary(_bytes);
	        list.getListValueList().forEach(function (v) {
	          val.push(deserialize(v));
	        });
	      }
	      break;
	    case GenericCollectionValue.Type.OBJECT:
	      {
	        var typeId = genericVal.getObjectTypeId();
	        var customType = _typeIdMap[typeId];
	        if (customType) {
	          var _bytes2 = genericVal.getBytesValue();var
	          deserializeMethod = customType.deserializeMethod;
	          val = deserializeMethod(_bytes2);
	        } else {
	          throw new TypeError('type id: ' + typeId + ' is not supported');
	        }
	      }
	      break;
	}

	  return val;
	}

	/**
	   * 序列化 object
	   * @param {*} obj 要序列化的 object
	   */
	function serializeObject(obj) {
	  if (obj === undefined) {
	    return null;
	  }
	  var entryList = [];
	  _Object$entries(obj).forEach(function (_ref) {var _ref2 = _slicedToArray(_ref, 2),key = _ref2[0],val = _ref2[1];
	    if (typeof val === 'undefined') {
	      return;
	    }
	    var entry = new GenericCollection.MapEntry();
	    entry.setKey(key);
	    entry.setVal(serialize(val));
	    entryList.push(entry);
	  });
	  var map = new GenericCollection();
	  map.setMapEntryValueList(entryList);
	  return map.serializeBinary();
	}

	/**
	   * 反序列化 object
	   * @param {*} bytes 字节数组
	   */
	function deserializeObject(bytes) {
	  if (bytes === undefined) {
	    return null;
	  }
	  var map = GenericCollection.deserializeBinary(bytes);
	  var obj = {};
	  map.getMapEntryValueList().forEach(function (entry) {
	    obj[entry.getKey()] = deserialize(entry.getVal());
	  });
	  return obj;
	}

	/**
	                                * 玩家类
	                                */var Player = function () {
	  function Player(room) {_classCallCheck(this, Player);
	    this._userId = '';
	    this._actorId = 0;
	    this._active = true;
	    this._properties = {};
	    this._room = room;
	  }

	  /**
	     * 玩家 ID
	     * @type {String}
	     * @readonly
	     */_createClass(Player, [{ key: 'setCustomProperties',








































	    /**
	                                                            * 设置玩家的自定义属性
	                                                            * @param {Object} properties 自定义属性
	                                                            * @param {Object} [opts] 设置选项
	                                                            * @param {Object} [opts.expectedValues] 期望属性，用于 CAS 检测
	                                                            */value: function setCustomProperties(
	    properties) {var _this = this;var _ref = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},_ref$expectedValues = _ref.expectedValues,expectedValues = _ref$expectedValues === undefined ? null : _ref$expectedValues;
	      return this._room.
	      setPlayerProperties(this.actorId, properties, expectedValues).
	      then(
	      tap(function (res) {var
	        aId = res.actorId,attr = res.attr;
	        if (aId === _this.actorId && attr) {
	          _this._mergeProperties(attr);
	        }
	      }));

	    }

	    /**
	       * 获取自定义属性
	       * @type {Object}
	       * @readonly
	       */ }, { key: '_init', value: function _init(




	    playerData) {
	      this._userId = playerData.getPid();
	      this._actorId = playerData.getActorId();
	      this._active = !playerData.getInactive();
	      this._properties = deserializeObject(playerData.getAttr());
	    } }, { key: '_mergeProperties', value: function _mergeProperties(

	    changedProperties) {
	      this._properties = _Object$assign(this._properties, changedProperties);
	    } }, { key: 'userId', get: function get() {return this._userId;} /**
	                                                                      * 房间玩家 ID
	                                                                      * @type {Number}
	                                                                      * @readonly
	                                                                      */ }, { key: 'actorId', get: function get() {return this._actorId;} /**
	                                                                                                                                           * 判断是不是当前客户端玩家
	                                                                                                                                           * @type {Boolean}
	                                                                                                                                           * @readonly
	                                                                                                                                           */ }, { key: 'isLocal', get: function get() {return this._actorId !== 0 && this._room._client.userId === this._userId;} /**
	                                                                                                                                                                                                                                                                    * 判断是不是主机玩家
	                                                                                                                                                                                                                                                                    * @type {Boolean}
	                                                                                                                                                                                                                                                                    * @readonly
	                                                                                                                                                                                                                                                                    */ }, { key: 'isMaster', get: function get() {return this._actorId !== 0 && this._room.masterId === this._actorId;} /**
	                                                                                                                                                                                                                                                                                                                                                                                         * 判断是不是活跃状态
	                                                                                                                                                                                                                                                                                                                                                                                         * @type {Boolean}
	                                                                                                                                                                                                                                                                                                                                                                                         * @readonly
	                                                                                                                                                                                                                                                                                                                                                                                         */ }, { key: 'isActive', get: function get() {return this._active;} }, { key: 'customProperties', get: function get() {return this._properties;} }]);return Player;}();

	// 19.1.2.14 Object.keys(O)



	_objectSap('keys', function () {
	  return function keys(it) {
	    return _objectKeys(_toObject(it));
	  };
	});

	var keys$1 = _core.Object.keys;

	var keys = createCommonjsModule(function (module) {
	module.exports = { "default": keys$1, __esModule: true };
	});

	var _Object$keys = unwrapExports(keys);

	var PlayErrorCode = {
	  // 打开 WebSocket 错误
	  OPEN_WEBSOCKET_ERROR: 10001,
	  // 发送消息状态错误
	  SEND_MESSAGE_STATE_ERROR: 10002,
	  // 状态错误
	  STATE_ERROR: 10003 };

	// https://github.com/maxogden/websocket-stream/blob/48dc3ddf943e5ada668c31ccd94e9186f02fafbd/ws-fallback.js

	var ws = null;

	if (typeof WebSocket !== 'undefined') {
	  ws = WebSocket;
	} else if (typeof MozWebSocket !== 'undefined') {
	  ws = MozWebSocket;
	} else if (typeof commonjsGlobal !== 'undefined') {
	  ws = commonjsGlobal.WebSocket || commonjsGlobal.MozWebSocket;
	} else if (typeof window !== 'undefined') {
	  ws = window.WebSocket || window.MozWebSocket;
	} else if (typeof self !== 'undefined') {
	  ws = self.WebSocket || self.MozWebSocket;
	}

	var browser = ws;

	var adapters = {
	  WebSocket: browser };


	/**
	                           * 设置适配器
	                           * @param {Object} newAdapters
	                           * @param {Function} newAdapters.WebSocketAdapter WebSocket 适配器，Cocos Creator 打包 android 平台时需要传入 CA 证书
	                           */
	function setAdapters(newAdapters) {
	  _Object$assign(adapters, newAdapters);
	}

	var wrappers_pb = createCommonjsModule(function (module, exports) {
	// source: google/protobuf/wrappers.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 goog = googleProtobuf;
	var global = Function('return this')();

	goog.exportSymbol('proto.google.protobuf.BoolValue', null, global);
	goog.exportSymbol('proto.google.protobuf.BytesValue', null, global);
	goog.exportSymbol('proto.google.protobuf.DoubleValue', null, global);
	goog.exportSymbol('proto.google.protobuf.FloatValue', null, global);
	goog.exportSymbol('proto.google.protobuf.Int32Value', null, global);
	goog.exportSymbol('proto.google.protobuf.Int64Value', null, global);
	goog.exportSymbol('proto.google.protobuf.StringValue', null, global);
	goog.exportSymbol('proto.google.protobuf.UInt32Value', null, global);
	goog.exportSymbol('proto.google.protobuf.UInt64Value', null, global);
	var { proto } = 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.google.protobuf.DoubleValue = function(opt_data) {
	  googleProtobuf.Message.initialize(this, opt_data, 0, -1, null, null);
	};
	goog.inherits(proto.google.protobuf.DoubleValue, googleProtobuf.Message);
	if (goog.DEBUG && !COMPILED) {
	  /**
	   * @public
	   * @override
	   */
	  proto.google.protobuf.DoubleValue.displayName = 'proto.google.protobuf.DoubleValue';
	}
	/**
	 * 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.google.protobuf.FloatValue = function(opt_data) {
	  googleProtobuf.Message.initialize(this, opt_data, 0, -1, null, null);
	};
	goog.inherits(proto.google.protobuf.FloatValue, googleProtobuf.Message);
	if (goog.DEBUG && !COMPILED) {
	  /**
	   * @public
	   * @override
	   */
	  proto.google.protobuf.FloatValue.displayName = 'proto.google.protobuf.FloatValue';
	}
	/**
	 * 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.google.protobuf.Int64Value = function(opt_data) {
	  googleProtobuf.Message.initialize(this, opt_data, 0, -1, null, null);
	};
	goog.inherits(proto.google.protobuf.Int64Value, googleProtobuf.Message);
	if (goog.DEBUG && !COMPILED) {
	  /**
	   * @public
	   * @override
	   */
	  proto.google.protobuf.Int64Value.displayName = 'proto.google.protobuf.Int64Value';
	}
	/**
	 * 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.google.protobuf.UInt64Value = function(opt_data) {
	  googleProtobuf.Message.initialize(this, opt_data, 0, -1, null, null);
	};
	goog.inherits(proto.google.protobuf.UInt64Value, googleProtobuf.Message);
	if (goog.DEBUG && !COMPILED) {
	  /**
	   * @public
	   * @override
	   */
	  proto.google.protobuf.UInt64Value.displayName = 'proto.google.protobuf.UInt64Value';
	}
	/**
	 * 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.google.protobuf.Int32Value = function(opt_data) {
	  googleProtobuf.Message.initialize(this, opt_data, 0, -1, null, null);
	};
	goog.inherits(proto.google.protobuf.Int32Value, googleProtobuf.Message);
	if (goog.DEBUG && !COMPILED) {
	  /**
	   * @public
	   * @override
	   */
	  proto.google.protobuf.Int32Value.displayName = 'proto.google.protobuf.Int32Value';
	}
	/**
	 * 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.google.protobuf.UInt32Value = function(opt_data) {
	  googleProtobuf.Message.initialize(this, opt_data, 0, -1, null, null);
	};
	goog.inherits(proto.google.protobuf.UInt32Value, googleProtobuf.Message);
	if (goog.DEBUG && !COMPILED) {
	  /**
	   * @public
	   * @override
	   */
	  proto.google.protobuf.UInt32Value.displayName = 'proto.google.protobuf.UInt32Value';
	}
	/**
	 * 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.google.protobuf.BoolValue = function(opt_data) {
	  googleProtobuf.Message.initialize(this, opt_data, 0, -1, null, null);
	};
	goog.inherits(proto.google.protobuf.BoolValue, googleProtobuf.Message);
	if (goog.DEBUG && !COMPILED) {
	  /**
	   * @public
	   * @override
	   */
	  proto.google.protobuf.BoolValue.displayName = 'proto.google.protobuf.BoolValue';
	}
	/**
	 * 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.google.protobuf.StringValue = function(opt_data) {
	  googleProtobuf.Message.initialize(this, opt_data, 0, -1, null, null);
	};
	goog.inherits(proto.google.protobuf.StringValue, googleProtobuf.Message);
	if (goog.DEBUG && !COMPILED) {
	  /**
	   * @public
	   * @override
	   */
	  proto.google.protobuf.StringValue.displayName = 'proto.google.protobuf.StringValue';
	}
	/**
	 * 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.google.protobuf.BytesValue = function(opt_data) {
	  googleProtobuf.Message.initialize(this, opt_data, 0, -1, null, null);
	};
	goog.inherits(proto.google.protobuf.BytesValue, googleProtobuf.Message);
	if (goog.DEBUG && !COMPILED) {
	  /**
	   * @public
	   * @override
	   */
	  proto.google.protobuf.BytesValue.displayName = 'proto.google.protobuf.BytesValue';
	}



	if (googleProtobuf.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.google.protobuf.DoubleValue.prototype.toObject = function(opt_includeInstance) {
	  return proto.google.protobuf.DoubleValue.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.google.protobuf.DoubleValue} msg The msg instance to transform.
	 * @return {!Object}
	 * @suppress {unusedLocalVariables} f is only used for nested messages
	 */
	proto.google.protobuf.DoubleValue.toObject = function(includeInstance, msg) {
	  var obj = {
	    value: googleProtobuf.Message.getFloatingPointFieldWithDefault(msg, 1, 0.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.google.protobuf.DoubleValue}
	 */
	proto.google.protobuf.DoubleValue.deserializeBinary = function(bytes) {
	  var reader = new googleProtobuf.BinaryReader(bytes);
	  var msg = new proto.google.protobuf.DoubleValue;
	  return proto.google.protobuf.DoubleValue.deserializeBinaryFromReader(msg, reader);
	};


	/**
	 * Deserializes binary data (in protobuf wire format) from the
	 * given reader into the given message object.
	 * @param {!proto.google.protobuf.DoubleValue} msg The message object to deserialize into.
	 * @param {!jspb.BinaryReader} reader The BinaryReader to use.
	 * @return {!proto.google.protobuf.DoubleValue}
	 */
	proto.google.protobuf.DoubleValue.deserializeBinaryFromReader = function(msg, reader) {
	  while (reader.nextField()) {
	    if (reader.isEndGroup()) {
	      break;
	    }
	    var field = reader.getFieldNumber();
	    switch (field) {
	    case 1:
	      var value = /** @type {number} */ (reader.readDouble());
	      msg.setValue(value);
	      break;
	    default:
	      reader.skipField();
	      break;
	    }
	  }
	  return msg;
	};


	/**
	 * Serializes the message to binary data (in protobuf wire format).
	 * @return {!Uint8Array}
	 */
	proto.google.protobuf.DoubleValue.prototype.serializeBinary = function() {
	  var writer = new googleProtobuf.BinaryWriter();
	  proto.google.protobuf.DoubleValue.serializeBinaryToWriter(this, writer);
	  return writer.getResultBuffer();
	};


	/**
	 * Serializes the given message to binary data (in protobuf wire
	 * format), writing to the given BinaryWriter.
	 * @param {!proto.google.protobuf.DoubleValue} message
	 * @param {!jspb.BinaryWriter} writer
	 * @suppress {unusedLocalVariables} f is only used for nested messages
	 */
	proto.google.protobuf.DoubleValue.serializeBinaryToWriter = function(message, writer) {
	  var f = undefined;
	  f = message.getValue();
	  if (f !== 0.0) {
	    writer.writeDouble(
	      1,
	      f
	    );
	  }
	};


	/**
	 * optional double value = 1;
	 * @return {number}
	 */
	proto.google.protobuf.DoubleValue.prototype.getValue = function() {
	  return /** @type {number} */ (googleProtobuf.Message.getFloatingPointFieldWithDefault(this, 1, 0.0));
	};


	/**
	 * @param {number} value
	 * @return {!proto.google.protobuf.DoubleValue} returns this
	 */
	proto.google.protobuf.DoubleValue.prototype.setValue = function(value) {
	  return googleProtobuf.Message.setProto3FloatField(this, 1, value);
	};





	if (googleProtobuf.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.google.protobuf.FloatValue.prototype.toObject = function(opt_includeInstance) {
	  return proto.google.protobuf.FloatValue.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.google.protobuf.FloatValue} msg The msg instance to transform.
	 * @return {!Object}
	 * @suppress {unusedLocalVariables} f is only used for nested messages
	 */
	proto.google.protobuf.FloatValue.toObject = function(includeInstance, msg) {
	  var obj = {
	    value: googleProtobuf.Message.getFloatingPointFieldWithDefault(msg, 1, 0.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.google.protobuf.FloatValue}
	 */
	proto.google.protobuf.FloatValue.deserializeBinary = function(bytes) {
	  var reader = new googleProtobuf.BinaryReader(bytes);
	  var msg = new proto.google.protobuf.FloatValue;
	  return proto.google.protobuf.FloatValue.deserializeBinaryFromReader(msg, reader);
	};


	/**
	 * Deserializes binary data (in protobuf wire format) from the
	 * given reader into the given message object.
	 * @param {!proto.google.protobuf.FloatValue} msg The message object to deserialize into.
	 * @param {!jspb.BinaryReader} reader The BinaryReader to use.
	 * @return {!proto.google.protobuf.FloatValue}
	 */
	proto.google.protobuf.FloatValue.deserializeBinaryFromReader = function(msg, reader) {
	  while (reader.nextField()) {
	    if (reader.isEndGroup()) {
	      break;
	    }
	    var field = reader.getFieldNumber();
	    switch (field) {
	    case 1:
	      var value = /** @type {number} */ (reader.readFloat());
	      msg.setValue(value);
	      break;
	    default:
	      reader.skipField();
	      break;
	    }
	  }
	  return msg;
	};


	/**
	 * Serializes the message to binary data (in protobuf wire format).
	 * @return {!Uint8Array}
	 */
	proto.google.protobuf.FloatValue.prototype.serializeBinary = function() {
	  var writer = new googleProtobuf.BinaryWriter();
	  proto.google.protobuf.FloatValue.serializeBinaryToWriter(this, writer);
	  return writer.getResultBuffer();
	};


	/**
	 * Serializes the given message to binary data (in protobuf wire
	 * format), writing to the given BinaryWriter.
	 * @param {!proto.google.protobuf.FloatValue} message
	 * @param {!jspb.BinaryWriter} writer
	 * @suppress {unusedLocalVariables} f is only used for nested messages
	 */
	proto.google.protobuf.FloatValue.serializeBinaryToWriter = function(message, writer) {
	  var f = undefined;
	  f = message.getValue();
	  if (f !== 0.0) {
	    writer.writeFloat(
	      1,
	      f
	    );
	  }
	};


	/**
	 * optional float value = 1;
	 * @return {number}
	 */
	proto.google.protobuf.FloatValue.prototype.getValue = function() {
	  return /** @type {number} */ (googleProtobuf.Message.getFloatingPointFieldWithDefault(this, 1, 0.0));
	};


	/**
	 * @param {number} value
	 * @return {!proto.google.protobuf.FloatValue} returns this
	 */
	proto.google.protobuf.FloatValue.prototype.setValue = function(value) {
	  return googleProtobuf.Message.setProto3FloatField(this, 1, value);
	};





	if (googleProtobuf.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.google.protobuf.Int64Value.prototype.toObject = function(opt_includeInstance) {
	  return proto.google.protobuf.Int64Value.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.google.protobuf.Int64Value} msg The msg instance to transform.
	 * @return {!Object}
	 * @suppress {unusedLocalVariables} f is only used for nested messages
	 */
	proto.google.protobuf.Int64Value.toObject = function(includeInstance, msg) {
	  var obj = {
	    value: googleProtobuf.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.google.protobuf.Int64Value}
	 */
	proto.google.protobuf.Int64Value.deserializeBinary = function(bytes) {
	  var reader = new googleProtobuf.BinaryReader(bytes);
	  var msg = new proto.google.protobuf.Int64Value;
	  return proto.google.protobuf.Int64Value.deserializeBinaryFromReader(msg, reader);
	};


	/**
	 * Deserializes binary data (in protobuf wire format) from the
	 * given reader into the given message object.
	 * @param {!proto.google.protobuf.Int64Value} msg The message object to deserialize into.
	 * @param {!jspb.BinaryReader} reader The BinaryReader to use.
	 * @return {!proto.google.protobuf.Int64Value}
	 */
	proto.google.protobuf.Int64Value.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.setValue(value);
	      break;
	    default:
	      reader.skipField();
	      break;
	    }
	  }
	  return msg;
	};


	/**
	 * Serializes the message to binary data (in protobuf wire format).
	 * @return {!Uint8Array}
	 */
	proto.google.protobuf.Int64Value.prototype.serializeBinary = function() {
	  var writer = new googleProtobuf.BinaryWriter();
	  proto.google.protobuf.Int64Value.serializeBinaryToWriter(this, writer);
	  return writer.getResultBuffer();
	};


	/**
	 * Serializes the given message to binary data (in protobuf wire
	 * format), writing to the given BinaryWriter.
	 * @param {!proto.google.protobuf.Int64Value} message
	 * @param {!jspb.BinaryWriter} writer
	 * @suppress {unusedLocalVariables} f is only used for nested messages
	 */
	proto.google.protobuf.Int64Value.serializeBinaryToWriter = function(message, writer) {
	  var f = undefined;
	  f = message.getValue();
	  if (f !== 0) {
	    writer.writeInt64(
	      1,
	      f
	    );
	  }
	};


	/**
	 * optional int64 value = 1;
	 * @return {number}
	 */
	proto.google.protobuf.Int64Value.prototype.getValue = function() {
	  return /** @type {number} */ (googleProtobuf.Message.getFieldWithDefault(this, 1, 0));
	};


	/**
	 * @param {number} value
	 * @return {!proto.google.protobuf.Int64Value} returns this
	 */
	proto.google.protobuf.Int64Value.prototype.setValue = function(value) {
	  return googleProtobuf.Message.setProto3IntField(this, 1, value);
	};





	if (googleProtobuf.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.google.protobuf.UInt64Value.prototype.toObject = function(opt_includeInstance) {
	  return proto.google.protobuf.UInt64Value.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.google.protobuf.UInt64Value} msg The msg instance to transform.
	 * @return {!Object}
	 * @suppress {unusedLocalVariables} f is only used for nested messages
	 */
	proto.google.protobuf.UInt64Value.toObject = function(includeInstance, msg) {
	  var obj = {
	    value: googleProtobuf.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.google.protobuf.UInt64Value}
	 */
	proto.google.protobuf.UInt64Value.deserializeBinary = function(bytes) {
	  var reader = new googleProtobuf.BinaryReader(bytes);
	  var msg = new proto.google.protobuf.UInt64Value;
	  return proto.google.protobuf.UInt64Value.deserializeBinaryFromReader(msg, reader);
	};


	/**
	 * Deserializes binary data (in protobuf wire format) from the
	 * given reader into the given message object.
	 * @param {!proto.google.protobuf.UInt64Value} msg The message object to deserialize into.
	 * @param {!jspb.BinaryReader} reader The BinaryReader to use.
	 * @return {!proto.google.protobuf.UInt64Value}
	 */
	proto.google.protobuf.UInt64Value.deserializeBinaryFromReader = function(msg, reader) {
	  while (reader.nextField()) {
	    if (reader.isEndGroup()) {
	      break;
	    }
	    var field = reader.getFieldNumber();
	    switch (field) {
	    case 1:
	      var value = /** @type {number} */ (reader.readUint64());
	      msg.setValue(value);
	      break;
	    default:
	      reader.skipField();
	      break;
	    }
	  }
	  return msg;
	};


	/**
	 * Serializes the message to binary data (in protobuf wire format).
	 * @return {!Uint8Array}
	 */
	proto.google.protobuf.UInt64Value.prototype.serializeBinary = function() {
	  var writer = new googleProtobuf.BinaryWriter();
	  proto.google.protobuf.UInt64Value.serializeBinaryToWriter(this, writer);
	  return writer.getResultBuffer();
	};


	/**
	 * Serializes the given message to binary data (in protobuf wire
	 * format), writing to the given BinaryWriter.
	 * @param {!proto.google.protobuf.UInt64Value} message
	 * @param {!jspb.BinaryWriter} writer
	 * @suppress {unusedLocalVariables} f is only used for nested messages
	 */
	proto.google.protobuf.UInt64Value.serializeBinaryToWriter = function(message, writer) {
	  var f = undefined;
	  f = message.getValue();
	  if (f !== 0) {
	    writer.writeUint64(
	      1,
	      f
	    );
	  }
	};


	/**
	 * optional uint64 value = 1;
	 * @return {number}
	 */
	proto.google.protobuf.UInt64Value.prototype.getValue = function() {
	  return /** @type {number} */ (googleProtobuf.Message.getFieldWithDefault(this, 1, 0));
	};


	/**
	 * @param {number} value
	 * @return {!proto.google.protobuf.UInt64Value} returns this
	 */
	proto.google.protobuf.UInt64Value.prototype.setValue = function(value) {
	  return googleProtobuf.Message.setProto3IntField(this, 1, value);
	};





	if (googleProtobuf.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.google.protobuf.Int32Value.prototype.toObject = function(opt_includeInstance) {
	  return proto.google.protobuf.Int32Value.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.google.protobuf.Int32Value} msg The msg instance to transform.
	 * @return {!Object}
	 * @suppress {unusedLocalVariables} f is only used for nested messages
	 */
	proto.google.protobuf.Int32Value.toObject = function(includeInstance, msg) {
	  var obj = {
	    value: googleProtobuf.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.google.protobuf.Int32Value}
	 */
	proto.google.protobuf.Int32Value.deserializeBinary = function(bytes) {
	  var reader = new googleProtobuf.BinaryReader(bytes);
	  var msg = new proto.google.protobuf.Int32Value;
	  return proto.google.protobuf.Int32Value.deserializeBinaryFromReader(msg, reader);
	};


	/**
	 * Deserializes binary data (in protobuf wire format) from the
	 * given reader into the given message object.
	 * @param {!proto.google.protobuf.Int32Value} msg The message object to deserialize into.
	 * @param {!jspb.BinaryReader} reader The BinaryReader to use.
	 * @return {!proto.google.protobuf.Int32Value}
	 */
	proto.google.protobuf.Int32Value.deserializeBinaryFromReader = function(msg, reader) {
	  while (reader.nextField()) {
	    if (reader.isEndGroup()) {
	      break;
	    }
	    var field = reader.getFieldNumber();
	    switch (field) {
	    case 1:
	      var value = /** @type {number} */ (reader.readInt32());
	      msg.setValue(value);
	      break;
	    default:
	      reader.skipField();
	      break;
	    }
	  }
	  return msg;
	};


	/**
	 * Serializes the message to binary data (in protobuf wire format).
	 * @return {!Uint8Array}
	 */
	proto.google.protobuf.Int32Value.prototype.serializeBinary = function() {
	  var writer = new googleProtobuf.BinaryWriter();
	  proto.google.protobuf.Int32Value.serializeBinaryToWriter(this, writer);
	  return writer.getResultBuffer();
	};


	/**
	 * Serializes the given message to binary data (in protobuf wire
	 * format), writing to the given BinaryWriter.
	 * @param {!proto.google.protobuf.Int32Value} message
	 * @param {!jspb.BinaryWriter} writer
	 * @suppress {unusedLocalVariables} f is only used for nested messages
	 */
	proto.google.protobuf.Int32Value.serializeBinaryToWriter = function(message, writer) {
	  var f = undefined;
	  f = message.getValue();
	  if (f !== 0) {
	    writer.writeInt32(
	      1,
	      f
	    );
	  }
	};


	/**
	 * optional int32 value = 1;
	 * @return {number}
	 */
	proto.google.protobuf.Int32Value.prototype.getValue = function() {
	  return /** @type {number} */ (googleProtobuf.Message.getFieldWithDefault(this, 1, 0));
	};


	/**
	 * @param {number} value
	 * @return {!proto.google.protobuf.Int32Value} returns this
	 */
	proto.google.protobuf.Int32Value.prototype.setValue = function(value) {
	  return googleProtobuf.Message.setProto3IntField(this, 1, value);
	};





	if (googleProtobuf.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.google.protobuf.UInt32Value.prototype.toObject = function(opt_includeInstance) {
	  return proto.google.protobuf.UInt32Value.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.google.protobuf.UInt32Value} msg The msg instance to transform.
	 * @return {!Object}
	 * @suppress {unusedLocalVariables} f is only used for nested messages
	 */
	proto.google.protobuf.UInt32Value.toObject = function(includeInstance, msg) {
	  var obj = {
	    value: googleProtobuf.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.google.protobuf.UInt32Value}
	 */
	proto.google.protobuf.UInt32Value.deserializeBinary = function(bytes) {
	  var reader = new googleProtobuf.BinaryReader(bytes);
	  var msg = new proto.google.protobuf.UInt32Value;
	  return proto.google.protobuf.UInt32Value.deserializeBinaryFromReader(msg, reader);
	};


	/**
	 * Deserializes binary data (in protobuf wire format) from the
	 * given reader into the given message object.
	 * @param {!proto.google.protobuf.UInt32Value} msg The message object to deserialize into.
	 * @param {!jspb.BinaryReader} reader The BinaryReader to use.
	 * @return {!proto.google.protobuf.UInt32Value}
	 */
	proto.google.protobuf.UInt32Value.deserializeBinaryFromReader = function(msg, reader) {
	  while (reader.nextField()) {
	    if (reader.isEndGroup()) {
	      break;
	    }
	    var field = reader.getFieldNumber();
	    switch (field) {
	    case 1:
	      var value = /** @type {number} */ (reader.readUint32());
	      msg.setValue(value);
	      break;
	    default:
	      reader.skipField();
	      break;
	    }
	  }
	  return msg;
	};


	/**
	 * Serializes the message to binary data (in protobuf wire format).
	 * @return {!Uint8Array}
	 */
	proto.google.protobuf.UInt32Value.prototype.serializeBinary = function() {
	  var writer = new googleProtobuf.BinaryWriter();
	  proto.google.protobuf.UInt32Value.serializeBinaryToWriter(this, writer);
	  return writer.getResultBuffer();
	};


	/**
	 * Serializes the given message to binary data (in protobuf wire
	 * format), writing to the given BinaryWriter.
	 * @param {!proto.google.protobuf.UInt32Value} message
	 * @param {!jspb.BinaryWriter} writer
	 * @suppress {unusedLocalVariables} f is only used for nested messages
	 */
	proto.google.protobuf.UInt32Value.serializeBinaryToWriter = function(message, writer) {
	  var f = undefined;
	  f = message.getValue();
	  if (f !== 0) {
	    writer.writeUint32(
	      1,
	      f
	    );
	  }
	};


	/**
	 * optional uint32 value = 1;
	 * @return {number}
	 */
	proto.google.protobuf.UInt32Value.prototype.getValue = function() {
	  return /** @type {number} */ (googleProtobuf.Message.getFieldWithDefault(this, 1, 0));
	};


	/**
	 * @param {number} value
	 * @return {!proto.google.protobuf.UInt32Value} returns this
	 */
	proto.google.protobuf.UInt32Value.prototype.setValue = function(value) {
	  return googleProtobuf.Message.setProto3IntField(this, 1, value);
	};





	if (googleProtobuf.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.google.protobuf.BoolValue.prototype.toObject = function(opt_includeInstance) {
	  return proto.google.protobuf.BoolValue.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.google.protobuf.BoolValue} msg The msg instance to transform.
	 * @return {!Object}
	 * @suppress {unusedLocalVariables} f is only used for nested messages
	 */
	proto.google.protobuf.BoolValue.toObject = function(includeInstance, msg) {
	  var obj = {
	    value: googleProtobuf.Message.getBooleanFieldWithDefault(msg, 1, false)
	  };

	  if (includeInstance) {
	    obj.$jspbMessageInstance = msg;
	  }
	  return obj;
	};
	}


	/**
	 * Deserializes binary data (in protobuf wire format).
	 * @param {jspb.ByteSource} bytes The bytes to deserialize.
	 * @return {!proto.google.protobuf.BoolValue}
	 */
	proto.google.protobuf.BoolValue.deserializeBinary = function(bytes) {
	  var reader = new googleProtobuf.BinaryReader(bytes);
	  var msg = new proto.google.protobuf.BoolValue;
	  return proto.google.protobuf.BoolValue.deserializeBinaryFromReader(msg, reader);
	};


	/**
	 * Deserializes binary data (in protobuf wire format) from the
	 * given reader into the given message object.
	 * @param {!proto.google.protobuf.BoolValue} msg The message object to deserialize into.
	 * @param {!jspb.BinaryReader} reader The BinaryReader to use.
	 * @return {!proto.google.protobuf.BoolValue}
	 */
	proto.google.protobuf.BoolValue.deserializeBinaryFromReader = function(msg, reader) {
	  while (reader.nextField()) {
	    if (reader.isEndGroup()) {
	      break;
	    }
	    var field = reader.getFieldNumber();
	    switch (field) {
	    case 1:
	      var value = /** @type {boolean} */ (reader.readBool());
	      msg.setValue(value);
	      break;
	    default:
	      reader.skipField();
	      break;
	    }
	  }
	  return msg;
	};


	/**
	 * Serializes the message to binary data (in protobuf wire format).
	 * @return {!Uint8Array}
	 */
	proto.google.protobuf.BoolValue.prototype.serializeBinary = function() {
	  var writer = new googleProtobuf.BinaryWriter();
	  proto.google.protobuf.BoolValue.serializeBinaryToWriter(this, writer);
	  return writer.getResultBuffer();
	};


	/**
	 * Serializes the given message to binary data (in protobuf wire
	 * format), writing to the given BinaryWriter.
	 * @param {!proto.google.protobuf.BoolValue} message
	 * @param {!jspb.BinaryWriter} writer
	 * @suppress {unusedLocalVariables} f is only used for nested messages
	 */
	proto.google.protobuf.BoolValue.serializeBinaryToWriter = function(message, writer) {
	  var f = undefined;
	  f = message.getValue();
	  if (f) {
	    writer.writeBool(
	      1,
	      f
	    );
	  }
	};


	/**
	 * optional bool value = 1;
	 * @return {boolean}
	 */
	proto.google.protobuf.BoolValue.prototype.getValue = function() {
	  return /** @type {boolean} */ (googleProtobuf.Message.getBooleanFieldWithDefault(this, 1, false));
	};


	/**
	 * @param {boolean} value
	 * @return {!proto.google.protobuf.BoolValue} returns this
	 */
	proto.google.protobuf.BoolValue.prototype.setValue = function(value) {
	  return googleProtobuf.Message.setProto3BooleanField(this, 1, value);
	};





	if (googleProtobuf.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.google.protobuf.StringValue.prototype.toObject = function(opt_includeInstance) {
	  return proto.google.protobuf.StringValue.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.google.protobuf.StringValue} msg The msg instance to transform.
	 * @return {!Object}
	 * @suppress {unusedLocalVariables} f is only used for nested messages
	 */
	proto.google.protobuf.StringValue.toObject = function(includeInstance, msg) {
	  var obj = {
	    value: googleProtobuf.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.google.protobuf.StringValue}
	 */
	proto.google.protobuf.StringValue.deserializeBinary = function(bytes) {
	  var reader = new googleProtobuf.BinaryReader(bytes);
	  var msg = new proto.google.protobuf.StringValue;
	  return proto.google.protobuf.StringValue.deserializeBinaryFromReader(msg, reader);
	};


	/**
	 * Deserializes binary data (in protobuf wire format) from the
	 * given reader into the given message object.
	 * @param {!proto.google.protobuf.StringValue} msg The message object to deserialize into.
	 * @param {!jspb.BinaryReader} reader The BinaryReader to use.
	 * @return {!proto.google.protobuf.StringValue}
	 */
	proto.google.protobuf.StringValue.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.setValue(value);
	      break;
	    default:
	      reader.skipField();
	      break;
	    }
	  }
	  return msg;
	};


	/**
	 * Serializes the message to binary data (in protobuf wire format).
	 * @return {!Uint8Array}
	 */
	proto.google.protobuf.StringValue.prototype.serializeBinary = function() {
	  var writer = new googleProtobuf.BinaryWriter();
	  proto.google.protobuf.StringValue.serializeBinaryToWriter(this, writer);
	  return writer.getResultBuffer();
	};


	/**
	 * Serializes the given message to binary data (in protobuf wire
	 * format), writing to the given BinaryWriter.
	 * @param {!proto.google.protobuf.StringValue} message
	 * @param {!jspb.BinaryWriter} writer
	 * @suppress {unusedLocalVariables} f is only used for nested messages
	 */
	proto.google.protobuf.StringValue.serializeBinaryToWriter = function(message, writer) {
	  var f = undefined;
	  f = message.getValue();
	  if (f.length > 0) {
	    writer.writeString(
	      1,
	      f
	    );
	  }
	};


	/**
	 * optional string value = 1;
	 * @return {string}
	 */
	proto.google.protobuf.StringValue.prototype.getValue = function() {
	  return /** @type {string} */ (googleProtobuf.Message.getFieldWithDefault(this, 1, ""));
	};


	/**
	 * @param {string} value
	 * @return {!proto.google.protobuf.StringValue} returns this
	 */
	proto.google.protobuf.StringValue.prototype.setValue = function(value) {
	  return googleProtobuf.Message.setProto3StringField(this, 1, value);
	};





	if (googleProtobuf.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.google.protobuf.BytesValue.prototype.toObject = function(opt_includeInstance) {
	  return proto.google.protobuf.BytesValue.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.google.protobuf.BytesValue} msg The msg instance to transform.
	 * @return {!Object}
	 * @suppress {unusedLocalVariables} f is only used for nested messages
	 */
	proto.google.protobuf.BytesValue.toObject = function(includeInstance, msg) {
	  var obj = {
	    value: msg.getValue_asB64()
	  };

	  if (includeInstance) {
	    obj.$jspbMessageInstance = msg;
	  }
	  return obj;
	};
	}


	/**
	 * Deserializes binary data (in protobuf wire format).
	 * @param {jspb.ByteSource} bytes The bytes to deserialize.
	 * @return {!proto.google.protobuf.BytesValue}
	 */
	proto.google.protobuf.BytesValue.deserializeBinary = function(bytes) {
	  var reader = new googleProtobuf.BinaryReader(bytes);
	  var msg = new proto.google.protobuf.BytesValue;
	  return proto.google.protobuf.BytesValue.deserializeBinaryFromReader(msg, reader);
	};


	/**
	 * Deserializes binary data (in protobuf wire format) from the
	 * given reader into the given message object.
	 * @param {!proto.google.protobuf.BytesValue} msg The message object to deserialize into.
	 * @param {!jspb.BinaryReader} reader The BinaryReader to use.
	 * @return {!proto.google.protobuf.BytesValue}
	 */
	proto.google.protobuf.BytesValue.deserializeBinaryFromReader = function(msg, reader) {
	  while (reader.nextField()) {
	    if (reader.isEndGroup()) {
	      break;
	    }
	    var field = reader.getFieldNumber();
	    switch (field) {
	    case 1:
	      var value = /** @type {!Uint8Array} */ (reader.readBytes());
	      msg.setValue(value);
	      break;
	    default:
	      reader.skipField();
	      break;
	    }
	  }
	  return msg;
	};


	/**
	 * Serializes the message to binary data (in protobuf wire format).
	 * @return {!Uint8Array}
	 */
	proto.google.protobuf.BytesValue.prototype.serializeBinary = function() {
	  var writer = new googleProtobuf.BinaryWriter();
	  proto.google.protobuf.BytesValue.serializeBinaryToWriter(this, writer);
	  return writer.getResultBuffer();
	};


	/**
	 * Serializes the given message to binary data (in protobuf wire
	 * format), writing to the given BinaryWriter.
	 * @param {!proto.google.protobuf.BytesValue} message
	 * @param {!jspb.BinaryWriter} writer
	 * @suppress {unusedLocalVariables} f is only used for nested messages
	 */
	proto.google.protobuf.BytesValue.serializeBinaryToWriter = function(message, writer) {
	  var f = undefined;
	  f = message.getValue_asU8();
	  if (f.length > 0) {
	    writer.writeBytes(
	      1,
	      f
	    );
	  }
	};


	/**
	 * optional bytes value = 1;
	 * @return {!(string|Uint8Array)}
	 */
	proto.google.protobuf.BytesValue.prototype.getValue = function() {
	  return /** @type {!(string|Uint8Array)} */ (googleProtobuf.Message.getFieldWithDefault(this, 1, ""));
	};


	/**
	 * optional bytes value = 1;
	 * This is a type-conversion wrapper around `getValue()`
	 * @return {string}
	 */
	proto.google.protobuf.BytesValue.prototype.getValue_asB64 = function() {
	  return /** @type {string} */ (googleProtobuf.Message.bytesAsB64(
	      this.getValue()));
	};


	/**
	 * optional bytes value = 1;
	 * Note that Uint8Array is not supported on all browsers.
	 * @see http://caniuse.com/Uint8Array
	 * This is a type-conversion wrapper around `getValue()`
	 * @return {!Uint8Array}
	 */
	proto.google.protobuf.BytesValue.prototype.getValue_asU8 = function() {
	  return /** @type {!Uint8Array} */ (googleProtobuf.Message.bytesAsU8(
	      this.getValue()));
	};


	/**
	 * @param {!(string|Uint8Array)} value
	 * @return {!proto.google.protobuf.BytesValue} returns this
	 */
	proto.google.protobuf.BytesValue.prototype.setValue = function(value) {
	  return googleProtobuf.Message.setProto3BytesField(this, 1, value);
	};


	goog.object.extend(exports, proto.google.protobuf);
	});

	var messages_pb = createCommonjsModule(function (module, exports) {
	// source: proto/messages.proto
	/**
	 * @fileoverview
	 * @enhanceable
	 * @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!


	var goog = googleProtobuf;
	var proto = {};


	goog.object.extend(proto, wrappers_pb);
	goog.exportSymbol(
	'game_protobuf_messages.proto.messages.AckCommand',
	null,
	proto);

	goog.exportSymbol('game_protobuf_messages.proto.messages.AppInfo', null, proto);
	goog.exportSymbol(
	'game_protobuf_messages.proto.messages.AppStatistic',
	null,
	proto);

	goog.exportSymbol('game_protobuf_messages.proto.messages.Body', null, proto);
	goog.exportSymbol(
	'game_protobuf_messages.proto.messages.Body.BodyCase',
	null,
	proto);

	goog.exportSymbol('game_protobuf_messages.proto.messages.Command', null, proto);
	goog.exportSymbol(
	'game_protobuf_messages.proto.messages.CommandType',
	null,
	proto);

	goog.exportSymbol(
	'game_protobuf_messages.proto.messages.CreateRoomRequest',
	null,
	proto);

	goog.exportSymbol(
	'game_protobuf_messages.proto.messages.CreateRoomResponse',
	null,
	proto);

	goog.exportSymbol(
	'game_protobuf_messages.proto.messages.DirectCommand',
	null,
	proto);

	goog.exportSymbol(
	'game_protobuf_messages.proto.messages.ErrorCommand',
	null,
	proto);

	goog.exportSymbol(
	'game_protobuf_messages.proto.messages.ErrorInfo',
	null,
	proto);

	goog.exportSymbol(
	'game_protobuf_messages.proto.messages.EventsCommand',
	null,
	proto);

	goog.exportSymbol(
	'game_protobuf_messages.proto.messages.EventsRequest',
	null,
	proto);

	goog.exportSymbol(
	'game_protobuf_messages.proto.messages.IntValue',
	null,
	proto);

	goog.exportSymbol(
	'game_protobuf_messages.proto.messages.InterestGroups',
	null,
	proto);

	goog.exportSymbol(
	'game_protobuf_messages.proto.messages.JoinLobbyRequest',
	null,
	proto);

	goog.exportSymbol(
	'game_protobuf_messages.proto.messages.JoinRoomNotification',
	null,
	proto);

	goog.exportSymbol(
	'game_protobuf_messages.proto.messages.JoinRoomRequest',
	null,
	proto);

	goog.exportSymbol(
	'game_protobuf_messages.proto.messages.JoinRoomResponse',
	null,
	proto);

	goog.exportSymbol(
	'game_protobuf_messages.proto.messages.KickMemberRequest',
	null,
	proto);

	goog.exportSymbol(
	'game_protobuf_messages.proto.messages.KickMemberResponse',
	null,
	proto);

	goog.exportSymbol(
	'game_protobuf_messages.proto.messages.LeftRoomNotification',
	null,
	proto);

	goog.exportSymbol('game_protobuf_messages.proto.messages.OpType', null, proto);
	goog.exportSymbol(
	'game_protobuf_messages.proto.messages.RequestMessage',
	null,
	proto);

	goog.exportSymbol(
	'game_protobuf_messages.proto.messages.RequestMessage.RequestCase',
	null,
	proto);

	goog.exportSymbol(
	'game_protobuf_messages.proto.messages.ResponseMessage',
	null,
	proto);

	goog.exportSymbol(
	'game_protobuf_messages.proto.messages.ResponseMessage.ResponseCase',
	null,
	proto);

	goog.exportSymbol(
	'game_protobuf_messages.proto.messages.RoomListCommand',
	null,
	proto);

	goog.exportSymbol(
	'game_protobuf_messages.proto.messages.RoomMember',
	null,
	proto);

	goog.exportSymbol(
	'game_protobuf_messages.proto.messages.RoomNotification',
	null,
	proto);

	goog.exportSymbol(
	'game_protobuf_messages.proto.messages.RoomNotification.NotificationCase',
	null,
	proto);

	goog.exportSymbol(
	'game_protobuf_messages.proto.messages.RoomOptions',
	null,
	proto);

	goog.exportSymbol(
	'game_protobuf_messages.proto.messages.RoomSystemProperty',
	null,
	proto);

	goog.exportSymbol(
	'game_protobuf_messages.proto.messages.SessionOpenRequest',
	null,
	proto);

	goog.exportSymbol(
	'game_protobuf_messages.proto.messages.StatisticCommand',
	null,
	proto);

	goog.exportSymbol(
	'game_protobuf_messages.proto.messages.UpdateMasterClientNotification',
	null,
	proto);

	goog.exportSymbol(
	'game_protobuf_messages.proto.messages.UpdateMasterClientRequest',
	null,
	proto);

	goog.exportSymbol(
	'game_protobuf_messages.proto.messages.UpdateMasterClientResponse',
	null,
	proto);

	goog.exportSymbol(
	'game_protobuf_messages.proto.messages.UpdatePropertyNotification',
	null,
	proto);

	goog.exportSymbol(
	'game_protobuf_messages.proto.messages.UpdatePropertyRequest',
	null,
	proto);

	goog.exportSymbol(
	'game_protobuf_messages.proto.messages.UpdatePropertyResponse',
	null,
	proto);

	goog.exportSymbol(
	'game_protobuf_messages.proto.messages.UpdateSysPropertyNotification',
	null,
	proto);

	goog.exportSymbol(
	'game_protobuf_messages.proto.messages.UpdateSysPropertyRequest',
	null,
	proto);

	goog.exportSymbol(
	'game_protobuf_messages.proto.messages.UpdateSysPropertyResponse',
	null,
	proto);

	/**
	         * 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.game_protobuf_messages.proto.messages.IntValue = function (opt_data) {
	  googleProtobuf.Message.initialize(this, opt_data, 0, -1, null, null);
	};
	goog.inherits(
	proto.game_protobuf_messages.proto.messages.IntValue,
	googleProtobuf.Message);

	if (goog.DEBUG && !COMPILED) {
	  /**
	                               * @public
	                               * @override
	                               */
	  proto.game_protobuf_messages.proto.messages.IntValue.displayName =
	  'proto.game_protobuf_messages.proto.messages.IntValue';
	}
	/**
	   * 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.game_protobuf_messages.proto.messages.RoomSystemProperty = function (
	opt_data)
	{
	  googleProtobuf.Message.initialize(this, opt_data, 0, -1, null, null);
	};
	goog.inherits(
	proto.game_protobuf_messages.proto.messages.RoomSystemProperty,
	googleProtobuf.Message);

	if (goog.DEBUG && !COMPILED) {
	  /**
	                               * @public
	                               * @override
	                               */
	  proto.game_protobuf_messages.proto.messages.RoomSystemProperty.displayName =
	  'proto.game_protobuf_messages.proto.messages.RoomSystemProperty';
	}
	/**
	   * 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.game_protobuf_messages.proto.messages.RoomMember = function (opt_data) {
	  googleProtobuf.Message.initialize(this, opt_data, 0, -1, null, null);
	};
	goog.inherits(
	proto.game_protobuf_messages.proto.messages.RoomMember,
	googleProtobuf.Message);

	if (goog.DEBUG && !COMPILED) {
	  /**
	                               * @public
	                               * @override
	                               */
	  proto.game_protobuf_messages.proto.messages.RoomMember.displayName =
	  'proto.game_protobuf_messages.proto.messages.RoomMember';
	}
	/**
	   * 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.game_protobuf_messages.proto.messages.AppInfo = function (opt_data) {
	  googleProtobuf.Message.initialize(this, opt_data, 0, -1, null, null);
	};
	goog.inherits(
	proto.game_protobuf_messages.proto.messages.AppInfo,
	googleProtobuf.Message);

	if (goog.DEBUG && !COMPILED) {
	  /**
	                               * @public
	                               * @override
	                               */
	  proto.game_protobuf_messages.proto.messages.AppInfo.displayName =
	  'proto.game_protobuf_messages.proto.messages.AppInfo';
	}
	/**
	   * 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.game_protobuf_messages.proto.messages.ErrorInfo = function (opt_data) {
	  googleProtobuf.Message.initialize(this, opt_data, 0, -1, null, null);
	};
	goog.inherits(
	proto.game_protobuf_messages.proto.messages.ErrorInfo,
	googleProtobuf.Message);

	if (goog.DEBUG && !COMPILED) {
	  /**
	                               * @public
	                               * @override
	                               */
	  proto.game_protobuf_messages.proto.messages.ErrorInfo.displayName =
	  'proto.game_protobuf_messages.proto.messages.ErrorInfo';
	}
	/**
	   * 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.game_protobuf_messages.proto.messages.RoomOptions = function (opt_data) {
	  googleProtobuf.Message.initialize(
	  this,
	  opt_data,
	  0,
	  -1,
	  proto.game_protobuf_messages.proto.messages.RoomOptions.repeatedFields_,
	  null);

	};
	goog.inherits(
	proto.game_protobuf_messages.proto.messages.RoomOptions,
	googleProtobuf.Message);

	if (goog.DEBUG && !COMPILED) {
	  /**
	                               * @public
	                               * @override
	                               */
	  proto.game_protobuf_messages.proto.messages.RoomOptions.displayName =
	  'proto.game_protobuf_messages.proto.messages.RoomOptions';
	}
	/**
	   * 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.game_protobuf_messages.proto.messages.SessionOpenRequest = function (
	opt_data)
	{
	  googleProtobuf.Message.initialize(this, opt_data, 0, -1, null, null);
	};
	goog.inherits(
	proto.game_protobuf_messages.proto.messages.SessionOpenRequest,
	googleProtobuf.Message);

	if (goog.DEBUG && !COMPILED) {
	  /**
	                               * @public
	                               * @override
	                               */
	  proto.game_protobuf_messages.proto.messages.SessionOpenRequest.displayName =
	  'proto.game_protobuf_messages.proto.messages.SessionOpenRequest';
	}
	/**
	   * 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.game_protobuf_messages.proto.messages.CreateRoomRequest = function (
	opt_data)
	{
	  googleProtobuf.Message.initialize(this, opt_data, 0, -1, null, null);
	};
	goog.inherits(
	proto.game_protobuf_messages.proto.messages.CreateRoomRequest,
	googleProtobuf.Message);

	if (goog.DEBUG && !COMPILED) {
	  /**
	                               * @public
	                               * @override
	                               */
	  proto.game_protobuf_messages.proto.messages.CreateRoomRequest.displayName =
	  'proto.game_protobuf_messages.proto.messages.CreateRoomRequest';
	}
	/**
	   * 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.game_protobuf_messages.proto.messages.CreateRoomResponse = function (
	opt_data)
	{
	  googleProtobuf.Message.initialize(this, opt_data, 0, -1, null, null);
	};
	goog.inherits(
	proto.game_protobuf_messages.proto.messages.CreateRoomResponse,
	googleProtobuf.Message);

	if (goog.DEBUG && !COMPILED) {
	  /**
	                               * @public
	                               * @override
	                               */
	  proto.game_protobuf_messages.proto.messages.CreateRoomResponse.displayName =
	  'proto.game_protobuf_messages.proto.messages.CreateRoomResponse';
	}
	/**
	   * 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.game_protobuf_messages.proto.messages.JoinRoomRequest = function (
	opt_data)
	{
	  googleProtobuf.Message.initialize(this, opt_data, 0, -1, null, null);
	};
	goog.inherits(
	proto.game_protobuf_messages.proto.messages.JoinRoomRequest,
	googleProtobuf.Message);

	if (goog.DEBUG && !COMPILED) {
	  /**
	                               * @public
	                               * @override
	                               */
	  proto.game_protobuf_messages.proto.messages.JoinRoomRequest.displayName =
	  'proto.game_protobuf_messages.proto.messages.JoinRoomRequest';
	}
	/**
	   * 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.game_protobuf_messages.proto.messages.JoinRoomResponse = function (
	opt_data)
	{
	  googleProtobuf.Message.initialize(this, opt_data, 0, -1, null, null);
	};
	goog.inherits(
	proto.game_protobuf_messages.proto.messages.JoinRoomResponse,
	googleProtobuf.Message);

	if (goog.DEBUG && !COMPILED) {
	  /**
	                               * @public
	                               * @override
	                               */
	  proto.game_protobuf_messages.proto.messages.JoinRoomResponse.displayName =
	  'proto.game_protobuf_messages.proto.messages.JoinRoomResponse';
	}
	/**
	   * 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.game_protobuf_messages.proto.messages.JoinRoomNotification = function (
	opt_data)
	{
	  googleProtobuf.Message.initialize(this, opt_data, 0, -1, null, null);
	};
	goog.inherits(
	proto.game_protobuf_messages.proto.messages.JoinRoomNotification,
	googleProtobuf.Message);

	if (goog.DEBUG && !COMPILED) {
	  /**
	                               * @public
	                               * @override
	                               */
	  proto.game_protobuf_messages.proto.messages.JoinRoomNotification.displayName =
	  'proto.game_protobuf_messages.proto.messages.JoinRoomNotification';
	}
	/**
	   * 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.game_protobuf_messages.proto.messages.LeftRoomNotification = function (
	opt_data)
	{
	  googleProtobuf.Message.initialize(this, opt_data, 0, -1, null, null);
	};
	goog.inherits(
	proto.game_protobuf_messages.proto.messages.LeftRoomNotification,
	googleProtobuf.Message);

	if (goog.DEBUG && !COMPILED) {
	  /**
	                               * @public
	                               * @override
	                               */
	  proto.game_protobuf_messages.proto.messages.LeftRoomNotification.displayName =
	  'proto.game_protobuf_messages.proto.messages.LeftRoomNotification';
	}
	/**
	   * 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.game_protobuf_messages.proto.messages.KickMemberRequest = function (
	opt_data)
	{
	  googleProtobuf.Message.initialize(this, opt_data, 0, -1, null, null);
	};
	goog.inherits(
	proto.game_protobuf_messages.proto.messages.KickMemberRequest,
	googleProtobuf.Message);

	if (goog.DEBUG && !COMPILED) {
	  /**
	                               * @public
	                               * @override
	                               */
	  proto.game_protobuf_messages.proto.messages.KickMemberRequest.displayName =
	  'proto.game_protobuf_messages.proto.messages.KickMemberRequest';
	}
	/**
	   * 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.game_protobuf_messages.proto.messages.KickMemberResponse = function (
	opt_data)
	{
	  googleProtobuf.Message.initialize(this, opt_data, 0, -1, null, null);
	};
	goog.inherits(
	proto.game_protobuf_messages.proto.messages.KickMemberResponse,
	googleProtobuf.Message);

	if (goog.DEBUG && !COMPILED) {
	  /**
	                               * @public
	                               * @override
	                               */
	  proto.game_protobuf_messages.proto.messages.KickMemberResponse.displayName =
	  'proto.game_protobuf_messages.proto.messages.KickMemberResponse';
	}
	/**
	   * 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.game_protobuf_messages.proto.messages.UpdatePropertyRequest = function (
	opt_data)
	{
	  googleProtobuf.Message.initialize(this, opt_data, 0, -1, null, null);
	};
	goog.inherits(
	proto.game_protobuf_messages.proto.messages.UpdatePropertyRequest,
	googleProtobuf.Message);

	if (goog.DEBUG && !COMPILED) {
	  /**
	                               * @public
	                               * @override
	                               */
	  proto.game_protobuf_messages.proto.messages.UpdatePropertyRequest.displayName =
	  'proto.game_protobuf_messages.proto.messages.UpdatePropertyRequest';
	}
	/**
	   * 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.game_protobuf_messages.proto.messages.UpdatePropertyResponse = function (
	opt_data)
	{
	  googleProtobuf.Message.initialize(this, opt_data, 0, -1, null, null);
	};
	goog.inherits(
	proto.game_protobuf_messages.proto.messages.UpdatePropertyResponse,
	googleProtobuf.Message);

	if (goog.DEBUG && !COMPILED) {
	  /**
	                               * @public
	                               * @override
	                               */
	  proto.game_protobuf_messages.proto.messages.UpdatePropertyResponse.displayName =
	  'proto.game_protobuf_messages.proto.messages.UpdatePropertyResponse';
	}
	/**
	   * 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.game_protobuf_messages.proto.messages.UpdatePropertyNotification = function (
	opt_data)
	{
	  googleProtobuf.Message.initialize(this, opt_data, 0, -1, null, null);
	};
	goog.inherits(
	proto.game_protobuf_messages.proto.messages.UpdatePropertyNotification,
	googleProtobuf.Message);

	if (goog.DEBUG && !COMPILED) {
	  /**
	                               * @public
	                               * @override
	                               */
	  proto.game_protobuf_messages.proto.messages.UpdatePropertyNotification.displayName =
	  'proto.game_protobuf_messages.proto.messages.UpdatePropertyNotification';
	}
	/**
	   * 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.game_protobuf_messages.proto.messages.UpdateSysPropertyRequest = function (
	opt_data)
	{
	  googleProtobuf.Message.initialize(this, opt_data, 0, -1, null, null);
	};
	goog.inherits(
	proto.game_protobuf_messages.proto.messages.UpdateSysPropertyRequest,
	googleProtobuf.Message);

	if (goog.DEBUG && !COMPILED) {
	  /**
	                               * @public
	                               * @override
	                               */
	  proto.game_protobuf_messages.proto.messages.UpdateSysPropertyRequest.displayName =
	  'proto.game_protobuf_messages.proto.messages.UpdateSysPropertyRequest';
	}
	/**
	   * 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.game_protobuf_messages.proto.messages.UpdateSysPropertyResponse = function (
	opt_data)
	{
	  googleProtobuf.Message.initialize(this, opt_data, 0, -1, null, null);
	};
	goog.inherits(
	proto.game_protobuf_messages.proto.messages.UpdateSysPropertyResponse,
	googleProtobuf.Message);

	if (goog.DEBUG && !COMPILED) {
	  /**
	                               * @public
	                               * @override
	                               */
	  proto.game_protobuf_messages.proto.messages.UpdateSysPropertyResponse.displayName =
	  'proto.game_protobuf_messages.proto.messages.UpdateSysPropertyResponse';
	}
	/**
	   * 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.game_protobuf_messages.proto.messages.UpdateSysPropertyNotification = function (
	opt_data)
	{
	  googleProtobuf.Message.initialize(this, opt_data, 0, -1, null, null);
	};
	goog.inherits(
	proto.game_protobuf_messages.proto.messages.UpdateSysPropertyNotification,
	googleProtobuf.Message);

	if (goog.DEBUG && !COMPILED) {
	  /**
	                               * @public
	                               * @override
	                               */
	  proto.game_protobuf_messages.proto.messages.UpdateSysPropertyNotification.displayName =
	  'proto.game_protobuf_messages.proto.messages.UpdateSysPropertyNotification';
	}
	/**
	   * 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.game_protobuf_messages.proto.messages.UpdateMasterClientRequest = function (
	opt_data)
	{
	  googleProtobuf.Message.initialize(this, opt_data, 0, -1, null, null);
	};
	goog.inherits(
	proto.game_protobuf_messages.proto.messages.UpdateMasterClientRequest,
	googleProtobuf.Message);

	if (goog.DEBUG && !COMPILED) {
	  /**
	                               * @public
	                               * @override
	                               */
	  proto.game_protobuf_messages.proto.messages.UpdateMasterClientRequest.displayName =
	  'proto.game_protobuf_messages.proto.messages.UpdateMasterClientRequest';
	}
	/**
	   * 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.game_protobuf_messages.proto.messages.UpdateMasterClientResponse = function (
	opt_data)
	{
	  googleProtobuf.Message.initialize(this, opt_data, 0, -1, null, null);
	};
	goog.inherits(
	proto.game_protobuf_messages.proto.messages.UpdateMasterClientResponse,
	googleProtobuf.Message);

	if (goog.DEBUG && !COMPILED) {
	  /**
	                               * @public
	                               * @override
	                               */
	  proto.game_protobuf_messages.proto.messages.UpdateMasterClientResponse.displayName =
	  'proto.game_protobuf_messages.proto.messages.UpdateMasterClientResponse';
	}
	/**
	   * 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.game_protobuf_messages.proto.messages.UpdateMasterClientNotification = function (
	opt_data)
	{
	  googleProtobuf.Message.initialize(this, opt_data, 0, -1, null, null);
	};
	goog.inherits(
	proto.game_protobuf_messages.proto.messages.UpdateMasterClientNotification,
	googleProtobuf.Message);

	if (goog.DEBUG && !COMPILED) {
	  /**
	                               * @public
	                               * @override
	                               */
	  proto.game_protobuf_messages.proto.messages.UpdateMasterClientNotification.displayName =
	  'proto.game_protobuf_messages.proto.messages.UpdateMasterClientNotification';
	}
	/**
	   * 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.game_protobuf_messages.proto.messages.RoomNotification = function (
	opt_data)
	{
	  googleProtobuf.Message.initialize(
	  this,
	  opt_data,
	  0,
	  -1,
	  null,
	  proto.game_protobuf_messages.proto.messages.RoomNotification.oneofGroups_);

	};
	goog.inherits(
	proto.game_protobuf_messages.proto.messages.RoomNotification,
	googleProtobuf.Message);

	if (goog.DEBUG && !COMPILED) {
	  /**
	                               * @public
	                               * @override
	                               */
	  proto.game_protobuf_messages.proto.messages.RoomNotification.displayName =
	  'proto.game_protobuf_messages.proto.messages.RoomNotification';
	}
	/**
	   * 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.game_protobuf_messages.proto.messages.DirectCommand = function (opt_data) {
	  googleProtobuf.Message.initialize(
	  this,
	  opt_data,
	  0,
	  -1,
	  proto.game_protobuf_messages.proto.messages.DirectCommand.repeatedFields_,
	  null);

	};
	goog.inherits(
	proto.game_protobuf_messages.proto.messages.DirectCommand,
	googleProtobuf.Message);

	if (goog.DEBUG && !COMPILED) {
	  /**
	                               * @public
	                               * @override
	                               */
	  proto.game_protobuf_messages.proto.messages.DirectCommand.displayName =
	  'proto.game_protobuf_messages.proto.messages.DirectCommand';
	}
	/**
	   * 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.game_protobuf_messages.proto.messages.AckCommand = function (opt_data) {
	  googleProtobuf.Message.initialize(this, opt_data, 0, -1, null, null);
	};
	goog.inherits(
	proto.game_protobuf_messages.proto.messages.AckCommand,
	googleProtobuf.Message);

	if (goog.DEBUG && !COMPILED) {
	  /**
	                               * @public
	                               * @override
	                               */
	  proto.game_protobuf_messages.proto.messages.AckCommand.displayName =
	  'proto.game_protobuf_messages.proto.messages.AckCommand';
	}
	/**
	   * 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.game_protobuf_messages.proto.messages.EventsRequest = function (opt_data) {
	  googleProtobuf.Message.initialize(this, opt_data, 0, -1, null, null);
	};
	goog.inherits(
	proto.game_protobuf_messages.proto.messages.EventsRequest,
	googleProtobuf.Message);

	if (goog.DEBUG && !COMPILED) {
	  /**
	                               * @public
	                               * @override
	                               */
	  proto.game_protobuf_messages.proto.messages.EventsRequest.displayName =
	  'proto.game_protobuf_messages.proto.messages.EventsRequest';
	}
	/**
	   * 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.game_protobuf_messages.proto.messages.EventsCommand = function (opt_data) {
	  googleProtobuf.Message.initialize(
	  this,
	  opt_data,
	  0,
	  -1,
	  proto.game_protobuf_messages.proto.messages.EventsCommand.repeatedFields_,
	  null);

	};
	goog.inherits(
	proto.game_protobuf_messages.proto.messages.EventsCommand,
	googleProtobuf.Message);

	if (goog.DEBUG && !COMPILED) {
	  /**
	                               * @public
	                               * @override
	                               */
	  proto.game_protobuf_messages.proto.messages.EventsCommand.displayName =
	  'proto.game_protobuf_messages.proto.messages.EventsCommand';
	}
	/**
	   * 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.game_protobuf_messages.proto.messages.InterestGroups = function (
	opt_data)
	{
	  googleProtobuf.Message.initialize(
	  this,
	  opt_data,
	  0,
	  -1,
	  proto.game_protobuf_messages.proto.messages.InterestGroups.repeatedFields_,
	  null);

	};
	goog.inherits(
	proto.game_protobuf_messages.proto.messages.InterestGroups,
	googleProtobuf.Message);

	if (goog.DEBUG && !COMPILED) {
	  /**
	                               * @public
	                               * @override
	                               */
	  proto.game_protobuf_messages.proto.messages.InterestGroups.displayName =
	  'proto.game_protobuf_messages.proto.messages.InterestGroups';
	}
	/**
	   * 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.game_protobuf_messages.proto.messages.JoinLobbyRequest = function (
	opt_data)
	{
	  googleProtobuf.Message.initialize(this, opt_data, 0, -1, null, null);
	};
	goog.inherits(
	proto.game_protobuf_messages.proto.messages.JoinLobbyRequest,
	googleProtobuf.Message);

	if (goog.DEBUG && !COMPILED) {
	  /**
	                               * @public
	                               * @override
	                               */
	  proto.game_protobuf_messages.proto.messages.JoinLobbyRequest.displayName =
	  'proto.game_protobuf_messages.proto.messages.JoinLobbyRequest';
	}
	/**
	   * 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.game_protobuf_messages.proto.messages.RoomListCommand = function (
	opt_data)
	{
	  googleProtobuf.Message.initialize(
	  this,
	  opt_data,
	  0,
	  -1,
	  proto.game_protobuf_messages.proto.messages.RoomListCommand.repeatedFields_,
	  null);

	};
	goog.inherits(
	proto.game_protobuf_messages.proto.messages.RoomListCommand,
	googleProtobuf.Message);

	if (goog.DEBUG && !COMPILED) {
	  /**
	                               * @public
	                               * @override
	                               */
	  proto.game_protobuf_messages.proto.messages.RoomListCommand.displayName =
	  'proto.game_protobuf_messages.proto.messages.RoomListCommand';
	}
	/**
	   * 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.game_protobuf_messages.proto.messages.AppStatistic = function (opt_data) {
	  googleProtobuf.Message.initialize(this, opt_data, 0, -1, null, null);
	};
	goog.inherits(
	proto.game_protobuf_messages.proto.messages.AppStatistic,
	googleProtobuf.Message);

	if (goog.DEBUG && !COMPILED) {
	  /**
	                               * @public
	                               * @override
	                               */
	  proto.game_protobuf_messages.proto.messages.AppStatistic.displayName =
	  'proto.game_protobuf_messages.proto.messages.AppStatistic';
	}
	/**
	   * 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.game_protobuf_messages.proto.messages.StatisticCommand = function (
	opt_data)
	{
	  googleProtobuf.Message.initialize(this, opt_data, 0, -1, null, null);
	};
	goog.inherits(
	proto.game_protobuf_messages.proto.messages.StatisticCommand,
	googleProtobuf.Message);

	if (goog.DEBUG && !COMPILED) {
	  /**
	                               * @public
	                               * @override
	                               */
	  proto.game_protobuf_messages.proto.messages.StatisticCommand.displayName =
	  'proto.game_protobuf_messages.proto.messages.StatisticCommand';
	}
	/**
	   * 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.game_protobuf_messages.proto.messages.ErrorCommand = function (opt_data) {
	  googleProtobuf.Message.initialize(this, opt_data, 0, -1, null, null);
	};
	goog.inherits(
	proto.game_protobuf_messages.proto.messages.ErrorCommand,
	googleProtobuf.Message);

	if (goog.DEBUG && !COMPILED) {
	  /**
	                               * @public
	                               * @override
	                               */
	  proto.game_protobuf_messages.proto.messages.ErrorCommand.displayName =
	  'proto.game_protobuf_messages.proto.messages.ErrorCommand';
	}
	/**
	   * 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.game_protobuf_messages.proto.messages.RequestMessage = function (
	opt_data)
	{
	  googleProtobuf.Message.initialize(
	  this,
	  opt_data,
	  0,
	  -1,
	  null,
	  proto.game_protobuf_messages.proto.messages.RequestMessage.oneofGroups_);

	};
	goog.inherits(
	proto.game_protobuf_messages.proto.messages.RequestMessage,
	googleProtobuf.Message);

	if (goog.DEBUG && !COMPILED) {
	  /**
	                               * @public
	                               * @override
	                               */
	  proto.game_protobuf_messages.proto.messages.RequestMessage.displayName =
	  'proto.game_protobuf_messages.proto.messages.RequestMessage';
	}
	/**
	   * 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.game_protobuf_messages.proto.messages.ResponseMessage = function (
	opt_data)
	{
	  googleProtobuf.Message.initialize(
	  this,
	  opt_data,
	  0,
	  -1,
	  null,
	  proto.game_protobuf_messages.proto.messages.ResponseMessage.oneofGroups_);

	};
	goog.inherits(
	proto.game_protobuf_messages.proto.messages.ResponseMessage,
	googleProtobuf.Message);

	if (goog.DEBUG && !COMPILED) {
	  /**
	                               * @public
	                               * @override
	                               */
	  proto.game_protobuf_messages.proto.messages.ResponseMessage.displayName =
	  'proto.game_protobuf_messages.proto.messages.ResponseMessage';
	}
	/**
	   * 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.game_protobuf_messages.proto.messages.Body = function (opt_data) {
	  googleProtobuf.Message.initialize(
	  this,
	  opt_data,
	  0,
	  -1,
	  null,
	  proto.game_protobuf_messages.proto.messages.Body.oneofGroups_);

	};
	goog.inherits(proto.game_protobuf_messages.proto.messages.Body, googleProtobuf.Message);
	if (goog.DEBUG && !COMPILED) {
	  /**
	                               * @public
	                               * @override
	                               */
	  proto.game_protobuf_messages.proto.messages.Body.displayName =
	  'proto.game_protobuf_messages.proto.messages.Body';
	}
	/**
	   * 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.game_protobuf_messages.proto.messages.Command = function (opt_data) {
	  googleProtobuf.Message.initialize(this, opt_data, 0, -1, null, null);
	};
	goog.inherits(
	proto.game_protobuf_messages.proto.messages.Command,
	googleProtobuf.Message);

	if (goog.DEBUG && !COMPILED) {
	  /**
	                               * @public
	                               * @override
	                               */
	  proto.game_protobuf_messages.proto.messages.Command.displayName =
	  'proto.game_protobuf_messages.proto.messages.Command';
	}

	if (googleProtobuf.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.game_protobuf_messages.proto.messages.IntValue.prototype.toObject = function (
	  opt_includeInstance)
	  {
	    return proto.game_protobuf_messages.proto.messages.IntValue.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.game_protobuf_messages.proto.messages.IntValue} msg The msg instance to transform.
	      * @return {!Object}
	      * @suppress {unusedLocalVariables} f is only used for nested messages
	      */
	  proto.game_protobuf_messages.proto.messages.IntValue.toObject = function (
	  includeInstance,
	  msg)
	  {
	    var obj = {
	      val: googleProtobuf.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.game_protobuf_messages.proto.messages.IntValue}
	   */
	proto.game_protobuf_messages.proto.messages.IntValue.deserializeBinary = function (
	bytes)
	{
	  var reader = new googleProtobuf.BinaryReader(bytes);
	  var msg = new proto.game_protobuf_messages.proto.messages.IntValue();
	  return proto.game_protobuf_messages.proto.messages.IntValue.deserializeBinaryFromReader(
	  msg,
	  reader);

	};

	/**
	    * Deserializes binary data (in protobuf wire format) from the
	    * given reader into the given message object.
	    * @param {!proto.game_protobuf_messages.proto.messages.IntValue} msg The message object to deserialize into.
	    * @param {!jspb.BinaryReader} reader The BinaryReader to use.
	    * @return {!proto.game_protobuf_messages.proto.messages.IntValue}
	    */
	proto.game_protobuf_messages.proto.messages.IntValue.deserializeBinaryFromReader = function (
	msg,
	reader)
	{
	  while (reader.nextField()) {
	    if (reader.isEndGroup()) {
	      break;
	    }
	    var field = reader.getFieldNumber();
	    switch (field) {
	      case 1:
	        var value = /** @type {number} */reader.readInt32();
	        msg.setVal(value);
	        break;
	      default:
	        reader.skipField();
	        break;}

	  }
	  return msg;
	};

	/**
	    * Serializes the message to binary data (in protobuf wire format).
	    * @return {!Uint8Array}
	    */
	proto.game_protobuf_messages.proto.messages.IntValue.prototype.serializeBinary = function () {
	  var writer = new googleProtobuf.BinaryWriter();
	  proto.game_protobuf_messages.proto.messages.IntValue.serializeBinaryToWriter(
	  this,
	  writer);

	  return writer.getResultBuffer();
	};

	/**
	    * Serializes the given message to binary data (in protobuf wire
	    * format), writing to the given BinaryWriter.
	    * @param {!proto.game_protobuf_messages.proto.messages.IntValue} message
	    * @param {!jspb.BinaryWriter} writer
	    * @suppress {unusedLocalVariables} f is only used for nested messages
	    */
	proto.game_protobuf_messages.proto.messages.IntValue.serializeBinaryToWriter = function (
	message,
	writer)
	{
	  var f = undefined;
	  f = message.getVal();
	  if (f !== 0) {
	    writer.writeInt32(1, f);
	  }
	};

	/**
	    * optional int32 val = 1;
	    * @return {number}
	    */
	proto.game_protobuf_messages.proto.messages.IntValue.prototype.getVal = function () {
	  return (/** @type {number} */googleProtobuf.Message.getFieldWithDefault(this, 1, 0));
	};

	/**
	    * @param {number} value
	    * @return {!proto.game_protobuf_messages.proto.messages.IntValue} returns this
	    */
	proto.game_protobuf_messages.proto.messages.IntValue.prototype.setVal = function (
	value)
	{
	  return googleProtobuf.Message.setProto3IntField(this, 1, value);
	};

	if (googleProtobuf.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.game_protobuf_messages.proto.messages.RoomSystemProperty.prototype.toObject = function (
	  opt_includeInstance)
	  {
	    return proto.game_protobuf_messages.proto.messages.RoomSystemProperty.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.game_protobuf_messages.proto.messages.RoomSystemProperty} msg The msg instance to transform.
	      * @return {!Object}
	      * @suppress {unusedLocalVariables} f is only used for nested messages
	      */
	  proto.game_protobuf_messages.proto.messages.RoomSystemProperty.toObject = function (
	  includeInstance,
	  msg)
	  {
	    var f,
	    obj = {
	      open:
	      (f = msg.getOpen()) &&
	      wrappers_pb.BoolValue.toObject(includeInstance, f),
	      visible:
	      (f = msg.getVisible()) &&
	      wrappers_pb.BoolValue.toObject(includeInstance, f),
	      expectMembers: googleProtobuf.Message.getFieldWithDefault(msg, 3, ''),
	      maxMembers: googleProtobuf.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.game_protobuf_messages.proto.messages.RoomSystemProperty}
	   */
	proto.game_protobuf_messages.proto.messages.RoomSystemProperty.deserializeBinary = function (
	bytes)
	{
	  var reader = new googleProtobuf.BinaryReader(bytes);
	  var msg = new proto.game_protobuf_messages.proto.messages.RoomSystemProperty();
	  return proto.game_protobuf_messages.proto.messages.RoomSystemProperty.deserializeBinaryFromReader(
	  msg,
	  reader);

	};

	/**
	    * Deserializes binary data (in protobuf wire format) from the
	    * given reader into the given message object.
	    * @param {!proto.game_protobuf_messages.proto.messages.RoomSystemProperty} msg The message object to deserialize into.
	    * @param {!jspb.BinaryReader} reader The BinaryReader to use.
	    * @return {!proto.game_protobuf_messages.proto.messages.RoomSystemProperty}
	    */
	proto.game_protobuf_messages.proto.messages.RoomSystemProperty.deserializeBinaryFromReader = function (
	msg,
	reader)
	{
	  while (reader.nextField()) {
	    if (reader.isEndGroup()) {
	      break;
	    }
	    var field = reader.getFieldNumber();
	    switch (field) {
	      case 1:
	        var value = new wrappers_pb.BoolValue();
	        reader.readMessage(
	        value,
	        wrappers_pb.BoolValue.deserializeBinaryFromReader);

	        msg.setOpen(value);
	        break;
	      case 2:
	        var value = new wrappers_pb.BoolValue();
	        reader.readMessage(
	        value,
	        wrappers_pb.BoolValue.deserializeBinaryFromReader);

	        msg.setVisible(value);
	        break;
	      case 3:
	        var value = /** @type {string} */reader.readString();
	        msg.setExpectMembers(value);
	        break;
	      case 4:
	        var value = /** @type {number} */reader.readInt32();
	        msg.setMaxMembers(value);
	        break;
	      default:
	        reader.skipField();
	        break;}

	  }
	  return msg;
	};

	/**
	    * Serializes the message to binary data (in protobuf wire format).
	    * @return {!Uint8Array}
	    */
	proto.game_protobuf_messages.proto.messages.RoomSystemProperty.prototype.serializeBinary = function () {
	  var writer = new googleProtobuf.BinaryWriter();
	  proto.game_protobuf_messages.proto.messages.RoomSystemProperty.serializeBinaryToWriter(
	  this,
	  writer);

	  return writer.getResultBuffer();
	};

	/**
	    * Serializes the given message to binary data (in protobuf wire
	    * format), writing to the given BinaryWriter.
	    * @param {!proto.game_protobuf_messages.proto.messages.RoomSystemProperty} message
	    * @param {!jspb.BinaryWriter} writer
	    * @suppress {unusedLocalVariables} f is only used for nested messages
	    */
	proto.game_protobuf_messages.proto.messages.RoomSystemProperty.serializeBinaryToWriter = function (
	message,
	writer)
	{
	  var f = undefined;
	  f = message.getOpen();
	  if (f != null) {
	    writer.writeMessage(
	    1,
	    f,
	    wrappers_pb.BoolValue.serializeBinaryToWriter);

	  }
	  f = message.getVisible();
	  if (f != null) {
	    writer.writeMessage(
	    2,
	    f,
	    wrappers_pb.BoolValue.serializeBinaryToWriter);

	  }
	  f = message.getExpectMembers();
	  if (f.length > 0) {
	    writer.writeString(3, f);
	  }
	  f = message.getMaxMembers();
	  if (f !== 0) {
	    writer.writeInt32(4, f);
	  }
	};

	/**
	    * optional google.protobuf.BoolValue open = 1;
	    * @return {?proto.google.protobuf.BoolValue}
	    */
	proto.game_protobuf_messages.proto.messages.RoomSystemProperty.prototype.getOpen = function () {
	  return (/** @type{?proto.google.protobuf.BoolValue} */googleProtobuf.Message.getWrapperField(
	    this,
	    wrappers_pb.BoolValue,
	    1));

	};

	/**
	    * @param {?proto.google.protobuf.BoolValue|undefined} value
	    * @return {!proto.game_protobuf_messages.proto.messages.RoomSystemProperty} returns this
	    */
	proto.game_protobuf_messages.proto.messages.RoomSystemProperty.prototype.setOpen = function (
	value)
	{
	  return googleProtobuf.Message.setWrapperField(this, 1, value);
	};

	/**
	    * Clears the message field making it undefined.
	    * @return {!proto.game_protobuf_messages.proto.messages.RoomSystemProperty} returns this
	    */
	proto.game_protobuf_messages.proto.messages.RoomSystemProperty.prototype.clearOpen = function () {
	  return this.setOpen(undefined);
	};

	/**
	    * Returns whether this field is set.
	    * @return {boolean}
	    */
	proto.game_protobuf_messages.proto.messages.RoomSystemProperty.prototype.hasOpen = function () {
	  return googleProtobuf.Message.getField(this, 1) != null;
	};

	/**
	    * optional google.protobuf.BoolValue visible = 2;
	    * @return {?proto.google.protobuf.BoolValue}
	    */
	proto.game_protobuf_messages.proto.messages.RoomSystemProperty.prototype.getVisible = function () {
	  return (/** @type{?proto.google.protobuf.BoolValue} */googleProtobuf.Message.getWrapperField(
	    this,
	    wrappers_pb.BoolValue,
	    2));

	};

	/**
	    * @param {?proto.google.protobuf.BoolValue|undefined} value
	    * @return {!proto.game_protobuf_messages.proto.messages.RoomSystemProperty} returns this
	    */
	proto.game_protobuf_messages.proto.messages.RoomSystemProperty.prototype.setVisible = function (
	value)
	{
	  return googleProtobuf.Message.setWrapperField(this, 2, value);
	};

	/**
	    * Clears the message field making it undefined.
	    * @return {!proto.game_protobuf_messages.proto.messages.RoomSystemProperty} returns this
	    */
	proto.game_protobuf_messages.proto.messages.RoomSystemProperty.prototype.clearVisible = function () {
	  return this.setVisible(undefined);
	};

	/**
	    * Returns whether this field is set.
	    * @return {boolean}
	    */
	proto.game_protobuf_messages.proto.messages.RoomSystemProperty.prototype.hasVisible = function () {
	  return googleProtobuf.Message.getField(this, 2) != null;
	};

	/**
	    * optional string expect_members = 3;
	    * @return {string}
	    */
	proto.game_protobuf_messages.proto.messages.RoomSystemProperty.prototype.getExpectMembers = function () {
	  return (/** @type {string} */googleProtobuf.Message.getFieldWithDefault(this, 3, ''));
	};

	/**
	    * @param {string} value
	    * @return {!proto.game_protobuf_messages.proto.messages.RoomSystemProperty} returns this
	    */
	proto.game_protobuf_messages.proto.messages.RoomSystemProperty.prototype.setExpectMembers = function (
	value)
	{
	  return googleProtobuf.Message.setProto3StringField(this, 3, value);
	};

	/**
	    * optional int32 max_members = 4;
	    * @return {number}
	    */
	proto.game_protobuf_messages.proto.messages.RoomSystemProperty.prototype.getMaxMembers = function () {
	  return (/** @type {number} */googleProtobuf.Message.getFieldWithDefault(this, 4, 0));
	};

	/**
	    * @param {number} value
	    * @return {!proto.game_protobuf_messages.proto.messages.RoomSystemProperty} returns this
	    */
	proto.game_protobuf_messages.proto.messages.RoomSystemProperty.prototype.setMaxMembers = function (
	value)
	{
	  return googleProtobuf.Message.setProto3IntField(this, 4, value);
	};

	if (googleProtobuf.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.game_protobuf_messages.proto.messages.RoomMember.prototype.toObject = function (
	  opt_includeInstance)
	  {
	    return proto.game_protobuf_messages.proto.messages.RoomMember.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.game_protobuf_messages.proto.messages.RoomMember} msg The msg instance to transform.
	      * @return {!Object}
	      * @suppress {unusedLocalVariables} f is only used for nested messages
	      */
	  proto.game_protobuf_messages.proto.messages.RoomMember.toObject = function (
	  includeInstance,
	  msg)
	  {
	    var obj = {
	      pid: googleProtobuf.Message.getFieldWithDefault(msg, 1, ''),
	      actorId: googleProtobuf.Message.getFieldWithDefault(msg, 2, 0),
	      attr: msg.getAttr_asB64(),
	      inactive: googleProtobuf.Message.getBooleanFieldWithDefault(msg, 4, false) };


	    if (includeInstance) {
	      obj.$jspbMessageInstance = msg;
	    }
	    return obj;
	  };
	}

	/**
	   * Deserializes binary data (in protobuf wire format).
	   * @param {jspb.ByteSource} bytes The bytes to deserialize.
	   * @return {!proto.game_protobuf_messages.proto.messages.RoomMember}
	   */
	proto.game_protobuf_messages.proto.messages.RoomMember.deserializeBinary = function (
	bytes)
	{
	  var reader = new googleProtobuf.BinaryReader(bytes);
	  var msg = new proto.game_protobuf_messages.proto.messages.RoomMember();
	  return proto.game_protobuf_messages.proto.messages.RoomMember.deserializeBinaryFromReader(
	  msg,
	  reader);

	};

	/**
	    * Deserializes binary data (in protobuf wire format) from the
	    * given reader into the given message object.
	    * @param {!proto.game_protobuf_messages.proto.messages.RoomMember} msg The message object to deserialize into.
	    * @param {!jspb.BinaryReader} reader The BinaryReader to use.
	    * @return {!proto.game_protobuf_messages.proto.messages.RoomMember}
	    */
	proto.game_protobuf_messages.proto.messages.RoomMember.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.setPid(value);
	        break;
	      case 2:
	        var value = /** @type {number} */reader.readInt32();
	        msg.setActorId(value);
	        break;
	      case 3:
	        var value = /** @type {!Uint8Array} */reader.readBytes();
	        msg.setAttr(value);
	        break;
	      case 4:
	        var value = /** @type {boolean} */reader.readBool();
	        msg.setInactive(value);
	        break;
	      default:
	        reader.skipField();
	        break;}

	  }
	  return msg;
	};

	/**
	    * Serializes the message to binary data (in protobuf wire format).
	    * @return {!Uint8Array}
	    */
	proto.game_protobuf_messages.proto.messages.RoomMember.prototype.serializeBinary = function () {
	  var writer = new googleProtobuf.BinaryWriter();
	  proto.game_protobuf_messages.proto.messages.RoomMember.serializeBinaryToWriter(
	  this,
	  writer);

	  return writer.getResultBuffer();
	};

	/**
	    * Serializes the given message to binary data (in protobuf wire
	    * format), writing to the given BinaryWriter.
	    * @param {!proto.game_protobuf_messages.proto.messages.RoomMember} message
	    * @param {!jspb.BinaryWriter} writer
	    * @suppress {unusedLocalVariables} f is only used for nested messages
	    */
	proto.game_protobuf_messages.proto.messages.RoomMember.serializeBinaryToWriter = function (
	message,
	writer)
	{
	  var f = undefined;
	  f = message.getPid();
	  if (f.length > 0) {
	    writer.writeString(1, f);
	  }
	  f = message.getActorId();
	  if (f !== 0) {
	    writer.writeInt32(2, f);
	  }
	  f = message.getAttr_asU8();
	  if (f.length > 0) {
	    writer.writeBytes(3, f);
	  }
	  f = message.getInactive();
	  if (f) {
	    writer.writeBool(4, f);
	  }
	};

	/**
	    * optional string pid = 1;
	    * @return {string}
	    */
	proto.game_protobuf_messages.proto.messages.RoomMember.prototype.getPid = function () {
	  return (/** @type {string} */googleProtobuf.Message.getFieldWithDefault(this, 1, ''));
	};

	/**
	    * @param {string} value
	    * @return {!proto.game_protobuf_messages.proto.messages.RoomMember} returns this
	    */
	proto.game_protobuf_messages.proto.messages.RoomMember.prototype.setPid = function (
	value)
	{
	  return googleProtobuf.Message.setProto3StringField(this, 1, value);
	};

	/**
	    * optional int32 actor_id = 2;
	    * @return {number}
	    */
	proto.game_protobuf_messages.proto.messages.RoomMember.prototype.getActorId = function () {
	  return (/** @type {number} */googleProtobuf.Message.getFieldWithDefault(this, 2, 0));
	};

	/**
	    * @param {number} value
	    * @return {!proto.game_protobuf_messages.proto.messages.RoomMember} returns this
	    */
	proto.game_protobuf_messages.proto.messages.RoomMember.prototype.setActorId = function (
	value)
	{
	  return googleProtobuf.Message.setProto3IntField(this, 2, value);
	};

	/**
	    * optional bytes attr = 3;
	    * @return {!(string|Uint8Array)}
	    */
	proto.game_protobuf_messages.proto.messages.RoomMember.prototype.getAttr = function () {
	  return (/** @type {!(string|Uint8Array)} */googleProtobuf.Message.getFieldWithDefault(
	    this,
	    3,
	    ''));

	};

	/**
	    * optional bytes attr = 3;
	    * This is a type-conversion wrapper around `getAttr()`
	    * @return {string}
	    */
	proto.game_protobuf_messages.proto.messages.RoomMember.prototype.getAttr_asB64 = function () {
	  return (/** @type {string} */googleProtobuf.Message.bytesAsB64(this.getAttr()));
	};

	/**
	    * optional bytes attr = 3;
	    * Note that Uint8Array is not supported on all browsers.
	    * @see http://caniuse.com/Uint8Array
	    * This is a type-conversion wrapper around `getAttr()`
	    * @return {!Uint8Array}
	    */
	proto.game_protobuf_messages.proto.messages.RoomMember.prototype.getAttr_asU8 = function () {
	  return (/** @type {!Uint8Array} */googleProtobuf.Message.bytesAsU8(this.getAttr()));
	};

	/**
	    * @param {!(string|Uint8Array)} value
	    * @return {!proto.game_protobuf_messages.proto.messages.RoomMember} returns this
	    */
	proto.game_protobuf_messages.proto.messages.RoomMember.prototype.setAttr = function (
	value)
	{
	  return googleProtobuf.Message.setProto3BytesField(this, 3, value);
	};

	/**
	    * optional bool inactive = 4;
	    * @return {boolean}
	    */
	proto.game_protobuf_messages.proto.messages.RoomMember.prototype.getInactive = function () {
	  return (/** @type {boolean} */googleProtobuf.Message.getBooleanFieldWithDefault(
	    this,
	    4,
	    false));

	};

	/**
	    * @param {boolean} value
	    * @return {!proto.game_protobuf_messages.proto.messages.RoomMember} returns this
	    */
	proto.game_protobuf_messages.proto.messages.RoomMember.prototype.setInactive = function (
	value)
	{
	  return googleProtobuf.Message.setProto3BooleanField(this, 4, value);
	};

	if (googleProtobuf.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.game_protobuf_messages.proto.messages.AppInfo.prototype.toObject = function (
	  opt_includeInstance)
	  {
	    return proto.game_protobuf_messages.proto.messages.AppInfo.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.game_protobuf_messages.proto.messages.AppInfo} msg The msg instance to transform.
	      * @return {!Object}
	      * @suppress {unusedLocalVariables} f is only used for nested messages
	      */
	  proto.game_protobuf_messages.proto.messages.AppInfo.toObject = function (
	  includeInstance,
	  msg)
	  {
	    var obj = {
	      appCode: googleProtobuf.Message.getFieldWithDefault(msg, 1, 0),
	      appMsg: googleProtobuf.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.game_protobuf_messages.proto.messages.AppInfo}
	   */
	proto.game_protobuf_messages.proto.messages.AppInfo.deserializeBinary = function (
	bytes)
	{
	  var reader = new googleProtobuf.BinaryReader(bytes);
	  var msg = new proto.game_protobuf_messages.proto.messages.AppInfo();
	  return proto.game_protobuf_messages.proto.messages.AppInfo.deserializeBinaryFromReader(
	  msg,
	  reader);

	};

	/**
	    * Deserializes binary data (in protobuf wire format) from the
	    * given reader into the given message object.
	    * @param {!proto.game_protobuf_messages.proto.messages.AppInfo} msg The message object to deserialize into.
	    * @param {!jspb.BinaryReader} reader The BinaryReader to use.
	    * @return {!proto.game_protobuf_messages.proto.messages.AppInfo}
	    */
	proto.game_protobuf_messages.proto.messages.AppInfo.deserializeBinaryFromReader = function (
	msg,
	reader)
	{
	  while (reader.nextField()) {
	    if (reader.isEndGroup()) {
	      break;
	    }
	    var field = reader.getFieldNumber();
	    switch (field) {
	      case 1:
	        var value = /** @type {number} */reader.readInt32();
	        msg.setAppCode(value);
	        break;
	      case 2:
	        var value = /** @type {string} */reader.readString();
	        msg.setAppMsg(value);
	        break;
	      default:
	        reader.skipField();
	        break;}

	  }
	  return msg;
	};

	/**
	    * Serializes the message to binary data (in protobuf wire format).
	    * @return {!Uint8Array}
	    */
	proto.game_protobuf_messages.proto.messages.AppInfo.prototype.serializeBinary = function () {
	  var writer = new googleProtobuf.BinaryWriter();
	  proto.game_protobuf_messages.proto.messages.AppInfo.serializeBinaryToWriter(
	  this,
	  writer);

	  return writer.getResultBuffer();
	};

	/**
	    * Serializes the given message to binary data (in protobuf wire
	    * format), writing to the given BinaryWriter.
	    * @param {!proto.game_protobuf_messages.proto.messages.AppInfo} message
	    * @param {!jspb.BinaryWriter} writer
	    * @suppress {unusedLocalVariables} f is only used for nested messages
	    */
	proto.game_protobuf_messages.proto.messages.AppInfo.serializeBinaryToWriter = function (
	message,
	writer)
	{
	  var f = undefined;
	  f = message.getAppCode();
	  if (f !== 0) {
	    writer.writeInt32(1, f);
	  }
	  f = message.getAppMsg();
	  if (f.length > 0) {
	    writer.writeString(2, f);
	  }
	};

	/**
	    * optional int32 app_code = 1;
	    * @return {number}
	    */
	proto.game_protobuf_messages.proto.messages.AppInfo.prototype.getAppCode = function () {
	  return (/** @type {number} */googleProtobuf.Message.getFieldWithDefault(this, 1, 0));
	};

	/**
	    * @param {number} value
	    * @return {!proto.game_protobuf_messages.proto.messages.AppInfo} returns this
	    */
	proto.game_protobuf_messages.proto.messages.AppInfo.prototype.setAppCode = function (
	value)
	{
	  return googleProtobuf.Message.setProto3IntField(this, 1, value);
	};

	/**
	    * optional string app_msg = 2;
	    * @return {string}
	    */
	proto.game_protobuf_messages.proto.messages.AppInfo.prototype.getAppMsg = function () {
	  return (/** @type {string} */googleProtobuf.Message.getFieldWithDefault(this, 2, ''));
	};

	/**
	    * @param {string} value
	    * @return {!proto.game_protobuf_messages.proto.messages.AppInfo} returns this
	    */
	proto.game_protobuf_messages.proto.messages.AppInfo.prototype.setAppMsg = function (
	value)
	{
	  return googleProtobuf.Message.setProto3StringField(this, 2, value);
	};

	if (googleProtobuf.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.game_protobuf_messages.proto.messages.ErrorInfo.prototype.toObject = function (
	  opt_includeInstance)
	  {
	    return proto.game_protobuf_messages.proto.messages.ErrorInfo.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.game_protobuf_messages.proto.messages.ErrorInfo} msg The msg instance to transform.
	      * @return {!Object}
	      * @suppress {unusedLocalVariables} f is only used for nested messages
	      */
	  proto.game_protobuf_messages.proto.messages.ErrorInfo.toObject = function (
	  includeInstance,
	  msg)
	  {
	    var f,
	    obj = {
	      reasonCode: googleProtobuf.Message.getFieldWithDefault(msg, 1, 0),
	      detail: googleProtobuf.Message.getFieldWithDefault(msg, 2, ''),
	      appInfo:
	      (f = msg.getAppInfo()) &&
	      proto.game_protobuf_messages.proto.messages.AppInfo.toObject(
	      includeInstance,
	      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.game_protobuf_messages.proto.messages.ErrorInfo}
	   */
	proto.game_protobuf_messages.proto.messages.ErrorInfo.deserializeBinary = function (
	bytes)
	{
	  var reader = new googleProtobuf.BinaryReader(bytes);
	  var msg = new proto.game_protobuf_messages.proto.messages.ErrorInfo();
	  return proto.game_protobuf_messages.proto.messages.ErrorInfo.deserializeBinaryFromReader(
	  msg,
	  reader);

	};

	/**
	    * Deserializes binary data (in protobuf wire format) from the
	    * given reader into the given message object.
	    * @param {!proto.game_protobuf_messages.proto.messages.ErrorInfo} msg The message object to deserialize into.
	    * @param {!jspb.BinaryReader} reader The BinaryReader to use.
	    * @return {!proto.game_protobuf_messages.proto.messages.ErrorInfo}
	    */
	proto.game_protobuf_messages.proto.messages.ErrorInfo.deserializeBinaryFromReader = function (
	msg,
	reader)
	{
	  while (reader.nextField()) {
	    if (reader.isEndGroup()) {
	      break;
	    }
	    var field = reader.getFieldNumber();
	    switch (field) {
	      case 1:
	        var value = /** @type {number} */reader.readInt32();
	        msg.setReasonCode(value);
	        break;
	      case 2:
	        var value = /** @type {string} */reader.readString();
	        msg.setDetail(value);
	        break;
	      case 3:
	        var value = new proto.game_protobuf_messages.proto.messages.AppInfo();
	        reader.readMessage(
	        value,
	        proto.game_protobuf_messages.proto.messages.AppInfo.
	        deserializeBinaryFromReader);

	        msg.setAppInfo(value);
	        break;
	      default:
	        reader.skipField();
	        break;}

	  }
	  return msg;
	};

	/**
	    * Serializes the message to binary data (in protobuf wire format).
	    * @return {!Uint8Array}
	    */
	proto.game_protobuf_messages.proto.messages.ErrorInfo.prototype.serializeBinary = function () {
	  var writer = new googleProtobuf.BinaryWriter();
	  proto.game_protobuf_messages.proto.messages.ErrorInfo.serializeBinaryToWriter(
	  this,
	  writer);

	  return writer.getResultBuffer();
	};

	/**
	    * Serializes the given message to binary data (in protobuf wire
	    * format), writing to the given BinaryWriter.
	    * @param {!proto.game_protobuf_messages.proto.messages.ErrorInfo} message
	    * @param {!jspb.BinaryWriter} writer
	    * @suppress {unusedLocalVariables} f is only used for nested messages
	    */
	proto.game_protobuf_messages.proto.messages.ErrorInfo.serializeBinaryToWriter = function (
	message,
	writer)
	{
	  var f = undefined;
	  f = message.getReasonCode();
	  if (f !== 0) {
	    writer.writeInt32(1, f);
	  }
	  f = message.getDetail();
	  if (f.length > 0) {
	    writer.writeString(2, f);
	  }
	  f = message.getAppInfo();
	  if (f != null) {
	    writer.writeMessage(
	    3,
	    f,
	    proto.game_protobuf_messages.proto.messages.AppInfo.
	    serializeBinaryToWriter);

	  }
	};

	/**
	    * optional int32 reason_code = 1;
	    * @return {number}
	    */
	proto.game_protobuf_messages.proto.messages.ErrorInfo.prototype.getReasonCode = function () {
	  return (/** @type {number} */googleProtobuf.Message.getFieldWithDefault(this, 1, 0));
	};

	/**
	    * @param {number} value
	    * @return {!proto.game_protobuf_messages.proto.messages.ErrorInfo} returns this
	    */
	proto.game_protobuf_messages.proto.messages.ErrorInfo.prototype.setReasonCode = function (
	value)
	{
	  return googleProtobuf.Message.setProto3IntField(this, 1, value);
	};

	/**
	    * optional string detail = 2;
	    * @return {string}
	    */
	proto.game_protobuf_messages.proto.messages.ErrorInfo.prototype.getDetail = function () {
	  return (/** @type {string} */googleProtobuf.Message.getFieldWithDefault(this, 2, ''));
	};

	/**
	    * @param {string} value
	    * @return {!proto.game_protobuf_messages.proto.messages.ErrorInfo} returns this
	    */
	proto.game_protobuf_messages.proto.messages.ErrorInfo.prototype.setDetail = function (
	value)
	{
	  return googleProtobuf.Message.setProto3StringField(this, 2, value);
	};

	/**
	    * optional AppInfo app_info = 3;
	    * @return {?proto.game_protobuf_messages.proto.messages.AppInfo}
	    */
	proto.game_protobuf_messages.proto.messages.ErrorInfo.prototype.getAppInfo = function () {
	  return (/** @type{?proto.game_protobuf_messages.proto.messages.AppInfo} */googleProtobuf.Message.getWrapperField(
	    this,
	    proto.game_protobuf_messages.proto.messages.AppInfo,
	    3));

	};

	/**
	    * @param {?proto.game_protobuf_messages.proto.messages.AppInfo|undefined} value
	    * @return {!proto.game_protobuf_messages.proto.messages.ErrorInfo} returns this
	    */
	proto.game_protobuf_messages.proto.messages.ErrorInfo.prototype.setAppInfo = function (
	value)
	{
	  return googleProtobuf.Message.setWrapperField(this, 3, value);
	};

	/**
	    * Clears the message field making it undefined.
	    * @return {!proto.game_protobuf_messages.proto.messages.ErrorInfo} returns this
	    */
	proto.game_protobuf_messages.proto.messages.ErrorInfo.prototype.clearAppInfo = function () {
	  return this.setAppInfo(undefined);
	};

	/**
	    * Returns whether this field is set.
	    * @return {boolean}
	    */
	proto.game_protobuf_messages.proto.messages.ErrorInfo.prototype.hasAppInfo = function () {
	  return googleProtobuf.Message.getField(this, 3) != null;
	};

	/**
	    * List of repeated fields within this message type.
	    * @private {!Array<number>}
	    * @const
	    */
	proto.game_protobuf_messages.proto.messages.RoomOptions.repeatedFields_ = [
	10,
	11,
	12];


	if (googleProtobuf.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.game_protobuf_messages.proto.messages.RoomOptions.prototype.toObject = function (
	  opt_includeInstance)
	  {
	    return proto.game_protobuf_messages.proto.messages.RoomOptions.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.game_protobuf_messages.proto.messages.RoomOptions} msg The msg instance to transform.
	      * @return {!Object}
	      * @suppress {unusedLocalVariables} f is only used for nested messages
	      */
	  proto.game_protobuf_messages.proto.messages.RoomOptions.toObject = function (
	  includeInstance,
	  msg)
	  {
	    var f,
	    obj = {
	      cid: googleProtobuf.Message.getFieldWithDefault(msg, 1, ''),
	      visible:
	      (f = msg.getVisible()) &&
	      wrappers_pb.BoolValue.toObject(includeInstance, f),
	      open:
	      (f = msg.getOpen()) &&
	      wrappers_pb.BoolValue.toObject(includeInstance, f),
	      emptyRoomTtl: googleProtobuf.Message.getFieldWithDefault(msg, 4, 0),
	      playerTtl: googleProtobuf.Message.getFieldWithDefault(msg, 5, 0),
	      maxMembers: googleProtobuf.Message.getFieldWithDefault(msg, 6, 0),
	      flag: googleProtobuf.Message.getFieldWithDefault(msg, 7, 0),
	      pluginName: googleProtobuf.Message.getFieldWithDefault(msg, 8, ''),
	      attr: msg.getAttr_asB64(),
	      expectMembersList:
	      (f = googleProtobuf.Message.getRepeatedField(msg, 10)) == null ? undefined : f,
	      lobbyAttrKeysList:
	      (f = googleProtobuf.Message.getRepeatedField(msg, 11)) == null ? undefined : f,
	      membersList: googleProtobuf.Message.toObjectList(
	      msg.getMembersList(),
	      proto.game_protobuf_messages.proto.messages.RoomMember.toObject,
	      includeInstance),

	      memberCount: googleProtobuf.Message.getFieldWithDefault(msg, 13, 0),
	      masterActorId: googleProtobuf.Message.getFieldWithDefault(msg, 14, 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.game_protobuf_messages.proto.messages.RoomOptions}
	   */
	proto.game_protobuf_messages.proto.messages.RoomOptions.deserializeBinary = function (
	bytes)
	{
	  var reader = new googleProtobuf.BinaryReader(bytes);
	  var msg = new proto.game_protobuf_messages.proto.messages.RoomOptions();
	  return proto.game_protobuf_messages.proto.messages.RoomOptions.deserializeBinaryFromReader(
	  msg,
	  reader);

	};

	/**
	    * Deserializes binary data (in protobuf wire format) from the
	    * given reader into the given message object.
	    * @param {!proto.game_protobuf_messages.proto.messages.RoomOptions} msg The message object to deserialize into.
	    * @param {!jspb.BinaryReader} reader The BinaryReader to use.
	    * @return {!proto.game_protobuf_messages.proto.messages.RoomOptions}
	    */
	proto.game_protobuf_messages.proto.messages.RoomOptions.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.setCid(value);
	        break;
	      case 2:
	        var value = new wrappers_pb.BoolValue();
	        reader.readMessage(
	        value,
	        wrappers_pb.BoolValue.deserializeBinaryFromReader);

	        msg.setVisible(value);
	        break;
	      case 3:
	        var value = new wrappers_pb.BoolValue();
	        reader.readMessage(
	        value,
	        wrappers_pb.BoolValue.deserializeBinaryFromReader);

	        msg.setOpen(value);
	        break;
	      case 4:
	        var value = /** @type {number} */reader.readInt32();
	        msg.setEmptyRoomTtl(value);
	        break;
	      case 5:
	        var value = /** @type {number} */reader.readInt32();
	        msg.setPlayerTtl(value);
	        break;
	      case 6:
	        var value = /** @type {number} */reader.readInt32();
	        msg.setMaxMembers(value);
	        break;
	      case 7:
	        var value = /** @type {number} */reader.readInt64();
	        msg.setFlag(value);
	        break;
	      case 8:
	        var value = /** @type {string} */reader.readString();
	        msg.setPluginName(value);
	        break;
	      case 9:
	        var value = /** @type {!Uint8Array} */reader.readBytes();
	        msg.setAttr(value);
	        break;
	      case 10:
	        var value = /** @type {string} */reader.readString();
	        msg.addExpectMembers(value);
	        break;
	      case 11:
	        var value = /** @type {string} */reader.readString();
	        msg.addLobbyAttrKeys(value);
	        break;
	      case 12:
	        var value = new proto.game_protobuf_messages.proto.messages.RoomMember();
	        reader.readMessage(
	        value,
	        proto.game_protobuf_messages.proto.messages.RoomMember.
	        deserializeBinaryFromReader);

	        msg.addMembers(value);
	        break;
	      case 13:
	        var value = /** @type {number} */reader.readInt32();
	        msg.setMemberCount(value);
	        break;
	      case 14:
	        var value = /** @type {number} */reader.readInt32();
	        msg.setMasterActorId(value);
	        break;
	      default:
	        reader.skipField();
	        break;}

	  }
	  return msg;
	};

	/**
	    * Serializes the message to binary data (in protobuf wire format).
	    * @return {!Uint8Array}
	    */
	proto.game_protobuf_messages.proto.messages.RoomOptions.prototype.serializeBinary = function () {
	  var writer = new googleProtobuf.BinaryWriter();
	  proto.game_protobuf_messages.proto.messages.RoomOptions.serializeBinaryToWriter(
	  this,
	  writer);

	  return writer.getResultBuffer();
	};

	/**
	    * Serializes the given message to binary data (in protobuf wire
	    * format), writing to the given BinaryWriter.
	    * @param {!proto.game_protobuf_messages.proto.messages.RoomOptions} message
	    * @param {!jspb.BinaryWriter} writer
	    * @suppress {unusedLocalVariables} f is only used for nested messages
	    */
	proto.game_protobuf_messages.proto.messages.RoomOptions.serializeBinaryToWriter = function (
	message,
	writer)
	{
	  var f = undefined;
	  f = message.getCid();
	  if (f.length > 0) {
	    writer.writeString(1, f);
	  }
	  f = message.getVisible();
	  if (f != null) {
	    writer.writeMessage(
	    2,
	    f,
	    wrappers_pb.BoolValue.serializeBinaryToWriter);

	  }
	  f = message.getOpen();
	  if (f != null) {
	    writer.writeMessage(
	    3,
	    f,
	    wrappers_pb.BoolValue.serializeBinaryToWriter);

	  }
	  f = message.getEmptyRoomTtl();
	  if (f !== 0) {
	    writer.writeInt32(4, f);
	  }
	  f = message.getPlayerTtl();
	  if (f !== 0) {
	    writer.writeInt32(5, f);
	  }
	  f = message.getMaxMembers();
	  if (f !== 0) {
	    writer.writeInt32(6, f);
	  }
	  f = message.getFlag();
	  if (f !== 0) {
	    writer.writeInt64(7, f);
	  }
	  f = message.getPluginName();
	  if (f.length > 0) {
	    writer.writeString(8, f);
	  }
	  f = message.getAttr_asU8();
	  if (f.length > 0) {
	    writer.writeBytes(9, f);
	  }
	  f = message.getExpectMembersList();
	  if (f.length > 0) {
	    writer.writeRepeatedString(10, f);
	  }
	  f = message.getLobbyAttrKeysList();
	  if (f.length > 0) {
	    writer.writeRepeatedString(11, f);
	  }
	  f = message.getMembersList();
	  if (f.length > 0) {
	    writer.writeRepeatedMessage(
	    12,
	    f,
	    proto.game_protobuf_messages.proto.messages.RoomMember.
	    serializeBinaryToWriter);

	  }
	  f = message.getMemberCount();
	  if (f !== 0) {
	    writer.writeInt32(13, f);
	  }
	  f = message.getMasterActorId();
	  if (f !== 0) {
	    writer.writeInt32(14, f);
	  }
	};

	/**
	    * optional string cid = 1;
	    * @return {string}
	    */
	proto.game_protobuf_messages.proto.messages.RoomOptions.prototype.getCid = function () {
	  return (/** @type {string} */googleProtobuf.Message.getFieldWithDefault(this, 1, ''));
	};

	/**
	    * @param {string} value
	    * @return {!proto.game_protobuf_messages.proto.messages.RoomOptions} returns this
	    */
	proto.game_protobuf_messages.proto.messages.RoomOptions.prototype.setCid = function (
	value)
	{
	  return googleProtobuf.Message.setProto3StringField(this, 1, value);
	};

	/**
	    * optional google.protobuf.BoolValue visible = 2;
	    * @return {?proto.google.protobuf.BoolValue}
	    */
	proto.game_protobuf_messages.proto.messages.RoomOptions.prototype.getVisible = function () {
	  return (/** @type{?proto.google.protobuf.BoolValue} */googleProtobuf.Message.getWrapperField(
	    this,
	    wrappers_pb.BoolValue,
	    2));

	};

	/**
	    * @param {?proto.google.protobuf.BoolValue|undefined} value
	    * @return {!proto.game_protobuf_messages.proto.messages.RoomOptions} returns this
	    */
	proto.game_protobuf_messages.proto.messages.RoomOptions.prototype.setVisible = function (
	value)
	{
	  return googleProtobuf.Message.setWrapperField(this, 2, value);
	};

	/**
	    * Clears the message field making it undefined.
	    * @return {!proto.game_protobuf_messages.proto.messages.RoomOptions} returns this
	    */
	proto.game_protobuf_messages.proto.messages.RoomOptions.prototype.clearVisible = function () {
	  return this.setVisible(undefined);
	};

	/**
	    * Returns whether this field is set.
	    * @return {boolean}
	    */
	proto.game_protobuf_messages.proto.messages.RoomOptions.prototype.hasVisible = function () {
	  return googleProtobuf.Message.getField(this, 2) != null;
	};

	/**
	    * optional google.protobuf.BoolValue open = 3;
	    * @return {?proto.google.protobuf.BoolValue}
	    */
	proto.game_protobuf_messages.proto.messages.RoomOptions.prototype.getOpen = function () {
	  return (/** @type{?proto.google.protobuf.BoolValue} */googleProtobuf.Message.getWrapperField(
	    this,
	    wrappers_pb.BoolValue,
	    3));

	};

	/**
	    * @param {?proto.google.protobuf.BoolValue|undefined} value
	    * @return {!proto.game_protobuf_messages.proto.messages.RoomOptions} returns this
	    */
	proto.game_protobuf_messages.proto.messages.RoomOptions.prototype.setOpen = function (
	value)
	{
	  return googleProtobuf.Message.setWrapperField(this, 3, value);
	};

	/**
	    * Clears the message field making it undefined.
	    * @return {!proto.game_protobuf_messages.proto.messages.RoomOptions} returns this
	    */
	proto.game_protobuf_messages.proto.messages.RoomOptions.prototype.clearOpen = function () {
	  return this.setOpen(undefined);
	};

	/**
	    * Returns whether this field is set.
	    * @return {boolean}
	    */
	proto.game_protobuf_messages.proto.messages.RoomOptions.prototype.hasOpen = function () {
	  return googleProtobuf.Message.getField(this, 3) != null;
	};

	/**
	    * optional int32 empty_room_ttl = 4;
	    * @return {number}
	    */
	proto.game_protobuf_messages.proto.messages.RoomOptions.prototype.getEmptyRoomTtl = function () {
	  return (/** @type {number} */googleProtobuf.Message.getFieldWithDefault(this, 4, 0));
	};

	/**
	    * @param {number} value
	    * @return {!proto.game_protobuf_messages.proto.messages.RoomOptions} returns this
	    */
	proto.game_protobuf_messages.proto.messages.RoomOptions.prototype.setEmptyRoomTtl = function (
	value)
	{
	  return googleProtobuf.Message.setProto3IntField(this, 4, value);
	};

	/**
	    * optional int32 player_ttl = 5;
	    * @return {number}
	    */
	proto.game_protobuf_messages.proto.messages.RoomOptions.prototype.getPlayerTtl = function () {
	  return (/** @type {number} */googleProtobuf.Message.getFieldWithDefault(this, 5, 0));
	};

	/**
	    * @param {number} value
	    * @return {!proto.game_protobuf_messages.proto.messages.RoomOptions} returns this
	    */
	proto.game_protobuf_messages.proto.messages.RoomOptions.prototype.setPlayerTtl = function (
	value)
	{
	  return googleProtobuf.Message.setProto3IntField(this, 5, value);
	};

	/**
	    * optional int32 max_members = 6;
	    * @return {number}
	    */
	proto.game_protobuf_messages.proto.messages.RoomOptions.prototype.getMaxMembers = function () {
	  return (/** @type {number} */googleProtobuf.Message.getFieldWithDefault(this, 6, 0));
	};

	/**
	    * @param {number} value
	    * @return {!proto.game_protobuf_messages.proto.messages.RoomOptions} returns this
	    */
	proto.game_protobuf_messages.proto.messages.RoomOptions.prototype.setMaxMembers = function (
	value)
	{
	  return googleProtobuf.Message.setProto3IntField(this, 6, value);
	};

	/**
	    * optional int64 flag = 7;
	    * @return {number}
	    */
	proto.game_protobuf_messages.proto.messages.RoomOptions.prototype.getFlag = function () {
	  return (/** @type {number} */googleProtobuf.Message.getFieldWithDefault(this, 7, 0));
	};

	/**
	    * @param {number} value
	    * @return {!proto.game_protobuf_messages.proto.messages.RoomOptions} returns this
	    */
	proto.game_protobuf_messages.proto.messages.RoomOptions.prototype.setFlag = function (
	value)
	{
	  return googleProtobuf.Message.setProto3IntField(this, 7, value);
	};

	/**
	    * optional string plugin_name = 8;
	    * @return {string}
	    */
	proto.game_protobuf_messages.proto.messages.RoomOptions.prototype.getPluginName = function () {
	  return (/** @type {string} */googleProtobuf.Message.getFieldWithDefault(this, 8, ''));
	};

	/**
	    * @param {string} value
	    * @return {!proto.game_protobuf_messages.proto.messages.RoomOptions} returns this
	    */
	proto.game_protobuf_messages.proto.messages.RoomOptions.prototype.setPluginName = function (
	value)
	{
	  return googleProtobuf.Message.setProto3StringField(this, 8, value);
	};

	/**
	    * optional bytes attr = 9;
	    * @return {!(string|Uint8Array)}
	    */
	proto.game_protobuf_messages.proto.messages.RoomOptions.prototype.getAttr = function () {
	  return (/** @type {!(string|Uint8Array)} */googleProtobuf.Message.getFieldWithDefault(
	    this,
	    9,
	    ''));

	};

	/**
	    * optional bytes attr = 9;
	    * This is a type-conversion wrapper around `getAttr()`
	    * @return {string}
	    */
	proto.game_protobuf_messages.proto.messages.RoomOptions.prototype.getAttr_asB64 = function () {
	  return (/** @type {string} */googleProtobuf.Message.bytesAsB64(this.getAttr()));
	};

	/**
	    * optional bytes attr = 9;
	    * Note that Uint8Array is not supported on all browsers.
	    * @see http://caniuse.com/Uint8Array
	    * This is a type-conversion wrapper around `getAttr()`
	    * @return {!Uint8Array}
	    */
	proto.game_protobuf_messages.proto.messages.RoomOptions.prototype.getAttr_asU8 = function () {
	  return (/** @type {!Uint8Array} */googleProtobuf.Message.bytesAsU8(this.getAttr()));
	};

	/**
	    * @param {!(string|Uint8Array)} value
	    * @return {!proto.game_protobuf_messages.proto.messages.RoomOptions} returns this
	    */
	proto.game_protobuf_messages.proto.messages.RoomOptions.prototype.setAttr = function (
	value)
	{
	  return googleProtobuf.Message.setProto3BytesField(this, 9, value);
	};

	/**
	    * repeated string expect_members = 10;
	    * @return {!Array<string>}
	    */
	proto.game_protobuf_messages.proto.messages.RoomOptions.prototype.getExpectMembersList = function () {
	  return (/** @type {!Array<string>} */googleProtobuf.Message.getRepeatedField(
	    this,
	    10));

	};

	/**
	    * @param {!Array<string>} value
	    * @return {!proto.game_protobuf_messages.proto.messages.RoomOptions} returns this
	    */
	proto.game_protobuf_messages.proto.messages.RoomOptions.prototype.setExpectMembersList = function (
	value)
	{
	  return googleProtobuf.Message.setField(this, 10, value || []);
	};

	/**
	    * @param {string} value
	    * @param {number=} opt_index
	    * @return {!proto.game_protobuf_messages.proto.messages.RoomOptions} returns this
	    */
	proto.game_protobuf_messages.proto.messages.RoomOptions.prototype.addExpectMembers = function (
	value,
	opt_index)
	{
	  return googleProtobuf.Message.addToRepeatedField(this, 10, value, opt_index);
	};

	/**
	    * Clears the list making it empty but non-null.
	    * @return {!proto.game_protobuf_messages.proto.messages.RoomOptions} returns this
	    */
	proto.game_protobuf_messages.proto.messages.RoomOptions.prototype.clearExpectMembersList = function () {
	  return this.setExpectMembersList([]);
	};

	/**
	    * repeated string lobby_attr_keys = 11;
	    * @return {!Array<string>}
	    */
	proto.game_protobuf_messages.proto.messages.RoomOptions.prototype.getLobbyAttrKeysList = function () {
	  return (/** @type {!Array<string>} */googleProtobuf.Message.getRepeatedField(
	    this,
	    11));

	};

	/**
	    * @param {!Array<string>} value
	    * @return {!proto.game_protobuf_messages.proto.messages.RoomOptions} returns this
	    */
	proto.game_protobuf_messages.proto.messages.RoomOptions.prototype.setLobbyAttrKeysList = function (
	value)
	{
	  return googleProtobuf.Message.setField(this, 11, value || []);
	};

	/**
	    * @param {string} value
	    * @param {number=} opt_index
	    * @return {!proto.game_protobuf_messages.proto.messages.RoomOptions} returns this
	    */
	proto.game_protobuf_messages.proto.messages.RoomOptions.prototype.addLobbyAttrKeys = function (
	value,
	opt_index)
	{
	  return googleProtobuf.Message.addToRepeatedField(this, 11, value, opt_index);
	};

	/**
	    * Clears the list making it empty but non-null.
	    * @return {!proto.game_protobuf_messages.proto.messages.RoomOptions} returns this
	    */
	proto.game_protobuf_messages.proto.messages.RoomOptions.prototype.clearLobbyAttrKeysList = function () {
	  return this.setLobbyAttrKeysList([]);
	};

	/**
	    * repeated RoomMember members = 12;
	    * @return {!Array<!proto.game_protobuf_messages.proto.messages.RoomMember>}
	    */
	proto.game_protobuf_messages.proto.messages.RoomOptions.prototype.getMembersList = function () {
	  return (/** @type{!Array<!proto.game_protobuf_messages.proto.messages.RoomMember>} */googleProtobuf.Message.getRepeatedWrapperField(
	    this,
	    proto.game_protobuf_messages.proto.messages.RoomMember,
	    12));

	};

	/**
	    * @param {!Array<!proto.game_protobuf_messages.proto.messages.RoomMember>} value
	    * @return {!proto.game_protobuf_messages.proto.messages.RoomOptions} returns this
	    */
	proto.game_protobuf_messages.proto.messages.RoomOptions.prototype.setMembersList = function (
	value)
	{
	  return googleProtobuf.Message.setRepeatedWrapperField(this, 12, value);
	};

	/**
	    * @param {!proto.game_protobuf_messages.proto.messages.RoomMember=} opt_value
	    * @param {number=} opt_index
	    * @return {!proto.game_protobuf_messages.proto.messages.RoomMember}
	    */
	proto.game_protobuf_messages.proto.messages.RoomOptions.prototype.addMembers = function (
	opt_value,
	opt_index)
	{
	  return googleProtobuf.Message.addToRepeatedWrapperField(
	  this,
	  12,
	  opt_value,
	  proto.game_protobuf_messages.proto.messages.RoomMember,
	  opt_index);

	};

	/**
	    * Clears the list making it empty but non-null.
	    * @return {!proto.game_protobuf_messages.proto.messages.RoomOptions} returns this
	    */
	proto.game_protobuf_messages.proto.messages.RoomOptions.prototype.clearMembersList = function () {
	  return this.setMembersList([]);
	};

	/**
	    * optional int32 member_count = 13;
	    * @return {number}
	    */
	proto.game_protobuf_messages.proto.messages.RoomOptions.prototype.getMemberCount = function () {
	  return (/** @type {number} */googleProtobuf.Message.getFieldWithDefault(this, 13, 0));
	};

	/**
	    * @param {number} value
	    * @return {!proto.game_protobuf_messages.proto.messages.RoomOptions} returns this
	    */
	proto.game_protobuf_messages.proto.messages.RoomOptions.prototype.setMemberCount = function (
	value)
	{
	  return googleProtobuf.Message.setProto3IntField(this, 13, value);
	};

	/**
	    * optional int32 master_actor_id = 14;
	    * @return {number}
	    */
	proto.game_protobuf_messages.proto.messages.RoomOptions.prototype.getMasterActorId = function () {
	  return (/** @type {number} */googleProtobuf.Message.getFieldWithDefault(this, 14, 0));
	};

	/**
	    * @param {number} value
	    * @return {!proto.game_protobuf_messages.proto.messages.RoomOptions} returns this
	    */
	proto.game_protobuf_messages.proto.messages.RoomOptions.prototype.setMasterActorId = function (
	value)
	{
	  return googleProtobuf.Message.setProto3IntField(this, 14, value);
	};

	if (googleProtobuf.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.game_protobuf_messages.proto.messages.SessionOpenRequest.prototype.toObject = function (
	  opt_includeInstance)
	  {
	    return proto.game_protobuf_messages.proto.messages.SessionOpenRequest.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.game_protobuf_messages.proto.messages.SessionOpenRequest} msg The msg instance to transform.
	      * @return {!Object}
	      * @suppress {unusedLocalVariables} f is only used for nested messages
	      */
	  proto.game_protobuf_messages.proto.messages.SessionOpenRequest.toObject = function (
	  includeInstance,
	  msg)
	  {
	    var obj = {
	      appId: googleProtobuf.Message.getFieldWithDefault(msg, 1, ''),
	      peerId: googleProtobuf.Message.getFieldWithDefault(msg, 2, ''),
	      gameVersion: googleProtobuf.Message.getFieldWithDefault(msg, 3, ''),
	      sdkVersion: googleProtobuf.Message.getFieldWithDefault(msg, 4, ''),
	      protocolVersion: googleProtobuf.Message.getFieldWithDefault(msg, 5, ''),
	      t: googleProtobuf.Message.getFieldWithDefault(msg, 6, 0),
	      n: googleProtobuf.Message.getFieldWithDefault(msg, 7, ''),
	      s: googleProtobuf.Message.getFieldWithDefault(msg, 8, ''),
	      configBitmap: googleProtobuf.Message.getFieldWithDefault(msg, 9, 0),
	      sessionToken: googleProtobuf.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.game_protobuf_messages.proto.messages.SessionOpenRequest}
	   */
	proto.game_protobuf_messages.proto.messages.SessionOpenRequest.deserializeBinary = function (
	bytes)
	{
	  var reader = new googleProtobuf.BinaryReader(bytes);
	  var msg = new proto.game_protobuf_messages.proto.messages.SessionOpenRequest();
	  return proto.game_protobuf_messages.proto.messages.SessionOpenRequest.deserializeBinaryFromReader(
	  msg,
	  reader);

	};

	/**
	    * Deserializes binary data (in protobuf wire format) from the
	    * given reader into the given message object.
	    * @param {!proto.game_protobuf_messages.proto.messages.SessionOpenRequest} msg The message object to deserialize into.
	    * @param {!jspb.BinaryReader} reader The BinaryReader to use.
	    * @return {!proto.game_protobuf_messages.proto.messages.SessionOpenRequest}
	    */
	proto.game_protobuf_messages.proto.messages.SessionOpenRequest.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.setAppId(value);
	        break;
	      case 2:
	        var value = /** @type {string} */reader.readString();
	        msg.setPeerId(value);
	        break;
	      case 3:
	        var value = /** @type {string} */reader.readString();
	        msg.setGameVersion(value);
	        break;
	      case 4:
	        var value = /** @type {string} */reader.readString();
	        msg.setSdkVersion(value);
	        break;
	      case 5:
	        var value = /** @type {string} */reader.readString();
	        msg.setProtocolVersion(value);
	        break;
	      case 6:
	        var value = /** @type {number} */reader.readInt64();
	        msg.setT(value);
	        break;
	      case 7:
	        var value = /** @type {string} */reader.readString();
	        msg.setN(value);
	        break;
	      case 8:
	        var value = /** @type {string} */reader.readString();
	        msg.setS(value);
	        break;
	      case 9:
	        var value = /** @type {number} */reader.readInt64();
	        msg.setConfigBitmap(value);
	        break;
	      case 10:
	        var value = /** @type {string} */reader.readString();
	        msg.setSessionToken(value);
	        break;
	      default:
	        reader.skipField();
	        break;}

	  }
	  return msg;
	};

	/**
	    * Serializes the message to binary data (in protobuf wire format).
	    * @return {!Uint8Array}
	    */
	proto.game_protobuf_messages.proto.messages.SessionOpenRequest.prototype.serializeBinary = function () {
	  var writer = new googleProtobuf.BinaryWriter();
	  proto.game_protobuf_messages.proto.messages.SessionOpenRequest.serializeBinaryToWriter(
	  this,
	  writer);

	  return writer.getResultBuffer();
	};

	/**
	    * Serializes the given message to binary data (in protobuf wire
	    * format), writing to the given BinaryWriter.
	    * @param {!proto.game_protobuf_messages.proto.messages.SessionOpenRequest} message
	    * @param {!jspb.BinaryWriter} writer
	    * @suppress {unusedLocalVariables} f is only used for nested messages
	    */
	proto.game_protobuf_messages.proto.messages.SessionOpenRequest.serializeBinaryToWriter = function (
	message,
	writer)
	{
	  var f = undefined;
	  f = message.getAppId();
	  if (f.length > 0) {
	    writer.writeString(1, f);
	  }
	  f = message.getPeerId();
	  if (f.length > 0) {
	    writer.writeString(2, f);
	  }
	  f = message.getGameVersion();
	  if (f.length > 0) {
	    writer.writeString(3, f);
	  }
	  f = message.getSdkVersion();
	  if (f.length > 0) {
	    writer.writeString(4, f);
	  }
	  f = message.getProtocolVersion();
	  if (f.length > 0) {
	    writer.writeString(5, f);
	  }
	  f = message.getT();
	  if (f !== 0) {
	    writer.writeInt64(6, f);
	  }
	  f = message.getN();
	  if (f.length > 0) {
	    writer.writeString(7, f);
	  }
	  f = message.getS();
	  if (f.length > 0) {
	    writer.writeString(8, f);
	  }
	  f = message.getConfigBitmap();
	  if (f !== 0) {
	    writer.writeInt64(9, f);
	  }
	  f = message.getSessionToken();
	  if (f.length > 0) {
	    writer.writeString(10, f);
	  }
	};

	/**
	    * optional string app_id = 1;
	    * @return {string}
	    */
	proto.game_protobuf_messages.proto.messages.SessionOpenRequest.prototype.getAppId = function () {
	  return (/** @type {string} */googleProtobuf.Message.getFieldWithDefault(this, 1, ''));
	};

	/**
	    * @param {string} value
	    * @return {!proto.game_protobuf_messages.proto.messages.SessionOpenRequest} returns this
	    */
	proto.game_protobuf_messages.proto.messages.SessionOpenRequest.prototype.setAppId = function (
	value)
	{
	  return googleProtobuf.Message.setProto3StringField(this, 1, value);
	};

	/**
	    * optional string peer_id = 2;
	    * @return {string}
	    */
	proto.game_protobuf_messages.proto.messages.SessionOpenRequest.prototype.getPeerId = function () {
	  return (/** @type {string} */googleProtobuf.Message.getFieldWithDefault(this, 2, ''));
	};

	/**
	    * @param {string} value
	    * @return {!proto.game_protobuf_messages.proto.messages.SessionOpenRequest} returns this
	    */
	proto.game_protobuf_messages.proto.messages.SessionOpenRequest.prototype.setPeerId = function (
	value)
	{
	  return googleProtobuf.Message.setProto3StringField(this, 2, value);
	};

	/**
	    * optional string game_version = 3;
	    * @return {string}
	    */
	proto.game_protobuf_messages.proto.messages.SessionOpenRequest.prototype.getGameVersion = function () {
	  return (/** @type {string} */googleProtobuf.Message.getFieldWithDefault(this, 3, ''));
	};

	/**
	    * @param {string} value
	    * @return {!proto.game_protobuf_messages.proto.messages.SessionOpenRequest} returns this
	    */
	proto.game_protobuf_messages.proto.messages.SessionOpenRequest.prototype.setGameVersion = function (
	value)
	{
	  return googleProtobuf.Message.setProto3StringField(this, 3, value);
	};

	/**
	    * optional string sdk_version = 4;
	    * @return {string}
	    */
	proto.game_protobuf_messages.proto.messages.SessionOpenRequest.prototype.getSdkVersion = function () {
	  return (/** @type {string} */googleProtobuf.Message.getFieldWithDefault(this, 4, ''));
	};

	/**
	    * @param {string} value
	    * @return {!proto.game_protobuf_messages.proto.messages.SessionOpenRequest} returns this
	    */
	proto.game_protobuf_messages.proto.messages.SessionOpenRequest.prototype.setSdkVersion = function (
	value)
	{
	  return googleProtobuf.Message.setProto3StringField(this, 4, value);
	};

	/**
	    * optional string protocol_version = 5;
	    * @return {string}
	    */
	proto.game_protobuf_messages.proto.messages.SessionOpenRequest.prototype.getProtocolVersion = function () {
	  return (/** @type {string} */googleProtobuf.Message.getFieldWithDefault(this, 5, ''));
	};

	/**
	    * @param {string} value
	    * @return {!proto.game_protobuf_messages.proto.messages.SessionOpenRequest} returns this
	    */
	proto.game_protobuf_messages.proto.messages.SessionOpenRequest.prototype.setProtocolVersion = function (
	value)
	{
	  return googleProtobuf.Message.setProto3StringField(this, 5, value);
	};

	/**
	    * optional int64 t = 6;
	    * @return {number}
	    */
	proto.game_protobuf_messages.proto.messages.SessionOpenRequest.prototype.getT = function () {
	  return (/** @type {number} */googleProtobuf.Message.getFieldWithDefault(this, 6, 0));
	};

	/**
	    * @param {number} value
	    * @return {!proto.game_protobuf_messages.proto.messages.SessionOpenRequest} returns this
	    */
	proto.game_protobuf_messages.proto.messages.SessionOpenRequest.prototype.setT = function (
	value)
	{
	  return googleProtobuf.Message.setProto3IntField(this, 6, value);
	};

	/**
	    * optional string n = 7;
	    * @return {string}
	    */
	proto.game_protobuf_messages.proto.messages.SessionOpenRequest.prototype.getN = function () {
	  return (/** @type {string} */googleProtobuf.Message.getFieldWithDefault(this, 7, ''));
	};

	/**
	    * @param {string} value
	    * @return {!proto.game_protobuf_messages.proto.messages.SessionOpenRequest} returns this
	    */
	proto.game_protobuf_messages.proto.messages.SessionOpenRequest.prototype.setN = function (
	value)
	{
	  return googleProtobuf.Message.setProto3StringField(this, 7, value);
	};

	/**
	    * optional string s = 8;
	    * @return {string}
	    */
	proto.game_protobuf_messages.proto.messages.SessionOpenRequest.prototype.getS = function () {
	  return (/** @type {string} */googleProtobuf.Message.getFieldWithDefault(this, 8, ''));
	};

	/**
	    * @param {string} value
	    * @return {!proto.game_protobuf_messages.proto.messages.SessionOpenRequest} returns this
	    */
	proto.game_protobuf_messages.proto.messages.SessionOpenRequest.prototype.setS = function (
	value)
	{
	  return googleProtobuf.Message.setProto3StringField(this, 8, value);
	};

	/**
	    * optional int64 config_bitmap = 9;
	    * @return {number}
	    */
	proto.game_protobuf_messages.proto.messages.SessionOpenRequest.prototype.getConfigBitmap = function () {
	  return (/** @type {number} */googleProtobuf.Message.getFieldWithDefault(this, 9, 0));
	};

	/**
	    * @param {number} value
	    * @return {!proto.game_protobuf_messages.proto.messages.SessionOpenRequest} returns this
	    */
	proto.game_protobuf_messages.proto.messages.SessionOpenRequest.prototype.setConfigBitmap = function (
	value)
	{
	  return googleProtobuf.Message.setProto3IntField(this, 9, value);
	};

	/**
	    * optional string session_token = 10;
	    * @return {string}
	    */
	proto.game_protobuf_messages.proto.messages.SessionOpenRequest.prototype.getSessionToken = function () {
	  return (/** @type {string} */googleProtobuf.Message.getFieldWithDefault(this, 10, ''));
	};

	/**
	    * @param {string} value
	    * @return {!proto.game_protobuf_messages.proto.messages.SessionOpenRequest} returns this
	    */
	proto.game_protobuf_messages.proto.messages.SessionOpenRequest.prototype.setSessionToken = function (
	value)
	{
	  return googleProtobuf.Message.setProto3StringField(this, 10, value);
	};

	if (googleProtobuf.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.game_protobuf_messages.proto.messages.CreateRoomRequest.prototype.toObject = function (
	  opt_includeInstance)
	  {
	    return proto.game_protobuf_messages.proto.messages.CreateRoomRequest.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.game_protobuf_messages.proto.messages.CreateRoomRequest} msg The msg instance to transform.
	      * @return {!Object}
	      * @suppress {unusedLocalVariables} f is only used for nested messages
	      */
	  proto.game_protobuf_messages.proto.messages.CreateRoomRequest.toObject = function (
	  includeInstance,
	  msg)
	  {
	    var f,
	    obj = {
	      roomOptions:
	      (f = msg.getRoomOptions()) &&
	      proto.game_protobuf_messages.proto.messages.RoomOptions.toObject(
	      includeInstance,
	      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.game_protobuf_messages.proto.messages.CreateRoomRequest}
	   */
	proto.game_protobuf_messages.proto.messages.CreateRoomRequest.deserializeBinary = function (
	bytes)
	{
	  var reader = new googleProtobuf.BinaryReader(bytes);
	  var msg = new proto.game_protobuf_messages.proto.messages.CreateRoomRequest();
	  return proto.game_protobuf_messages.proto.messages.CreateRoomRequest.deserializeBinaryFromReader(
	  msg,
	  reader);

	};

	/**
	    * Deserializes binary data (in protobuf wire format) from the
	    * given reader into the given message object.
	    * @param {!proto.game_protobuf_messages.proto.messages.CreateRoomRequest} msg The message object to deserialize into.
	    * @param {!jspb.BinaryReader} reader The BinaryReader to use.
	    * @return {!proto.game_protobuf_messages.proto.messages.CreateRoomRequest}
	    */
	proto.game_protobuf_messages.proto.messages.CreateRoomRequest.deserializeBinaryFromReader = function (
	msg,
	reader)
	{
	  while (reader.nextField()) {
	    if (reader.isEndGroup()) {
	      break;
	    }
	    var field = reader.getFieldNumber();
	    switch (field) {
	      case 1:
	        var value = new proto.game_protobuf_messages.proto.messages.RoomOptions();
	        reader.readMessage(
	        value,
	        proto.game_protobuf_messages.proto.messages.RoomOptions.
	        deserializeBinaryFromReader);

	        msg.setRoomOptions(value);
	        break;
	      default:
	        reader.skipField();
	        break;}

	  }
	  return msg;
	};

	/**
	    * Serializes the message to binary data (in protobuf wire format).
	    * @return {!Uint8Array}
	    */
	proto.game_protobuf_messages.proto.messages.CreateRoomRequest.prototype.serializeBinary = function () {
	  var writer = new googleProtobuf.BinaryWriter();
	  proto.game_protobuf_messages.proto.messages.CreateRoomRequest.serializeBinaryToWriter(
	  this,
	  writer);

	  return writer.getResultBuffer();
	};

	/**
	    * Serializes the given message to binary data (in protobuf wire
	    * format), writing to the given BinaryWriter.
	    * @param {!proto.game_protobuf_messages.proto.messages.CreateRoomRequest} message
	    * @param {!jspb.BinaryWriter} writer
	    * @suppress {unusedLocalVariables} f is only used for nested messages
	    */
	proto.game_protobuf_messages.proto.messages.CreateRoomRequest.serializeBinaryToWriter = function (
	message,
	writer)
	{
	  var f = undefined;
	  f = message.getRoomOptions();
	  if (f != null) {
	    writer.writeMessage(
	    1,
	    f,
	    proto.game_protobuf_messages.proto.messages.RoomOptions.
	    serializeBinaryToWriter);

	  }
	};

	/**
	    * optional RoomOptions room_options = 1;
	    * @return {?proto.game_protobuf_messages.proto.messages.RoomOptions}
	    */
	proto.game_protobuf_messages.proto.messages.CreateRoomRequest.prototype.getRoomOptions = function () {
	  return (/** @type{?proto.game_protobuf_messages.proto.messages.RoomOptions} */googleProtobuf.Message.getWrapperField(
	    this,
	    proto.game_protobuf_messages.proto.messages.RoomOptions,
	    1));

	};

	/**
	    * @param {?proto.game_protobuf_messages.proto.messages.RoomOptions|undefined} value
	    * @return {!proto.game_protobuf_messages.proto.messages.CreateRoomRequest} returns this
	    */
	proto.game_protobuf_messages.proto.messages.CreateRoomRequest.prototype.setRoomOptions = function (
	value)
	{
	  return googleProtobuf.Message.setWrapperField(this, 1, value);
	};

	/**
	    * Clears the message field making it undefined.
	    * @return {!proto.game_protobuf_messages.proto.messages.CreateRoomRequest} returns this
	    */
	proto.game_protobuf_messages.proto.messages.CreateRoomRequest.prototype.clearRoomOptions = function () {
	  return this.setRoomOptions(undefined);
	};

	/**
	    * Returns whether this field is set.
	    * @return {boolean}
	    */
	proto.game_protobuf_messages.proto.messages.CreateRoomRequest.prototype.hasRoomOptions = function () {
	  return googleProtobuf.Message.getField(this, 1) != null;
	};

	if (googleProtobuf.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.game_protobuf_messages.proto.messages.CreateRoomResponse.prototype.toObject = function (
	  opt_includeInstance)
	  {
	    return proto.game_protobuf_messages.proto.messages.CreateRoomResponse.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.game_protobuf_messages.proto.messages.CreateRoomResponse} msg The msg instance to transform.
	      * @return {!Object}
	      * @suppress {unusedLocalVariables} f is only used for nested messages
	      */
	  proto.game_protobuf_messages.proto.messages.CreateRoomResponse.toObject = function (
	  includeInstance,
	  msg)
	  {
	    var f,
	    obj = {
	      roomOptions:
	      (f = msg.getRoomOptions()) &&
	      proto.game_protobuf_messages.proto.messages.RoomOptions.toObject(
	      includeInstance,
	      f),

	      addr: googleProtobuf.Message.getFieldWithDefault(msg, 2, ''),
	      roomCreated: googleProtobuf.Message.getBooleanFieldWithDefault(msg, 3, false) };


	    if (includeInstance) {
	      obj.$jspbMessageInstance = msg;
	    }
	    return obj;
	  };
	}

	/**
	   * Deserializes binary data (in protobuf wire format).
	   * @param {jspb.ByteSource} bytes The bytes to deserialize.
	   * @return {!proto.game_protobuf_messages.proto.messages.CreateRoomResponse}
	   */
	proto.game_protobuf_messages.proto.messages.CreateRoomResponse.deserializeBinary = function (
	bytes)
	{
	  var reader = new googleProtobuf.BinaryReader(bytes);
	  var msg = new proto.game_protobuf_messages.proto.messages.CreateRoomResponse();
	  return proto.game_protobuf_messages.proto.messages.CreateRoomResponse.deserializeBinaryFromReader(
	  msg,
	  reader);

	};

	/**
	    * Deserializes binary data (in protobuf wire format) from the
	    * given reader into the given message object.
	    * @param {!proto.game_protobuf_messages.proto.messages.CreateRoomResponse} msg The message object to deserialize into.
	    * @param {!jspb.BinaryReader} reader The BinaryReader to use.
	    * @return {!proto.game_protobuf_messages.proto.messages.CreateRoomResponse}
	    */
	proto.game_protobuf_messages.proto.messages.CreateRoomResponse.deserializeBinaryFromReader = function (
	msg,
	reader)
	{
	  while (reader.nextField()) {
	    if (reader.isEndGroup()) {
	      break;
	    }
	    var field = reader.getFieldNumber();
	    switch (field) {
	      case 1:
	        var value = new proto.game_protobuf_messages.proto.messages.RoomOptions();
	        reader.readMessage(
	        value,
	        proto.game_protobuf_messages.proto.messages.RoomOptions.
	        deserializeBinaryFromReader);

	        msg.setRoomOptions(value);
	        break;
	      case 2:
	        var value = /** @type {string} */reader.readString();
	        msg.setAddr(value);
	        break;
	      case 3:
	        var value = /** @type {boolean} */reader.readBool();
	        msg.setRoomCreated(value);
	        break;
	      default:
	        reader.skipField();
	        break;}

	  }
	  return msg;
	};

	/**
	    * Serializes the message to binary data (in protobuf wire format).
	    * @return {!Uint8Array}
	    */
	proto.game_protobuf_messages.proto.messages.CreateRoomResponse.prototype.serializeBinary = function () {
	  var writer = new googleProtobuf.BinaryWriter();
	  proto.game_protobuf_messages.proto.messages.CreateRoomResponse.serializeBinaryToWriter(
	  this,
	  writer);

	  return writer.getResultBuffer();
	};

	/**
	    * Serializes the given message to binary data (in protobuf wire
	    * format), writing to the given BinaryWriter.
	    * @param {!proto.game_protobuf_messages.proto.messages.CreateRoomResponse} message
	    * @param {!jspb.BinaryWriter} writer
	    * @suppress {unusedLocalVariables} f is only used for nested messages
	    */
	proto.game_protobuf_messages.proto.messages.CreateRoomResponse.serializeBinaryToWriter = function (
	message,
	writer)
	{
	  var f = undefined;
	  f = message.getRoomOptions();
	  if (f != null) {
	    writer.writeMessage(
	    1,
	    f,
	    proto.game_protobuf_messages.proto.messages.RoomOptions.
	    serializeBinaryToWriter);

	  }
	  f = message.getAddr();
	  if (f.length > 0) {
	    writer.writeString(2, f);
	  }
	  f = message.getRoomCreated();
	  if (f) {
	    writer.writeBool(3, f);
	  }
	};

	/**
	    * optional RoomOptions room_options = 1;
	    * @return {?proto.game_protobuf_messages.proto.messages.RoomOptions}
	    */
	proto.game_protobuf_messages.proto.messages.CreateRoomResponse.prototype.getRoomOptions = function () {
	  return (/** @type{?proto.game_protobuf_messages.proto.messages.RoomOptions} */googleProtobuf.Message.getWrapperField(
	    this,
	    proto.game_protobuf_messages.proto.messages.RoomOptions,
	    1));

	};

	/**
	    * @param {?proto.game_protobuf_messages.proto.messages.RoomOptions|undefined} value
	    * @return {!proto.game_protobuf_messages.proto.messages.CreateRoomResponse} returns this
	    */
	proto.game_protobuf_messages.proto.messages.CreateRoomResponse.prototype.setRoomOptions = function (
	value)
	{
	  return googleProtobuf.Message.setWrapperField(this, 1, value);
	};

	/**
	    * Clears the message field making it undefined.
	    * @return {!proto.game_protobuf_messages.proto.messages.CreateRoomResponse} returns this
	    */
	proto.game_protobuf_messages.proto.messages.CreateRoomResponse.prototype.clearRoomOptions = function () {
	  return this.setRoomOptions(undefined);
	};

	/**
	    * Returns whether this field is set.
	    * @return {boolean}
	    */
	proto.game_protobuf_messages.proto.messages.CreateRoomResponse.prototype.hasRoomOptions = function () {
	  return googleProtobuf.Message.getField(this, 1) != null;
	};

	/**
	    * optional string addr = 2;
	    * @return {string}
	    */
	proto.game_protobuf_messages.proto.messages.CreateRoomResponse.prototype.getAddr = function () {
	  return (/** @type {string} */googleProtobuf.Message.getFieldWithDefault(this, 2, ''));
	};

	/**
	    * @param {string} value
	    * @return {!proto.game_protobuf_messages.proto.messages.CreateRoomResponse} returns this
	    */
	proto.game_protobuf_messages.proto.messages.CreateRoomResponse.prototype.setAddr = function (
	value)
	{
	  return googleProtobuf.Message.setProto3StringField(this, 2, value);
	};

	/**
	    * optional bool room_created = 3;
	    * @return {boolean}
	    */
	proto.game_protobuf_messages.proto.messages.CreateRoomResponse.prototype.getRoomCreated = function () {
	  return (/** @type {boolean} */googleProtobuf.Message.getBooleanFieldWithDefault(
	    this,
	    3,
	    false));

	};

	/**
	    * @param {boolean} value
	    * @return {!proto.game_protobuf_messages.proto.messages.CreateRoomResponse} returns this
	    */
	proto.game_protobuf_messages.proto.messages.CreateRoomResponse.prototype.setRoomCreated = function (
	value)
	{
	  return googleProtobuf.Message.setProto3BooleanField(this, 3, value);
	};

	if (googleProtobuf.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.game_protobuf_messages.proto.messages.JoinRoomRequest.prototype.toObject = function (
	  opt_includeInstance)
	  {
	    return proto.game_protobuf_messages.proto.messages.JoinRoomRequest.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.game_protobuf_messages.proto.messages.JoinRoomRequest} msg The msg instance to transform.
	      * @return {!Object}
	      * @suppress {unusedLocalVariables} f is only used for nested messages
	      */
	  proto.game_protobuf_messages.proto.messages.JoinRoomRequest.toObject = function (
	  includeInstance,
	  msg)
	  {
	    var f,
	    obj = {
	      rejoin: googleProtobuf.Message.getBooleanFieldWithDefault(msg, 1, false),
	      roomOptions:
	      (f = msg.getRoomOptions()) &&
	      proto.game_protobuf_messages.proto.messages.RoomOptions.toObject(
	      includeInstance,
	      f),

	      expectAttr: msg.getExpectAttr_asB64(),
	      piggybackPeerId: googleProtobuf.Message.getFieldWithDefault(msg, 4, ''),
	      createOnNotFound: googleProtobuf.Message.getBooleanFieldWithDefault(
	      msg,
	      5,
	      false) };



	    if (includeInstance) {
	      obj.$jspbMessageInstance = msg;
	    }
	    return obj;
	  };
	}

	/**
	   * Deserializes binary data (in protobuf wire format).
	   * @param {jspb.ByteSource} bytes The bytes to deserialize.
	   * @return {!proto.game_protobuf_messages.proto.messages.JoinRoomRequest}
	   */
	proto.game_protobuf_messages.proto.messages.JoinRoomRequest.deserializeBinary = function (
	bytes)
	{
	  var reader = new googleProtobuf.BinaryReader(bytes);
	  var msg = new proto.game_protobuf_messages.proto.messages.JoinRoomRequest();
	  return proto.game_protobuf_messages.proto.messages.JoinRoomRequest.deserializeBinaryFromReader(
	  msg,
	  reader);

	};

	/**
	    * Deserializes binary data (in protobuf wire format) from the
	    * given reader into the given message object.
	    * @param {!proto.game_protobuf_messages.proto.messages.JoinRoomRequest} msg The message object to deserialize into.
	    * @param {!jspb.BinaryReader} reader The BinaryReader to use.
	    * @return {!proto.game_protobuf_messages.proto.messages.JoinRoomRequest}
	    */
	proto.game_protobuf_messages.proto.messages.JoinRoomRequest.deserializeBinaryFromReader = function (
	msg,
	reader)
	{
	  while (reader.nextField()) {
	    if (reader.isEndGroup()) {
	      break;
	    }
	    var field = reader.getFieldNumber();
	    switch (field) {
	      case 1:
	        var value = /** @type {boolean} */reader.readBool();
	        msg.setRejoin(value);
	        break;
	      case 2:
	        var value = new proto.game_protobuf_messages.proto.messages.RoomOptions();
	        reader.readMessage(
	        value,
	        proto.game_protobuf_messages.proto.messages.RoomOptions.
	        deserializeBinaryFromReader);

	        msg.setRoomOptions(value);
	        break;
	      case 3:
	        var value = /** @type {!Uint8Array} */reader.readBytes();
	        msg.setExpectAttr(value);
	        break;
	      case 4:
	        var value = /** @type {string} */reader.readString();
	        msg.setPiggybackPeerId(value);
	        break;
	      case 5:
	        var value = /** @type {boolean} */reader.readBool();
	        msg.setCreateOnNotFound(value);
	        break;
	      default:
	        reader.skipField();
	        break;}

	  }
	  return msg;
	};

	/**
	    * Serializes the message to binary data (in protobuf wire format).
	    * @return {!Uint8Array}
	    */
	proto.game_protobuf_messages.proto.messages.JoinRoomRequest.prototype.serializeBinary = function () {
	  var writer = new googleProtobuf.BinaryWriter();
	  proto.game_protobuf_messages.proto.messages.JoinRoomRequest.serializeBinaryToWriter(
	  this,
	  writer);

	  return writer.getResultBuffer();
	};

	/**
	    * Serializes the given message to binary data (in protobuf wire
	    * format), writing to the given BinaryWriter.
	    * @param {!proto.game_protobuf_messages.proto.messages.JoinRoomRequest} message
	    * @param {!jspb.BinaryWriter} writer
	    * @suppress {unusedLocalVariables} f is only used for nested messages
	    */
	proto.game_protobuf_messages.proto.messages.JoinRoomRequest.serializeBinaryToWriter = function (
	message,
	writer)
	{
	  var f = undefined;
	  f = message.getRejoin();
	  if (f) {
	    writer.writeBool(1, f);
	  }
	  f = message.getRoomOptions();
	  if (f != null) {
	    writer.writeMessage(
	    2,
	    f,
	    proto.game_protobuf_messages.proto.messages.RoomOptions.
	    serializeBinaryToWriter);

	  }
	  f = message.getExpectAttr_asU8();
	  if (f.length > 0) {
	    writer.writeBytes(3, f);
	  }
	  f = message.getPiggybackPeerId();
	  if (f.length > 0) {
	    writer.writeString(4, f);
	  }
	  f = message.getCreateOnNotFound();
	  if (f) {
	    writer.writeBool(5, f);
	  }
	};

	/**
	    * optional bool rejoin = 1;
	    * @return {boolean}
	    */
	proto.game_protobuf_messages.proto.messages.JoinRoomRequest.prototype.getRejoin = function () {
	  return (/** @type {boolean} */googleProtobuf.Message.getBooleanFieldWithDefault(
	    this,
	    1,
	    false));

	};

	/**
	    * @param {boolean} value
	    * @return {!proto.game_protobuf_messages.proto.messages.JoinRoomRequest} returns this
	    */
	proto.game_protobuf_messages.proto.messages.JoinRoomRequest.prototype.setRejoin = function (
	value)
	{
	  return googleProtobuf.Message.setProto3BooleanField(this, 1, value);
	};

	/**
	    * optional RoomOptions room_options = 2;
	    * @return {?proto.game_protobuf_messages.proto.messages.RoomOptions}
	    */
	proto.game_protobuf_messages.proto.messages.JoinRoomRequest.prototype.getRoomOptions = function () {
	  return (/** @type{?proto.game_protobuf_messages.proto.messages.RoomOptions} */googleProtobuf.Message.getWrapperField(
	    this,
	    proto.game_protobuf_messages.proto.messages.RoomOptions,
	    2));

	};

	/**
	    * @param {?proto.game_protobuf_messages.proto.messages.RoomOptions|undefined} value
	    * @return {!proto.game_protobuf_messages.proto.messages.JoinRoomRequest} returns this
	    */
	proto.game_protobuf_messages.proto.messages.JoinRoomRequest.prototype.setRoomOptions = function (
	value)
	{
	  return googleProtobuf.Message.setWrapperField(this, 2, value);
	};

	/**
	    * Clears the message field making it undefined.
	    * @return {!proto.game_protobuf_messages.proto.messages.JoinRoomRequest} returns this
	    */
	proto.game_protobuf_messages.proto.messages.JoinRoomRequest.prototype.clearRoomOptions = function () {
	  return this.setRoomOptions(undefined);
	};

	/**
	    * Returns whether this field is set.
	    * @return {boolean}
	    */
	proto.game_protobuf_messages.proto.messages.JoinRoomRequest.prototype.hasRoomOptions = function () {
	  return googleProtobuf.Message.getField(this, 2) != null;
	};

	/**
	    * optional bytes expect_attr = 3;
	    * @return {!(string|Uint8Array)}
	    */
	proto.game_protobuf_messages.proto.messages.JoinRoomRequest.prototype.getExpectAttr = function () {
	  return (/** @type {!(string|Uint8Array)} */googleProtobuf.Message.getFieldWithDefault(
	    this,
	    3,
	    ''));

	};

	/**
	    * optional bytes expect_attr = 3;
	    * This is a type-conversion wrapper around `getExpectAttr()`
	    * @return {string}
	    */
	proto.game_protobuf_messages.proto.messages.JoinRoomRequest.prototype.getExpectAttr_asB64 = function () {
	  return (/** @type {string} */googleProtobuf.Message.bytesAsB64(this.getExpectAttr()));
	};

	/**
	    * optional bytes expect_attr = 3;
	    * Note that Uint8Array is not supported on all browsers.
	    * @see http://caniuse.com/Uint8Array
	    * This is a type-conversion wrapper around `getExpectAttr()`
	    * @return {!Uint8Array}
	    */
	proto.game_protobuf_messages.proto.messages.JoinRoomRequest.prototype.getExpectAttr_asU8 = function () {
	  return (/** @type {!Uint8Array} */googleProtobuf.Message.bytesAsU8(
	    this.getExpectAttr()));

	};

	/**
	    * @param {!(string|Uint8Array)} value
	    * @return {!proto.game_protobuf_messages.proto.messages.JoinRoomRequest} returns this
	    */
	proto.game_protobuf_messages.proto.messages.JoinRoomRequest.prototype.setExpectAttr = function (
	value)
	{
	  return googleProtobuf.Message.setProto3BytesField(this, 3, value);
	};

	/**
	    * optional string piggyback_peer_id = 4;
	    * @return {string}
	    */
	proto.game_protobuf_messages.proto.messages.JoinRoomRequest.prototype.getPiggybackPeerId = function () {
	  return (/** @type {string} */googleProtobuf.Message.getFieldWithDefault(this, 4, ''));
	};

	/**
	    * @param {string} value
	    * @return {!proto.game_protobuf_messages.proto.messages.JoinRoomRequest} returns this
	    */
	proto.game_protobuf_messages.proto.messages.JoinRoomRequest.prototype.setPiggybackPeerId = function (
	value)
	{
	  return googleProtobuf.Message.setProto3StringField(this, 4, value);
	};

	/**
	    * optional bool create_on_not_found = 5;
	    * @return {boolean}
	    */
	proto.game_protobuf_messages.proto.messages.JoinRoomRequest.prototype.getCreateOnNotFound = function () {
	  return (/** @type {boolean} */googleProtobuf.Message.getBooleanFieldWithDefault(
	    this,
	    5,
	    false));

	};

	/**
	    * @param {boolean} value
	    * @return {!proto.game_protobuf_messages.proto.messages.JoinRoomRequest} returns this
	    */
	proto.game_protobuf_messages.proto.messages.JoinRoomRequest.prototype.setCreateOnNotFound = function (
	value)
	{
	  return googleProtobuf.Message.setProto3BooleanField(this, 5, value);
	};

	if (googleProtobuf.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.game_protobuf_messages.proto.messages.JoinRoomResponse.prototype.toObject = function (
	  opt_includeInstance)
	  {
	    return proto.game_protobuf_messages.proto.messages.JoinRoomResponse.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.game_protobuf_messages.proto.messages.JoinRoomResponse} msg The msg instance to transform.
	      * @return {!Object}
	      * @suppress {unusedLocalVariables} f is only used for nested messages
	      */
	  proto.game_protobuf_messages.proto.messages.JoinRoomResponse.toObject = function (
	  includeInstance,
	  msg)
	  {
	    var f,
	    obj = {
	      roomOptions:
	      (f = msg.getRoomOptions()) &&
	      proto.game_protobuf_messages.proto.messages.RoomOptions.toObject(
	      includeInstance,
	      f),

	      addr: googleProtobuf.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.game_protobuf_messages.proto.messages.JoinRoomResponse}
	   */
	proto.game_protobuf_messages.proto.messages.JoinRoomResponse.deserializeBinary = function (
	bytes)
	{
	  var reader = new googleProtobuf.BinaryReader(bytes);
	  var msg = new proto.game_protobuf_messages.proto.messages.JoinRoomResponse();
	  return proto.game_protobuf_messages.proto.messages.JoinRoomResponse.deserializeBinaryFromReader(
	  msg,
	  reader);

	};

	/**
	    * Deserializes binary data (in protobuf wire format) from the
	    * given reader into the given message object.
	    * @param {!proto.game_protobuf_messages.proto.messages.JoinRoomResponse} msg The message object to deserialize into.
	    * @param {!jspb.BinaryReader} reader The BinaryReader to use.
	    * @return {!proto.game_protobuf_messages.proto.messages.JoinRoomResponse}
	    */
	proto.game_protobuf_messages.proto.messages.JoinRoomResponse.deserializeBinaryFromReader = function (
	msg,
	reader)
	{
	  while (reader.nextField()) {
	    if (reader.isEndGroup()) {
	      break;
	    }
	    var field = reader.getFieldNumber();
	    switch (field) {
	      case 1:
	        var value = new proto.game_protobuf_messages.proto.messages.RoomOptions();
	        reader.readMessage(
	        value,
	        proto.game_protobuf_messages.proto.messages.RoomOptions.
	        deserializeBinaryFromReader);

	        msg.setRoomOptions(value);
	        break;
	      case 2:
	        var value = /** @type {string} */reader.readString();
	        msg.setAddr(value);
	        break;
	      default:
	        reader.skipField();
	        break;}

	  }
	  return msg;
	};

	/**
	    * Serializes the message to binary data (in protobuf wire format).
	    * @return {!Uint8Array}
	    */
	proto.game_protobuf_messages.proto.messages.JoinRoomResponse.prototype.serializeBinary = function () {
	  var writer = new googleProtobuf.BinaryWriter();
	  proto.game_protobuf_messages.proto.messages.JoinRoomResponse.serializeBinaryToWriter(
	  this,
	  writer);

	  return writer.getResultBuffer();
	};

	/**
	    * Serializes the given message to binary data (in protobuf wire
	    * format), writing to the given BinaryWriter.
	    * @param {!proto.game_protobuf_messages.proto.messages.JoinRoomResponse} message
	    * @param {!jspb.BinaryWriter} writer
	    * @suppress {unusedLocalVariables} f is only used for nested messages
	    */
	proto.game_protobuf_messages.proto.messages.JoinRoomResponse.serializeBinaryToWriter = function (
	message,
	writer)
	{
	  var f = undefined;
	  f = message.getRoomOptions();
	  if (f != null) {
	    writer.writeMessage(
	    1,
	    f,
	    proto.game_protobuf_messages.proto.messages.RoomOptions.
	    serializeBinaryToWriter);

	  }
	  f = message.getAddr();
	  if (f.length > 0) {
	    writer.writeString(2, f);
	  }
	};

	/**
	    * optional RoomOptions room_options = 1;
	    * @return {?proto.game_protobuf_messages.proto.messages.RoomOptions}
	    */
	proto.game_protobuf_messages.proto.messages.JoinRoomResponse.prototype.getRoomOptions = function () {
	  return (/** @type{?proto.game_protobuf_messages.proto.messages.RoomOptions} */googleProtobuf.Message.getWrapperField(
	    this,
	    proto.game_protobuf_messages.proto.messages.RoomOptions,
	    1));

	};

	/**
	    * @param {?proto.game_protobuf_messages.proto.messages.RoomOptions|undefined} value
	    * @return {!proto.game_protobuf_messages.proto.messages.JoinRoomResponse} returns this
	    */
	proto.game_protobuf_messages.proto.messages.JoinRoomResponse.prototype.setRoomOptions = function (
	value)
	{
	  return googleProtobuf.Message.setWrapperField(this, 1, value);
	};

	/**
	    * Clears the message field making it undefined.
	    * @return {!proto.game_protobuf_messages.proto.messages.JoinRoomResponse} returns this
	    */
	proto.game_protobuf_messages.proto.messages.JoinRoomResponse.prototype.clearRoomOptions = function () {
	  return this.setRoomOptions(undefined);
	};

	/**
	    * Returns whether this field is set.
	    * @return {boolean}
	    */
	proto.game_protobuf_messages.proto.messages.JoinRoomResponse.prototype.hasRoomOptions = function () {
	  return googleProtobuf.Message.getField(this, 1) != null;
	};

	/**
	    * optional string addr = 2;
	    * @return {string}
	    */
	proto.game_protobuf_messages.proto.messages.JoinRoomResponse.prototype.getAddr = function () {
	  return (/** @type {string} */googleProtobuf.Message.getFieldWithDefault(this, 2, ''));
	};

	/**
	    * @param {string} value
	    * @return {!proto.game_protobuf_messages.proto.messages.JoinRoomResponse} returns this
	    */
	proto.game_protobuf_messages.proto.messages.JoinRoomResponse.prototype.setAddr = function (
	value)
	{
	  return googleProtobuf.Message.setProto3StringField(this, 2, value);
	};

	if (googleProtobuf.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.game_protobuf_messages.proto.messages.JoinRoomNotification.prototype.toObject = function (
	  opt_includeInstance)
	  {
	    return proto.game_protobuf_messages.proto.messages.JoinRoomNotification.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.game_protobuf_messages.proto.messages.JoinRoomNotification} msg The msg instance to transform.
	      * @return {!Object}
	      * @suppress {unusedLocalVariables} f is only used for nested messages
	      */
	  proto.game_protobuf_messages.proto.messages.JoinRoomNotification.toObject = function (
	  includeInstance,
	  msg)
	  {
	    var f,
	    obj = {
	      member:
	      (f = msg.getMember()) &&
	      proto.game_protobuf_messages.proto.messages.RoomMember.toObject(
	      includeInstance,
	      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.game_protobuf_messages.proto.messages.JoinRoomNotification}
	   */
	proto.game_protobuf_messages.proto.messages.JoinRoomNotification.deserializeBinary = function (
	bytes)
	{
	  var reader = new googleProtobuf.BinaryReader(bytes);
	  var msg = new proto.game_protobuf_messages.proto.messages.JoinRoomNotification();
	  return proto.game_protobuf_messages.proto.messages.JoinRoomNotification.deserializeBinaryFromReader(
	  msg,
	  reader);

	};

	/**
	    * Deserializes binary data (in protobuf wire format) from the
	    * given reader into the given message object.
	    * @param {!proto.game_protobuf_messages.proto.messages.JoinRoomNotification} msg The message object to deserialize into.
	    * @param {!jspb.BinaryReader} reader The BinaryReader to use.
	    * @return {!proto.game_protobuf_messages.proto.messages.JoinRoomNotification}
	    */
	proto.game_protobuf_messages.proto.messages.JoinRoomNotification.deserializeBinaryFromReader = function (
	msg,
	reader)
	{
	  while (reader.nextField()) {
	    if (reader.isEndGroup()) {
	      break;
	    }
	    var field = reader.getFieldNumber();
	    switch (field) {
	      case 1:
	        var value = new proto.game_protobuf_messages.proto.messages.RoomMember();
	        reader.readMessage(
	        value,
	        proto.game_protobuf_messages.proto.messages.RoomMember.
	        deserializeBinaryFromReader);

	        msg.setMember(value);
	        break;
	      default:
	        reader.skipField();
	        break;}

	  }
	  return msg;
	};

	/**
	    * Serializes the message to binary data (in protobuf wire format).
	    * @return {!Uint8Array}
	    */
	proto.game_protobuf_messages.proto.messages.JoinRoomNotification.prototype.serializeBinary = function () {
	  var writer = new googleProtobuf.BinaryWriter();
	  proto.game_protobuf_messages.proto.messages.JoinRoomNotification.serializeBinaryToWriter(
	  this,
	  writer);

	  return writer.getResultBuffer();
	};

	/**
	    * Serializes the given message to binary data (in protobuf wire
	    * format), writing to the given BinaryWriter.
	    * @param {!proto.game_protobuf_messages.proto.messages.JoinRoomNotification} message
	    * @param {!jspb.BinaryWriter} writer
	    * @suppress {unusedLocalVariables} f is only used for nested messages
	    */
	proto.game_protobuf_messages.proto.messages.JoinRoomNotification.serializeBinaryToWriter = function (
	message,
	writer)
	{
	  var f = undefined;
	  f = message.getMember();
	  if (f != null) {
	    writer.writeMessage(
	    1,
	    f,
	    proto.game_protobuf_messages.proto.messages.RoomMember.
	    serializeBinaryToWriter);

	  }
	};

	/**
	    * optional RoomMember member = 1;
	    * @return {?proto.game_protobuf_messages.proto.messages.RoomMember}
	    */
	proto.game_protobuf_messages.proto.messages.JoinRoomNotification.prototype.getMember = function () {
	  return (/** @type{?proto.game_protobuf_messages.proto.messages.RoomMember} */googleProtobuf.Message.getWrapperField(
	    this,
	    proto.game_protobuf_messages.proto.messages.RoomMember,
	    1));

	};

	/**
	    * @param {?proto.game_protobuf_messages.proto.messages.RoomMember|undefined} value
	    * @return {!proto.game_protobuf_messages.proto.messages.JoinRoomNotification} returns this
	    */
	proto.game_protobuf_messages.proto.messages.JoinRoomNotification.prototype.setMember = function (
	value)
	{
	  return googleProtobuf.Message.setWrapperField(this, 1, value);
	};

	/**
	    * Clears the message field making it undefined.
	    * @return {!proto.game_protobuf_messages.proto.messages.JoinRoomNotification} returns this
	    */
	proto.game_protobuf_messages.proto.messages.JoinRoomNotification.prototype.clearMember = function () {
	  return this.setMember(undefined);
	};

	/**
	    * Returns whether this field is set.
	    * @return {boolean}
	    */
	proto.game_protobuf_messages.proto.messages.JoinRoomNotification.prototype.hasMember = function () {
	  return googleProtobuf.Message.getField(this, 1) != null;
	};

	if (googleProtobuf.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.game_protobuf_messages.proto.messages.LeftRoomNotification.prototype.toObject = function (
	  opt_includeInstance)
	  {
	    return proto.game_protobuf_messages.proto.messages.LeftRoomNotification.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.game_protobuf_messages.proto.messages.LeftRoomNotification} msg The msg instance to transform.
	      * @return {!Object}
	      * @suppress {unusedLocalVariables} f is only used for nested messages
	      */
	  proto.game_protobuf_messages.proto.messages.LeftRoomNotification.toObject = function (
	  includeInstance,
	  msg)
	  {
	    var obj = {
	      actorId: googleProtobuf.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.game_protobuf_messages.proto.messages.LeftRoomNotification}
	   */
	proto.game_protobuf_messages.proto.messages.LeftRoomNotification.deserializeBinary = function (
	bytes)
	{
	  var reader = new googleProtobuf.BinaryReader(bytes);
	  var msg = new proto.game_protobuf_messages.proto.messages.LeftRoomNotification();
	  return proto.game_protobuf_messages.proto.messages.LeftRoomNotification.deserializeBinaryFromReader(
	  msg,
	  reader);

	};

	/**
	    * Deserializes binary data (in protobuf wire format) from the
	    * given reader into the given message object.
	    * @param {!proto.game_protobuf_messages.proto.messages.LeftRoomNotification} msg The message object to deserialize into.
	    * @param {!jspb.BinaryReader} reader The BinaryReader to use.
	    * @return {!proto.game_protobuf_messages.proto.messages.LeftRoomNotification}
	    */
	proto.game_protobuf_messages.proto.messages.LeftRoomNotification.deserializeBinaryFromReader = function (
	msg,
	reader)
	{
	  while (reader.nextField()) {
	    if (reader.isEndGroup()) {
	      break;
	    }
	    var field = reader.getFieldNumber();
	    switch (field) {
	      case 1:
	        var value = /** @type {number} */reader.readInt32();
	        msg.setActorId(value);
	        break;
	      default:
	        reader.skipField();
	        break;}

	  }
	  return msg;
	};

	/**
	    * Serializes the message to binary data (in protobuf wire format).
	    * @return {!Uint8Array}
	    */
	proto.game_protobuf_messages.proto.messages.LeftRoomNotification.prototype.serializeBinary = function () {
	  var writer = new googleProtobuf.BinaryWriter();
	  proto.game_protobuf_messages.proto.messages.LeftRoomNotification.serializeBinaryToWriter(
	  this,
	  writer);

	  return writer.getResultBuffer();
	};

	/**
	    * Serializes the given message to binary data (in protobuf wire
	    * format), writing to the given BinaryWriter.
	    * @param {!proto.game_protobuf_messages.proto.messages.LeftRoomNotification} message
	    * @param {!jspb.BinaryWriter} writer
	    * @suppress {unusedLocalVariables} f is only used for nested messages
	    */
	proto.game_protobuf_messages.proto.messages.LeftRoomNotification.serializeBinaryToWriter = function (
	message,
	writer)
	{
	  var f = undefined;
	  f = message.getActorId();
	  if (f !== 0) {
	    writer.writeInt32(1, f);
	  }
	};

	/**
	    * optional int32 actor_id = 1;
	    * @return {number}
	    */
	proto.game_protobuf_messages.proto.messages.LeftRoomNotification.prototype.getActorId = function () {
	  return (/** @type {number} */googleProtobuf.Message.getFieldWithDefault(this, 1, 0));
	};

	/**
	    * @param {number} value
	    * @return {!proto.game_protobuf_messages.proto.messages.LeftRoomNotification} returns this
	    */
	proto.game_protobuf_messages.proto.messages.LeftRoomNotification.prototype.setActorId = function (
	value)
	{
	  return googleProtobuf.Message.setProto3IntField(this, 1, value);
	};

	if (googleProtobuf.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.game_protobuf_messages.proto.messages.KickMemberRequest.prototype.toObject = function (
	  opt_includeInstance)
	  {
	    return proto.game_protobuf_messages.proto.messages.KickMemberRequest.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.game_protobuf_messages.proto.messages.KickMemberRequest} msg The msg instance to transform.
	      * @return {!Object}
	      * @suppress {unusedLocalVariables} f is only used for nested messages
	      */
	  proto.game_protobuf_messages.proto.messages.KickMemberRequest.toObject = function (
	  includeInstance,
	  msg)
	  {
	    var f,
	    obj = {
	      targetActorId: googleProtobuf.Message.getFieldWithDefault(msg, 1, 0),
	      appInfo:
	      (f = msg.getAppInfo()) &&
	      proto.game_protobuf_messages.proto.messages.AppInfo.toObject(
	      includeInstance,
	      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.game_protobuf_messages.proto.messages.KickMemberRequest}
	   */
	proto.game_protobuf_messages.proto.messages.KickMemberRequest.deserializeBinary = function (
	bytes)
	{
	  var reader = new googleProtobuf.BinaryReader(bytes);
	  var msg = new proto.game_protobuf_messages.proto.messages.KickMemberRequest();
	  return proto.game_protobuf_messages.proto.messages.KickMemberRequest.deserializeBinaryFromReader(
	  msg,
	  reader);

	};

	/**
	    * Deserializes binary data (in protobuf wire format) from the
	    * given reader into the given message object.
	    * @param {!proto.game_protobuf_messages.proto.messages.KickMemberRequest} msg The message object to deserialize into.
	    * @param {!jspb.BinaryReader} reader The BinaryReader to use.
	    * @return {!proto.game_protobuf_messages.proto.messages.KickMemberRequest}
	    */
	proto.game_protobuf_messages.proto.messages.KickMemberRequest.deserializeBinaryFromReader = function (
	msg,
	reader)
	{
	  while (reader.nextField()) {
	    if (reader.isEndGroup()) {
	      break;
	    }
	    var field = reader.getFieldNumber();
	    switch (field) {
	      case 1:
	        var value = /** @type {number} */reader.readInt32();
	        msg.setTargetActorId(value);
	        break;
	      case 2:
	        var value = new proto.game_protobuf_messages.proto.messages.AppInfo();
	        reader.readMessage(
	        value,
	        proto.game_protobuf_messages.proto.messages.AppInfo.
	        deserializeBinaryFromReader);

	        msg.setAppInfo(value);
	        break;
	      default:
	        reader.skipField();
	        break;}

	  }
	  return msg;
	};

	/**
	    * Serializes the message to binary data (in protobuf wire format).
	    * @return {!Uint8Array}
	    */
	proto.game_protobuf_messages.proto.messages.KickMemberRequest.prototype.serializeBinary = function () {
	  var writer = new googleProtobuf.BinaryWriter();
	  proto.game_protobuf_messages.proto.messages.KickMemberRequest.serializeBinaryToWriter(
	  this,
	  writer);

	  return writer.getResultBuffer();
	};

	/**
	    * Serializes the given message to binary data (in protobuf wire
	    * format), writing to the given BinaryWriter.
	    * @param {!proto.game_protobuf_messages.proto.messages.KickMemberRequest} message
	    * @param {!jspb.BinaryWriter} writer
	    * @suppress {unusedLocalVariables} f is only used for nested messages
	    */
	proto.game_protobuf_messages.proto.messages.KickMemberRequest.serializeBinaryToWriter = function (
	message,
	writer)
	{
	  var f = undefined;
	  f = message.getTargetActorId();
	  if (f !== 0) {
	    writer.writeInt32(1, f);
	  }
	  f = message.getAppInfo();
	  if (f != null) {
	    writer.writeMessage(
	    2,
	    f,
	    proto.game_protobuf_messages.proto.messages.AppInfo.
	    serializeBinaryToWriter);

	  }
	};

	/**
	    * optional int32 target_actor_id = 1;
	    * @return {number}
	    */
	proto.game_protobuf_messages.proto.messages.KickMemberRequest.prototype.getTargetActorId = function () {
	  return (/** @type {number} */googleProtobuf.Message.getFieldWithDefault(this, 1, 0));
	};

	/**
	    * @param {number} value
	    * @return {!proto.game_protobuf_messages.proto.messages.KickMemberRequest} returns this
	    */
	proto.game_protobuf_messages.proto.messages.KickMemberRequest.prototype.setTargetActorId = function (
	value)
	{
	  return googleProtobuf.Message.setProto3IntField(this, 1, value);
	};

	/**
	    * optional AppInfo app_info = 2;
	    * @return {?proto.game_protobuf_messages.proto.messages.AppInfo}
	    */
	proto.game_protobuf_messages.proto.messages.KickMemberRequest.prototype.getAppInfo = function () {
	  return (/** @type{?proto.game_protobuf_messages.proto.messages.AppInfo} */googleProtobuf.Message.getWrapperField(
	    this,
	    proto.game_protobuf_messages.proto.messages.AppInfo,
	    2));

	};

	/**
	    * @param {?proto.game_protobuf_messages.proto.messages.AppInfo|undefined} value
	    * @return {!proto.game_protobuf_messages.proto.messages.KickMemberRequest} returns this
	    */
	proto.game_protobuf_messages.proto.messages.KickMemberRequest.prototype.setAppInfo = function (
	value)
	{
	  return googleProtobuf.Message.setWrapperField(this, 2, value);
	};

	/**
	    * Clears the message field making it undefined.
	    * @return {!proto.game_protobuf_messages.proto.messages.KickMemberRequest} returns this
	    */
	proto.game_protobuf_messages.proto.messages.KickMemberRequest.prototype.clearAppInfo = function () {
	  return this.setAppInfo(undefined);
	};

	/**
	    * Returns whether this field is set.
	    * @return {boolean}
	    */
	proto.game_protobuf_messages.proto.messages.KickMemberRequest.prototype.hasAppInfo = function () {
	  return googleProtobuf.Message.getField(this, 2) != null;
	};

	if (googleProtobuf.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.game_protobuf_messages.proto.messages.KickMemberResponse.prototype.toObject = function (
	  opt_includeInstance)
	  {
	    return proto.game_protobuf_messages.proto.messages.KickMemberResponse.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.game_protobuf_messages.proto.messages.KickMemberResponse} msg The msg instance to transform.
	      * @return {!Object}
	      * @suppress {unusedLocalVariables} f is only used for nested messages
	      */
	  proto.game_protobuf_messages.proto.messages.KickMemberResponse.toObject = function (
	  includeInstance,
	  msg)
	  {
	    var obj = {
	      targetActorId: googleProtobuf.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.game_protobuf_messages.proto.messages.KickMemberResponse}
	   */
	proto.game_protobuf_messages.proto.messages.KickMemberResponse.deserializeBinary = function (
	bytes)
	{
	  var reader = new googleProtobuf.BinaryReader(bytes);
	  var msg = new proto.game_protobuf_messages.proto.messages.KickMemberResponse();
	  return proto.game_protobuf_messages.proto.messages.KickMemberResponse.deserializeBinaryFromReader(
	  msg,
	  reader);

	};

	/**
	    * Deserializes binary data (in protobuf wire format) from the
	    * given reader into the given message object.
	    * @param {!proto.game_protobuf_messages.proto.messages.KickMemberResponse} msg The message object to deserialize into.
	    * @param {!jspb.BinaryReader} reader The BinaryReader to use.
	    * @return {!proto.game_protobuf_messages.proto.messages.KickMemberResponse}
	    */
	proto.game_protobuf_messages.proto.messages.KickMemberResponse.deserializeBinaryFromReader = function (
	msg,
	reader)
	{
	  while (reader.nextField()) {
	    if (reader.isEndGroup()) {
	      break;
	    }
	    var field = reader.getFieldNumber();
	    switch (field) {
	      case 1:
	        var value = /** @type {number} */reader.readInt32();
	        msg.setTargetActorId(value);
	        break;
	      default:
	        reader.skipField();
	        break;}

	  }
	  return msg;
	};

	/**
	    * Serializes the message to binary data (in protobuf wire format).
	    * @return {!Uint8Array}
	    */
	proto.game_protobuf_messages.proto.messages.KickMemberResponse.prototype.serializeBinary = function () {
	  var writer = new googleProtobuf.BinaryWriter();
	  proto.game_protobuf_messages.proto.messages.KickMemberResponse.serializeBinaryToWriter(
	  this,
	  writer);

	  return writer.getResultBuffer();
	};

	/**
	    * Serializes the given message to binary data (in protobuf wire
	    * format), writing to the given BinaryWriter.
	    * @param {!proto.game_protobuf_messages.proto.messages.KickMemberResponse} message
	    * @param {!jspb.BinaryWriter} writer
	    * @suppress {unusedLocalVariables} f is only used for nested messages
	    */
	proto.game_protobuf_messages.proto.messages.KickMemberResponse.serializeBinaryToWriter = function (
	message,
	writer)
	{
	  var f = undefined;
	  f = message.getTargetActorId();
	  if (f !== 0) {
	    writer.writeInt32(1, f);
	  }
	};

	/**
	    * optional int32 target_actor_id = 1;
	    * @return {number}
	    */
	proto.game_protobuf_messages.proto.messages.KickMemberResponse.prototype.getTargetActorId = function () {
	  return (/** @type {number} */googleProtobuf.Message.getFieldWithDefault(this, 1, 0));
	};

	/**
	    * @param {number} value
	    * @return {!proto.game_protobuf_messages.proto.messages.KickMemberResponse} returns this
	    */
	proto.game_protobuf_messages.proto.messages.KickMemberResponse.prototype.setTargetActorId = function (
	value)
	{
	  return googleProtobuf.Message.setProto3IntField(this, 1, value);
	};

	if (googleProtobuf.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.game_protobuf_messages.proto.messages.UpdatePropertyRequest.prototype.toObject = function (
	  opt_includeInstance)
	  {
	    return proto.game_protobuf_messages.proto.messages.UpdatePropertyRequest.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.game_protobuf_messages.proto.messages.UpdatePropertyRequest} msg The msg instance to transform.
	      * @return {!Object}
	      * @suppress {unusedLocalVariables} f is only used for nested messages
	      */
	  proto.game_protobuf_messages.proto.messages.UpdatePropertyRequest.toObject = function (
	  includeInstance,
	  msg)
	  {
	    var obj = {
	      targetActorId: googleProtobuf.Message.getFieldWithDefault(msg, 1, 0),
	      expectAttr: msg.getExpectAttr_asB64(),
	      attr: msg.getAttr_asB64() };


	    if (includeInstance) {
	      obj.$jspbMessageInstance = msg;
	    }
	    return obj;
	  };
	}

	/**
	   * Deserializes binary data (in protobuf wire format).
	   * @param {jspb.ByteSource} bytes The bytes to deserialize.
	   * @return {!proto.game_protobuf_messages.proto.messages.UpdatePropertyRequest}
	   */
	proto.game_protobuf_messages.proto.messages.UpdatePropertyRequest.deserializeBinary = function (
	bytes)
	{
	  var reader = new googleProtobuf.BinaryReader(bytes);
	  var msg = new proto.game_protobuf_messages.proto.messages.UpdatePropertyRequest();
	  return proto.game_protobuf_messages.proto.messages.UpdatePropertyRequest.deserializeBinaryFromReader(
	  msg,
	  reader);

	};

	/**
	    * Deserializes binary data (in protobuf wire format) from the
	    * given reader into the given message object.
	    * @param {!proto.game_protobuf_messages.proto.messages.UpdatePropertyRequest} msg The message object to deserialize into.
	    * @param {!jspb.BinaryReader} reader The BinaryReader to use.
	    * @return {!proto.game_protobuf_messages.proto.messages.UpdatePropertyRequest}
	    */
	proto.game_protobuf_messages.proto.messages.UpdatePropertyRequest.deserializeBinaryFromReader = function (
	msg,
	reader)
	{
	  while (reader.nextField()) {
	    if (reader.isEndGroup()) {
	      break;
	    }
	    var field = reader.getFieldNumber();
	    switch (field) {
	      case 1:
	        var value = /** @type {number} */reader.readInt32();
	        msg.setTargetActorId(value);
	        break;
	      case 2:
	        var value = /** @type {!Uint8Array} */reader.readBytes();
	        msg.setExpectAttr(value);
	        break;
	      case 3:
	        var value = /** @type {!Uint8Array} */reader.readBytes();
	        msg.setAttr(value);
	        break;
	      default:
	        reader.skipField();
	        break;}

	  }
	  return msg;
	};

	/**
	    * Serializes the message to binary data (in protobuf wire format).
	    * @return {!Uint8Array}
	    */
	proto.game_protobuf_messages.proto.messages.UpdatePropertyRequest.prototype.serializeBinary = function () {
	  var writer = new googleProtobuf.BinaryWriter();
	  proto.game_protobuf_messages.proto.messages.UpdatePropertyRequest.serializeBinaryToWriter(
	  this,
	  writer);

	  return writer.getResultBuffer();
	};

	/**
	    * Serializes the given message to binary data (in protobuf wire
	    * format), writing to the given BinaryWriter.
	    * @param {!proto.game_protobuf_messages.proto.messages.UpdatePropertyRequest} message
	    * @param {!jspb.BinaryWriter} writer
	    * @suppress {unusedLocalVariables} f is only used for nested messages
	    */
	proto.game_protobuf_messages.proto.messages.UpdatePropertyRequest.serializeBinaryToWriter = function (
	message,
	writer)
	{
	  var f = undefined;
	  f = message.getTargetActorId();
	  if (f !== 0) {
	    writer.writeInt32(1, f);
	  }
	  f = message.getExpectAttr_asU8();
	  if (f.length > 0) {
	    writer.writeBytes(2, f);
	  }
	  f = message.getAttr_asU8();
	  if (f.length > 0) {
	    writer.writeBytes(3, f);
	  }
	};

	/**
	    * optional int32 target_actor_id = 1;
	    * @return {number}
	    */
	proto.game_protobuf_messages.proto.messages.UpdatePropertyRequest.prototype.getTargetActorId = function () {
	  return (/** @type {number} */googleProtobuf.Message.getFieldWithDefault(this, 1, 0));
	};

	/**
	    * @param {number} value
	    * @return {!proto.game_protobuf_messages.proto.messages.UpdatePropertyRequest} returns this
	    */
	proto.game_protobuf_messages.proto.messages.UpdatePropertyRequest.prototype.setTargetActorId = function (
	value)
	{
	  return googleProtobuf.Message.setProto3IntField(this, 1, value);
	};

	/**
	    * optional bytes expect_attr = 2;
	    * @return {!(string|Uint8Array)}
	    */
	proto.game_protobuf_messages.proto.messages.UpdatePropertyRequest.prototype.getExpectAttr = function () {
	  return (/** @type {!(string|Uint8Array)} */googleProtobuf.Message.getFieldWithDefault(
	    this,
	    2,
	    ''));

	};

	/**
	    * optional bytes expect_attr = 2;
	    * This is a type-conversion wrapper around `getExpectAttr()`
	    * @return {string}
	    */
	proto.game_protobuf_messages.proto.messages.UpdatePropertyRequest.prototype.getExpectAttr_asB64 = function () {
	  return (/** @type {string} */googleProtobuf.Message.bytesAsB64(this.getExpectAttr()));
	};

	/**
	    * optional bytes expect_attr = 2;
	    * Note that Uint8Array is not supported on all browsers.
	    * @see http://caniuse.com/Uint8Array
	    * This is a type-conversion wrapper around `getExpectAttr()`
	    * @return {!Uint8Array}
	    */
	proto.game_protobuf_messages.proto.messages.UpdatePropertyRequest.prototype.getExpectAttr_asU8 = function () {
	  return (/** @type {!Uint8Array} */googleProtobuf.Message.bytesAsU8(
	    this.getExpectAttr()));

	};

	/**
	    * @param {!(string|Uint8Array)} value
	    * @return {!proto.game_protobuf_messages.proto.messages.UpdatePropertyRequest} returns this
	    */
	proto.game_protobuf_messages.proto.messages.UpdatePropertyRequest.prototype.setExpectAttr = function (
	value)
	{
	  return googleProtobuf.Message.setProto3BytesField(this, 2, value);
	};

	/**
	    * optional bytes attr = 3;
	    * @return {!(string|Uint8Array)}
	    */
	proto.game_protobuf_messages.proto.messages.UpdatePropertyRequest.prototype.getAttr = function () {
	  return (/** @type {!(string|Uint8Array)} */googleProtobuf.Message.getFieldWithDefault(
	    this,
	    3,
	    ''));

	};

	/**
	    * optional bytes attr = 3;
	    * This is a type-conversion wrapper around `getAttr()`
	    * @return {string}
	    */
	proto.game_protobuf_messages.proto.messages.UpdatePropertyRequest.prototype.getAttr_asB64 = function () {
	  return (/** @type {string} */googleProtobuf.Message.bytesAsB64(this.getAttr()));
	};

	/**
	    * optional bytes attr = 3;
	    * Note that Uint8Array is not supported on all browsers.
	    * @see http://caniuse.com/Uint8Array
	    * This is a type-conversion wrapper around `getAttr()`
	    * @return {!Uint8Array}
	    */
	proto.game_protobuf_messages.proto.messages.UpdatePropertyRequest.prototype.getAttr_asU8 = function () {
	  return (/** @type {!Uint8Array} */googleProtobuf.Message.bytesAsU8(this.getAttr()));
	};

	/**
	    * @param {!(string|Uint8Array)} value
	    * @return {!proto.game_protobuf_messages.proto.messages.UpdatePropertyRequest} returns this
	    */
	proto.game_protobuf_messages.proto.messages.UpdatePropertyRequest.prototype.setAttr = function (
	value)
	{
	  return googleProtobuf.Message.setProto3BytesField(this, 3, value);
	};

	if (googleProtobuf.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.game_protobuf_messages.proto.messages.UpdatePropertyResponse.prototype.toObject = function (
	  opt_includeInstance)
	  {
	    return proto.game_protobuf_messages.proto.messages.UpdatePropertyResponse.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.game_protobuf_messages.proto.messages.UpdatePropertyResponse} msg The msg instance to transform.
	      * @return {!Object}
	      * @suppress {unusedLocalVariables} f is only used for nested messages
	      */
	  proto.game_protobuf_messages.proto.messages.UpdatePropertyResponse.toObject = function (
	  includeInstance,
	  msg)
	  {
	    var obj = {
	      attr: msg.getAttr_asB64(),
	      actorId: googleProtobuf.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.game_protobuf_messages.proto.messages.UpdatePropertyResponse}
	   */
	proto.game_protobuf_messages.proto.messages.UpdatePropertyResponse.deserializeBinary = function (
	bytes)
	{
	  var reader = new googleProtobuf.BinaryReader(bytes);
	  var msg = new proto.game_protobuf_messages.proto.messages.UpdatePropertyResponse();
	  return proto.game_protobuf_messages.proto.messages.UpdatePropertyResponse.deserializeBinaryFromReader(
	  msg,
	  reader);

	};

	/**
	    * Deserializes binary data (in protobuf wire format) from the
	    * given reader into the given message object.
	    * @param {!proto.game_protobuf_messages.proto.messages.UpdatePropertyResponse} msg The message object to deserialize into.
	    * @param {!jspb.BinaryReader} reader The BinaryReader to use.
	    * @return {!proto.game_protobuf_messages.proto.messages.UpdatePropertyResponse}
	    */
	proto.game_protobuf_messages.proto.messages.UpdatePropertyResponse.deserializeBinaryFromReader = function (
	msg,
	reader)
	{
	  while (reader.nextField()) {
	    if (reader.isEndGroup()) {
	      break;
	    }
	    var field = reader.getFieldNumber();
	    switch (field) {
	      case 1:
	        var value = /** @type {!Uint8Array} */reader.readBytes();
	        msg.setAttr(value);
	        break;
	      case 2:
	        var value = /** @type {number} */reader.readInt32();
	        msg.setActorId(value);
	        break;
	      default:
	        reader.skipField();
	        break;}

	  }
	  return msg;
	};

	/**
	    * Serializes the message to binary data (in protobuf wire format).
	    * @return {!Uint8Array}
	    */
	proto.game_protobuf_messages.proto.messages.UpdatePropertyResponse.prototype.serializeBinary = function () {
	  var writer = new googleProtobuf.BinaryWriter();
	  proto.game_protobuf_messages.proto.messages.UpdatePropertyResponse.serializeBinaryToWriter(
	  this,
	  writer);

	  return writer.getResultBuffer();
	};

	/**
	    * Serializes the given message to binary data (in protobuf wire
	    * format), writing to the given BinaryWriter.
	    * @param {!proto.game_protobuf_messages.proto.messages.UpdatePropertyResponse} message
	    * @param {!jspb.BinaryWriter} writer
	    * @suppress {unusedLocalVariables} f is only used for nested messages
	    */
	proto.game_protobuf_messages.proto.messages.UpdatePropertyResponse.serializeBinaryToWriter = function (
	message,
	writer)
	{
	  var f = undefined;
	  f = message.getAttr_asU8();
	  if (f.length > 0) {
	    writer.writeBytes(1, f);
	  }
	  f = message.getActorId();
	  if (f !== 0) {
	    writer.writeInt32(2, f);
	  }
	};

	/**
	    * optional bytes attr = 1;
	    * @return {!(string|Uint8Array)}
	    */
	proto.game_protobuf_messages.proto.messages.UpdatePropertyResponse.prototype.getAttr = function () {
	  return (/** @type {!(string|Uint8Array)} */googleProtobuf.Message.getFieldWithDefault(
	    this,
	    1,
	    ''));

	};

	/**
	    * optional bytes attr = 1;
	    * This is a type-conversion wrapper around `getAttr()`
	    * @return {string}
	    */
	proto.game_protobuf_messages.proto.messages.UpdatePropertyResponse.prototype.getAttr_asB64 = function () {
	  return (/** @type {string} */googleProtobuf.Message.bytesAsB64(this.getAttr()));
	};

	/**
	    * optional bytes attr = 1;
	    * Note that Uint8Array is not supported on all browsers.
	    * @see http://caniuse.com/Uint8Array
	    * This is a type-conversion wrapper around `getAttr()`
	    * @return {!Uint8Array}
	    */
	proto.game_protobuf_messages.proto.messages.UpdatePropertyResponse.prototype.getAttr_asU8 = function () {
	  return (/** @type {!Uint8Array} */googleProtobuf.Message.bytesAsU8(this.getAttr()));
	};

	/**
	    * @param {!(string|Uint8Array)} value
	    * @return {!proto.game_protobuf_messages.proto.messages.UpdatePropertyResponse} returns this
	    */
	proto.game_protobuf_messages.proto.messages.UpdatePropertyResponse.prototype.setAttr = function (
	value)
	{
	  return googleProtobuf.Message.setProto3BytesField(this, 1, value);
	};

	/**
	    * optional int32 actor_id = 2;
	    * @return {number}
	    */
	proto.game_protobuf_messages.proto.messages.UpdatePropertyResponse.prototype.getActorId = function () {
	  return (/** @type {number} */googleProtobuf.Message.getFieldWithDefault(this, 2, 0));
	};

	/**
	    * @param {number} value
	    * @return {!proto.game_protobuf_messages.proto.messages.UpdatePropertyResponse} returns this
	    */
	proto.game_protobuf_messages.proto.messages.UpdatePropertyResponse.prototype.setActorId = function (
	value)
	{
	  return googleProtobuf.Message.setProto3IntField(this, 2, value);
	};

	if (googleProtobuf.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.game_protobuf_messages.proto.messages.UpdatePropertyNotification.prototype.toObject = function (
	  opt_includeInstance)
	  {
	    return proto.game_protobuf_messages.proto.messages.UpdatePropertyNotification.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.game_protobuf_messages.proto.messages.UpdatePropertyNotification} msg The msg instance to transform.
	      * @return {!Object}
	      * @suppress {unusedLocalVariables} f is only used for nested messages
	      */
	  proto.game_protobuf_messages.proto.messages.UpdatePropertyNotification.toObject = function (
	  includeInstance,
	  msg)
	  {
	    var obj = {
	      attr: msg.getAttr_asB64(),
	      actorId: googleProtobuf.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.game_protobuf_messages.proto.messages.UpdatePropertyNotification}
	   */
	proto.game_protobuf_messages.proto.messages.UpdatePropertyNotification.deserializeBinary = function (
	bytes)
	{
	  var reader = new googleProtobuf.BinaryReader(bytes);
	  var msg = new proto.game_protobuf_messages.proto.messages.UpdatePropertyNotification();
	  return proto.game_protobuf_messages.proto.messages.UpdatePropertyNotification.deserializeBinaryFromReader(
	  msg,
	  reader);

	};

	/**
	    * Deserializes binary data (in protobuf wire format) from the
	    * given reader into the given message object.
	    * @param {!proto.game_protobuf_messages.proto.messages.UpdatePropertyNotification} msg The message object to deserialize into.
	    * @param {!jspb.BinaryReader} reader The BinaryReader to use.
	    * @return {!proto.game_protobuf_messages.proto.messages.UpdatePropertyNotification}
	    */
	proto.game_protobuf_messages.proto.messages.UpdatePropertyNotification.deserializeBinaryFromReader = function (
	msg,
	reader)
	{
	  while (reader.nextField()) {
	    if (reader.isEndGroup()) {
	      break;
	    }
	    var field = reader.getFieldNumber();
	    switch (field) {
	      case 1:
	        var value = /** @type {!Uint8Array} */reader.readBytes();
	        msg.setAttr(value);
	        break;
	      case 2:
	        var value = /** @type {number} */reader.readInt32();
	        msg.setActorId(value);
	        break;
	      default:
	        reader.skipField();
	        break;}

	  }
	  return msg;
	};

	/**
	    * Serializes the message to binary data (in protobuf wire format).
	    * @return {!Uint8Array}
	    */
	proto.game_protobuf_messages.proto.messages.UpdatePropertyNotification.prototype.serializeBinary = function () {
	  var writer = new googleProtobuf.BinaryWriter();
	  proto.game_protobuf_messages.proto.messages.UpdatePropertyNotification.serializeBinaryToWriter(
	  this,
	  writer);

	  return writer.getResultBuffer();
	};

	/**
	    * Serializes the given message to binary data (in protobuf wire
	    * format), writing to the given BinaryWriter.
	    * @param {!proto.game_protobuf_messages.proto.messages.UpdatePropertyNotification} message
	    * @param {!jspb.BinaryWriter} writer
	    * @suppress {unusedLocalVariables} f is only used for nested messages
	    */
	proto.game_protobuf_messages.proto.messages.UpdatePropertyNotification.serializeBinaryToWriter = function (
	message,
	writer)
	{
	  var f = undefined;
	  f = message.getAttr_asU8();
	  if (f.length > 0) {
	    writer.writeBytes(1, f);
	  }
	  f = message.getActorId();
	  if (f !== 0) {
	    writer.writeInt32(2, f);
	  }
	};

	/**
	    * optional bytes attr = 1;
	    * @return {!(string|Uint8Array)}
	    */
	proto.game_protobuf_messages.proto.messages.UpdatePropertyNotification.prototype.getAttr = function () {
	  return (/** @type {!(string|Uint8Array)} */googleProtobuf.Message.getFieldWithDefault(
	    this,
	    1,
	    ''));

	};

	/**
	    * optional bytes attr = 1;
	    * This is a type-conversion wrapper around `getAttr()`
	    * @return {string}
	    */
	proto.game_protobuf_messages.proto.messages.UpdatePropertyNotification.prototype.getAttr_asB64 = function () {
	  return (/** @type {string} */googleProtobuf.Message.bytesAsB64(this.getAttr()));
	};

	/**
	    * optional bytes attr = 1;
	    * Note that Uint8Array is not supported on all browsers.
	    * @see http://caniuse.com/Uint8Array
	    * This is a type-conversion wrapper around `getAttr()`
	    * @return {!Uint8Array}
	    */
	proto.game_protobuf_messages.proto.messages.UpdatePropertyNotification.prototype.getAttr_asU8 = function () {
	  return (/** @type {!Uint8Array} */googleProtobuf.Message.bytesAsU8(this.getAttr()));
	};

	/**
	    * @param {!(string|Uint8Array)} value
	    * @return {!proto.game_protobuf_messages.proto.messages.UpdatePropertyNotification} returns this
	    */
	proto.game_protobuf_messages.proto.messages.UpdatePropertyNotification.prototype.setAttr = function (
	value)
	{
	  return googleProtobuf.Message.setProto3BytesField(this, 1, value);
	};

	/**
	    * optional int32 actor_id = 2;
	    * @return {number}
	    */
	proto.game_protobuf_messages.proto.messages.UpdatePropertyNotification.prototype.getActorId = function () {
	  return (/** @type {number} */googleProtobuf.Message.getFieldWithDefault(this, 2, 0));
	};

	/**
	    * @param {number} value
	    * @return {!proto.game_protobuf_messages.proto.messages.UpdatePropertyNotification} returns this
	    */
	proto.game_protobuf_messages.proto.messages.UpdatePropertyNotification.prototype.setActorId = function (
	value)
	{
	  return googleProtobuf.Message.setProto3IntField(this, 2, value);
	};

	if (googleProtobuf.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.game_protobuf_messages.proto.messages.UpdateSysPropertyRequest.prototype.toObject = function (
	  opt_includeInstance)
	  {
	    return proto.game_protobuf_messages.proto.messages.UpdateSysPropertyRequest.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.game_protobuf_messages.proto.messages.UpdateSysPropertyRequest} msg The msg instance to transform.
	      * @return {!Object}
	      * @suppress {unusedLocalVariables} f is only used for nested messages
	      */
	  proto.game_protobuf_messages.proto.messages.UpdateSysPropertyRequest.toObject = function (
	  includeInstance,
	  msg)
	  {
	    var f,
	    obj = {
	      expectSysAttr:
	      (f = msg.getExpectSysAttr()) &&
	      proto.game_protobuf_messages.proto.messages.RoomSystemProperty.toObject(
	      includeInstance,
	      f),

	      sysAttr:
	      (f = msg.getSysAttr()) &&
	      proto.game_protobuf_messages.proto.messages.RoomSystemProperty.toObject(
	      includeInstance,
	      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.game_protobuf_messages.proto.messages.UpdateSysPropertyRequest}
	   */
	proto.game_protobuf_messages.proto.messages.UpdateSysPropertyRequest.deserializeBinary = function (
	bytes)
	{
	  var reader = new googleProtobuf.BinaryReader(bytes);
	  var msg = new proto.game_protobuf_messages.proto.messages.UpdateSysPropertyRequest();
	  return proto.game_protobuf_messages.proto.messages.UpdateSysPropertyRequest.deserializeBinaryFromReader(
	  msg,
	  reader);

	};

	/**
	    * Deserializes binary data (in protobuf wire format) from the
	    * given reader into the given message object.
	    * @param {!proto.game_protobuf_messages.proto.messages.UpdateSysPropertyRequest} msg The message object to deserialize into.
	    * @param {!jspb.BinaryReader} reader The BinaryReader to use.
	    * @return {!proto.game_protobuf_messages.proto.messages.UpdateSysPropertyRequest}
	    */
	proto.game_protobuf_messages.proto.messages.UpdateSysPropertyRequest.deserializeBinaryFromReader = function (
	msg,
	reader)
	{
	  while (reader.nextField()) {
	    if (reader.isEndGroup()) {
	      break;
	    }
	    var field = reader.getFieldNumber();
	    switch (field) {
	      case 1:
	        var value = new proto.game_protobuf_messages.proto.messages.RoomSystemProperty();
	        reader.readMessage(
	        value,
	        proto.game_protobuf_messages.proto.messages.RoomSystemProperty.
	        deserializeBinaryFromReader);

	        msg.setExpectSysAttr(value);
	        break;
	      case 2:
	        var value = new proto.game_protobuf_messages.proto.messages.RoomSystemProperty();
	        reader.readMessage(
	        value,
	        proto.game_protobuf_messages.proto.messages.RoomSystemProperty.
	        deserializeBinaryFromReader);

	        msg.setSysAttr(value);
	        break;
	      default:
	        reader.skipField();
	        break;}

	  }
	  return msg;
	};

	/**
	    * Serializes the message to binary data (in protobuf wire format).
	    * @return {!Uint8Array}
	    */
	proto.game_protobuf_messages.proto.messages.UpdateSysPropertyRequest.prototype.serializeBinary = function () {
	  var writer = new googleProtobuf.BinaryWriter();
	  proto.game_protobuf_messages.proto.messages.UpdateSysPropertyRequest.serializeBinaryToWriter(
	  this,
	  writer);

	  return writer.getResultBuffer();
	};

	/**
	    * Serializes the given message to binary data (in protobuf wire
	    * format), writing to the given BinaryWriter.
	    * @param {!proto.game_protobuf_messages.proto.messages.UpdateSysPropertyRequest} message
	    * @param {!jspb.BinaryWriter} writer
	    * @suppress {unusedLocalVariables} f is only used for nested messages
	    */
	proto.game_protobuf_messages.proto.messages.UpdateSysPropertyRequest.serializeBinaryToWriter = function (
	message,
	writer)
	{
	  var f = undefined;
	  f = message.getExpectSysAttr();
	  if (f != null) {
	    writer.writeMessage(
	    1,
	    f,
	    proto.game_protobuf_messages.proto.messages.RoomSystemProperty.
	    serializeBinaryToWriter);

	  }
	  f = message.getSysAttr();
	  if (f != null) {
	    writer.writeMessage(
	    2,
	    f,
	    proto.game_protobuf_messages.proto.messages.RoomSystemProperty.
	    serializeBinaryToWriter);

	  }
	};

	/**
	    * optional RoomSystemProperty expect_sys_attr = 1;
	    * @return {?proto.game_protobuf_messages.proto.messages.RoomSystemProperty}
	    */
	proto.game_protobuf_messages.proto.messages.UpdateSysPropertyRequest.prototype.getExpectSysAttr = function () {
	  return (/** @type{?proto.game_protobuf_messages.proto.messages.RoomSystemProperty} */googleProtobuf.Message.getWrapperField(
	    this,
	    proto.game_protobuf_messages.proto.messages.RoomSystemProperty,
	    1));

	};

	/**
	    * @param {?proto.game_protobuf_messages.proto.messages.RoomSystemProperty|undefined} value
	    * @return {!proto.game_protobuf_messages.proto.messages.UpdateSysPropertyRequest} returns this
	    */
	proto.game_protobuf_messages.proto.messages.UpdateSysPropertyRequest.prototype.setExpectSysAttr = function (
	value)
	{
	  return googleProtobuf.Message.setWrapperField(this, 1, value);
	};

	/**
	    * Clears the message field making it undefined.
	    * @return {!proto.game_protobuf_messages.proto.messages.UpdateSysPropertyRequest} returns this
	    */
	proto.game_protobuf_messages.proto.messages.UpdateSysPropertyRequest.prototype.clearExpectSysAttr = function () {
	  return this.setExpectSysAttr(undefined);
	};

	/**
	    * Returns whether this field is set.
	    * @return {boolean}
	    */
	proto.game_protobuf_messages.proto.messages.UpdateSysPropertyRequest.prototype.hasExpectSysAttr = function () {
	  return googleProtobuf.Message.getField(this, 1) != null;
	};

	/**
	    * optional RoomSystemProperty sys_attr = 2;
	    * @return {?proto.game_protobuf_messages.proto.messages.RoomSystemProperty}
	    */
	proto.game_protobuf_messages.proto.messages.UpdateSysPropertyRequest.prototype.getSysAttr = function () {
	  return (/** @type{?proto.game_protobuf_messages.proto.messages.RoomSystemProperty} */googleProtobuf.Message.getWrapperField(
	    this,
	    proto.game_protobuf_messages.proto.messages.RoomSystemProperty,
	    2));

	};

	/**
	    * @param {?proto.game_protobuf_messages.proto.messages.RoomSystemProperty|undefined} value
	    * @return {!proto.game_protobuf_messages.proto.messages.UpdateSysPropertyRequest} returns this
	    */
	proto.game_protobuf_messages.proto.messages.UpdateSysPropertyRequest.prototype.setSysAttr = function (
	value)
	{
	  return googleProtobuf.Message.setWrapperField(this, 2, value);
	};

	/**
	    * Clears the message field making it undefined.
	    * @return {!proto.game_protobuf_messages.proto.messages.UpdateSysPropertyRequest} returns this
	    */
	proto.game_protobuf_messages.proto.messages.UpdateSysPropertyRequest.prototype.clearSysAttr = function () {
	  return this.setSysAttr(undefined);
	};

	/**
	    * Returns whether this field is set.
	    * @return {boolean}
	    */
	proto.game_protobuf_messages.proto.messages.UpdateSysPropertyRequest.prototype.hasSysAttr = function () {
	  return googleProtobuf.Message.getField(this, 2) != null;
	};

	if (googleProtobuf.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.game_protobuf_messages.proto.messages.UpdateSysPropertyResponse.prototype.toObject = function (
	  opt_includeInstance)
	  {
	    return proto.game_protobuf_messages.proto.messages.UpdateSysPropertyResponse.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.game_protobuf_messages.proto.messages.UpdateSysPropertyResponse} msg The msg instance to transform.
	      * @return {!Object}
	      * @suppress {unusedLocalVariables} f is only used for nested messages
	      */
	  proto.game_protobuf_messages.proto.messages.UpdateSysPropertyResponse.toObject = function (
	  includeInstance,
	  msg)
	  {
	    var f,
	    obj = {
	      sysAttr:
	      (f = msg.getSysAttr()) &&
	      proto.game_protobuf_messages.proto.messages.RoomSystemProperty.toObject(
	      includeInstance,
	      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.game_protobuf_messages.proto.messages.UpdateSysPropertyResponse}
	   */
	proto.game_protobuf_messages.proto.messages.UpdateSysPropertyResponse.deserializeBinary = function (
	bytes)
	{
	  var reader = new googleProtobuf.BinaryReader(bytes);
	  var msg = new proto.game_protobuf_messages.proto.messages.UpdateSysPropertyResponse();
	  return proto.game_protobuf_messages.proto.messages.UpdateSysPropertyResponse.deserializeBinaryFromReader(
	  msg,
	  reader);

	};

	/**
	    * Deserializes binary data (in protobuf wire format) from the
	    * given reader into the given message object.
	    * @param {!proto.game_protobuf_messages.proto.messages.UpdateSysPropertyResponse} msg The message object to deserialize into.
	    * @param {!jspb.BinaryReader} reader The BinaryReader to use.
	    * @return {!proto.game_protobuf_messages.proto.messages.UpdateSysPropertyResponse}
	    */
	proto.game_protobuf_messages.proto.messages.UpdateSysPropertyResponse.deserializeBinaryFromReader = function (
	msg,
	reader)
	{
	  while (reader.nextField()) {
	    if (reader.isEndGroup()) {
	      break;
	    }
	    var field = reader.getFieldNumber();
	    switch (field) {
	      case 1:
	        var value = new proto.game_protobuf_messages.proto.messages.RoomSystemProperty();
	        reader.readMessage(
	        value,
	        proto.game_protobuf_messages.proto.messages.RoomSystemProperty.
	        deserializeBinaryFromReader);

	        msg.setSysAttr(value);
	        break;
	      default:
	        reader.skipField();
	        break;}

	  }
	  return msg;
	};

	/**
	    * Serializes the message to binary data (in protobuf wire format).
	    * @return {!Uint8Array}
	    */
	proto.game_protobuf_messages.proto.messages.UpdateSysPropertyResponse.prototype.serializeBinary = function () {
	  var writer = new googleProtobuf.BinaryWriter();
	  proto.game_protobuf_messages.proto.messages.UpdateSysPropertyResponse.serializeBinaryToWriter(
	  this,
	  writer);

	  return writer.getResultBuffer();
	};

	/**
	    * Serializes the given message to binary data (in protobuf wire
	    * format), writing to the given BinaryWriter.
	    * @param {!proto.game_protobuf_messages.proto.messages.UpdateSysPropertyResponse} message
	    * @param {!jspb.BinaryWriter} writer
	    * @suppress {unusedLocalVariables} f is only used for nested messages
	    */
	proto.game_protobuf_messages.proto.messages.UpdateSysPropertyResponse.serializeBinaryToWriter = function (
	message,
	writer)
	{
	  var f = undefined;
	  f = message.getSysAttr();
	  if (f != null) {
	    writer.writeMessage(
	    1,
	    f,
	    proto.game_protobuf_messages.proto.messages.RoomSystemProperty.
	    serializeBinaryToWriter);

	  }
	};

	/**
	    * optional RoomSystemProperty sys_attr = 1;
	    * @return {?proto.game_protobuf_messages.proto.messages.RoomSystemProperty}
	    */
	proto.game_protobuf_messages.proto.messages.UpdateSysPropertyResponse.prototype.getSysAttr = function () {
	  return (/** @type{?proto.game_protobuf_messages.proto.messages.RoomSystemProperty} */googleProtobuf.Message.getWrapperField(
	    this,
	    proto.game_protobuf_messages.proto.messages.RoomSystemProperty,
	    1));

	};

	/**
	    * @param {?proto.game_protobuf_messages.proto.messages.RoomSystemProperty|undefined} value
	    * @return {!proto.game_protobuf_messages.proto.messages.UpdateSysPropertyResponse} returns this
	    */
	proto.game_protobuf_messages.proto.messages.UpdateSysPropertyResponse.prototype.setSysAttr = function (
	value)
	{
	  return googleProtobuf.Message.setWrapperField(this, 1, value);
	};

	/**
	    * Clears the message field making it undefined.
	    * @return {!proto.game_protobuf_messages.proto.messages.UpdateSysPropertyResponse} returns this
	    */
	proto.game_protobuf_messages.proto.messages.UpdateSysPropertyResponse.prototype.clearSysAttr = function () {
	  return this.setSysAttr(undefined);
	};

	/**
	    * Returns whether this field is set.
	    * @return {boolean}
	    */
	proto.game_protobuf_messages.proto.messages.UpdateSysPropertyResponse.prototype.hasSysAttr = function () {
	  return googleProtobuf.Message.getField(this, 1) != null;
	};

	if (googleProtobuf.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.game_protobuf_messages.proto.messages.UpdateSysPropertyNotification.prototype.toObject = function (
	  opt_includeInstance)
	  {
	    return proto.game_protobuf_messages.proto.messages.UpdateSysPropertyNotification.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.game_protobuf_messages.proto.messages.UpdateSysPropertyNotification} msg The msg instance to transform.
	      * @return {!Object}
	      * @suppress {unusedLocalVariables} f is only used for nested messages
	      */
	  proto.game_protobuf_messages.proto.messages.UpdateSysPropertyNotification.toObject = function (
	  includeInstance,
	  msg)
	  {
	    var f,
	    obj = {
	      sysAttr:
	      (f = msg.getSysAttr()) &&
	      proto.game_protobuf_messages.proto.messages.RoomSystemProperty.toObject(
	      includeInstance,
	      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.game_protobuf_messages.proto.messages.UpdateSysPropertyNotification}
	   */
	proto.game_protobuf_messages.proto.messages.UpdateSysPropertyNotification.deserializeBinary = function (
	bytes)
	{
	  var reader = new googleProtobuf.BinaryReader(bytes);
	  var msg = new proto.game_protobuf_messages.proto.messages.UpdateSysPropertyNotification();
	  return proto.game_protobuf_messages.proto.messages.UpdateSysPropertyNotification.deserializeBinaryFromReader(
	  msg,
	  reader);

	};

	/**
	    * Deserializes binary data (in protobuf wire format) from the
	    * given reader into the given message object.
	    * @param {!proto.game_protobuf_messages.proto.messages.UpdateSysPropertyNotification} msg The message object to deserialize into.
	    * @param {!jspb.BinaryReader} reader The BinaryReader to use.
	    * @return {!proto.game_protobuf_messages.proto.messages.UpdateSysPropertyNotification}
	    */
	proto.game_protobuf_messages.proto.messages.UpdateSysPropertyNotification.deserializeBinaryFromReader = function (
	msg,
	reader)
	{
	  while (reader.nextField()) {
	    if (reader.isEndGroup()) {
	      break;
	    }
	    var field = reader.getFieldNumber();
	    switch (field) {
	      case 1:
	        var value = new proto.game_protobuf_messages.proto.messages.RoomSystemProperty();
	        reader.readMessage(
	        value,
	        proto.game_protobuf_messages.proto.messages.RoomSystemProperty.
	        deserializeBinaryFromReader);

	        msg.setSysAttr(value);
	        break;
	      default:
	        reader.skipField();
	        break;}

	  }
	  return msg;
	};

	/**
	    * Serializes the message to binary data (in protobuf wire format).
	    * @return {!Uint8Array}
	    */
	proto.game_protobuf_messages.proto.messages.UpdateSysPropertyNotification.prototype.serializeBinary = function () {
	  var writer = new googleProtobuf.BinaryWriter();
	  proto.game_protobuf_messages.proto.messages.UpdateSysPropertyNotification.serializeBinaryToWriter(
	  this,
	  writer);

	  return writer.getResultBuffer();
	};

	/**
	    * Serializes the given message to binary data (in protobuf wire
	    * format), writing to the given BinaryWriter.
	    * @param {!proto.game_protobuf_messages.proto.messages.UpdateSysPropertyNotification} message
	    * @param {!jspb.BinaryWriter} writer
	    * @suppress {unusedLocalVariables} f is only used for nested messages
	    */
	proto.game_protobuf_messages.proto.messages.UpdateSysPropertyNotification.serializeBinaryToWriter = function (
	message,
	writer)
	{
	  var f = undefined;
	  f = message.getSysAttr();
	  if (f != null) {
	    writer.writeMessage(
	    1,
	    f,
	    proto.game_protobuf_messages.proto.messages.RoomSystemProperty.
	    serializeBinaryToWriter);

	  }
	};

	/**
	    * optional RoomSystemProperty sys_attr = 1;
	    * @return {?proto.game_protobuf_messages.proto.messages.RoomSystemProperty}
	    */
	proto.game_protobuf_messages.proto.messages.UpdateSysPropertyNotification.prototype.getSysAttr = function () {
	  return (/** @type{?proto.game_protobuf_messages.proto.messages.RoomSystemProperty} */googleProtobuf.Message.getWrapperField(
	    this,
	    proto.game_protobuf_messages.proto.messages.RoomSystemProperty,
	    1));

	};

	/**
	    * @param {?proto.game_protobuf_messages.proto.messages.RoomSystemProperty|undefined} value
	    * @return {!proto.game_protobuf_messages.proto.messages.UpdateSysPropertyNotification} returns this
	    */
	proto.game_protobuf_messages.proto.messages.UpdateSysPropertyNotification.prototype.setSysAttr = function (
	value)
	{
	  return googleProtobuf.Message.setWrapperField(this, 1, value);
	};

	/**
	    * Clears the message field making it undefined.
	    * @return {!proto.game_protobuf_messages.proto.messages.UpdateSysPropertyNotification} returns this
	    */
	proto.game_protobuf_messages.proto.messages.UpdateSysPropertyNotification.prototype.clearSysAttr = function () {
	  return this.setSysAttr(undefined);
	};

	/**
	    * Returns whether this field is set.
	    * @return {boolean}
	    */
	proto.game_protobuf_messages.proto.messages.UpdateSysPropertyNotification.prototype.hasSysAttr = function () {
	  return googleProtobuf.Message.getField(this, 1) != null;
	};

	if (googleProtobuf.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.game_protobuf_messages.proto.messages.UpdateMasterClientRequest.prototype.toObject = function (
	  opt_includeInstance)
	  {
	    return proto.game_protobuf_messages.proto.messages.UpdateMasterClientRequest.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.game_protobuf_messages.proto.messages.UpdateMasterClientRequest} msg The msg instance to transform.
	      * @return {!Object}
	      * @suppress {unusedLocalVariables} f is only used for nested messages
	      */
	  proto.game_protobuf_messages.proto.messages.UpdateMasterClientRequest.toObject = function (
	  includeInstance,
	  msg)
	  {
	    var obj = {
	      masterActorId: googleProtobuf.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.game_protobuf_messages.proto.messages.UpdateMasterClientRequest}
	   */
	proto.game_protobuf_messages.proto.messages.UpdateMasterClientRequest.deserializeBinary = function (
	bytes)
	{
	  var reader = new googleProtobuf.BinaryReader(bytes);
	  var msg = new proto.game_protobuf_messages.proto.messages.UpdateMasterClientRequest();
	  return proto.game_protobuf_messages.proto.messages.UpdateMasterClientRequest.deserializeBinaryFromReader(
	  msg,
	  reader);

	};

	/**
	    * Deserializes binary data (in protobuf wire format) from the
	    * given reader into the given message object.
	    * @param {!proto.game_protobuf_messages.proto.messages.UpdateMasterClientRequest} msg The message object to deserialize into.
	    * @param {!jspb.BinaryReader} reader The BinaryReader to use.
	    * @return {!proto.game_protobuf_messages.proto.messages.UpdateMasterClientRequest}
	    */
	proto.game_protobuf_messages.proto.messages.UpdateMasterClientRequest.deserializeBinaryFromReader = function (
	msg,
	reader)
	{
	  while (reader.nextField()) {
	    if (reader.isEndGroup()) {
	      break;
	    }
	    var field = reader.getFieldNumber();
	    switch (field) {
	      case 1:
	        var value = /** @type {number} */reader.readInt32();
	        msg.setMasterActorId(value);
	        break;
	      default:
	        reader.skipField();
	        break;}

	  }
	  return msg;
	};

	/**
	    * Serializes the message to binary data (in protobuf wire format).
	    * @return {!Uint8Array}
	    */
	proto.game_protobuf_messages.proto.messages.UpdateMasterClientRequest.prototype.serializeBinary = function () {
	  var writer = new googleProtobuf.BinaryWriter();
	  proto.game_protobuf_messages.proto.messages.UpdateMasterClientRequest.serializeBinaryToWriter(
	  this,
	  writer);

	  return writer.getResultBuffer();
	};

	/**
	    * Serializes the given message to binary data (in protobuf wire
	    * format), writing to the given BinaryWriter.
	    * @param {!proto.game_protobuf_messages.proto.messages.UpdateMasterClientRequest} message
	    * @param {!jspb.BinaryWriter} writer
	    * @suppress {unusedLocalVariables} f is only used for nested messages
	    */
	proto.game_protobuf_messages.proto.messages.UpdateMasterClientRequest.serializeBinaryToWriter = function (
	message,
	writer)
	{
	  var f = undefined;
	  f = message.getMasterActorId();
	  if (f !== 0) {
	    writer.writeInt32(1, f);
	  }
	};

	/**
	    * optional int32 master_actor_id = 1;
	    * @return {number}
	    */
	proto.game_protobuf_messages.proto.messages.UpdateMasterClientRequest.prototype.getMasterActorId = function () {
	  return (/** @type {number} */googleProtobuf.Message.getFieldWithDefault(this, 1, 0));
	};

	/**
	    * @param {number} value
	    * @return {!proto.game_protobuf_messages.proto.messages.UpdateMasterClientRequest} returns this
	    */
	proto.game_protobuf_messages.proto.messages.UpdateMasterClientRequest.prototype.setMasterActorId = function (
	value)
	{
	  return googleProtobuf.Message.setProto3IntField(this, 1, value);
	};

	if (googleProtobuf.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.game_protobuf_messages.proto.messages.UpdateMasterClientResponse.prototype.toObject = function (
	  opt_includeInstance)
	  {
	    return proto.game_protobuf_messages.proto.messages.UpdateMasterClientResponse.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.game_protobuf_messages.proto.messages.UpdateMasterClientResponse} msg The msg instance to transform.
	      * @return {!Object}
	      * @suppress {unusedLocalVariables} f is only used for nested messages
	      */
	  proto.game_protobuf_messages.proto.messages.UpdateMasterClientResponse.toObject = function (
	  includeInstance,
	  msg)
	  {
	    var obj = {
	      masterActorId: googleProtobuf.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.game_protobuf_messages.proto.messages.UpdateMasterClientResponse}
	   */
	proto.game_protobuf_messages.proto.messages.UpdateMasterClientResponse.deserializeBinary = function (
	bytes)
	{
	  var reader = new googleProtobuf.BinaryReader(bytes);
	  var msg = new proto.game_protobuf_messages.proto.messages.UpdateMasterClientResponse();
	  return proto.game_protobuf_messages.proto.messages.UpdateMasterClientResponse.deserializeBinaryFromReader(
	  msg,
	  reader);

	};

	/**
	    * Deserializes binary data (in protobuf wire format) from the
	    * given reader into the given message object.
	    * @param {!proto.game_protobuf_messages.proto.messages.UpdateMasterClientResponse} msg The message object to deserialize into.
	    * @param {!jspb.BinaryReader} reader The BinaryReader to use.
	    * @return {!proto.game_protobuf_messages.proto.messages.UpdateMasterClientResponse}
	    */
	proto.game_protobuf_messages.proto.messages.UpdateMasterClientResponse.deserializeBinaryFromReader = function (
	msg,
	reader)
	{
	  while (reader.nextField()) {
	    if (reader.isEndGroup()) {
	      break;
	    }
	    var field = reader.getFieldNumber();
	    switch (field) {
	      case 1:
	        var value = /** @type {number} */reader.readInt32();
	        msg.setMasterActorId(value);
	        break;
	      default:
	        reader.skipField();
	        break;}

	  }
	  return msg;
	};

	/**
	    * Serializes the message to binary data (in protobuf wire format).
	    * @return {!Uint8Array}
	    */
	proto.game_protobuf_messages.proto.messages.UpdateMasterClientResponse.prototype.serializeBinary = function () {
	  var writer = new googleProtobuf.BinaryWriter();
	  proto.game_protobuf_messages.proto.messages.UpdateMasterClientResponse.serializeBinaryToWriter(
	  this,
	  writer);

	  return writer.getResultBuffer();
	};

	/**
	    * Serializes the given message to binary data (in protobuf wire
	    * format), writing to the given BinaryWriter.
	    * @param {!proto.game_protobuf_messages.proto.messages.UpdateMasterClientResponse} message
	    * @param {!jspb.BinaryWriter} writer
	    * @suppress {unusedLocalVariables} f is only used for nested messages
	    */
	proto.game_protobuf_messages.proto.messages.UpdateMasterClientResponse.serializeBinaryToWriter = function (
	message,
	writer)
	{
	  var f = undefined;
	  f = message.getMasterActorId();
	  if (f !== 0) {
	    writer.writeInt32(1, f);
	  }
	};

	/**
	    * optional int32 master_actor_id = 1;
	    * @return {number}
	    */
	proto.game_protobuf_messages.proto.messages.UpdateMasterClientResponse.prototype.getMasterActorId = function () {
	  return (/** @type {number} */googleProtobuf.Message.getFieldWithDefault(this, 1, 0));
	};

	/**
	    * @param {number} value
	    * @return {!proto.game_protobuf_messages.proto.messages.UpdateMasterClientResponse} returns this
	    */
	proto.game_protobuf_messages.proto.messages.UpdateMasterClientResponse.prototype.setMasterActorId = function (
	value)
	{
	  return googleProtobuf.Message.setProto3IntField(this, 1, value);
	};

	if (googleProtobuf.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.game_protobuf_messages.proto.messages.UpdateMasterClientNotification.prototype.toObject = function (
	  opt_includeInstance)
	  {
	    return proto.game_protobuf_messages.proto.messages.UpdateMasterClientNotification.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.game_protobuf_messages.proto.messages.UpdateMasterClientNotification} msg The msg instance to transform.
	      * @return {!Object}
	      * @suppress {unusedLocalVariables} f is only used for nested messages
	      */
	  proto.game_protobuf_messages.proto.messages.UpdateMasterClientNotification.toObject = function (
	  includeInstance,
	  msg)
	  {
	    var obj = {
	      masterActorId: googleProtobuf.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.game_protobuf_messages.proto.messages.UpdateMasterClientNotification}
	   */
	proto.game_protobuf_messages.proto.messages.UpdateMasterClientNotification.deserializeBinary = function (
	bytes)
	{
	  var reader = new googleProtobuf.BinaryReader(bytes);
	  var msg = new proto.game_protobuf_messages.proto.messages.UpdateMasterClientNotification();
	  return proto.game_protobuf_messages.proto.messages.UpdateMasterClientNotification.deserializeBinaryFromReader(
	  msg,
	  reader);

	};

	/**
	    * Deserializes binary data (in protobuf wire format) from the
	    * given reader into the given message object.
	    * @param {!proto.game_protobuf_messages.proto.messages.UpdateMasterClientNotification} msg The message object to deserialize into.
	    * @param {!jspb.BinaryReader} reader The BinaryReader to use.
	    * @return {!proto.game_protobuf_messages.proto.messages.UpdateMasterClientNotification}
	    */
	proto.game_protobuf_messages.proto.messages.UpdateMasterClientNotification.deserializeBinaryFromReader = function (
	msg,
	reader)
	{
	  while (reader.nextField()) {
	    if (reader.isEndGroup()) {
	      break;
	    }
	    var field = reader.getFieldNumber();
	    switch (field) {
	      case 1:
	        var value = /** @type {number} */reader.readInt32();
	        msg.setMasterActorId(value);
	        break;
	      default:
	        reader.skipField();
	        break;}

	  }
	  return msg;
	};

	/**
	    * Serializes the message to binary data (in protobuf wire format).
	    * @return {!Uint8Array}
	    */
	proto.game_protobuf_messages.proto.messages.UpdateMasterClientNotification.prototype.serializeBinary = function () {
	  var writer = new googleProtobuf.BinaryWriter();
	  proto.game_protobuf_messages.proto.messages.UpdateMasterClientNotification.serializeBinaryToWriter(
	  this,
	  writer);

	  return writer.getResultBuffer();
	};

	/**
	    * Serializes the given message to binary data (in protobuf wire
	    * format), writing to the given BinaryWriter.
	    * @param {!proto.game_protobuf_messages.proto.messages.UpdateMasterClientNotification} message
	    * @param {!jspb.BinaryWriter} writer
	    * @suppress {unusedLocalVariables} f is only used for nested messages
	    */
	proto.game_protobuf_messages.proto.messages.UpdateMasterClientNotification.serializeBinaryToWriter = function (
	message,
	writer)
	{
	  var f = undefined;
	  f = message.getMasterActorId();
	  if (f !== 0) {
	    writer.writeInt32(1, f);
	  }
	};

	/**
	    * optional int32 master_actor_id = 1;
	    * @return {number}
	    */
	proto.game_protobuf_messages.proto.messages.UpdateMasterClientNotification.prototype.getMasterActorId = function () {
	  return (/** @type {number} */googleProtobuf.Message.getFieldWithDefault(this, 1, 0));
	};

	/**
	    * @param {number} value
	    * @return {!proto.game_protobuf_messages.proto.messages.UpdateMasterClientNotification} returns this
	    */
	proto.game_protobuf_messages.proto.messages.UpdateMasterClientNotification.prototype.setMasterActorId = function (
	value)
	{
	  return googleProtobuf.Message.setProto3IntField(this, 1, value);
	};

	/**
	    * Oneof group definitions for this message. Each group defines the field
	    * numbers belonging to that group. When of these fields' value is set, all
	    * other fields in the group are cleared. During deserialization, if multiple
	    * fields are encountered for a group, only the last value seen will be kept.
	    * @private {!Array<!Array<number>>}
	    * @const
	    */
	proto.game_protobuf_messages.proto.messages.RoomNotification.oneofGroups_ = [
	[20, 21, 22, 23, 24]];


	/**
	                        * @enum {number}
	                        */
	proto.game_protobuf_messages.proto.messages.RoomNotification.NotificationCase = {
	  NOTIFICATION_NOT_SET: 0,
	  JOIN_ROOM: 20,
	  UPDATE_PROPERTY: 21,
	  UPDATE_SYS_PROPERTY: 22,
	  UPDATE_MASTER_CLIENT: 23,
	  LEFT_ROOM: 24 };


	/**
	                    * @return {proto.game_protobuf_messages.proto.messages.RoomNotification.NotificationCase}
	                    */
	proto.game_protobuf_messages.proto.messages.RoomNotification.prototype.getNotificationCase = function () {
	  return (/** @type {proto.game_protobuf_messages.proto.messages.RoomNotification.NotificationCase} */googleProtobuf.Message.computeOneofCase(
	    this,
	    proto.game_protobuf_messages.proto.messages.RoomNotification.oneofGroups_[0]));

	};

	if (googleProtobuf.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.game_protobuf_messages.proto.messages.RoomNotification.prototype.toObject = function (
	  opt_includeInstance)
	  {
	    return proto.game_protobuf_messages.proto.messages.RoomNotification.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.game_protobuf_messages.proto.messages.RoomNotification} msg The msg instance to transform.
	      * @return {!Object}
	      * @suppress {unusedLocalVariables} f is only used for nested messages
	      */
	  proto.game_protobuf_messages.proto.messages.RoomNotification.toObject = function (
	  includeInstance,
	  msg)
	  {
	    var f,
	    obj = {
	      initByActor: googleProtobuf.Message.getFieldWithDefault(msg, 1, 0),
	      appInfo:
	      (f = msg.getAppInfo()) &&
	      proto.game_protobuf_messages.proto.messages.AppInfo.toObject(
	      includeInstance,
	      f),

	      byMaster: googleProtobuf.Message.getBooleanFieldWithDefault(msg, 4, false),
	      joinRoom:
	      (f = msg.getJoinRoom()) &&
	      proto.game_protobuf_messages.proto.messages.JoinRoomNotification.toObject(
	      includeInstance,
	      f),

	      updateProperty:
	      (f = msg.getUpdateProperty()) &&
	      proto.game_protobuf_messages.proto.messages.UpdatePropertyNotification.toObject(
	      includeInstance,
	      f),

	      updateSysProperty:
	      (f = msg.getUpdateSysProperty()) &&
	      proto.game_protobuf_messages.proto.messages.UpdateSysPropertyNotification.toObject(
	      includeInstance,
	      f),

	      updateMasterClient:
	      (f = msg.getUpdateMasterClient()) &&
	      proto.game_protobuf_messages.proto.messages.UpdateMasterClientNotification.toObject(
	      includeInstance,
	      f),

	      leftRoom:
	      (f = msg.getLeftRoom()) &&
	      proto.game_protobuf_messages.proto.messages.LeftRoomNotification.toObject(
	      includeInstance,
	      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.game_protobuf_messages.proto.messages.RoomNotification}
	   */
	proto.game_protobuf_messages.proto.messages.RoomNotification.deserializeBinary = function (
	bytes)
	{
	  var reader = new googleProtobuf.BinaryReader(bytes);
	  var msg = new proto.game_protobuf_messages.proto.messages.RoomNotification();
	  return proto.game_protobuf_messages.proto.messages.RoomNotification.deserializeBinaryFromReader(
	  msg,
	  reader);

	};

	/**
	    * Deserializes binary data (in protobuf wire format) from the
	    * given reader into the given message object.
	    * @param {!proto.game_protobuf_messages.proto.messages.RoomNotification} msg The message object to deserialize into.
	    * @param {!jspb.BinaryReader} reader The BinaryReader to use.
	    * @return {!proto.game_protobuf_messages.proto.messages.RoomNotification}
	    */
	proto.game_protobuf_messages.proto.messages.RoomNotification.deserializeBinaryFromReader = function (
	msg,
	reader)
	{
	  while (reader.nextField()) {
	    if (reader.isEndGroup()) {
	      break;
	    }
	    var field = reader.getFieldNumber();
	    switch (field) {
	      case 1:
	        var value = /** @type {number} */reader.readInt32();
	        msg.setInitByActor(value);
	        break;
	      case 3:
	        var value = new proto.game_protobuf_messages.proto.messages.AppInfo();
	        reader.readMessage(
	        value,
	        proto.game_protobuf_messages.proto.messages.AppInfo.
	        deserializeBinaryFromReader);

	        msg.setAppInfo(value);
	        break;
	      case 4:
	        var value = /** @type {boolean} */reader.readBool();
	        msg.setByMaster(value);
	        break;
	      case 20:
	        var value = new proto.game_protobuf_messages.proto.messages.JoinRoomNotification();
	        reader.readMessage(
	        value,
	        proto.game_protobuf_messages.proto.messages.JoinRoomNotification.
	        deserializeBinaryFromReader);

	        msg.setJoinRoom(value);
	        break;
	      case 21:
	        var value = new proto.game_protobuf_messages.proto.messages.UpdatePropertyNotification();
	        reader.readMessage(
	        value,
	        proto.game_protobuf_messages.proto.messages.UpdatePropertyNotification.
	        deserializeBinaryFromReader);

	        msg.setUpdateProperty(value);
	        break;
	      case 22:
	        var value = new proto.game_protobuf_messages.proto.messages.UpdateSysPropertyNotification();
	        reader.readMessage(
	        value,
	        proto.game_protobuf_messages.proto.messages.
	        UpdateSysPropertyNotification.deserializeBinaryFromReader);

	        msg.setUpdateSysProperty(value);
	        break;
	      case 23:
	        var value = new proto.game_protobuf_messages.proto.messages.UpdateMasterClientNotification();
	        reader.readMessage(
	        value,
	        proto.game_protobuf_messages.proto.messages.
	        UpdateMasterClientNotification.deserializeBinaryFromReader);

	        msg.setUpdateMasterClient(value);
	        break;
	      case 24:
	        var value = new proto.game_protobuf_messages.proto.messages.LeftRoomNotification();
	        reader.readMessage(
	        value,
	        proto.game_protobuf_messages.proto.messages.LeftRoomNotification.
	        deserializeBinaryFromReader);

	        msg.setLeftRoom(value);
	        break;
	      default:
	        reader.skipField();
	        break;}

	  }
	  return msg;
	};

	/**
	    * Serializes the message to binary data (in protobuf wire format).
	    * @return {!Uint8Array}
	    */
	proto.game_protobuf_messages.proto.messages.RoomNotification.prototype.serializeBinary = function () {
	  var writer = new googleProtobuf.BinaryWriter();
	  proto.game_protobuf_messages.proto.messages.RoomNotification.serializeBinaryToWriter(
	  this,
	  writer);

	  return writer.getResultBuffer();
	};

	/**
	    * Serializes the given message to binary data (in protobuf wire
	    * format), writing to the given BinaryWriter.
	    * @param {!proto.game_protobuf_messages.proto.messages.RoomNotification} message
	    * @param {!jspb.BinaryWriter} writer
	    * @suppress {unusedLocalVariables} f is only used for nested messages
	    */
	proto.game_protobuf_messages.proto.messages.RoomNotification.serializeBinaryToWriter = function (
	message,
	writer)
	{
	  var f = undefined;
	  f = message.getInitByActor();
	  if (f !== 0) {
	    writer.writeInt32(1, f);
	  }
	  f = message.getAppInfo();
	  if (f != null) {
	    writer.writeMessage(
	    3,
	    f,
	    proto.game_protobuf_messages.proto.messages.AppInfo.
	    serializeBinaryToWriter);

	  }
	  f = message.getByMaster();
	  if (f) {
	    writer.writeBool(4, f);
	  }
	  f = message.getJoinRoom();
	  if (f != null) {
	    writer.writeMessage(
	    20,
	    f,
	    proto.game_protobuf_messages.proto.messages.JoinRoomNotification.
	    serializeBinaryToWriter);

	  }
	  f = message.getUpdateProperty();
	  if (f != null) {
	    writer.writeMessage(
	    21,
	    f,
	    proto.game_protobuf_messages.proto.messages.UpdatePropertyNotification.
	    serializeBinaryToWriter);

	  }
	  f = message.getUpdateSysProperty();
	  if (f != null) {
	    writer.writeMessage(
	    22,
	    f,
	    proto.game_protobuf_messages.proto.messages.UpdateSysPropertyNotification.
	    serializeBinaryToWriter);

	  }
	  f = message.getUpdateMasterClient();
	  if (f != null) {
	    writer.writeMessage(
	    23,
	    f,
	    proto.game_protobuf_messages.proto.messages.UpdateMasterClientNotification.
	    serializeBinaryToWriter);

	  }
	  f = message.getLeftRoom();
	  if (f != null) {
	    writer.writeMessage(
	    24,
	    f,
	    proto.game_protobuf_messages.proto.messages.LeftRoomNotification.
	    serializeBinaryToWriter);

	  }
	};

	/**
	    * optional int32 init_by_actor = 1;
	    * @return {number}
	    */
	proto.game_protobuf_messages.proto.messages.RoomNotification.prototype.getInitByActor = function () {
	  return (/** @type {number} */googleProtobuf.Message.getFieldWithDefault(this, 1, 0));
	};

	/**
	    * @param {number} value
	    * @return {!proto.game_protobuf_messages.proto.messages.RoomNotification} returns this
	    */
	proto.game_protobuf_messages.proto.messages.RoomNotification.prototype.setInitByActor = function (
	value)
	{
	  return googleProtobuf.Message.setProto3IntField(this, 1, value);
	};

	/**
	    * optional AppInfo app_info = 3;
	    * @return {?proto.game_protobuf_messages.proto.messages.AppInfo}
	    */
	proto.game_protobuf_messages.proto.messages.RoomNotification.prototype.getAppInfo = function () {
	  return (/** @type{?proto.game_protobuf_messages.proto.messages.AppInfo} */googleProtobuf.Message.getWrapperField(
	    this,
	    proto.game_protobuf_messages.proto.messages.AppInfo,
	    3));

	};

	/**
	    * @param {?proto.game_protobuf_messages.proto.messages.AppInfo|undefined} value
	    * @return {!proto.game_protobuf_messages.proto.messages.RoomNotification} returns this
	    */
	proto.game_protobuf_messages.proto.messages.RoomNotification.prototype.setAppInfo = function (
	value)
	{
	  return googleProtobuf.Message.setWrapperField(this, 3, value);
	};

	/**
	    * Clears the message field making it undefined.
	    * @return {!proto.game_protobuf_messages.proto.messages.RoomNotification} returns this
	    */
	proto.game_protobuf_messages.proto.messages.RoomNotification.prototype.clearAppInfo = function () {
	  return this.setAppInfo(undefined);
	};

	/**
	    * Returns whether this field is set.
	    * @return {boolean}
	    */
	proto.game_protobuf_messages.proto.messages.RoomNotification.prototype.hasAppInfo = function () {
	  return googleProtobuf.Message.getField(this, 3) != null;
	};

	/**
	    * optional bool by_master = 4;
	    * @return {boolean}
	    */
	proto.game_protobuf_messages.proto.messages.RoomNotification.prototype.getByMaster = function () {
	  return (/** @type {boolean} */googleProtobuf.Message.getBooleanFieldWithDefault(
	    this,
	    4,
	    false));

	};

	/**
	    * @param {boolean} value
	    * @return {!proto.game_protobuf_messages.proto.messages.RoomNotification} returns this
	    */
	proto.game_protobuf_messages.proto.messages.RoomNotification.prototype.setByMaster = function (
	value)
	{
	  return googleProtobuf.Message.setProto3BooleanField(this, 4, value);
	};

	/**
	    * optional JoinRoomNotification join_room = 20;
	    * @return {?proto.game_protobuf_messages.proto.messages.JoinRoomNotification}
	    */
	proto.game_protobuf_messages.proto.messages.RoomNotification.prototype.getJoinRoom = function () {
	  return (/** @type{?proto.game_protobuf_messages.proto.messages.JoinRoomNotification} */googleProtobuf.Message.getWrapperField(
	    this,
	    proto.game_protobuf_messages.proto.messages.JoinRoomNotification,
	    20));

	};

	/**
	    * @param {?proto.game_protobuf_messages.proto.messages.JoinRoomNotification|undefined} value
	    * @return {!proto.game_protobuf_messages.proto.messages.RoomNotification} returns this
	    */
	proto.game_protobuf_messages.proto.messages.RoomNotification.prototype.setJoinRoom = function (
	value)
	{
	  return googleProtobuf.Message.setOneofWrapperField(
	  this,
	  20,
	  proto.game_protobuf_messages.proto.messages.RoomNotification.
	  oneofGroups_[0],
	  value);

	};

	/**
	    * Clears the message field making it undefined.
	    * @return {!proto.game_protobuf_messages.proto.messages.RoomNotification} returns this
	    */
	proto.game_protobuf_messages.proto.messages.RoomNotification.prototype.clearJoinRoom = function () {
	  return this.setJoinRoom(undefined);
	};

	/**
	    * Returns whether this field is set.
	    * @return {boolean}
	    */
	proto.game_protobuf_messages.proto.messages.RoomNotification.prototype.hasJoinRoom = function () {
	  return googleProtobuf.Message.getField(this, 20) != null;
	};

	/**
	    * optional UpdatePropertyNotification update_property = 21;
	    * @return {?proto.game_protobuf_messages.proto.messages.UpdatePropertyNotification}
	    */
	proto.game_protobuf_messages.proto.messages.RoomNotification.prototype.getUpdateProperty = function () {
	  return (/** @type{?proto.game_protobuf_messages.proto.messages.UpdatePropertyNotification} */googleProtobuf.Message.getWrapperField(
	    this,
	    proto.game_protobuf_messages.proto.messages.UpdatePropertyNotification,
	    21));

	};

	/**
	    * @param {?proto.game_protobuf_messages.proto.messages.UpdatePropertyNotification|undefined} value
	    * @return {!proto.game_protobuf_messages.proto.messages.RoomNotification} returns this
	    */
	proto.game_protobuf_messages.proto.messages.RoomNotification.prototype.setUpdateProperty = function (
	value)
	{
	  return googleProtobuf.Message.setOneofWrapperField(
	  this,
	  21,
	  proto.game_protobuf_messages.proto.messages.RoomNotification.
	  oneofGroups_[0],
	  value);

	};

	/**
	    * Clears the message field making it undefined.
	    * @return {!proto.game_protobuf_messages.proto.messages.RoomNotification} returns this
	    */
	proto.game_protobuf_messages.proto.messages.RoomNotification.prototype.clearUpdateProperty = function () {
	  return this.setUpdateProperty(undefined);
	};

	/**
	    * Returns whether this field is set.
	    * @return {boolean}
	    */
	proto.game_protobuf_messages.proto.messages.RoomNotification.prototype.hasUpdateProperty = function () {
	  return googleProtobuf.Message.getField(this, 21) != null;
	};

	/**
	    * optional UpdateSysPropertyNotification update_sys_property = 22;
	    * @return {?proto.game_protobuf_messages.proto.messages.UpdateSysPropertyNotification}
	    */
	proto.game_protobuf_messages.proto.messages.RoomNotification.prototype.getUpdateSysProperty = function () {
	  return (/** @type{?proto.game_protobuf_messages.proto.messages.UpdateSysPropertyNotification} */googleProtobuf.Message.getWrapperField(
	    this,
	    proto.game_protobuf_messages.proto.messages.UpdateSysPropertyNotification,
	    22));

	};

	/**
	    * @param {?proto.game_protobuf_messages.proto.messages.UpdateSysPropertyNotification|undefined} value
	    * @return {!proto.game_protobuf_messages.proto.messages.RoomNotification} returns this
	    */
	proto.game_protobuf_messages.proto.messages.RoomNotification.prototype.setUpdateSysProperty = function (
	value)
	{
	  return googleProtobuf.Message.setOneofWrapperField(
	  this,
	  22,
	  proto.game_protobuf_messages.proto.messages.RoomNotification.
	  oneofGroups_[0],
	  value);

	};

	/**
	    * Clears the message field making it undefined.
	    * @return {!proto.game_protobuf_messages.proto.messages.RoomNotification} returns this
	    */
	proto.game_protobuf_messages.proto.messages.RoomNotification.prototype.clearUpdateSysProperty = function () {
	  return this.setUpdateSysProperty(undefined);
	};

	/**
	    * Returns whether this field is set.
	    * @return {boolean}
	    */
	proto.game_protobuf_messages.proto.messages.RoomNotification.prototype.hasUpdateSysProperty = function () {
	  return googleProtobuf.Message.getField(this, 22) != null;
	};

	/**
	    * optional UpdateMasterClientNotification update_master_client = 23;
	    * @return {?proto.game_protobuf_messages.proto.messages.UpdateMasterClientNotification}
	    */
	proto.game_protobuf_messages.proto.messages.RoomNotification.prototype.getUpdateMasterClient = function () {
	  return (/** @type{?proto.game_protobuf_messages.proto.messages.UpdateMasterClientNotification} */googleProtobuf.Message.getWrapperField(
	    this,
	    proto.game_protobuf_messages.proto.messages.UpdateMasterClientNotification,
	    23));

	};

	/**
	    * @param {?proto.game_protobuf_messages.proto.messages.UpdateMasterClientNotification|undefined} value
	    * @return {!proto.game_protobuf_messages.proto.messages.RoomNotification} returns this
	    */
	proto.game_protobuf_messages.proto.messages.RoomNotification.prototype.setUpdateMasterClient = function (
	value)
	{
	  return googleProtobuf.Message.setOneofWrapperField(
	  this,
	  23,
	  proto.game_protobuf_messages.proto.messages.RoomNotification.
	  oneofGroups_[0],
	  value);

	};

	/**
	    * Clears the message field making it undefined.
	    * @return {!proto.game_protobuf_messages.proto.messages.RoomNotification} returns this
	    */
	proto.game_protobuf_messages.proto.messages.RoomNotification.prototype.clearUpdateMasterClient = function () {
	  return this.setUpdateMasterClient(undefined);
	};

	/**
	    * Returns whether this field is set.
	    * @return {boolean}
	    */
	proto.game_protobuf_messages.proto.messages.RoomNotification.prototype.hasUpdateMasterClient = function () {
	  return googleProtobuf.Message.getField(this, 23) != null;
	};

	/**
	    * optional LeftRoomNotification left_room = 24;
	    * @return {?proto.game_protobuf_messages.proto.messages.LeftRoomNotification}
	    */
	proto.game_protobuf_messages.proto.messages.RoomNotification.prototype.getLeftRoom = function () {
	  return (/** @type{?proto.game_protobuf_messages.proto.messages.LeftRoomNotification} */googleProtobuf.Message.getWrapperField(
	    this,
	    proto.game_protobuf_messages.proto.messages.LeftRoomNotification,
	    24));

	};

	/**
	    * @param {?proto.game_protobuf_messages.proto.messages.LeftRoomNotification|undefined} value
	    * @return {!proto.game_protobuf_messages.proto.messages.RoomNotification} returns this
	    */
	proto.game_protobuf_messages.proto.messages.RoomNotification.prototype.setLeftRoom = function (
	value)
	{
	  return googleProtobuf.Message.setOneofWrapperField(
	  this,
	  24,
	  proto.game_protobuf_messages.proto.messages.RoomNotification.
	  oneofGroups_[0],
	  value);

	};

	/**
	    * Clears the message field making it undefined.
	    * @return {!proto.game_protobuf_messages.proto.messages.RoomNotification} returns this
	    */
	proto.game_protobuf_messages.proto.messages.RoomNotification.prototype.clearLeftRoom = function () {
	  return this.setLeftRoom(undefined);
	};

	/**
	    * Returns whether this field is set.
	    * @return {boolean}
	    */
	proto.game_protobuf_messages.proto.messages.RoomNotification.prototype.hasLeftRoom = function () {
	  return googleProtobuf.Message.getField(this, 24) != null;
	};

	/**
	    * List of repeated fields within this message type.
	    * @private {!Array<number>}
	    * @const
	    */
	proto.game_protobuf_messages.proto.messages.DirectCommand.repeatedFields_ = [6];

	if (googleProtobuf.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.game_protobuf_messages.proto.messages.DirectCommand.prototype.toObject = function (
	  opt_includeInstance)
	  {
	    return proto.game_protobuf_messages.proto.messages.DirectCommand.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.game_protobuf_messages.proto.messages.DirectCommand} msg The msg instance to transform.
	      * @return {!Object}
	      * @suppress {unusedLocalVariables} f is only used for nested messages
	      */
	  proto.game_protobuf_messages.proto.messages.DirectCommand.toObject = function (
	  includeInstance,
	  msg)
	  {
	    var f,
	    obj = {
	      cached: googleProtobuf.Message.getBooleanFieldWithDefault(msg, 1, false),
	      eventId: googleProtobuf.Message.getFieldWithDefault(msg, 2, 0),
	      receiverGroup: googleProtobuf.Message.getFieldWithDefault(msg, 3, 0),
	      cachingOption: googleProtobuf.Message.getFieldWithDefault(msg, 4, 0),
	      eventOptions: googleProtobuf.Message.getFieldWithDefault(msg, 5, 0),
	      toActorIdsList:
	      (f = googleProtobuf.Message.getRepeatedField(msg, 6)) == null ? undefined : f,
	      msg: msg.getMsg_asB64(),
	      timestamp: googleProtobuf.Message.getFieldWithDefault(msg, 8, 0),
	      fromActorId: googleProtobuf.Message.getFieldWithDefault(msg, 9, 0),
	      i: googleProtobuf.Message.getFieldWithDefault(msg, 10, 0),
	      interestGroup: googleProtobuf.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.game_protobuf_messages.proto.messages.DirectCommand}
	   */
	proto.game_protobuf_messages.proto.messages.DirectCommand.deserializeBinary = function (
	bytes)
	{
	  var reader = new googleProtobuf.BinaryReader(bytes);
	  var msg = new proto.game_protobuf_messages.proto.messages.DirectCommand();
	  return proto.game_protobuf_messages.proto.messages.DirectCommand.deserializeBinaryFromReader(
	  msg,
	  reader);

	};

	/**
	    * Deserializes binary data (in protobuf wire format) from the
	    * given reader into the given message object.
	    * @param {!proto.game_protobuf_messages.proto.messages.DirectCommand} msg The message object to deserialize into.
	    * @param {!jspb.BinaryReader} reader The BinaryReader to use.
	    * @return {!proto.game_protobuf_messages.proto.messages.DirectCommand}
	    */
	proto.game_protobuf_messages.proto.messages.DirectCommand.deserializeBinaryFromReader = function (
	msg,
	reader)
	{
	  while (reader.nextField()) {
	    if (reader.isEndGroup()) {
	      break;
	    }
	    var field = reader.getFieldNumber();
	    switch (field) {
	      case 1:
	        var value = /** @type {boolean} */reader.readBool();
	        msg.setCached(value);
	        break;
	      case 2:
	        var value = /** @type {number} */reader.readInt32();
	        msg.setEventId(value);
	        break;
	      case 3:
	        var value = /** @type {number} */reader.readInt32();
	        msg.setReceiverGroup(value);
	        break;
	      case 4:
	        var value = /** @type {number} */reader.readInt32();
	        msg.setCachingOption(value);
	        break;
	      case 5:
	        var value = /** @type {number} */reader.readInt32();
	        msg.setEventOptions(value);
	        break;
	      case 6:
	        var value = /** @type {!Array<number>} */reader.readPackedInt32();
	        msg.setToActorIdsList(value);
	        break;
	      case 7:
	        var value = /** @type {!Uint8Array} */reader.readBytes();
	        msg.setMsg(value);
	        break;
	      case 8:
	        var value = /** @type {number} */reader.readInt64();
	        msg.setTimestamp(value);
	        break;
	      case 9:
	        var value = /** @type {number} */reader.readInt32();
	        msg.setFromActorId(value);
	        break;
	      case 10:
	        var value = /** @type {number} */reader.readInt32();
	        msg.setI(value);
	        break;
	      case 11:
	        var value = /** @type {number} */reader.readInt32();
	        msg.setInterestGroup(value);
	        break;
	      default:
	        reader.skipField();
	        break;}

	  }
	  return msg;
	};

	/**
	    * Serializes the message to binary data (in protobuf wire format).
	    * @return {!Uint8Array}
	    */
	proto.game_protobuf_messages.proto.messages.DirectCommand.prototype.serializeBinary = function () {
	  var writer = new googleProtobuf.BinaryWriter();
	  proto.game_protobuf_messages.proto.messages.DirectCommand.serializeBinaryToWriter(
	  this,
	  writer);

	  return writer.getResultBuffer();
	};

	/**
	    * Serializes the given message to binary data (in protobuf wire
	    * format), writing to the given BinaryWriter.
	    * @param {!proto.game_protobuf_messages.proto.messages.DirectCommand} message
	    * @param {!jspb.BinaryWriter} writer
	    * @suppress {unusedLocalVariables} f is only used for nested messages
	    */
	proto.game_protobuf_messages.proto.messages.DirectCommand.serializeBinaryToWriter = function (
	message,
	writer)
	{
	  var f = undefined;
	  f = message.getCached();
	  if (f) {
	    writer.writeBool(1, f);
	  }
	  f = message.getEventId();
	  if (f !== 0) {
	    writer.writeInt32(2, f);
	  }
	  f = message.getReceiverGroup();
	  if (f !== 0) {
	    writer.writeInt32(3, f);
	  }
	  f = message.getCachingOption();
	  if (f !== 0) {
	    writer.writeInt32(4, f);
	  }
	  f = message.getEventOptions();
	  if (f !== 0) {
	    writer.writeInt32(5, f);
	  }
	  f = message.getToActorIdsList();
	  if (f.length > 0) {
	    writer.writePackedInt32(6, f);
	  }
	  f = message.getMsg_asU8();
	  if (f.length > 0) {
	    writer.writeBytes(7, f);
	  }
	  f = message.getTimestamp();
	  if (f !== 0) {
	    writer.writeInt64(8, f);
	  }
	  f = message.getFromActorId();
	  if (f !== 0) {
	    writer.writeInt32(9, f);
	  }
	  f = message.getI();
	  if (f !== 0) {
	    writer.writeInt32(10, f);
	  }
	  f = message.getInterestGroup();
	  if (f !== 0) {
	    writer.writeInt32(11, f);
	  }
	};

	/**
	    * optional bool cached = 1;
	    * @return {boolean}
	    */
	proto.game_protobuf_messages.proto.messages.DirectCommand.prototype.getCached = function () {
	  return (/** @type {boolean} */googleProtobuf.Message.getBooleanFieldWithDefault(
	    this,
	    1,
	    false));

	};

	/**
	    * @param {boolean} value
	    * @return {!proto.game_protobuf_messages.proto.messages.DirectCommand} returns this
	    */
	proto.game_protobuf_messages.proto.messages.DirectCommand.prototype.setCached = function (
	value)
	{
	  return googleProtobuf.Message.setProto3BooleanField(this, 1, value);
	};

	/**
	    * optional int32 event_id = 2;
	    * @return {number}
	    */
	proto.game_protobuf_messages.proto.messages.DirectCommand.prototype.getEventId = function () {
	  return (/** @type {number} */googleProtobuf.Message.getFieldWithDefault(this, 2, 0));
	};

	/**
	    * @param {number} value
	    * @return {!proto.game_protobuf_messages.proto.messages.DirectCommand} returns this
	    */
	proto.game_protobuf_messages.proto.messages.DirectCommand.prototype.setEventId = function (
	value)
	{
	  return googleProtobuf.Message.setProto3IntField(this, 2, value);
	};

	/**
	    * optional int32 receiver_group = 3;
	    * @return {number}
	    */
	proto.game_protobuf_messages.proto.messages.DirectCommand.prototype.getReceiverGroup = function () {
	  return (/** @type {number} */googleProtobuf.Message.getFieldWithDefault(this, 3, 0));
	};

	/**
	    * @param {number} value
	    * @return {!proto.game_protobuf_messages.proto.messages.DirectCommand} returns this
	    */
	proto.game_protobuf_messages.proto.messages.DirectCommand.prototype.setReceiverGroup = function (
	value)
	{
	  return googleProtobuf.Message.setProto3IntField(this, 3, value);
	};

	/**
	    * optional int32 caching_option = 4;
	    * @return {number}
	    */
	proto.game_protobuf_messages.proto.messages.DirectCommand.prototype.getCachingOption = function () {
	  return (/** @type {number} */googleProtobuf.Message.getFieldWithDefault(this, 4, 0));
	};

	/**
	    * @param {number} value
	    * @return {!proto.game_protobuf_messages.proto.messages.DirectCommand} returns this
	    */
	proto.game_protobuf_messages.proto.messages.DirectCommand.prototype.setCachingOption = function (
	value)
	{
	  return googleProtobuf.Message.setProto3IntField(this, 4, value);
	};

	/**
	    * optional int32 event_options = 5;
	    * @return {number}
	    */
	proto.game_protobuf_messages.proto.messages.DirectCommand.prototype.getEventOptions = function () {
	  return (/** @type {number} */googleProtobuf.Message.getFieldWithDefault(this, 5, 0));
	};

	/**
	    * @param {number} value
	    * @return {!proto.game_protobuf_messages.proto.messages.DirectCommand} returns this
	    */
	proto.game_protobuf_messages.proto.messages.DirectCommand.prototype.setEventOptions = function (
	value)
	{
	  return googleProtobuf.Message.setProto3IntField(this, 5, value);
	};

	/**
	    * repeated int32 to_actor_ids = 6;
	    * @return {!Array<number>}
	    */
	proto.game_protobuf_messages.proto.messages.DirectCommand.prototype.getToActorIdsList = function () {
	  return (/** @type {!Array<number>} */googleProtobuf.Message.getRepeatedField(this, 6));
	};

	/**
	    * @param {!Array<number>} value
	    * @return {!proto.game_protobuf_messages.proto.messages.DirectCommand} returns this
	    */
	proto.game_protobuf_messages.proto.messages.DirectCommand.prototype.setToActorIdsList = function (
	value)
	{
	  return googleProtobuf.Message.setField(this, 6, value || []);
	};

	/**
	    * @param {number} value
	    * @param {number=} opt_index
	    * @return {!proto.game_protobuf_messages.proto.messages.DirectCommand} returns this
	    */
	proto.game_protobuf_messages.proto.messages.DirectCommand.prototype.addToActorIds = function (
	value,
	opt_index)
	{
	  return googleProtobuf.Message.addToRepeatedField(this, 6, value, opt_index);
	};

	/**
	    * Clears the list making it empty but non-null.
	    * @return {!proto.game_protobuf_messages.proto.messages.DirectCommand} returns this
	    */
	proto.game_protobuf_messages.proto.messages.DirectCommand.prototype.clearToActorIdsList = function () {
	  return this.setToActorIdsList([]);
	};

	/**
	    * optional bytes msg = 7;
	    * @return {!(string|Uint8Array)}
	    */
	proto.game_protobuf_messages.proto.messages.DirectCommand.prototype.getMsg = function () {
	  return (/** @type {!(string|Uint8Array)} */googleProtobuf.Message.getFieldWithDefault(
	    this,
	    7,
	    ''));

	};

	/**
	    * optional bytes msg = 7;
	    * This is a type-conversion wrapper around `getMsg()`
	    * @return {string}
	    */
	proto.game_protobuf_messages.proto.messages.DirectCommand.prototype.getMsg_asB64 = function () {
	  return (/** @type {string} */googleProtobuf.Message.bytesAsB64(this.getMsg()));
	};

	/**
	    * optional bytes msg = 7;
	    * Note that Uint8Array is not supported on all browsers.
	    * @see http://caniuse.com/Uint8Array
	    * This is a type-conversion wrapper around `getMsg()`
	    * @return {!Uint8Array}
	    */
	proto.game_protobuf_messages.proto.messages.DirectCommand.prototype.getMsg_asU8 = function () {
	  return (/** @type {!Uint8Array} */googleProtobuf.Message.bytesAsU8(this.getMsg()));
	};

	/**
	    * @param {!(string|Uint8Array)} value
	    * @return {!proto.game_protobuf_messages.proto.messages.DirectCommand} returns this
	    */
	proto.game_protobuf_messages.proto.messages.DirectCommand.prototype.setMsg = function (
	value)
	{
	  return googleProtobuf.Message.setProto3BytesField(this, 7, value);
	};

	/**
	    * optional int64 timestamp = 8;
	    * @return {number}
	    */
	proto.game_protobuf_messages.proto.messages.DirectCommand.prototype.getTimestamp = function () {
	  return (/** @type {number} */googleProtobuf.Message.getFieldWithDefault(this, 8, 0));
	};

	/**
	    * @param {number} value
	    * @return {!proto.game_protobuf_messages.proto.messages.DirectCommand} returns this
	    */
	proto.game_protobuf_messages.proto.messages.DirectCommand.prototype.setTimestamp = function (
	value)
	{
	  return googleProtobuf.Message.setProto3IntField(this, 8, value);
	};

	/**
	    * optional int32 from_actor_id = 9;
	    * @return {number}
	    */
	proto.game_protobuf_messages.proto.messages.DirectCommand.prototype.getFromActorId = function () {
	  return (/** @type {number} */googleProtobuf.Message.getFieldWithDefault(this, 9, 0));
	};

	/**
	    * @param {number} value
	    * @return {!proto.game_protobuf_messages.proto.messages.DirectCommand} returns this
	    */
	proto.game_protobuf_messages.proto.messages.DirectCommand.prototype.setFromActorId = function (
	value)
	{
	  return googleProtobuf.Message.setProto3IntField(this, 9, value);
	};

	/**
	    * optional int32 i = 10;
	    * @return {number}
	    */
	proto.game_protobuf_messages.proto.messages.DirectCommand.prototype.getI = function () {
	  return (/** @type {number} */googleProtobuf.Message.getFieldWithDefault(this, 10, 0));
	};

	/**
	    * @param {number} value
	    * @return {!proto.game_protobuf_messages.proto.messages.DirectCommand} returns this
	    */
	proto.game_protobuf_messages.proto.messages.DirectCommand.prototype.setI = function (
	value)
	{
	  return googleProtobuf.Message.setProto3IntField(this, 10, value);
	};

	/**
	    * optional int32 interest_group = 11;
	    * @return {number}
	    */
	proto.game_protobuf_messages.proto.messages.DirectCommand.prototype.getInterestGroup = function () {
	  return (/** @type {number} */googleProtobuf.Message.getFieldWithDefault(this, 11, 0));
	};

	/**
	    * @param {number} value
	    * @return {!proto.game_protobuf_messages.proto.messages.DirectCommand} returns this
	    */
	proto.game_protobuf_messages.proto.messages.DirectCommand.prototype.setInterestGroup = function (
	value)
	{
	  return googleProtobuf.Message.setProto3IntField(this, 11, value);
	};

	if (googleProtobuf.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.game_protobuf_messages.proto.messages.AckCommand.prototype.toObject = function (
	  opt_includeInstance)
	  {
	    return proto.game_protobuf_messages.proto.messages.AckCommand.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.game_protobuf_messages.proto.messages.AckCommand} msg The msg instance to transform.
	      * @return {!Object}
	      * @suppress {unusedLocalVariables} f is only used for nested messages
	      */
	  proto.game_protobuf_messages.proto.messages.AckCommand.toObject = function (
	  includeInstance,
	  msg)
	  {
	    var obj = {
	      timestamp: googleProtobuf.Message.getFieldWithDefault(msg, 1, 0),
	      i: googleProtobuf.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.game_protobuf_messages.proto.messages.AckCommand}
	   */
	proto.game_protobuf_messages.proto.messages.AckCommand.deserializeBinary = function (
	bytes)
	{
	  var reader = new googleProtobuf.BinaryReader(bytes);
	  var msg = new proto.game_protobuf_messages.proto.messages.AckCommand();
	  return proto.game_protobuf_messages.proto.messages.AckCommand.deserializeBinaryFromReader(
	  msg,
	  reader);

	};

	/**
	    * Deserializes binary data (in protobuf wire format) from the
	    * given reader into the given message object.
	    * @param {!proto.game_protobuf_messages.proto.messages.AckCommand} msg The message object to deserialize into.
	    * @param {!jspb.BinaryReader} reader The BinaryReader to use.
	    * @return {!proto.game_protobuf_messages.proto.messages.AckCommand}
	    */
	proto.game_protobuf_messages.proto.messages.AckCommand.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.setTimestamp(value);
	        break;
	      case 11:
	        var value = /** @type {number} */reader.readInt32();
	        msg.setI(value);
	        break;
	      default:
	        reader.skipField();
	        break;}

	  }
	  return msg;
	};

	/**
	    * Serializes the message to binary data (in protobuf wire format).
	    * @return {!Uint8Array}
	    */
	proto.game_protobuf_messages.proto.messages.AckCommand.prototype.serializeBinary = function () {
	  var writer = new googleProtobuf.BinaryWriter();
	  proto.game_protobuf_messages.proto.messages.AckCommand.serializeBinaryToWriter(
	  this,
	  writer);

	  return writer.getResultBuffer();
	};

	/**
	    * Serializes the given message to binary data (in protobuf wire
	    * format), writing to the given BinaryWriter.
	    * @param {!proto.game_protobuf_messages.proto.messages.AckCommand} message
	    * @param {!jspb.BinaryWriter} writer
	    * @suppress {unusedLocalVariables} f is only used for nested messages
	    */
	proto.game_protobuf_messages.proto.messages.AckCommand.serializeBinaryToWriter = function (
	message,
	writer)
	{
	  var f = undefined;
	  f = message.getTimestamp();
	  if (f !== 0) {
	    writer.writeInt64(1, f);
	  }
	  f = message.getI();
	  if (f !== 0) {
	    writer.writeInt32(11, f);
	  }
	};

	/**
	    * optional int64 timestamp = 1;
	    * @return {number}
	    */
	proto.game_protobuf_messages.proto.messages.AckCommand.prototype.getTimestamp = function () {
	  return (/** @type {number} */googleProtobuf.Message.getFieldWithDefault(this, 1, 0));
	};

	/**
	    * @param {number} value
	    * @return {!proto.game_protobuf_messages.proto.messages.AckCommand} returns this
	    */
	proto.game_protobuf_messages.proto.messages.AckCommand.prototype.setTimestamp = function (
	value)
	{
	  return googleProtobuf.Message.setProto3IntField(this, 1, value);
	};

	/**
	    * optional int32 i = 11;
	    * @return {number}
	    */
	proto.game_protobuf_messages.proto.messages.AckCommand.prototype.getI = function () {
	  return (/** @type {number} */googleProtobuf.Message.getFieldWithDefault(this, 11, 0));
	};

	/**
	    * @param {number} value
	    * @return {!proto.game_protobuf_messages.proto.messages.AckCommand} returns this
	    */
	proto.game_protobuf_messages.proto.messages.AckCommand.prototype.setI = function (
	value)
	{
	  return googleProtobuf.Message.setProto3IntField(this, 11, value);
	};

	if (googleProtobuf.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.game_protobuf_messages.proto.messages.EventsRequest.prototype.toObject = function (
	  opt_includeInstance)
	  {
	    return proto.game_protobuf_messages.proto.messages.EventsRequest.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.game_protobuf_messages.proto.messages.EventsRequest} msg The msg instance to transform.
	      * @return {!Object}
	      * @suppress {unusedLocalVariables} f is only used for nested messages
	      */
	  proto.game_protobuf_messages.proto.messages.EventsRequest.toObject = function (
	  includeInstance,
	  msg)
	  {
	    var f,
	    obj = {
	      msg: msg.getMsg_asB64(),
	      actorId:
	      (f = msg.getActorId()) &&
	      wrappers_pb.Int32Value.toObject(includeInstance, f),
	      eventId:
	      (f = msg.getEventId()) &&
	      wrappers_pb.Int32Value.toObject(includeInstance, 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.game_protobuf_messages.proto.messages.EventsRequest}
	   */
	proto.game_protobuf_messages.proto.messages.EventsRequest.deserializeBinary = function (
	bytes)
	{
	  var reader = new googleProtobuf.BinaryReader(bytes);
	  var msg = new proto.game_protobuf_messages.proto.messages.EventsRequest();
	  return proto.game_protobuf_messages.proto.messages.EventsRequest.deserializeBinaryFromReader(
	  msg,
	  reader);

	};

	/**
	    * Deserializes binary data (in protobuf wire format) from the
	    * given reader into the given message object.
	    * @param {!proto.game_protobuf_messages.proto.messages.EventsRequest} msg The message object to deserialize into.
	    * @param {!jspb.BinaryReader} reader The BinaryReader to use.
	    * @return {!proto.game_protobuf_messages.proto.messages.EventsRequest}
	    */
	proto.game_protobuf_messages.proto.messages.EventsRequest.deserializeBinaryFromReader = function (
	msg,
	reader)
	{
	  while (reader.nextField()) {
	    if (reader.isEndGroup()) {
	      break;
	    }
	    var field = reader.getFieldNumber();
	    switch (field) {
	      case 1:
	        var value = /** @type {!Uint8Array} */reader.readBytes();
	        msg.setMsg(value);
	        break;
	      case 2:
	        var value = new wrappers_pb.Int32Value();
	        reader.readMessage(
	        value,
	        wrappers_pb.Int32Value.deserializeBinaryFromReader);

	        msg.setActorId(value);
	        break;
	      case 3:
	        var value = new wrappers_pb.Int32Value();
	        reader.readMessage(
	        value,
	        wrappers_pb.Int32Value.deserializeBinaryFromReader);

	        msg.setEventId(value);
	        break;
	      default:
	        reader.skipField();
	        break;}

	  }
	  return msg;
	};

	/**
	    * Serializes the message to binary data (in protobuf wire format).
	    * @return {!Uint8Array}
	    */
	proto.game_protobuf_messages.proto.messages.EventsRequest.prototype.serializeBinary = function () {
	  var writer = new googleProtobuf.BinaryWriter();
	  proto.game_protobuf_messages.proto.messages.EventsRequest.serializeBinaryToWriter(
	  this,
	  writer);

	  return writer.getResultBuffer();
	};

	/**
	    * Serializes the given message to binary data (in protobuf wire
	    * format), writing to the given BinaryWriter.
	    * @param {!proto.game_protobuf_messages.proto.messages.EventsRequest} message
	    * @param {!jspb.BinaryWriter} writer
	    * @suppress {unusedLocalVariables} f is only used for nested messages
	    */
	proto.game_protobuf_messages.proto.messages.EventsRequest.serializeBinaryToWriter = function (
	message,
	writer)
	{
	  var f = undefined;
	  f = message.getMsg_asU8();
	  if (f.length > 0) {
	    writer.writeBytes(1, f);
	  }
	  f = message.getActorId();
	  if (f != null) {
	    writer.writeMessage(
	    2,
	    f,
	    wrappers_pb.Int32Value.serializeBinaryToWriter);

	  }
	  f = message.getEventId();
	  if (f != null) {
	    writer.writeMessage(
	    3,
	    f,
	    wrappers_pb.Int32Value.serializeBinaryToWriter);

	  }
	};

	/**
	    * optional bytes msg = 1;
	    * @return {!(string|Uint8Array)}
	    */
	proto.game_protobuf_messages.proto.messages.EventsRequest.prototype.getMsg = function () {
	  return (/** @type {!(string|Uint8Array)} */googleProtobuf.Message.getFieldWithDefault(
	    this,
	    1,
	    ''));

	};

	/**
	    * optional bytes msg = 1;
	    * This is a type-conversion wrapper around `getMsg()`
	    * @return {string}
	    */
	proto.game_protobuf_messages.proto.messages.EventsRequest.prototype.getMsg_asB64 = function () {
	  return (/** @type {string} */googleProtobuf.Message.bytesAsB64(this.getMsg()));
	};

	/**
	    * optional bytes msg = 1;
	    * Note that Uint8Array is not supported on all browsers.
	    * @see http://caniuse.com/Uint8Array
	    * This is a type-conversion wrapper around `getMsg()`
	    * @return {!Uint8Array}
	    */
	proto.game_protobuf_messages.proto.messages.EventsRequest.prototype.getMsg_asU8 = function () {
	  return (/** @type {!Uint8Array} */googleProtobuf.Message.bytesAsU8(this.getMsg()));
	};

	/**
	    * @param {!(string|Uint8Array)} value
	    * @return {!proto.game_protobuf_messages.proto.messages.EventsRequest} returns this
	    */
	proto.game_protobuf_messages.proto.messages.EventsRequest.prototype.setMsg = function (
	value)
	{
	  return googleProtobuf.Message.setProto3BytesField(this, 1, value);
	};

	/**
	    * optional google.protobuf.Int32Value actor_id = 2;
	    * @return {?proto.google.protobuf.Int32Value}
	    */
	proto.game_protobuf_messages.proto.messages.EventsRequest.prototype.getActorId = function () {
	  return (/** @type{?proto.google.protobuf.Int32Value} */googleProtobuf.Message.getWrapperField(
	    this,
	    wrappers_pb.Int32Value,
	    2));

	};

	/**
	    * @param {?proto.google.protobuf.Int32Value|undefined} value
	    * @return {!proto.game_protobuf_messages.proto.messages.EventsRequest} returns this
	    */
	proto.game_protobuf_messages.proto.messages.EventsRequest.prototype.setActorId = function (
	value)
	{
	  return googleProtobuf.Message.setWrapperField(this, 2, value);
	};

	/**
	    * Clears the message field making it undefined.
	    * @return {!proto.game_protobuf_messages.proto.messages.EventsRequest} returns this
	    */
	proto.game_protobuf_messages.proto.messages.EventsRequest.prototype.clearActorId = function () {
	  return this.setActorId(undefined);
	};

	/**
	    * Returns whether this field is set.
	    * @return {boolean}
	    */
	proto.game_protobuf_messages.proto.messages.EventsRequest.prototype.hasActorId = function () {
	  return googleProtobuf.Message.getField(this, 2) != null;
	};

	/**
	    * optional google.protobuf.Int32Value event_id = 3;
	    * @return {?proto.google.protobuf.Int32Value}
	    */
	proto.game_protobuf_messages.proto.messages.EventsRequest.prototype.getEventId = function () {
	  return (/** @type{?proto.google.protobuf.Int32Value} */googleProtobuf.Message.getWrapperField(
	    this,
	    wrappers_pb.Int32Value,
	    3));

	};

	/**
	    * @param {?proto.google.protobuf.Int32Value|undefined} value
	    * @return {!proto.game_protobuf_messages.proto.messages.EventsRequest} returns this
	    */
	proto.game_protobuf_messages.proto.messages.EventsRequest.prototype.setEventId = function (
	value)
	{
	  return googleProtobuf.Message.setWrapperField(this, 3, value);
	};

	/**
	    * Clears the message field making it undefined.
	    * @return {!proto.game_protobuf_messages.proto.messages.EventsRequest} returns this
	    */
	proto.game_protobuf_messages.proto.messages.EventsRequest.prototype.clearEventId = function () {
	  return this.setEventId(undefined);
	};

	/**
	    * Returns whether this field is set.
	    * @return {boolean}
	    */
	proto.game_protobuf_messages.proto.messages.EventsRequest.prototype.hasEventId = function () {
	  return googleProtobuf.Message.getField(this, 3) != null;
	};

	/**
	    * List of repeated fields within this message type.
	    * @private {!Array<number>}
	    * @const
	    */
	proto.game_protobuf_messages.proto.messages.EventsCommand.repeatedFields_ = [1];

	if (googleProtobuf.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.game_protobuf_messages.proto.messages.EventsCommand.prototype.toObject = function (
	  opt_includeInstance)
	  {
	    return proto.game_protobuf_messages.proto.messages.EventsCommand.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.game_protobuf_messages.proto.messages.EventsCommand} msg The msg instance to transform.
	      * @return {!Object}
	      * @suppress {unusedLocalVariables} f is only used for nested messages
	      */
	  proto.game_protobuf_messages.proto.messages.EventsCommand.toObject = function (
	  includeInstance,
	  msg)
	  {
	    var obj = {
	      eventsList: googleProtobuf.Message.toObjectList(
	      msg.getEventsList(),
	      proto.game_protobuf_messages.proto.messages.DirectCommand.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.game_protobuf_messages.proto.messages.EventsCommand}
	   */
	proto.game_protobuf_messages.proto.messages.EventsCommand.deserializeBinary = function (
	bytes)
	{
	  var reader = new googleProtobuf.BinaryReader(bytes);
	  var msg = new proto.game_protobuf_messages.proto.messages.EventsCommand();
	  return proto.game_protobuf_messages.proto.messages.EventsCommand.deserializeBinaryFromReader(
	  msg,
	  reader);

	};

	/**
	    * Deserializes binary data (in protobuf wire format) from the
	    * given reader into the given message object.
	    * @param {!proto.game_protobuf_messages.proto.messages.EventsCommand} msg The message object to deserialize into.
	    * @param {!jspb.BinaryReader} reader The BinaryReader to use.
	    * @return {!proto.game_protobuf_messages.proto.messages.EventsCommand}
	    */
	proto.game_protobuf_messages.proto.messages.EventsCommand.deserializeBinaryFromReader = function (
	msg,
	reader)
	{
	  while (reader.nextField()) {
	    if (reader.isEndGroup()) {
	      break;
	    }
	    var field = reader.getFieldNumber();
	    switch (field) {
	      case 1:
	        var value = new proto.game_protobuf_messages.proto.messages.DirectCommand();
	        reader.readMessage(
	        value,
	        proto.game_protobuf_messages.proto.messages.DirectCommand.
	        deserializeBinaryFromReader);

	        msg.addEvents(value);
	        break;
	      default:
	        reader.skipField();
	        break;}

	  }
	  return msg;
	};

	/**
	    * Serializes the message to binary data (in protobuf wire format).
	    * @return {!Uint8Array}
	    */
	proto.game_protobuf_messages.proto.messages.EventsCommand.prototype.serializeBinary = function () {
	  var writer = new googleProtobuf.BinaryWriter();
	  proto.game_protobuf_messages.proto.messages.EventsCommand.serializeBinaryToWriter(
	  this,
	  writer);

	  return writer.getResultBuffer();
	};

	/**
	    * Serializes the given message to binary data (in protobuf wire
	    * format), writing to the given BinaryWriter.
	    * @param {!proto.game_protobuf_messages.proto.messages.EventsCommand} message
	    * @param {!jspb.BinaryWriter} writer
	    * @suppress {unusedLocalVariables} f is only used for nested messages
	    */
	proto.game_protobuf_messages.proto.messages.EventsCommand.serializeBinaryToWriter = function (
	message,
	writer)
	{
	  var f = undefined;
	  f = message.getEventsList();
	  if (f.length > 0) {
	    writer.writeRepeatedMessage(
	    1,
	    f,
	    proto.game_protobuf_messages.proto.messages.DirectCommand.
	    serializeBinaryToWriter);

	  }
	};

	/**
	    * repeated DirectCommand events = 1;
	    * @return {!Array<!proto.game_protobuf_messages.proto.messages.DirectCommand>}
	    */
	proto.game_protobuf_messages.proto.messages.EventsCommand.prototype.getEventsList = function () {
	  return (/** @type{!Array<!proto.game_protobuf_messages.proto.messages.DirectCommand>} */googleProtobuf.Message.getRepeatedWrapperField(
	    this,
	    proto.game_protobuf_messages.proto.messages.DirectCommand,
	    1));

	};

	/**
	    * @param {!Array<!proto.game_protobuf_messages.proto.messages.DirectCommand>} value
	    * @return {!proto.game_protobuf_messages.proto.messages.EventsCommand} returns this
	    */
	proto.game_protobuf_messages.proto.messages.EventsCommand.prototype.setEventsList = function (
	value)
	{
	  return googleProtobuf.Message.setRepeatedWrapperField(this, 1, value);
	};

	/**
	    * @param {!proto.game_protobuf_messages.proto.messages.DirectCommand=} opt_value
	    * @param {number=} opt_index
	    * @return {!proto.game_protobuf_messages.proto.messages.DirectCommand}
	    */
	proto.game_protobuf_messages.proto.messages.EventsCommand.prototype.addEvents = function (
	opt_value,
	opt_index)
	{
	  return googleProtobuf.Message.addToRepeatedWrapperField(
	  this,
	  1,
	  opt_value,
	  proto.game_protobuf_messages.proto.messages.DirectCommand,
	  opt_index);

	};

	/**
	    * Clears the list making it empty but non-null.
	    * @return {!proto.game_protobuf_messages.proto.messages.EventsCommand} returns this
	    */
	proto.game_protobuf_messages.proto.messages.EventsCommand.prototype.clearEventsList = function () {
	  return this.setEventsList([]);
	};

	/**
	    * List of repeated fields within this message type.
	    * @private {!Array<number>}
	    * @const
	    */
	proto.game_protobuf_messages.proto.messages.InterestGroups.repeatedFields_ = [
	1,
	2];


	if (googleProtobuf.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.game_protobuf_messages.proto.messages.InterestGroups.prototype.toObject = function (
	  opt_includeInstance)
	  {
	    return proto.game_protobuf_messages.proto.messages.InterestGroups.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.game_protobuf_messages.proto.messages.InterestGroups} msg The msg instance to transform.
	      * @return {!Object}
	      * @suppress {unusedLocalVariables} f is only used for nested messages
	      */
	  proto.game_protobuf_messages.proto.messages.InterestGroups.toObject = function (
	  includeInstance,
	  msg)
	  {
	    var f,
	    obj = {
	      disabledGroupsList:
	      (f = googleProtobuf.Message.getRepeatedField(msg, 1)) == null ? undefined : f,
	      enabledGroupsList:
	      (f = googleProtobuf.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.game_protobuf_messages.proto.messages.InterestGroups}
	   */
	proto.game_protobuf_messages.proto.messages.InterestGroups.deserializeBinary = function (
	bytes)
	{
	  var reader = new googleProtobuf.BinaryReader(bytes);
	  var msg = new proto.game_protobuf_messages.proto.messages.InterestGroups();
	  return proto.game_protobuf_messages.proto.messages.InterestGroups.deserializeBinaryFromReader(
	  msg,
	  reader);

	};

	/**
	    * Deserializes binary data (in protobuf wire format) from the
	    * given reader into the given message object.
	    * @param {!proto.game_protobuf_messages.proto.messages.InterestGroups} msg The message object to deserialize into.
	    * @param {!jspb.BinaryReader} reader The BinaryReader to use.
	    * @return {!proto.game_protobuf_messages.proto.messages.InterestGroups}
	    */
	proto.game_protobuf_messages.proto.messages.InterestGroups.deserializeBinaryFromReader = function (
	msg,
	reader)
	{
	  while (reader.nextField()) {
	    if (reader.isEndGroup()) {
	      break;
	    }
	    var field = reader.getFieldNumber();
	    switch (field) {
	      case 1:
	        var value = /** @type {!Array<number>} */reader.readPackedInt32();
	        msg.setDisabledGroupsList(value);
	        break;
	      case 2:
	        var value = /** @type {!Array<number>} */reader.readPackedInt32();
	        msg.setEnabledGroupsList(value);
	        break;
	      default:
	        reader.skipField();
	        break;}

	  }
	  return msg;
	};

	/**
	    * Serializes the message to binary data (in protobuf wire format).
	    * @return {!Uint8Array}
	    */
	proto.game_protobuf_messages.proto.messages.InterestGroups.prototype.serializeBinary = function () {
	  var writer = new googleProtobuf.BinaryWriter();
	  proto.game_protobuf_messages.proto.messages.InterestGroups.serializeBinaryToWriter(
	  this,
	  writer);

	  return writer.getResultBuffer();
	};

	/**
	    * Serializes the given message to binary data (in protobuf wire
	    * format), writing to the given BinaryWriter.
	    * @param {!proto.game_protobuf_messages.proto.messages.InterestGroups} message
	    * @param {!jspb.BinaryWriter} writer
	    * @suppress {unusedLocalVariables} f is only used for nested messages
	    */
	proto.game_protobuf_messages.proto.messages.InterestGroups.serializeBinaryToWriter = function (
	message,
	writer)
	{
	  var f = undefined;
	  f = message.getDisabledGroupsList();
	  if (f.length > 0) {
	    writer.writePackedInt32(1, f);
	  }
	  f = message.getEnabledGroupsList();
	  if (f.length > 0) {
	    writer.writePackedInt32(2, f);
	  }
	};

	/**
	    * repeated int32 disabled_groups = 1;
	    * @return {!Array<number>}
	    */
	proto.game_protobuf_messages.proto.messages.InterestGroups.prototype.getDisabledGroupsList = function () {
	  return (/** @type {!Array<number>} */googleProtobuf.Message.getRepeatedField(this, 1));
	};

	/**
	    * @param {!Array<number>} value
	    * @return {!proto.game_protobuf_messages.proto.messages.InterestGroups} returns this
	    */
	proto.game_protobuf_messages.proto.messages.InterestGroups.prototype.setDisabledGroupsList = function (
	value)
	{
	  return googleProtobuf.Message.setField(this, 1, value || []);
	};

	/**
	    * @param {number} value
	    * @param {number=} opt_index
	    * @return {!proto.game_protobuf_messages.proto.messages.InterestGroups} returns this
	    */
	proto.game_protobuf_messages.proto.messages.InterestGroups.prototype.addDisabledGroups = function (
	value,
	opt_index)
	{
	  return googleProtobuf.Message.addToRepeatedField(this, 1, value, opt_index);
	};

	/**
	    * Clears the list making it empty but non-null.
	    * @return {!proto.game_protobuf_messages.proto.messages.InterestGroups} returns this
	    */
	proto.game_protobuf_messages.proto.messages.InterestGroups.prototype.clearDisabledGroupsList = function () {
	  return this.setDisabledGroupsList([]);
	};

	/**
	    * repeated int32 enabled_groups = 2;
	    * @return {!Array<number>}
	    */
	proto.game_protobuf_messages.proto.messages.InterestGroups.prototype.getEnabledGroupsList = function () {
	  return (/** @type {!Array<number>} */googleProtobuf.Message.getRepeatedField(this, 2));
	};

	/**
	    * @param {!Array<number>} value
	    * @return {!proto.game_protobuf_messages.proto.messages.InterestGroups} returns this
	    */
	proto.game_protobuf_messages.proto.messages.InterestGroups.prototype.setEnabledGroupsList = function (
	value)
	{
	  return googleProtobuf.Message.setField(this, 2, value || []);
	};

	/**
	    * @param {number} value
	    * @param {number=} opt_index
	    * @return {!proto.game_protobuf_messages.proto.messages.InterestGroups} returns this
	    */
	proto.game_protobuf_messages.proto.messages.InterestGroups.prototype.addEnabledGroups = function (
	value,
	opt_index)
	{
	  return googleProtobuf.Message.addToRepeatedField(this, 2, value, opt_index);
	};

	/**
	    * Clears the list making it empty but non-null.
	    * @return {!proto.game_protobuf_messages.proto.messages.InterestGroups} returns this
	    */
	proto.game_protobuf_messages.proto.messages.InterestGroups.prototype.clearEnabledGroupsList = function () {
	  return this.setEnabledGroupsList([]);
	};

	if (googleProtobuf.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.game_protobuf_messages.proto.messages.JoinLobbyRequest.prototype.toObject = function (
	  opt_includeInstance)
	  {
	    return proto.game_protobuf_messages.proto.messages.JoinLobbyRequest.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.game_protobuf_messages.proto.messages.JoinLobbyRequest} msg The msg instance to transform.
	      * @return {!Object}
	      * @suppress {unusedLocalVariables} f is only used for nested messages
	      */
	  proto.game_protobuf_messages.proto.messages.JoinLobbyRequest.toObject = function (
	  includeInstance,
	  msg)
	  {
	    var obj = {
	      lobbyId: googleProtobuf.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.game_protobuf_messages.proto.messages.JoinLobbyRequest}
	   */
	proto.game_protobuf_messages.proto.messages.JoinLobbyRequest.deserializeBinary = function (
	bytes)
	{
	  var reader = new googleProtobuf.BinaryReader(bytes);
	  var msg = new proto.game_protobuf_messages.proto.messages.JoinLobbyRequest();
	  return proto.game_protobuf_messages.proto.messages.JoinLobbyRequest.deserializeBinaryFromReader(
	  msg,
	  reader);

	};

	/**
	    * Deserializes binary data (in protobuf wire format) from the
	    * given reader into the given message object.
	    * @param {!proto.game_protobuf_messages.proto.messages.JoinLobbyRequest} msg The message object to deserialize into.
	    * @param {!jspb.BinaryReader} reader The BinaryReader to use.
	    * @return {!proto.game_protobuf_messages.proto.messages.JoinLobbyRequest}
	    */
	proto.game_protobuf_messages.proto.messages.JoinLobbyRequest.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.setLobbyId(value);
	        break;
	      default:
	        reader.skipField();
	        break;}

	  }
	  return msg;
	};

	/**
	    * Serializes the message to binary data (in protobuf wire format).
	    * @return {!Uint8Array}
	    */
	proto.game_protobuf_messages.proto.messages.JoinLobbyRequest.prototype.serializeBinary = function () {
	  var writer = new googleProtobuf.BinaryWriter();
	  proto.game_protobuf_messages.proto.messages.JoinLobbyRequest.serializeBinaryToWriter(
	  this,
	  writer);

	  return writer.getResultBuffer();
	};

	/**
	    * Serializes the given message to binary data (in protobuf wire
	    * format), writing to the given BinaryWriter.
	    * @param {!proto.game_protobuf_messages.proto.messages.JoinLobbyRequest} message
	    * @param {!jspb.BinaryWriter} writer
	    * @suppress {unusedLocalVariables} f is only used for nested messages
	    */
	proto.game_protobuf_messages.proto.messages.JoinLobbyRequest.serializeBinaryToWriter = function (
	message,
	writer)
	{
	  var f = undefined;
	  f = message.getLobbyId();
	  if (f.length > 0) {
	    writer.writeString(1, f);
	  }
	};

	/**
	    * optional string lobby_id = 1;
	    * @return {string}
	    */
	proto.game_protobuf_messages.proto.messages.JoinLobbyRequest.prototype.getLobbyId = function () {
	  return (/** @type {string} */googleProtobuf.Message.getFieldWithDefault(this, 1, ''));
	};

	/**
	    * @param {string} value
	    * @return {!proto.game_protobuf_messages.proto.messages.JoinLobbyRequest} returns this
	    */
	proto.game_protobuf_messages.proto.messages.JoinLobbyRequest.prototype.setLobbyId = function (
	value)
	{
	  return googleProtobuf.Message.setProto3StringField(this, 1, value);
	};

	/**
	    * List of repeated fields within this message type.
	    * @private {!Array<number>}
	    * @const
	    */
	proto.game_protobuf_messages.proto.messages.RoomListCommand.repeatedFields_ = [
	1];


	if (googleProtobuf.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.game_protobuf_messages.proto.messages.RoomListCommand.prototype.toObject = function (
	  opt_includeInstance)
	  {
	    return proto.game_protobuf_messages.proto.messages.RoomListCommand.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.game_protobuf_messages.proto.messages.RoomListCommand} msg The msg instance to transform.
	      * @return {!Object}
	      * @suppress {unusedLocalVariables} f is only used for nested messages
	      */
	  proto.game_protobuf_messages.proto.messages.RoomListCommand.toObject = function (
	  includeInstance,
	  msg)
	  {
	    var obj = {
	      listList: googleProtobuf.Message.toObjectList(
	      msg.getListList(),
	      proto.game_protobuf_messages.proto.messages.RoomOptions.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.game_protobuf_messages.proto.messages.RoomListCommand}
	   */
	proto.game_protobuf_messages.proto.messages.RoomListCommand.deserializeBinary = function (
	bytes)
	{
	  var reader = new googleProtobuf.BinaryReader(bytes);
	  var msg = new proto.game_protobuf_messages.proto.messages.RoomListCommand();
	  return proto.game_protobuf_messages.proto.messages.RoomListCommand.deserializeBinaryFromReader(
	  msg,
	  reader);

	};

	/**
	    * Deserializes binary data (in protobuf wire format) from the
	    * given reader into the given message object.
	    * @param {!proto.game_protobuf_messages.proto.messages.RoomListCommand} msg The message object to deserialize into.
	    * @param {!jspb.BinaryReader} reader The BinaryReader to use.
	    * @return {!proto.game_protobuf_messages.proto.messages.RoomListCommand}
	    */
	proto.game_protobuf_messages.proto.messages.RoomListCommand.deserializeBinaryFromReader = function (
	msg,
	reader)
	{
	  while (reader.nextField()) {
	    if (reader.isEndGroup()) {
	      break;
	    }
	    var field = reader.getFieldNumber();
	    switch (field) {
	      case 1:
	        var value = new proto.game_protobuf_messages.proto.messages.RoomOptions();
	        reader.readMessage(
	        value,
	        proto.game_protobuf_messages.proto.messages.RoomOptions.
	        deserializeBinaryFromReader);

	        msg.addList(value);
	        break;
	      default:
	        reader.skipField();
	        break;}

	  }
	  return msg;
	};

	/**
	    * Serializes the message to binary data (in protobuf wire format).
	    * @return {!Uint8Array}
	    */
	proto.game_protobuf_messages.proto.messages.RoomListCommand.prototype.serializeBinary = function () {
	  var writer = new googleProtobuf.BinaryWriter();
	  proto.game_protobuf_messages.proto.messages.RoomListCommand.serializeBinaryToWriter(
	  this,
	  writer);

	  return writer.getResultBuffer();
	};

	/**
	    * Serializes the given message to binary data (in protobuf wire
	    * format), writing to the given BinaryWriter.
	    * @param {!proto.game_protobuf_messages.proto.messages.RoomListCommand} message
	    * @param {!jspb.BinaryWriter} writer
	    * @suppress {unusedLocalVariables} f is only used for nested messages
	    */
	proto.game_protobuf_messages.proto.messages.RoomListCommand.serializeBinaryToWriter = function (
	message,
	writer)
	{
	  var f = undefined;
	  f = message.getListList();
	  if (f.length > 0) {
	    writer.writeRepeatedMessage(
	    1,
	    f,
	    proto.game_protobuf_messages.proto.messages.RoomOptions.
	    serializeBinaryToWriter);

	  }
	};

	/**
	    * repeated RoomOptions list = 1;
	    * @return {!Array<!proto.game_protobuf_messages.proto.messages.RoomOptions>}
	    */
	proto.game_protobuf_messages.proto.messages.RoomListCommand.prototype.getListList = function () {
	  return (/** @type{!Array<!proto.game_protobuf_messages.proto.messages.RoomOptions>} */googleProtobuf.Message.getRepeatedWrapperField(
	    this,
	    proto.game_protobuf_messages.proto.messages.RoomOptions,
	    1));

	};

	/**
	    * @param {!Array<!proto.game_protobuf_messages.proto.messages.RoomOptions>} value
	    * @return {!proto.game_protobuf_messages.proto.messages.RoomListCommand} returns this
	    */
	proto.game_protobuf_messages.proto.messages.RoomListCommand.prototype.setListList = function (
	value)
	{
	  return googleProtobuf.Message.setRepeatedWrapperField(this, 1, value);
	};

	/**
	    * @param {!proto.game_protobuf_messages.proto.messages.RoomOptions=} opt_value
	    * @param {number=} opt_index
	    * @return {!proto.game_protobuf_messages.proto.messages.RoomOptions}
	    */
	proto.game_protobuf_messages.proto.messages.RoomListCommand.prototype.addList = function (
	opt_value,
	opt_index)
	{
	  return googleProtobuf.Message.addToRepeatedWrapperField(
	  this,
	  1,
	  opt_value,
	  proto.game_protobuf_messages.proto.messages.RoomOptions,
	  opt_index);

	};

	/**
	    * Clears the list making it empty but non-null.
	    * @return {!proto.game_protobuf_messages.proto.messages.RoomListCommand} returns this
	    */
	proto.game_protobuf_messages.proto.messages.RoomListCommand.prototype.clearListList = function () {
	  return this.setListList([]);
	};

	if (googleProtobuf.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.game_protobuf_messages.proto.messages.AppStatistic.prototype.toObject = function (
	  opt_includeInstance)
	  {
	    return proto.game_protobuf_messages.proto.messages.AppStatistic.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.game_protobuf_messages.proto.messages.AppStatistic} msg The msg instance to transform.
	      * @return {!Object}
	      * @suppress {unusedLocalVariables} f is only used for nested messages
	      */
	  proto.game_protobuf_messages.proto.messages.AppStatistic.toObject = function (
	  includeInstance,
	  msg)
	  {
	    var obj = {
	      countOfRooms: googleProtobuf.Message.getFieldWithDefault(msg, 1, 0),
	      countOfPlayersOnRouter: googleProtobuf.Message.getFieldWithDefault(msg, 2, 0),
	      countOfPlayersInRooms: googleProtobuf.Message.getFieldWithDefault(msg, 3, 0),
	      countOfPlayers: googleProtobuf.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.game_protobuf_messages.proto.messages.AppStatistic}
	   */
	proto.game_protobuf_messages.proto.messages.AppStatistic.deserializeBinary = function (
	bytes)
	{
	  var reader = new googleProtobuf.BinaryReader(bytes);
	  var msg = new proto.game_protobuf_messages.proto.messages.AppStatistic();
	  return proto.game_protobuf_messages.proto.messages.AppStatistic.deserializeBinaryFromReader(
	  msg,
	  reader);

	};

	/**
	    * Deserializes binary data (in protobuf wire format) from the
	    * given reader into the given message object.
	    * @param {!proto.game_protobuf_messages.proto.messages.AppStatistic} msg The message object to deserialize into.
	    * @param {!jspb.BinaryReader} reader The BinaryReader to use.
	    * @return {!proto.game_protobuf_messages.proto.messages.AppStatistic}
	    */
	proto.game_protobuf_messages.proto.messages.AppStatistic.deserializeBinaryFromReader = function (
	msg,
	reader)
	{
	  while (reader.nextField()) {
	    if (reader.isEndGroup()) {
	      break;
	    }
	    var field = reader.getFieldNumber();
	    switch (field) {
	      case 1:
	        var value = /** @type {number} */reader.readInt32();
	        msg.setCountOfRooms(value);
	        break;
	      case 2:
	        var value = /** @type {number} */reader.readInt32();
	        msg.setCountOfPlayersOnRouter(value);
	        break;
	      case 3:
	        var value = /** @type {number} */reader.readInt32();
	        msg.setCountOfPlayersInRooms(value);
	        break;
	      case 4:
	        var value = /** @type {number} */reader.readInt32();
	        msg.setCountOfPlayers(value);
	        break;
	      default:
	        reader.skipField();
	        break;}

	  }
	  return msg;
	};

	/**
	    * Serializes the message to binary data (in protobuf wire format).
	    * @return {!Uint8Array}
	    */
	proto.game_protobuf_messages.proto.messages.AppStatistic.prototype.serializeBinary = function () {
	  var writer = new googleProtobuf.BinaryWriter();
	  proto.game_protobuf_messages.proto.messages.AppStatistic.serializeBinaryToWriter(
	  this,
	  writer);

	  return writer.getResultBuffer();
	};

	/**
	    * Serializes the given message to binary data (in protobuf wire
	    * format), writing to the given BinaryWriter.
	    * @param {!proto.game_protobuf_messages.proto.messages.AppStatistic} message
	    * @param {!jspb.BinaryWriter} writer
	    * @suppress {unusedLocalVariables} f is only used for nested messages
	    */
	proto.game_protobuf_messages.proto.messages.AppStatistic.serializeBinaryToWriter = function (
	message,
	writer)
	{
	  var f = undefined;
	  f = message.getCountOfRooms();
	  if (f !== 0) {
	    writer.writeInt32(1, f);
	  }
	  f = message.getCountOfPlayersOnRouter();
	  if (f !== 0) {
	    writer.writeInt32(2, f);
	  }
	  f = message.getCountOfPlayersInRooms();
	  if (f !== 0) {
	    writer.writeInt32(3, f);
	  }
	  f = message.getCountOfPlayers();
	  if (f !== 0) {
	    writer.writeInt32(4, f);
	  }
	};

	/**
	    * optional int32 count_of_rooms = 1;
	    * @return {number}
	    */
	proto.game_protobuf_messages.proto.messages.AppStatistic.prototype.getCountOfRooms = function () {
	  return (/** @type {number} */googleProtobuf.Message.getFieldWithDefault(this, 1, 0));
	};

	/**
	    * @param {number} value
	    * @return {!proto.game_protobuf_messages.proto.messages.AppStatistic} returns this
	    */
	proto.game_protobuf_messages.proto.messages.AppStatistic.prototype.setCountOfRooms = function (
	value)
	{
	  return googleProtobuf.Message.setProto3IntField(this, 1, value);
	};

	/**
	    * optional int32 count_of_players_on_router = 2;
	    * @return {number}
	    */
	proto.game_protobuf_messages.proto.messages.AppStatistic.prototype.getCountOfPlayersOnRouter = function () {
	  return (/** @type {number} */googleProtobuf.Message.getFieldWithDefault(this, 2, 0));
	};

	/**
	    * @param {number} value
	    * @return {!proto.game_protobuf_messages.proto.messages.AppStatistic} returns this
	    */
	proto.game_protobuf_messages.proto.messages.AppStatistic.prototype.setCountOfPlayersOnRouter = function (
	value)
	{
	  return googleProtobuf.Message.setProto3IntField(this, 2, value);
	};

	/**
	    * optional int32 count_of_players_in_rooms = 3;
	    * @return {number}
	    */
	proto.game_protobuf_messages.proto.messages.AppStatistic.prototype.getCountOfPlayersInRooms = function () {
	  return (/** @type {number} */googleProtobuf.Message.getFieldWithDefault(this, 3, 0));
	};

	/**
	    * @param {number} value
	    * @return {!proto.game_protobuf_messages.proto.messages.AppStatistic} returns this
	    */
	proto.game_protobuf_messages.proto.messages.AppStatistic.prototype.setCountOfPlayersInRooms = function (
	value)
	{
	  return googleProtobuf.Message.setProto3IntField(this, 3, value);
	};

	/**
	    * optional int32 count_of_players = 4;
	    * @return {number}
	    */
	proto.game_protobuf_messages.proto.messages.AppStatistic.prototype.getCountOfPlayers = function () {
	  return (/** @type {number} */googleProtobuf.Message.getFieldWithDefault(this, 4, 0));
	};

	/**
	    * @param {number} value
	    * @return {!proto.game_protobuf_messages.proto.messages.AppStatistic} returns this
	    */
	proto.game_protobuf_messages.proto.messages.AppStatistic.prototype.setCountOfPlayers = function (
	value)
	{
	  return googleProtobuf.Message.setProto3IntField(this, 4, value);
	};

	if (googleProtobuf.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.game_protobuf_messages.proto.messages.StatisticCommand.prototype.toObject = function (
	  opt_includeInstance)
	  {
	    return proto.game_protobuf_messages.proto.messages.StatisticCommand.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.game_protobuf_messages.proto.messages.StatisticCommand} msg The msg instance to transform.
	      * @return {!Object}
	      * @suppress {unusedLocalVariables} f is only used for nested messages
	      */
	  proto.game_protobuf_messages.proto.messages.StatisticCommand.toObject = function (
	  includeInstance,
	  msg)
	  {
	    var f,
	    obj = {
	      appStats:
	      (f = msg.getAppStats()) &&
	      proto.game_protobuf_messages.proto.messages.AppStatistic.toObject(
	      includeInstance,
	      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.game_protobuf_messages.proto.messages.StatisticCommand}
	   */
	proto.game_protobuf_messages.proto.messages.StatisticCommand.deserializeBinary = function (
	bytes)
	{
	  var reader = new googleProtobuf.BinaryReader(bytes);
	  var msg = new proto.game_protobuf_messages.proto.messages.StatisticCommand();
	  return proto.game_protobuf_messages.proto.messages.StatisticCommand.deserializeBinaryFromReader(
	  msg,
	  reader);

	};

	/**
	    * Deserializes binary data (in protobuf wire format) from the
	    * given reader into the given message object.
	    * @param {!proto.game_protobuf_messages.proto.messages.StatisticCommand} msg The message object to deserialize into.
	    * @param {!jspb.BinaryReader} reader The BinaryReader to use.
	    * @return {!proto.game_protobuf_messages.proto.messages.StatisticCommand}
	    */
	proto.game_protobuf_messages.proto.messages.StatisticCommand.deserializeBinaryFromReader = function (
	msg,
	reader)
	{
	  while (reader.nextField()) {
	    if (reader.isEndGroup()) {
	      break;
	    }
	    var field = reader.getFieldNumber();
	    switch (field) {
	      case 1:
	        var value = new proto.game_protobuf_messages.proto.messages.AppStatistic();
	        reader.readMessage(
	        value,
	        proto.game_protobuf_messages.proto.messages.AppStatistic.
	        deserializeBinaryFromReader);

	        msg.setAppStats(value);
	        break;
	      default:
	        reader.skipField();
	        break;}

	  }
	  return msg;
	};

	/**
	    * Serializes the message to binary data (in protobuf wire format).
	    * @return {!Uint8Array}
	    */
	proto.game_protobuf_messages.proto.messages.StatisticCommand.prototype.serializeBinary = function () {
	  var writer = new googleProtobuf.BinaryWriter();
	  proto.game_protobuf_messages.proto.messages.StatisticCommand.serializeBinaryToWriter(
	  this,
	  writer);

	  return writer.getResultBuffer();
	};

	/**
	    * Serializes the given message to binary data (in protobuf wire
	    * format), writing to the given BinaryWriter.
	    * @param {!proto.game_protobuf_messages.proto.messages.StatisticCommand} message
	    * @param {!jspb.BinaryWriter} writer
	    * @suppress {unusedLocalVariables} f is only used for nested messages
	    */
	proto.game_protobuf_messages.proto.messages.StatisticCommand.serializeBinaryToWriter = function (
	message,
	writer)
	{
	  var f = undefined;
	  f = message.getAppStats();
	  if (f != null) {
	    writer.writeMessage(
	    1,
	    f,
	    proto.game_protobuf_messages.proto.messages.AppStatistic.
	    serializeBinaryToWriter);

	  }
	};

	/**
	    * optional AppStatistic app_stats = 1;
	    * @return {?proto.game_protobuf_messages.proto.messages.AppStatistic}
	    */
	proto.game_protobuf_messages.proto.messages.StatisticCommand.prototype.getAppStats = function () {
	  return (/** @type{?proto.game_protobuf_messages.proto.messages.AppStatistic} */googleProtobuf.Message.getWrapperField(
	    this,
	    proto.game_protobuf_messages.proto.messages.AppStatistic,
	    1));

	};

	/**
	    * @param {?proto.game_protobuf_messages.proto.messages.AppStatistic|undefined} value
	    * @return {!proto.game_protobuf_messages.proto.messages.StatisticCommand} returns this
	    */
	proto.game_protobuf_messages.proto.messages.StatisticCommand.prototype.setAppStats = function (
	value)
	{
	  return googleProtobuf.Message.setWrapperField(this, 1, value);
	};

	/**
	    * Clears the message field making it undefined.
	    * @return {!proto.game_protobuf_messages.proto.messages.StatisticCommand} returns this
	    */
	proto.game_protobuf_messages.proto.messages.StatisticCommand.prototype.clearAppStats = function () {
	  return this.setAppStats(undefined);
	};

	/**
	    * Returns whether this field is set.
	    * @return {boolean}
	    */
	proto.game_protobuf_messages.proto.messages.StatisticCommand.prototype.hasAppStats = function () {
	  return googleProtobuf.Message.getField(this, 1) != null;
	};

	if (googleProtobuf.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.game_protobuf_messages.proto.messages.ErrorCommand.prototype.toObject = function (
	  opt_includeInstance)
	  {
	    return proto.game_protobuf_messages.proto.messages.ErrorCommand.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.game_protobuf_messages.proto.messages.ErrorCommand} msg The msg instance to transform.
	      * @return {!Object}
	      * @suppress {unusedLocalVariables} f is only used for nested messages
	      */
	  proto.game_protobuf_messages.proto.messages.ErrorCommand.toObject = function (
	  includeInstance,
	  msg)
	  {
	    var f,
	    obj = {
	      errorInfo:
	      (f = msg.getErrorInfo()) &&
	      proto.game_protobuf_messages.proto.messages.ErrorInfo.toObject(
	      includeInstance,
	      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.game_protobuf_messages.proto.messages.ErrorCommand}
	   */
	proto.game_protobuf_messages.proto.messages.ErrorCommand.deserializeBinary = function (
	bytes)
	{
	  var reader = new googleProtobuf.BinaryReader(bytes);
	  var msg = new proto.game_protobuf_messages.proto.messages.ErrorCommand();
	  return proto.game_protobuf_messages.proto.messages.ErrorCommand.deserializeBinaryFromReader(
	  msg,
	  reader);

	};

	/**
	    * Deserializes binary data (in protobuf wire format) from the
	    * given reader into the given message object.
	    * @param {!proto.game_protobuf_messages.proto.messages.ErrorCommand} msg The message object to deserialize into.
	    * @param {!jspb.BinaryReader} reader The BinaryReader to use.
	    * @return {!proto.game_protobuf_messages.proto.messages.ErrorCommand}
	    */
	proto.game_protobuf_messages.proto.messages.ErrorCommand.deserializeBinaryFromReader = function (
	msg,
	reader)
	{
	  while (reader.nextField()) {
	    if (reader.isEndGroup()) {
	      break;
	    }
	    var field = reader.getFieldNumber();
	    switch (field) {
	      case 1:
	        var value = new proto.game_protobuf_messages.proto.messages.ErrorInfo();
	        reader.readMessage(
	        value,
	        proto.game_protobuf_messages.proto.messages.ErrorInfo.
	        deserializeBinaryFromReader);

	        msg.setErrorInfo(value);
	        break;
	      default:
	        reader.skipField();
	        break;}

	  }
	  return msg;
	};

	/**
	    * Serializes the message to binary data (in protobuf wire format).
	    * @return {!Uint8Array}
	    */
	proto.game_protobuf_messages.proto.messages.ErrorCommand.prototype.serializeBinary = function () {
	  var writer = new googleProtobuf.BinaryWriter();
	  proto.game_protobuf_messages.proto.messages.ErrorCommand.serializeBinaryToWriter(
	  this,
	  writer);

	  return writer.getResultBuffer();
	};

	/**
	    * Serializes the given message to binary data (in protobuf wire
	    * format), writing to the given BinaryWriter.
	    * @param {!proto.game_protobuf_messages.proto.messages.ErrorCommand} message
	    * @param {!jspb.BinaryWriter} writer
	    * @suppress {unusedLocalVariables} f is only used for nested messages
	    */
	proto.game_protobuf_messages.proto.messages.ErrorCommand.serializeBinaryToWriter = function (
	message,
	writer)
	{
	  var f = undefined;
	  f = message.getErrorInfo();
	  if (f != null) {
	    writer.writeMessage(
	    1,
	    f,
	    proto.game_protobuf_messages.proto.messages.ErrorInfo.
	    serializeBinaryToWriter);

	  }
	};

	/**
	    * optional ErrorInfo error_info = 1;
	    * @return {?proto.game_protobuf_messages.proto.messages.ErrorInfo}
	    */
	proto.game_protobuf_messages.proto.messages.ErrorCommand.prototype.getErrorInfo = function () {
	  return (/** @type{?proto.game_protobuf_messages.proto.messages.ErrorInfo} */googleProtobuf.Message.getWrapperField(
	    this,
	    proto.game_protobuf_messages.proto.messages.ErrorInfo,
	    1));

	};

	/**
	    * @param {?proto.game_protobuf_messages.proto.messages.ErrorInfo|undefined} value
	    * @return {!proto.game_protobuf_messages.proto.messages.ErrorCommand} returns this
	    */
	proto.game_protobuf_messages.proto.messages.ErrorCommand.prototype.setErrorInfo = function (
	value)
	{
	  return googleProtobuf.Message.setWrapperField(this, 1, value);
	};

	/**
	    * Clears the message field making it undefined.
	    * @return {!proto.game_protobuf_messages.proto.messages.ErrorCommand} returns this
	    */
	proto.game_protobuf_messages.proto.messages.ErrorCommand.prototype.clearErrorInfo = function () {
	  return this.setErrorInfo(undefined);
	};

	/**
	    * Returns whether this field is set.
	    * @return {boolean}
	    */
	proto.game_protobuf_messages.proto.messages.ErrorCommand.prototype.hasErrorInfo = function () {
	  return googleProtobuf.Message.getField(this, 1) != null;
	};

	/**
	    * Oneof group definitions for this message. Each group defines the field
	    * numbers belonging to that group. When of these fields' value is set, all
	    * other fields in the group are cleared. During deserialization, if multiple
	    * fields are encountered for a group, only the last value seen will be kept.
	    * @private {!Array<!Array<number>>}
	    * @const
	    */
	proto.game_protobuf_messages.proto.messages.RequestMessage.oneofGroups_ = [
	[20, 21, 22, 23, 24, 25, 26, 27, 28, 54]];


	/**
	                                            * @enum {number}
	                                            */
	proto.game_protobuf_messages.proto.messages.RequestMessage.RequestCase = {
	  REQUEST_NOT_SET: 0,
	  SESSION_OPEN: 20,
	  CREATE_ROOM: 21,
	  JOIN_ROOM: 22,
	  UPDATE_PROPERTY: 23,
	  UPDATE_SYS_PROPERTY: 24,
	  UPDATE_MASTER_CLIENT: 25,
	  KICK_MEMBER: 26,
	  EVENTS: 27,
	  INTEREST_GROUPS: 28,
	  JOIN_LOBBY: 54 };


	/**
	                     * @return {proto.game_protobuf_messages.proto.messages.RequestMessage.RequestCase}
	                     */
	proto.game_protobuf_messages.proto.messages.RequestMessage.prototype.getRequestCase = function () {
	  return (/** @type {proto.game_protobuf_messages.proto.messages.RequestMessage.RequestCase} */googleProtobuf.Message.computeOneofCase(
	    this,
	    proto.game_protobuf_messages.proto.messages.RequestMessage.oneofGroups_[0]));

	};

	if (googleProtobuf.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.game_protobuf_messages.proto.messages.RequestMessage.prototype.toObject = function (
	  opt_includeInstance)
	  {
	    return proto.game_protobuf_messages.proto.messages.RequestMessage.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.game_protobuf_messages.proto.messages.RequestMessage} msg The msg instance to transform.
	      * @return {!Object}
	      * @suppress {unusedLocalVariables} f is only used for nested messages
	      */
	  proto.game_protobuf_messages.proto.messages.RequestMessage.toObject = function (
	  includeInstance,
	  msg)
	  {
	    var f,
	    obj = {
	      i: googleProtobuf.Message.getFieldWithDefault(msg, 1, 0),
	      sessionOpen:
	      (f = msg.getSessionOpen()) &&
	      proto.game_protobuf_messages.proto.messages.SessionOpenRequest.toObject(
	      includeInstance,
	      f),

	      createRoom:
	      (f = msg.getCreateRoom()) &&
	      proto.game_protobuf_messages.proto.messages.CreateRoomRequest.toObject(
	      includeInstance,
	      f),

	      joinRoom:
	      (f = msg.getJoinRoom()) &&
	      proto.game_protobuf_messages.proto.messages.JoinRoomRequest.toObject(
	      includeInstance,
	      f),

	      updateProperty:
	      (f = msg.getUpdateProperty()) &&
	      proto.game_protobuf_messages.proto.messages.UpdatePropertyRequest.toObject(
	      includeInstance,
	      f),

	      updateSysProperty:
	      (f = msg.getUpdateSysProperty()) &&
	      proto.game_protobuf_messages.proto.messages.UpdateSysPropertyRequest.toObject(
	      includeInstance,
	      f),

	      updateMasterClient:
	      (f = msg.getUpdateMasterClient()) &&
	      proto.game_protobuf_messages.proto.messages.UpdateMasterClientRequest.toObject(
	      includeInstance,
	      f),

	      kickMember:
	      (f = msg.getKickMember()) &&
	      proto.game_protobuf_messages.proto.messages.KickMemberRequest.toObject(
	      includeInstance,
	      f),

	      events:
	      (f = msg.getEvents()) &&
	      proto.game_protobuf_messages.proto.messages.EventsRequest.toObject(
	      includeInstance,
	      f),

	      interestGroups:
	      (f = msg.getInterestGroups()) &&
	      proto.game_protobuf_messages.proto.messages.InterestGroups.toObject(
	      includeInstance,
	      f),

	      joinLobby:
	      (f = msg.getJoinLobby()) &&
	      proto.game_protobuf_messages.proto.messages.JoinLobbyRequest.toObject(
	      includeInstance,
	      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.game_protobuf_messages.proto.messages.RequestMessage}
	   */
	proto.game_protobuf_messages.proto.messages.RequestMessage.deserializeBinary = function (
	bytes)
	{
	  var reader = new googleProtobuf.BinaryReader(bytes);
	  var msg = new proto.game_protobuf_messages.proto.messages.RequestMessage();
	  return proto.game_protobuf_messages.proto.messages.RequestMessage.deserializeBinaryFromReader(
	  msg,
	  reader);

	};

	/**
	    * Deserializes binary data (in protobuf wire format) from the
	    * given reader into the given message object.
	    * @param {!proto.game_protobuf_messages.proto.messages.RequestMessage} msg The message object to deserialize into.
	    * @param {!jspb.BinaryReader} reader The BinaryReader to use.
	    * @return {!proto.game_protobuf_messages.proto.messages.RequestMessage}
	    */
	proto.game_protobuf_messages.proto.messages.RequestMessage.deserializeBinaryFromReader = function (
	msg,
	reader)
	{
	  while (reader.nextField()) {
	    if (reader.isEndGroup()) {
	      break;
	    }
	    var field = reader.getFieldNumber();
	    switch (field) {
	      case 1:
	        var value = /** @type {number} */reader.readInt32();
	        msg.setI(value);
	        break;
	      case 20:
	        var value = new proto.game_protobuf_messages.proto.messages.SessionOpenRequest();
	        reader.readMessage(
	        value,
	        proto.game_protobuf_messages.proto.messages.SessionOpenRequest.
	        deserializeBinaryFromReader);

	        msg.setSessionOpen(value);
	        break;
	      case 21:
	        var value = new proto.game_protobuf_messages.proto.messages.CreateRoomRequest();
	        reader.readMessage(
	        value,
	        proto.game_protobuf_messages.proto.messages.CreateRoomRequest.
	        deserializeBinaryFromReader);

	        msg.setCreateRoom(value);
	        break;
	      case 22:
	        var value = new proto.game_protobuf_messages.proto.messages.JoinRoomRequest();
	        reader.readMessage(
	        value,
	        proto.game_protobuf_messages.proto.messages.JoinRoomRequest.
	        deserializeBinaryFromReader);

	        msg.setJoinRoom(value);
	        break;
	      case 23:
	        var value = new proto.game_protobuf_messages.proto.messages.UpdatePropertyRequest();
	        reader.readMessage(
	        value,
	        proto.game_protobuf_messages.proto.messages.UpdatePropertyRequest.
	        deserializeBinaryFromReader);

	        msg.setUpdateProperty(value);
	        break;
	      case 24:
	        var value = new proto.game_protobuf_messages.proto.messages.UpdateSysPropertyRequest();
	        reader.readMessage(
	        value,
	        proto.game_protobuf_messages.proto.messages.UpdateSysPropertyRequest.
	        deserializeBinaryFromReader);

	        msg.setUpdateSysProperty(value);
	        break;
	      case 25:
	        var value = new proto.game_protobuf_messages.proto.messages.UpdateMasterClientRequest();
	        reader.readMessage(
	        value,
	        proto.game_protobuf_messages.proto.messages.UpdateMasterClientRequest.
	        deserializeBinaryFromReader);

	        msg.setUpdateMasterClient(value);
	        break;
	      case 26:
	        var value = new proto.game_protobuf_messages.proto.messages.KickMemberRequest();
	        reader.readMessage(
	        value,
	        proto.game_protobuf_messages.proto.messages.KickMemberRequest.
	        deserializeBinaryFromReader);

	        msg.setKickMember(value);
	        break;
	      case 27:
	        var value = new proto.game_protobuf_messages.proto.messages.EventsRequest();
	        reader.readMessage(
	        value,
	        proto.game_protobuf_messages.proto.messages.EventsRequest.
	        deserializeBinaryFromReader);

	        msg.setEvents(value);
	        break;
	      case 28:
	        var value = new proto.game_protobuf_messages.proto.messages.InterestGroups();
	        reader.readMessage(
	        value,
	        proto.game_protobuf_messages.proto.messages.InterestGroups.
	        deserializeBinaryFromReader);

	        msg.setInterestGroups(value);
	        break;
	      case 54:
	        var value = new proto.game_protobuf_messages.proto.messages.JoinLobbyRequest();
	        reader.readMessage(
	        value,
	        proto.game_protobuf_messages.proto.messages.JoinLobbyRequest.
	        deserializeBinaryFromReader);

	        msg.setJoinLobby(value);
	        break;
	      default:
	        reader.skipField();
	        break;}

	  }
	  return msg;
	};

	/**
	    * Serializes the message to binary data (in protobuf wire format).
	    * @return {!Uint8Array}
	    */
	proto.game_protobuf_messages.proto.messages.RequestMessage.prototype.serializeBinary = function () {
	  var writer = new googleProtobuf.BinaryWriter();
	  proto.game_protobuf_messages.proto.messages.RequestMessage.serializeBinaryToWriter(
	  this,
	  writer);

	  return writer.getResultBuffer();
	};

	/**
	    * Serializes the given message to binary data (in protobuf wire
	    * format), writing to the given BinaryWriter.
	    * @param {!proto.game_protobuf_messages.proto.messages.RequestMessage} message
	    * @param {!jspb.BinaryWriter} writer
	    * @suppress {unusedLocalVariables} f is only used for nested messages
	    */
	proto.game_protobuf_messages.proto.messages.RequestMessage.serializeBinaryToWriter = function (
	message,
	writer)
	{
	  var f = undefined;
	  f = message.getI();
	  if (f !== 0) {
	    writer.writeInt32(1, f);
	  }
	  f = message.getSessionOpen();
	  if (f != null) {
	    writer.writeMessage(
	    20,
	    f,
	    proto.game_protobuf_messages.proto.messages.SessionOpenRequest.
	    serializeBinaryToWriter);

	  }
	  f = message.getCreateRoom();
	  if (f != null) {
	    writer.writeMessage(
	    21,
	    f,
	    proto.game_protobuf_messages.proto.messages.CreateRoomRequest.
	    serializeBinaryToWriter);

	  }
	  f = message.getJoinRoom();
	  if (f != null) {
	    writer.writeMessage(
	    22,
	    f,
	    proto.game_protobuf_messages.proto.messages.JoinRoomRequest.
	    serializeBinaryToWriter);

	  }
	  f = message.getUpdateProperty();
	  if (f != null) {
	    writer.writeMessage(
	    23,
	    f,
	    proto.game_protobuf_messages.proto.messages.UpdatePropertyRequest.
	    serializeBinaryToWriter);

	  }
	  f = message.getUpdateSysProperty();
	  if (f != null) {
	    writer.writeMessage(
	    24,
	    f,
	    proto.game_protobuf_messages.proto.messages.UpdateSysPropertyRequest.
	    serializeBinaryToWriter);

	  }
	  f = message.getUpdateMasterClient();
	  if (f != null) {
	    writer.writeMessage(
	    25,
	    f,
	    proto.game_protobuf_messages.proto.messages.UpdateMasterClientRequest.
	    serializeBinaryToWriter);

	  }
	  f = message.getKickMember();
	  if (f != null) {
	    writer.writeMessage(
	    26,
	    f,
	    proto.game_protobuf_messages.proto.messages.KickMemberRequest.
	    serializeBinaryToWriter);

	  }
	  f = message.getEvents();
	  if (f != null) {
	    writer.writeMessage(
	    27,
	    f,
	    proto.game_protobuf_messages.proto.messages.EventsRequest.
	    serializeBinaryToWriter);

	  }
	  f = message.getInterestGroups();
	  if (f != null) {
	    writer.writeMessage(
	    28,
	    f,
	    proto.game_protobuf_messages.proto.messages.InterestGroups.
	    serializeBinaryToWriter);

	  }
	  f = message.getJoinLobby();
	  if (f != null) {
	    writer.writeMessage(
	    54,
	    f,
	    proto.game_protobuf_messages.proto.messages.JoinLobbyRequest.
	    serializeBinaryToWriter);

	  }
	};

	/**
	    * optional int32 i = 1;
	    * @return {number}
	    */
	proto.game_protobuf_messages.proto.messages.RequestMessage.prototype.getI = function () {
	  return (/** @type {number} */googleProtobuf.Message.getFieldWithDefault(this, 1, 0));
	};

	/**
	    * @param {number} value
	    * @return {!proto.game_protobuf_messages.proto.messages.RequestMessage} returns this
	    */
	proto.game_protobuf_messages.proto.messages.RequestMessage.prototype.setI = function (
	value)
	{
	  return googleProtobuf.Message.setProto3IntField(this, 1, value);
	};

	/**
	    * optional SessionOpenRequest session_open = 20;
	    * @return {?proto.game_protobuf_messages.proto.messages.SessionOpenRequest}
	    */
	proto.game_protobuf_messages.proto.messages.RequestMessage.prototype.getSessionOpen = function () {
	  return (/** @type{?proto.game_protobuf_messages.proto.messages.SessionOpenRequest} */googleProtobuf.Message.getWrapperField(
	    this,
	    proto.game_protobuf_messages.proto.messages.SessionOpenRequest,
	    20));

	};

	/**
	    * @param {?proto.game_protobuf_messages.proto.messages.SessionOpenRequest|undefined} value
	    * @return {!proto.game_protobuf_messages.proto.messages.RequestMessage} returns this
	    */
	proto.game_protobuf_messages.proto.messages.RequestMessage.prototype.setSessionOpen = function (
	value)
	{
	  return googleProtobuf.Message.setOneofWrapperField(
	  this,
	  20,
	  proto.game_protobuf_messages.proto.messages.RequestMessage.oneofGroups_[0],
	  value);

	};

	/**
	    * Clears the message field making it undefined.
	    * @return {!proto.game_protobuf_messages.proto.messages.RequestMessage} returns this
	    */
	proto.game_protobuf_messages.proto.messages.RequestMessage.prototype.clearSessionOpen = function () {
	  return this.setSessionOpen(undefined);
	};

	/**
	    * Returns whether this field is set.
	    * @return {boolean}
	    */
	proto.game_protobuf_messages.proto.messages.RequestMessage.prototype.hasSessionOpen = function () {
	  return googleProtobuf.Message.getField(this, 20) != null;
	};

	/**
	    * optional CreateRoomRequest create_room = 21;
	    * @return {?proto.game_protobuf_messages.proto.messages.CreateRoomRequest}
	    */
	proto.game_protobuf_messages.proto.messages.RequestMessage.prototype.getCreateRoom = function () {
	  return (/** @type{?proto.game_protobuf_messages.proto.messages.CreateRoomRequest} */googleProtobuf.Message.getWrapperField(
	    this,
	    proto.game_protobuf_messages.proto.messages.CreateRoomRequest,
	    21));

	};

	/**
	    * @param {?proto.game_protobuf_messages.proto.messages.CreateRoomRequest|undefined} value
	    * @return {!proto.game_protobuf_messages.proto.messages.RequestMessage} returns this
	    */
	proto.game_protobuf_messages.proto.messages.RequestMessage.prototype.setCreateRoom = function (
	value)
	{
	  return googleProtobuf.Message.setOneofWrapperField(
	  this,
	  21,
	  proto.game_protobuf_messages.proto.messages.RequestMessage.oneofGroups_[0],
	  value);

	};

	/**
	    * Clears the message field making it undefined.
	    * @return {!proto.game_protobuf_messages.proto.messages.RequestMessage} returns this
	    */
	proto.game_protobuf_messages.proto.messages.RequestMessage.prototype.clearCreateRoom = function () {
	  return this.setCreateRoom(undefined);
	};

	/**
	    * Returns whether this field is set.
	    * @return {boolean}
	    */
	proto.game_protobuf_messages.proto.messages.RequestMessage.prototype.hasCreateRoom = function () {
	  return googleProtobuf.Message.getField(this, 21) != null;
	};

	/**
	    * optional JoinRoomRequest join_room = 22;
	    * @return {?proto.game_protobuf_messages.proto.messages.JoinRoomRequest}
	    */
	proto.game_protobuf_messages.proto.messages.RequestMessage.prototype.getJoinRoom = function () {
	  return (/** @type{?proto.game_protobuf_messages.proto.messages.JoinRoomRequest} */googleProtobuf.Message.getWrapperField(
	    this,
	    proto.game_protobuf_messages.proto.messages.JoinRoomRequest,
	    22));

	};

	/**
	    * @param {?proto.game_protobuf_messages.proto.messages.JoinRoomRequest|undefined} value
	    * @return {!proto.game_protobuf_messages.proto.messages.RequestMessage} returns this
	    */
	proto.game_protobuf_messages.proto.messages.RequestMessage.prototype.setJoinRoom = function (
	value)
	{
	  return googleProtobuf.Message.setOneofWrapperField(
	  this,
	  22,
	  proto.game_protobuf_messages.proto.messages.RequestMessage.oneofGroups_[0],
	  value);

	};

	/**
	    * Clears the message field making it undefined.
	    * @return {!proto.game_protobuf_messages.proto.messages.RequestMessage} returns this
	    */
	proto.game_protobuf_messages.proto.messages.RequestMessage.prototype.clearJoinRoom = function () {
	  return this.setJoinRoom(undefined);
	};

	/**
	    * Returns whether this field is set.
	    * @return {boolean}
	    */
	proto.game_protobuf_messages.proto.messages.RequestMessage.prototype.hasJoinRoom = function () {
	  return googleProtobuf.Message.getField(this, 22) != null;
	};

	/**
	    * optional UpdatePropertyRequest update_property = 23;
	    * @return {?proto.game_protobuf_messages.proto.messages.UpdatePropertyRequest}
	    */
	proto.game_protobuf_messages.proto.messages.RequestMessage.prototype.getUpdateProperty = function () {
	  return (/** @type{?proto.game_protobuf_messages.proto.messages.UpdatePropertyRequest} */googleProtobuf.Message.getWrapperField(
	    this,
	    proto.game_protobuf_messages.proto.messages.UpdatePropertyRequest,
	    23));

	};

	/**
	    * @param {?proto.game_protobuf_messages.proto.messages.UpdatePropertyRequest|undefined} value
	    * @return {!proto.game_protobuf_messages.proto.messages.RequestMessage} returns this
	    */
	proto.game_protobuf_messages.proto.messages.RequestMessage.prototype.setUpdateProperty = function (
	value)
	{
	  return googleProtobuf.Message.setOneofWrapperField(
	  this,
	  23,
	  proto.game_protobuf_messages.proto.messages.RequestMessage.oneofGroups_[0],
	  value);

	};

	/**
	    * Clears the message field making it undefined.
	    * @return {!proto.game_protobuf_messages.proto.messages.RequestMessage} returns this
	    */
	proto.game_protobuf_messages.proto.messages.RequestMessage.prototype.clearUpdateProperty = function () {
	  return this.setUpdateProperty(undefined);
	};

	/**
	    * Returns whether this field is set.
	    * @return {boolean}
	    */
	proto.game_protobuf_messages.proto.messages.RequestMessage.prototype.hasUpdateProperty = function () {
	  return googleProtobuf.Message.getField(this, 23) != null;
	};

	/**
	    * optional UpdateSysPropertyRequest update_sys_property = 24;
	    * @return {?proto.game_protobuf_messages.proto.messages.UpdateSysPropertyRequest}
	    */
	proto.game_protobuf_messages.proto.messages.RequestMessage.prototype.getUpdateSysProperty = function () {
	  return (/** @type{?proto.game_protobuf_messages.proto.messages.UpdateSysPropertyRequest} */googleProtobuf.Message.getWrapperField(
	    this,
	    proto.game_protobuf_messages.proto.messages.UpdateSysPropertyRequest,
	    24));

	};

	/**
	    * @param {?proto.game_protobuf_messages.proto.messages.UpdateSysPropertyRequest|undefined} value
	    * @return {!proto.game_protobuf_messages.proto.messages.RequestMessage} returns this
	    */
	proto.game_protobuf_messages.proto.messages.RequestMessage.prototype.setUpdateSysProperty = function (
	value)
	{
	  return googleProtobuf.Message.setOneofWrapperField(
	  this,
	  24,
	  proto.game_protobuf_messages.proto.messages.RequestMessage.oneofGroups_[0],
	  value);

	};

	/**
	    * Clears the message field making it undefined.
	    * @return {!proto.game_protobuf_messages.proto.messages.RequestMessage} returns this
	    */
	proto.game_protobuf_messages.proto.messages.RequestMessage.prototype.clearUpdateSysProperty = function () {
	  return this.setUpdateSysProperty(undefined);
	};

	/**
	    * Returns whether this field is set.
	    * @return {boolean}
	    */
	proto.game_protobuf_messages.proto.messages.RequestMessage.prototype.hasUpdateSysProperty = function () {
	  return googleProtobuf.Message.getField(this, 24) != null;
	};

	/**
	    * optional UpdateMasterClientRequest update_master_client = 25;
	    * @return {?proto.game_protobuf_messages.proto.messages.UpdateMasterClientRequest}
	    */
	proto.game_protobuf_messages.proto.messages.RequestMessage.prototype.getUpdateMasterClient = function () {
	  return (/** @type{?proto.game_protobuf_messages.proto.messages.UpdateMasterClientRequest} */googleProtobuf.Message.getWrapperField(
	    this,
	    proto.game_protobuf_messages.proto.messages.UpdateMasterClientRequest,
	    25));

	};

	/**
	    * @param {?proto.game_protobuf_messages.proto.messages.UpdateMasterClientRequest|undefined} value
	    * @return {!proto.game_protobuf_messages.proto.messages.RequestMessage} returns this
	    */
	proto.game_protobuf_messages.proto.messages.RequestMessage.prototype.setUpdateMasterClient = function (
	value)
	{
	  return googleProtobuf.Message.setOneofWrapperField(
	  this,
	  25,
	  proto.game_protobuf_messages.proto.messages.RequestMessage.oneofGroups_[0],
	  value);

	};

	/**
	    * Clears the message field making it undefined.
	    * @return {!proto.game_protobuf_messages.proto.messages.RequestMessage} returns this
	    */
	proto.game_protobuf_messages.proto.messages.RequestMessage.prototype.clearUpdateMasterClient = function () {
	  return this.setUpdateMasterClient(undefined);
	};

	/**
	    * Returns whether this field is set.
	    * @return {boolean}
	    */
	proto.game_protobuf_messages.proto.messages.RequestMessage.prototype.hasUpdateMasterClient = function () {
	  return googleProtobuf.Message.getField(this, 25) != null;
	};

	/**
	    * optional KickMemberRequest kick_member = 26;
	    * @return {?proto.game_protobuf_messages.proto.messages.KickMemberRequest}
	    */
	proto.game_protobuf_messages.proto.messages.RequestMessage.prototype.getKickMember = function () {
	  return (/** @type{?proto.game_protobuf_messages.proto.messages.KickMemberRequest} */googleProtobuf.Message.getWrapperField(
	    this,
	    proto.game_protobuf_messages.proto.messages.KickMemberRequest,
	    26));

	};

	/**
	    * @param {?proto.game_protobuf_messages.proto.messages.KickMemberRequest|undefined} value
	    * @return {!proto.game_protobuf_messages.proto.messages.RequestMessage} returns this
	    */
	proto.game_protobuf_messages.proto.messages.RequestMessage.prototype.setKickMember = function (
	value)
	{
	  return googleProtobuf.Message.setOneofWrapperField(
	  this,
	  26,
	  proto.game_protobuf_messages.proto.messages.RequestMessage.oneofGroups_[0],
	  value);

	};

	/**
	    * Clears the message field making it undefined.
	    * @return {!proto.game_protobuf_messages.proto.messages.RequestMessage} returns this
	    */
	proto.game_protobuf_messages.proto.messages.RequestMessage.prototype.clearKickMember = function () {
	  return this.setKickMember(undefined);
	};

	/**
	    * Returns whether this field is set.
	    * @return {boolean}
	    */
	proto.game_protobuf_messages.proto.messages.RequestMessage.prototype.hasKickMember = function () {
	  return googleProtobuf.Message.getField(this, 26) != null;
	};

	/**
	    * optional EventsRequest events = 27;
	    * @return {?proto.game_protobuf_messages.proto.messages.EventsRequest}
	    */
	proto.game_protobuf_messages.proto.messages.RequestMessage.prototype.getEvents = function () {
	  return (/** @type{?proto.game_protobuf_messages.proto.messages.EventsRequest} */googleProtobuf.Message.getWrapperField(
	    this,
	    proto.game_protobuf_messages.proto.messages.EventsRequest,
	    27));

	};

	/**
	    * @param {?proto.game_protobuf_messages.proto.messages.EventsRequest|undefined} value
	    * @return {!proto.game_protobuf_messages.proto.messages.RequestMessage} returns this
	    */
	proto.game_protobuf_messages.proto.messages.RequestMessage.prototype.setEvents = function (
	value)
	{
	  return googleProtobuf.Message.setOneofWrapperField(
	  this,
	  27,
	  proto.game_protobuf_messages.proto.messages.RequestMessage.oneofGroups_[0],
	  value);

	};

	/**
	    * Clears the message field making it undefined.
	    * @return {!proto.game_protobuf_messages.proto.messages.RequestMessage} returns this
	    */
	proto.game_protobuf_messages.proto.messages.RequestMessage.prototype.clearEvents = function () {
	  return this.setEvents(undefined);
	};

	/**
	    * Returns whether this field is set.
	    * @return {boolean}
	    */
	proto.game_protobuf_messages.proto.messages.RequestMessage.prototype.hasEvents = function () {
	  return googleProtobuf.Message.getField(this, 27) != null;
	};

	/**
	    * optional InterestGroups interest_groups = 28;
	    * @return {?proto.game_protobuf_messages.proto.messages.InterestGroups}
	    */
	proto.game_protobuf_messages.proto.messages.RequestMessage.prototype.getInterestGroups = function () {
	  return (/** @type{?proto.game_protobuf_messages.proto.messages.InterestGroups} */googleProtobuf.Message.getWrapperField(
	    this,
	    proto.game_protobuf_messages.proto.messages.InterestGroups,
	    28));

	};

	/**
	    * @param {?proto.game_protobuf_messages.proto.messages.InterestGroups|undefined} value
	    * @return {!proto.game_protobuf_messages.proto.messages.RequestMessage} returns this
	    */
	proto.game_protobuf_messages.proto.messages.RequestMessage.prototype.setInterestGroups = function (
	value)
	{
	  return googleProtobuf.Message.setOneofWrapperField(
	  this,
	  28,
	  proto.game_protobuf_messages.proto.messages.RequestMessage.oneofGroups_[0],
	  value);

	};

	/**
	    * Clears the message field making it undefined.
	    * @return {!proto.game_protobuf_messages.proto.messages.RequestMessage} returns this
	    */
	proto.game_protobuf_messages.proto.messages.RequestMessage.prototype.clearInterestGroups = function () {
	  return this.setInterestGroups(undefined);
	};

	/**
	    * Returns whether this field is set.
	    * @return {boolean}
	    */
	proto.game_protobuf_messages.proto.messages.RequestMessage.prototype.hasInterestGroups = function () {
	  return googleProtobuf.Message.getField(this, 28) != null;
	};

	/**
	    * optional JoinLobbyRequest join_lobby = 54;
	    * @return {?proto.game_protobuf_messages.proto.messages.JoinLobbyRequest}
	    */
	proto.game_protobuf_messages.proto.messages.RequestMessage.prototype.getJoinLobby = function () {
	  return (/** @type{?proto.game_protobuf_messages.proto.messages.JoinLobbyRequest} */googleProtobuf.Message.getWrapperField(
	    this,
	    proto.game_protobuf_messages.proto.messages.JoinLobbyRequest,
	    54));

	};

	/**
	    * @param {?proto.game_protobuf_messages.proto.messages.JoinLobbyRequest|undefined} value
	    * @return {!proto.game_protobuf_messages.proto.messages.RequestMessage} returns this
	    */
	proto.game_protobuf_messages.proto.messages.RequestMessage.prototype.setJoinLobby = function (
	value)
	{
	  return googleProtobuf.Message.setOneofWrapperField(
	  this,
	  54,
	  proto.game_protobuf_messages.proto.messages.RequestMessage.oneofGroups_[0],
	  value);

	};

	/**
	    * Clears the message field making it undefined.
	    * @return {!proto.game_protobuf_messages.proto.messages.RequestMessage} returns this
	    */
	proto.game_protobuf_messages.proto.messages.RequestMessage.prototype.clearJoinLobby = function () {
	  return this.setJoinLobby(undefined);
	};

	/**
	    * Returns whether this field is set.
	    * @return {boolean}
	    */
	proto.game_protobuf_messages.proto.messages.RequestMessage.prototype.hasJoinLobby = function () {
	  return googleProtobuf.Message.getField(this, 54) != null;
	};

	/**
	    * Oneof group definitions for this message. Each group defines the field
	    * numbers belonging to that group. When of these fields' value is set, all
	    * other fields in the group are cleared. During deserialization, if multiple
	    * fields are encountered for a group, only the last value seen will be kept.
	    * @private {!Array<!Array<number>>}
	    * @const
	    */
	proto.game_protobuf_messages.proto.messages.ResponseMessage.oneofGroups_ = [
	[20, 21, 22, 23, 24, 25, 26, 28]];


	/**
	                                    * @enum {number}
	                                    */
	proto.game_protobuf_messages.proto.messages.ResponseMessage.ResponseCase = {
	  RESPONSE_NOT_SET: 0,
	  CREATE_ROOM: 20,
	  JOIN_ROOM: 21,
	  UPDATE_PROPERTY: 22,
	  UPDATE_SYS_PROPERTY: 23,
	  UPDATE_MASTER_CLIENT: 24,
	  KICK_MEMBER: 25,
	  ACK: 26,
	  INTEREST_GROUPS: 28 };


	/**
	                          * @return {proto.game_protobuf_messages.proto.messages.ResponseMessage.ResponseCase}
	                          */
	proto.game_protobuf_messages.proto.messages.ResponseMessage.prototype.getResponseCase = function () {
	  return (/** @type {proto.game_protobuf_messages.proto.messages.ResponseMessage.ResponseCase} */googleProtobuf.Message.computeOneofCase(
	    this,
	    proto.game_protobuf_messages.proto.messages.ResponseMessage.oneofGroups_[0]));

	};

	if (googleProtobuf.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.game_protobuf_messages.proto.messages.ResponseMessage.prototype.toObject = function (
	  opt_includeInstance)
	  {
	    return proto.game_protobuf_messages.proto.messages.ResponseMessage.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.game_protobuf_messages.proto.messages.ResponseMessage} msg The msg instance to transform.
	      * @return {!Object}
	      * @suppress {unusedLocalVariables} f is only used for nested messages
	      */
	  proto.game_protobuf_messages.proto.messages.ResponseMessage.toObject = function (
	  includeInstance,
	  msg)
	  {
	    var f,
	    obj = {
	      i: googleProtobuf.Message.getFieldWithDefault(msg, 1, 0),
	      errorInfo:
	      (f = msg.getErrorInfo()) &&
	      proto.game_protobuf_messages.proto.messages.ErrorInfo.toObject(
	      includeInstance,
	      f),

	      createRoom:
	      (f = msg.getCreateRoom()) &&
	      proto.game_protobuf_messages.proto.messages.CreateRoomResponse.toObject(
	      includeInstance,
	      f),

	      joinRoom:
	      (f = msg.getJoinRoom()) &&
	      proto.game_protobuf_messages.proto.messages.JoinRoomResponse.toObject(
	      includeInstance,
	      f),

	      updateProperty:
	      (f = msg.getUpdateProperty()) &&
	      proto.game_protobuf_messages.proto.messages.UpdatePropertyResponse.toObject(
	      includeInstance,
	      f),

	      updateSysProperty:
	      (f = msg.getUpdateSysProperty()) &&
	      proto.game_protobuf_messages.proto.messages.UpdateSysPropertyResponse.toObject(
	      includeInstance,
	      f),

	      updateMasterClient:
	      (f = msg.getUpdateMasterClient()) &&
	      proto.game_protobuf_messages.proto.messages.UpdateMasterClientResponse.toObject(
	      includeInstance,
	      f),

	      kickMember:
	      (f = msg.getKickMember()) &&
	      proto.game_protobuf_messages.proto.messages.KickMemberResponse.toObject(
	      includeInstance,
	      f),

	      ack:
	      (f = msg.getAck()) &&
	      proto.game_protobuf_messages.proto.messages.AckCommand.toObject(
	      includeInstance,
	      f),

	      interestGroups:
	      (f = msg.getInterestGroups()) &&
	      proto.game_protobuf_messages.proto.messages.InterestGroups.toObject(
	      includeInstance,
	      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.game_protobuf_messages.proto.messages.ResponseMessage}
	   */
	proto.game_protobuf_messages.proto.messages.ResponseMessage.deserializeBinary = function (
	bytes)
	{
	  var reader = new googleProtobuf.BinaryReader(bytes);
	  var msg = new proto.game_protobuf_messages.proto.messages.ResponseMessage();
	  return proto.game_protobuf_messages.proto.messages.ResponseMessage.deserializeBinaryFromReader(
	  msg,
	  reader);

	};

	/**
	    * Deserializes binary data (in protobuf wire format) from the
	    * given reader into the given message object.
	    * @param {!proto.game_protobuf_messages.proto.messages.ResponseMessage} msg The message object to deserialize into.
	    * @param {!jspb.BinaryReader} reader The BinaryReader to use.
	    * @return {!proto.game_protobuf_messages.proto.messages.ResponseMessage}
	    */
	proto.game_protobuf_messages.proto.messages.ResponseMessage.deserializeBinaryFromReader = function (
	msg,
	reader)
	{
	  while (reader.nextField()) {
	    if (reader.isEndGroup()) {
	      break;
	    }
	    var field = reader.getFieldNumber();
	    switch (field) {
	      case 1:
	        var value = /** @type {number} */reader.readInt32();
	        msg.setI(value);
	        break;
	      case 2:
	        var value = new proto.game_protobuf_messages.proto.messages.ErrorInfo();
	        reader.readMessage(
	        value,
	        proto.game_protobuf_messages.proto.messages.ErrorInfo.
	        deserializeBinaryFromReader);

	        msg.setErrorInfo(value);
	        break;
	      case 20:
	        var value = new proto.game_protobuf_messages.proto.messages.CreateRoomResponse();
	        reader.readMessage(
	        value,
	        proto.game_protobuf_messages.proto.messages.CreateRoomResponse.
	        deserializeBinaryFromReader);

	        msg.setCreateRoom(value);
	        break;
	      case 21:
	        var value = new proto.game_protobuf_messages.proto.messages.JoinRoomResponse();
	        reader.readMessage(
	        value,
	        proto.game_protobuf_messages.proto.messages.JoinRoomResponse.
	        deserializeBinaryFromReader);

	        msg.setJoinRoom(value);
	        break;
	      case 22:
	        var value = new proto.game_protobuf_messages.proto.messages.UpdatePropertyResponse();
	        reader.readMessage(
	        value,
	        proto.game_protobuf_messages.proto.messages.UpdatePropertyResponse.
	        deserializeBinaryFromReader);

	        msg.setUpdateProperty(value);
	        break;
	      case 23:
	        var value = new proto.game_protobuf_messages.proto.messages.UpdateSysPropertyResponse();
	        reader.readMessage(
	        value,
	        proto.game_protobuf_messages.proto.messages.UpdateSysPropertyResponse.
	        deserializeBinaryFromReader);

	        msg.setUpdateSysProperty(value);
	        break;
	      case 24:
	        var value = new proto.game_protobuf_messages.proto.messages.UpdateMasterClientResponse();
	        reader.readMessage(
	        value,
	        proto.game_protobuf_messages.proto.messages.UpdateMasterClientResponse.
	        deserializeBinaryFromReader);

	        msg.setUpdateMasterClient(value);
	        break;
	      case 25:
	        var value = new proto.game_protobuf_messages.proto.messages.KickMemberResponse();
	        reader.readMessage(
	        value,
	        proto.game_protobuf_messages.proto.messages.KickMemberResponse.
	        deserializeBinaryFromReader);

	        msg.setKickMember(value);
	        break;
	      case 26:
	        var value = new proto.game_protobuf_messages.proto.messages.AckCommand();
	        reader.readMessage(
	        value,
	        proto.game_protobuf_messages.proto.messages.AckCommand.
	        deserializeBinaryFromReader);

	        msg.setAck(value);
	        break;
	      case 28:
	        var value = new proto.game_protobuf_messages.proto.messages.InterestGroups();
	        reader.readMessage(
	        value,
	        proto.game_protobuf_messages.proto.messages.InterestGroups.
	        deserializeBinaryFromReader);

	        msg.setInterestGroups(value);
	        break;
	      default:
	        reader.skipField();
	        break;}

	  }
	  return msg;
	};

	/**
	    * Serializes the message to binary data (in protobuf wire format).
	    * @return {!Uint8Array}
	    */
	proto.game_protobuf_messages.proto.messages.ResponseMessage.prototype.serializeBinary = function () {
	  var writer = new googleProtobuf.BinaryWriter();
	  proto.game_protobuf_messages.proto.messages.ResponseMessage.serializeBinaryToWriter(
	  this,
	  writer);

	  return writer.getResultBuffer();
	};

	/**
	    * Serializes the given message to binary data (in protobuf wire
	    * format), writing to the given BinaryWriter.
	    * @param {!proto.game_protobuf_messages.proto.messages.ResponseMessage} message
	    * @param {!jspb.BinaryWriter} writer
	    * @suppress {unusedLocalVariables} f is only used for nested messages
	    */
	proto.game_protobuf_messages.proto.messages.ResponseMessage.serializeBinaryToWriter = function (
	message,
	writer)
	{
	  var f = undefined;
	  f = message.getI();
	  if (f !== 0) {
	    writer.writeInt32(1, f);
	  }
	  f = message.getErrorInfo();
	  if (f != null) {
	    writer.writeMessage(
	    2,
	    f,
	    proto.game_protobuf_messages.proto.messages.ErrorInfo.
	    serializeBinaryToWriter);

	  }
	  f = message.getCreateRoom();
	  if (f != null) {
	    writer.writeMessage(
	    20,
	    f,
	    proto.game_protobuf_messages.proto.messages.CreateRoomResponse.
	    serializeBinaryToWriter);

	  }
	  f = message.getJoinRoom();
	  if (f != null) {
	    writer.writeMessage(
	    21,
	    f,
	    proto.game_protobuf_messages.proto.messages.JoinRoomResponse.
	    serializeBinaryToWriter);

	  }
	  f = message.getUpdateProperty();
	  if (f != null) {
	    writer.writeMessage(
	    22,
	    f,
	    proto.game_protobuf_messages.proto.messages.UpdatePropertyResponse.
	    serializeBinaryToWriter);

	  }
	  f = message.getUpdateSysProperty();
	  if (f != null) {
	    writer.writeMessage(
	    23,
	    f,
	    proto.game_protobuf_messages.proto.messages.UpdateSysPropertyResponse.
	    serializeBinaryToWriter);

	  }
	  f = message.getUpdateMasterClient();
	  if (f != null) {
	    writer.writeMessage(
	    24,
	    f,
	    proto.game_protobuf_messages.proto.messages.UpdateMasterClientResponse.
	    serializeBinaryToWriter);

	  }
	  f = message.getKickMember();
	  if (f != null) {
	    writer.writeMessage(
	    25,
	    f,
	    proto.game_protobuf_messages.proto.messages.KickMemberResponse.
	    serializeBinaryToWriter);

	  }
	  f = message.getAck();
	  if (f != null) {
	    writer.writeMessage(
	    26,
	    f,
	    proto.game_protobuf_messages.proto.messages.AckCommand.
	    serializeBinaryToWriter);

	  }
	  f = message.getInterestGroups();
	  if (f != null) {
	    writer.writeMessage(
	    28,
	    f,
	    proto.game_protobuf_messages.proto.messages.InterestGroups.
	    serializeBinaryToWriter);

	  }
	};

	/**
	    * optional int32 i = 1;
	    * @return {number}
	    */
	proto.game_protobuf_messages.proto.messages.ResponseMessage.prototype.getI = function () {
	  return (/** @type {number} */googleProtobuf.Message.getFieldWithDefault(this, 1, 0));
	};

	/**
	    * @param {number} value
	    * @return {!proto.game_protobuf_messages.proto.messages.ResponseMessage} returns this
	    */
	proto.game_protobuf_messages.proto.messages.ResponseMessage.prototype.setI = function (
	value)
	{
	  return googleProtobuf.Message.setProto3IntField(this, 1, value);
	};

	/**
	    * optional ErrorInfo error_info = 2;
	    * @return {?proto.game_protobuf_messages.proto.messages.ErrorInfo}
	    */
	proto.game_protobuf_messages.proto.messages.ResponseMessage.prototype.getErrorInfo = function () {
	  return (/** @type{?proto.game_protobuf_messages.proto.messages.ErrorInfo} */googleProtobuf.Message.getWrapperField(
	    this,
	    proto.game_protobuf_messages.proto.messages.ErrorInfo,
	    2));

	};

	/**
	    * @param {?proto.game_protobuf_messages.proto.messages.ErrorInfo|undefined} value
	    * @return {!proto.game_protobuf_messages.proto.messages.ResponseMessage} returns this
	    */
	proto.game_protobuf_messages.proto.messages.ResponseMessage.prototype.setErrorInfo = function (
	value)
	{
	  return googleProtobuf.Message.setWrapperField(this, 2, value);
	};

	/**
	    * Clears the message field making it undefined.
	    * @return {!proto.game_protobuf_messages.proto.messages.ResponseMessage} returns this
	    */
	proto.game_protobuf_messages.proto.messages.ResponseMessage.prototype.clearErrorInfo = function () {
	  return this.setErrorInfo(undefined);
	};

	/**
	    * Returns whether this field is set.
	    * @return {boolean}
	    */
	proto.game_protobuf_messages.proto.messages.ResponseMessage.prototype.hasErrorInfo = function () {
	  return googleProtobuf.Message.getField(this, 2) != null;
	};

	/**
	    * optional CreateRoomResponse create_room = 20;
	    * @return {?proto.game_protobuf_messages.proto.messages.CreateRoomResponse}
	    */
	proto.game_protobuf_messages.proto.messages.ResponseMessage.prototype.getCreateRoom = function () {
	  return (/** @type{?proto.game_protobuf_messages.proto.messages.CreateRoomResponse} */googleProtobuf.Message.getWrapperField(
	    this,
	    proto.game_protobuf_messages.proto.messages.CreateRoomResponse,
	    20));

	};

	/**
	    * @param {?proto.game_protobuf_messages.proto.messages.CreateRoomResponse|undefined} value
	    * @return {!proto.game_protobuf_messages.proto.messages.ResponseMessage} returns this
	    */
	proto.game_protobuf_messages.proto.messages.ResponseMessage.prototype.setCreateRoom = function (
	value)
	{
	  return googleProtobuf.Message.setOneofWrapperField(
	  this,
	  20,
	  proto.game_protobuf_messages.proto.messages.ResponseMessage.oneofGroups_[0],
	  value);

	};

	/**
	    * Clears the message field making it undefined.
	    * @return {!proto.game_protobuf_messages.proto.messages.ResponseMessage} returns this
	    */
	proto.game_protobuf_messages.proto.messages.ResponseMessage.prototype.clearCreateRoom = function () {
	  return this.setCreateRoom(undefined);
	};

	/**
	    * Returns whether this field is set.
	    * @return {boolean}
	    */
	proto.game_protobuf_messages.proto.messages.ResponseMessage.prototype.hasCreateRoom = function () {
	  return googleProtobuf.Message.getField(this, 20) != null;
	};

	/**
	    * optional JoinRoomResponse join_room = 21;
	    * @return {?proto.game_protobuf_messages.proto.messages.JoinRoomResponse}
	    */
	proto.game_protobuf_messages.proto.messages.ResponseMessage.prototype.getJoinRoom = function () {
	  return (/** @type{?proto.game_protobuf_messages.proto.messages.JoinRoomResponse} */googleProtobuf.Message.getWrapperField(
	    this,
	    proto.game_protobuf_messages.proto.messages.JoinRoomResponse,
	    21));

	};

	/**
	    * @param {?proto.game_protobuf_messages.proto.messages.JoinRoomResponse|undefined} value
	    * @return {!proto.game_protobuf_messages.proto.messages.ResponseMessage} returns this
	    */
	proto.game_protobuf_messages.proto.messages.ResponseMessage.prototype.setJoinRoom = function (
	value)
	{
	  return googleProtobuf.Message.setOneofWrapperField(
	  this,
	  21,
	  proto.game_protobuf_messages.proto.messages.ResponseMessage.oneofGroups_[0],
	  value);

	};

	/**
	    * Clears the message field making it undefined.
	    * @return {!proto.game_protobuf_messages.proto.messages.ResponseMessage} returns this
	    */
	proto.game_protobuf_messages.proto.messages.ResponseMessage.prototype.clearJoinRoom = function () {
	  return this.setJoinRoom(undefined);
	};

	/**
	    * Returns whether this field is set.
	    * @return {boolean}
	    */
	proto.game_protobuf_messages.proto.messages.ResponseMessage.prototype.hasJoinRoom = function () {
	  return googleProtobuf.Message.getField(this, 21) != null;
	};

	/**
	    * optional UpdatePropertyResponse update_property = 22;
	    * @return {?proto.game_protobuf_messages.proto.messages.UpdatePropertyResponse}
	    */
	proto.game_protobuf_messages.proto.messages.ResponseMessage.prototype.getUpdateProperty = function () {
	  return (/** @type{?proto.game_protobuf_messages.proto.messages.UpdatePropertyResponse} */googleProtobuf.Message.getWrapperField(
	    this,
	    proto.game_protobuf_messages.proto.messages.UpdatePropertyResponse,
	    22));

	};

	/**
	    * @param {?proto.game_protobuf_messages.proto.messages.UpdatePropertyResponse|undefined} value
	    * @return {!proto.game_protobuf_messages.proto.messages.ResponseMessage} returns this
	    */
	proto.game_protobuf_messages.proto.messages.ResponseMessage.prototype.setUpdateProperty = function (
	value)
	{
	  return googleProtobuf.Message.setOneofWrapperField(
	  this,
	  22,
	  proto.game_protobuf_messages.proto.messages.ResponseMessage.oneofGroups_[0],
	  value);

	};

	/**
	    * Clears the message field making it undefined.
	    * @return {!proto.game_protobuf_messages.proto.messages.ResponseMessage} returns this
	    */
	proto.game_protobuf_messages.proto.messages.ResponseMessage.prototype.clearUpdateProperty = function () {
	  return this.setUpdateProperty(undefined);
	};

	/**
	    * Returns whether this field is set.
	    * @return {boolean}
	    */
	proto.game_protobuf_messages.proto.messages.ResponseMessage.prototype.hasUpdateProperty = function () {
	  return googleProtobuf.Message.getField(this, 22) != null;
	};

	/**
	    * optional UpdateSysPropertyResponse update_sys_property = 23;
	    * @return {?proto.game_protobuf_messages.proto.messages.UpdateSysPropertyResponse}
	    */
	proto.game_protobuf_messages.proto.messages.ResponseMessage.prototype.getUpdateSysProperty = function () {
	  return (/** @type{?proto.game_protobuf_messages.proto.messages.UpdateSysPropertyResponse} */googleProtobuf.Message.getWrapperField(
	    this,
	    proto.game_protobuf_messages.proto.messages.UpdateSysPropertyResponse,
	    23));

	};

	/**
	    * @param {?proto.game_protobuf_messages.proto.messages.UpdateSysPropertyResponse|undefined} value
	    * @return {!proto.game_protobuf_messages.proto.messages.ResponseMessage} returns this
	    */
	proto.game_protobuf_messages.proto.messages.ResponseMessage.prototype.setUpdateSysProperty = function (
	value)
	{
	  return googleProtobuf.Message.setOneofWrapperField(
	  this,
	  23,
	  proto.game_protobuf_messages.proto.messages.ResponseMessage.oneofGroups_[0],
	  value);

	};

	/**
	    * Clears the message field making it undefined.
	    * @return {!proto.game_protobuf_messages.proto.messages.ResponseMessage} returns this
	    */
	proto.game_protobuf_messages.proto.messages.ResponseMessage.prototype.clearUpdateSysProperty = function () {
	  return this.setUpdateSysProperty(undefined);
	};

	/**
	    * Returns whether this field is set.
	    * @return {boolean}
	    */
	proto.game_protobuf_messages.proto.messages.ResponseMessage.prototype.hasUpdateSysProperty = function () {
	  return googleProtobuf.Message.getField(this, 23) != null;
	};

	/**
	    * optional UpdateMasterClientResponse update_master_client = 24;
	    * @return {?proto.game_protobuf_messages.proto.messages.UpdateMasterClientResponse}
	    */
	proto.game_protobuf_messages.proto.messages.ResponseMessage.prototype.getUpdateMasterClient = function () {
	  return (/** @type{?proto.game_protobuf_messages.proto.messages.UpdateMasterClientResponse} */googleProtobuf.Message.getWrapperField(
	    this,
	    proto.game_protobuf_messages.proto.messages.UpdateMasterClientResponse,
	    24));

	};

	/**
	    * @param {?proto.game_protobuf_messages.proto.messages.UpdateMasterClientResponse|undefined} value
	    * @return {!proto.game_protobuf_messages.proto.messages.ResponseMessage} returns this
	    */
	proto.game_protobuf_messages.proto.messages.ResponseMessage.prototype.setUpdateMasterClient = function (
	value)
	{
	  return googleProtobuf.Message.setOneofWrapperField(
	  this,
	  24,
	  proto.game_protobuf_messages.proto.messages.ResponseMessage.oneofGroups_[0],
	  value);

	};

	/**
	    * Clears the message field making it undefined.
	    * @return {!proto.game_protobuf_messages.proto.messages.ResponseMessage} returns this
	    */
	proto.game_protobuf_messages.proto.messages.ResponseMessage.prototype.clearUpdateMasterClient = function () {
	  return this.setUpdateMasterClient(undefined);
	};

	/**
	    * Returns whether this field is set.
	    * @return {boolean}
	    */
	proto.game_protobuf_messages.proto.messages.ResponseMessage.prototype.hasUpdateMasterClient = function () {
	  return googleProtobuf.Message.getField(this, 24) != null;
	};

	/**
	    * optional KickMemberResponse kick_member = 25;
	    * @return {?proto.game_protobuf_messages.proto.messages.KickMemberResponse}
	    */
	proto.game_protobuf_messages.proto.messages.ResponseMessage.prototype.getKickMember = function () {
	  return (/** @type{?proto.game_protobuf_messages.proto.messages.KickMemberResponse} */googleProtobuf.Message.getWrapperField(
	    this,
	    proto.game_protobuf_messages.proto.messages.KickMemberResponse,
	    25));

	};

	/**
	    * @param {?proto.game_protobuf_messages.proto.messages.KickMemberResponse|undefined} value
	    * @return {!proto.game_protobuf_messages.proto.messages.ResponseMessage} returns this
	    */
	proto.game_protobuf_messages.proto.messages.ResponseMessage.prototype.setKickMember = function (
	value)
	{
	  return googleProtobuf.Message.setOneofWrapperField(
	  this,
	  25,
	  proto.game_protobuf_messages.proto.messages.ResponseMessage.oneofGroups_[0],
	  value);

	};

	/**
	    * Clears the message field making it undefined.
	    * @return {!proto.game_protobuf_messages.proto.messages.ResponseMessage} returns this
	    */
	proto.game_protobuf_messages.proto.messages.ResponseMessage.prototype.clearKickMember = function () {
	  return this.setKickMember(undefined);
	};

	/**
	    * Returns whether this field is set.
	    * @return {boolean}
	    */
	proto.game_protobuf_messages.proto.messages.ResponseMessage.prototype.hasKickMember = function () {
	  return googleProtobuf.Message.getField(this, 25) != null;
	};

	/**
	    * optional AckCommand ack = 26;
	    * @return {?proto.game_protobuf_messages.proto.messages.AckCommand}
	    */
	proto.game_protobuf_messages.proto.messages.ResponseMessage.prototype.getAck = function () {
	  return (/** @type{?proto.game_protobuf_messages.proto.messages.AckCommand} */googleProtobuf.Message.getWrapperField(
	    this,
	    proto.game_protobuf_messages.proto.messages.AckCommand,
	    26));

	};

	/**
	    * @param {?proto.game_protobuf_messages.proto.messages.AckCommand|undefined} value
	    * @return {!proto.game_protobuf_messages.proto.messages.ResponseMessage} returns this
	    */
	proto.game_protobuf_messages.proto.messages.ResponseMessage.prototype.setAck = function (
	value)
	{
	  return googleProtobuf.Message.setOneofWrapperField(
	  this,
	  26,
	  proto.game_protobuf_messages.proto.messages.ResponseMessage.oneofGroups_[0],
	  value);

	};

	/**
	    * Clears the message field making it undefined.
	    * @return {!proto.game_protobuf_messages.proto.messages.ResponseMessage} returns this
	    */
	proto.game_protobuf_messages.proto.messages.ResponseMessage.prototype.clearAck = function () {
	  return this.setAck(undefined);
	};

	/**
	    * Returns whether this field is set.
	    * @return {boolean}
	    */
	proto.game_protobuf_messages.proto.messages.ResponseMessage.prototype.hasAck = function () {
	  return googleProtobuf.Message.getField(this, 26) != null;
	};

	/**
	    * optional InterestGroups interest_groups = 28;
	    * @return {?proto.game_protobuf_messages.proto.messages.InterestGroups}
	    */
	proto.game_protobuf_messages.proto.messages.ResponseMessage.prototype.getInterestGroups = function () {
	  return (/** @type{?proto.game_protobuf_messages.proto.messages.InterestGroups} */googleProtobuf.Message.getWrapperField(
	    this,
	    proto.game_protobuf_messages.proto.messages.InterestGroups,
	    28));

	};

	/**
	    * @param {?proto.game_protobuf_messages.proto.messages.InterestGroups|undefined} value
	    * @return {!proto.game_protobuf_messages.proto.messages.ResponseMessage} returns this
	    */
	proto.game_protobuf_messages.proto.messages.ResponseMessage.prototype.setInterestGroups = function (
	value)
	{
	  return googleProtobuf.Message.setOneofWrapperField(
	  this,
	  28,
	  proto.game_protobuf_messages.proto.messages.ResponseMessage.oneofGroups_[0],
	  value);

	};

	/**
	    * Clears the message field making it undefined.
	    * @return {!proto.game_protobuf_messages.proto.messages.ResponseMessage} returns this
	    */
	proto.game_protobuf_messages.proto.messages.ResponseMessage.prototype.clearInterestGroups = function () {
	  return this.setInterestGroups(undefined);
	};

	/**
	    * Returns whether this field is set.
	    * @return {boolean}
	    */
	proto.game_protobuf_messages.proto.messages.ResponseMessage.prototype.hasInterestGroups = function () {
	  return googleProtobuf.Message.getField(this, 28) != null;
	};

	/**
	    * Oneof group definitions for this message. Each group defines the field
	    * numbers belonging to that group. When of these fields' value is set, all
	    * other fields in the group are cleared. During deserialization, if multiple
	    * fields are encountered for a group, only the last value seen will be kept.
	    * @private {!Array<!Array<number>>}
	    * @const
	    */
	proto.game_protobuf_messages.proto.messages.Body.oneofGroups_ = [
	[1, 2, 3, 4, 5, 50, 51, 127]];


	/**
	                                * @enum {number}
	                                */
	proto.game_protobuf_messages.proto.messages.Body.BodyCase = {
	  BODY_NOT_SET: 0,
	  REQUEST: 1,
	  RESPONSE: 2,
	  DIRECT: 3,
	  ROOM_NOTIFICATION: 4,
	  EVENTS: 5,
	  STATISTIC: 50,
	  ROOM_LIST: 51,
	  ERROR: 127 };


	/**
	                 * @return {proto.game_protobuf_messages.proto.messages.Body.BodyCase}
	                 */
	proto.game_protobuf_messages.proto.messages.Body.prototype.getBodyCase = function () {
	  return (/** @type {proto.game_protobuf_messages.proto.messages.Body.BodyCase} */googleProtobuf.Message.computeOneofCase(
	    this,
	    proto.game_protobuf_messages.proto.messages.Body.oneofGroups_[0]));

	};

	if (googleProtobuf.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.game_protobuf_messages.proto.messages.Body.prototype.toObject = function (
	  opt_includeInstance)
	  {
	    return proto.game_protobuf_messages.proto.messages.Body.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.game_protobuf_messages.proto.messages.Body} msg The msg instance to transform.
	      * @return {!Object}
	      * @suppress {unusedLocalVariables} f is only used for nested messages
	      */
	  proto.game_protobuf_messages.proto.messages.Body.toObject = function (
	  includeInstance,
	  msg)
	  {
	    var f,
	    obj = {
	      request:
	      (f = msg.getRequest()) &&
	      proto.game_protobuf_messages.proto.messages.RequestMessage.toObject(
	      includeInstance,
	      f),

	      response:
	      (f = msg.getResponse()) &&
	      proto.game_protobuf_messages.proto.messages.ResponseMessage.toObject(
	      includeInstance,
	      f),

	      direct:
	      (f = msg.getDirect()) &&
	      proto.game_protobuf_messages.proto.messages.DirectCommand.toObject(
	      includeInstance,
	      f),

	      roomNotification:
	      (f = msg.getRoomNotification()) &&
	      proto.game_protobuf_messages.proto.messages.RoomNotification.toObject(
	      includeInstance,
	      f),

	      events:
	      (f = msg.getEvents()) &&
	      proto.game_protobuf_messages.proto.messages.EventsCommand.toObject(
	      includeInstance,
	      f),

	      statistic:
	      (f = msg.getStatistic()) &&
	      proto.game_protobuf_messages.proto.messages.StatisticCommand.toObject(
	      includeInstance,
	      f),

	      roomList:
	      (f = msg.getRoomList()) &&
	      proto.game_protobuf_messages.proto.messages.RoomListCommand.toObject(
	      includeInstance,
	      f),

	      error:
	      (f = msg.getError()) &&
	      proto.game_protobuf_messages.proto.messages.ErrorCommand.toObject(
	      includeInstance,
	      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.game_protobuf_messages.proto.messages.Body}
	   */
	proto.game_protobuf_messages.proto.messages.Body.deserializeBinary = function (
	bytes)
	{
	  var reader = new googleProtobuf.BinaryReader(bytes);
	  var msg = new proto.game_protobuf_messages.proto.messages.Body();
	  return proto.game_protobuf_messages.proto.messages.Body.deserializeBinaryFromReader(
	  msg,
	  reader);

	};

	/**
	    * Deserializes binary data (in protobuf wire format) from the
	    * given reader into the given message object.
	    * @param {!proto.game_protobuf_messages.proto.messages.Body} msg The message object to deserialize into.
	    * @param {!jspb.BinaryReader} reader The BinaryReader to use.
	    * @return {!proto.game_protobuf_messages.proto.messages.Body}
	    */
	proto.game_protobuf_messages.proto.messages.Body.deserializeBinaryFromReader = function (
	msg,
	reader)
	{
	  while (reader.nextField()) {
	    if (reader.isEndGroup()) {
	      break;
	    }
	    var field = reader.getFieldNumber();
	    switch (field) {
	      case 1:
	        var value = new proto.game_protobuf_messages.proto.messages.RequestMessage();
	        reader.readMessage(
	        value,
	        proto.game_protobuf_messages.proto.messages.RequestMessage.
	        deserializeBinaryFromReader);

	        msg.setRequest(value);
	        break;
	      case 2:
	        var value = new proto.game_protobuf_messages.proto.messages.ResponseMessage();
	        reader.readMessage(
	        value,
	        proto.game_protobuf_messages.proto.messages.ResponseMessage.
	        deserializeBinaryFromReader);

	        msg.setResponse(value);
	        break;
	      case 3:
	        var value = new proto.game_protobuf_messages.proto.messages.DirectCommand();
	        reader.readMessage(
	        value,
	        proto.game_protobuf_messages.proto.messages.DirectCommand.
	        deserializeBinaryFromReader);

	        msg.setDirect(value);
	        break;
	      case 4:
	        var value = new proto.game_protobuf_messages.proto.messages.RoomNotification();
	        reader.readMessage(
	        value,
	        proto.game_protobuf_messages.proto.messages.RoomNotification.
	        deserializeBinaryFromReader);

	        msg.setRoomNotification(value);
	        break;
	      case 5:
	        var value = new proto.game_protobuf_messages.proto.messages.EventsCommand();
	        reader.readMessage(
	        value,
	        proto.game_protobuf_messages.proto.messages.EventsCommand.
	        deserializeBinaryFromReader);

	        msg.setEvents(value);
	        break;
	      case 50:
	        var value = new proto.game_protobuf_messages.proto.messages.StatisticCommand();
	        reader.readMessage(
	        value,
	        proto.game_protobuf_messages.proto.messages.StatisticCommand.
	        deserializeBinaryFromReader);

	        msg.setStatistic(value);
	        break;
	      case 51:
	        var value = new proto.game_protobuf_messages.proto.messages.RoomListCommand();
	        reader.readMessage(
	        value,
	        proto.game_protobuf_messages.proto.messages.RoomListCommand.
	        deserializeBinaryFromReader);

	        msg.setRoomList(value);
	        break;
	      case 127:
	        var value = new proto.game_protobuf_messages.proto.messages.ErrorCommand();
	        reader.readMessage(
	        value,
	        proto.game_protobuf_messages.proto.messages.ErrorCommand.
	        deserializeBinaryFromReader);

	        msg.setError(value);
	        break;
	      default:
	        reader.skipField();
	        break;}

	  }
	  return msg;
	};

	/**
	    * Serializes the message to binary data (in protobuf wire format).
	    * @return {!Uint8Array}
	    */
	proto.game_protobuf_messages.proto.messages.Body.prototype.serializeBinary = function () {
	  var writer = new googleProtobuf.BinaryWriter();
	  proto.game_protobuf_messages.proto.messages.Body.serializeBinaryToWriter(
	  this,
	  writer);

	  return writer.getResultBuffer();
	};

	/**
	    * Serializes the given message to binary data (in protobuf wire
	    * format), writing to the given BinaryWriter.
	    * @param {!proto.game_protobuf_messages.proto.messages.Body} message
	    * @param {!jspb.BinaryWriter} writer
	    * @suppress {unusedLocalVariables} f is only used for nested messages
	    */
	proto.game_protobuf_messages.proto.messages.Body.serializeBinaryToWriter = function (
	message,
	writer)
	{
	  var f = undefined;
	  f = message.getRequest();
	  if (f != null) {
	    writer.writeMessage(
	    1,
	    f,
	    proto.game_protobuf_messages.proto.messages.RequestMessage.
	    serializeBinaryToWriter);

	  }
	  f = message.getResponse();
	  if (f != null) {
	    writer.writeMessage(
	    2,
	    f,
	    proto.game_protobuf_messages.proto.messages.ResponseMessage.
	    serializeBinaryToWriter);

	  }
	  f = message.getDirect();
	  if (f != null) {
	    writer.writeMessage(
	    3,
	    f,
	    proto.game_protobuf_messages.proto.messages.DirectCommand.
	    serializeBinaryToWriter);

	  }
	  f = message.getRoomNotification();
	  if (f != null) {
	    writer.writeMessage(
	    4,
	    f,
	    proto.game_protobuf_messages.proto.messages.RoomNotification.
	    serializeBinaryToWriter);

	  }
	  f = message.getEvents();
	  if (f != null) {
	    writer.writeMessage(
	    5,
	    f,
	    proto.game_protobuf_messages.proto.messages.EventsCommand.
	    serializeBinaryToWriter);

	  }
	  f = message.getStatistic();
	  if (f != null) {
	    writer.writeMessage(
	    50,
	    f,
	    proto.game_protobuf_messages.proto.messages.StatisticCommand.
	    serializeBinaryToWriter);

	  }
	  f = message.getRoomList();
	  if (f != null) {
	    writer.writeMessage(
	    51,
	    f,
	    proto.game_protobuf_messages.proto.messages.RoomListCommand.
	    serializeBinaryToWriter);

	  }
	  f = message.getError();
	  if (f != null) {
	    writer.writeMessage(
	    127,
	    f,
	    proto.game_protobuf_messages.proto.messages.ErrorCommand.
	    serializeBinaryToWriter);

	  }
	};

	/**
	    * optional RequestMessage request = 1;
	    * @return {?proto.game_protobuf_messages.proto.messages.RequestMessage}
	    */
	proto.game_protobuf_messages.proto.messages.Body.prototype.getRequest = function () {
	  return (/** @type{?proto.game_protobuf_messages.proto.messages.RequestMessage} */googleProtobuf.Message.getWrapperField(
	    this,
	    proto.game_protobuf_messages.proto.messages.RequestMessage,
	    1));

	};

	/**
	    * @param {?proto.game_protobuf_messages.proto.messages.RequestMessage|undefined} value
	    * @return {!proto.game_protobuf_messages.proto.messages.Body} returns this
	    */
	proto.game_protobuf_messages.proto.messages.Body.prototype.setRequest = function (
	value)
	{
	  return googleProtobuf.Message.setOneofWrapperField(
	  this,
	  1,
	  proto.game_protobuf_messages.proto.messages.Body.oneofGroups_[0],
	  value);

	};

	/**
	    * Clears the message field making it undefined.
	    * @return {!proto.game_protobuf_messages.proto.messages.Body} returns this
	    */
	proto.game_protobuf_messages.proto.messages.Body.prototype.clearRequest = function () {
	  return this.setRequest(undefined);
	};

	/**
	    * Returns whether this field is set.
	    * @return {boolean}
	    */
	proto.game_protobuf_messages.proto.messages.Body.prototype.hasRequest = function () {
	  return googleProtobuf.Message.getField(this, 1) != null;
	};

	/**
	    * optional ResponseMessage response = 2;
	    * @return {?proto.game_protobuf_messages.proto.messages.ResponseMessage}
	    */
	proto.game_protobuf_messages.proto.messages.Body.prototype.getResponse = function () {
	  return (/** @type{?proto.game_protobuf_messages.proto.messages.ResponseMessage} */googleProtobuf.Message.getWrapperField(
	    this,
	    proto.game_protobuf_messages.proto.messages.ResponseMessage,
	    2));

	};

	/**
	    * @param {?proto.game_protobuf_messages.proto.messages.ResponseMessage|undefined} value
	    * @return {!proto.game_protobuf_messages.proto.messages.Body} returns this
	    */
	proto.game_protobuf_messages.proto.messages.Body.prototype.setResponse = function (
	value)
	{
	  return googleProtobuf.Message.setOneofWrapperField(
	  this,
	  2,
	  proto.game_protobuf_messages.proto.messages.Body.oneofGroups_[0],
	  value);

	};

	/**
	    * Clears the message field making it undefined.
	    * @return {!proto.game_protobuf_messages.proto.messages.Body} returns this
	    */
	proto.game_protobuf_messages.proto.messages.Body.prototype.clearResponse = function () {
	  return this.setResponse(undefined);
	};

	/**
	    * Returns whether this field is set.
	    * @return {boolean}
	    */
	proto.game_protobuf_messages.proto.messages.Body.prototype.hasResponse = function () {
	  return googleProtobuf.Message.getField(this, 2) != null;
	};

	/**
	    * optional DirectCommand direct = 3;
	    * @return {?proto.game_protobuf_messages.proto.messages.DirectCommand}
	    */
	proto.game_protobuf_messages.proto.messages.Body.prototype.getDirect = function () {
	  return (/** @type{?proto.game_protobuf_messages.proto.messages.DirectCommand} */googleProtobuf.Message.getWrapperField(
	    this,
	    proto.game_protobuf_messages.proto.messages.DirectCommand,
	    3));

	};

	/**
	    * @param {?proto.game_protobuf_messages.proto.messages.DirectCommand|undefined} value
	    * @return {!proto.game_protobuf_messages.proto.messages.Body} returns this
	    */
	proto.game_protobuf_messages.proto.messages.Body.prototype.setDirect = function (
	value)
	{
	  return googleProtobuf.Message.setOneofWrapperField(
	  this,
	  3,
	  proto.game_protobuf_messages.proto.messages.Body.oneofGroups_[0],
	  value);

	};

	/**
	    * Clears the message field making it undefined.
	    * @return {!proto.game_protobuf_messages.proto.messages.Body} returns this
	    */
	proto.game_protobuf_messages.proto.messages.Body.prototype.clearDirect = function () {
	  return this.setDirect(undefined);
	};

	/**
	    * Returns whether this field is set.
	    * @return {boolean}
	    */
	proto.game_protobuf_messages.proto.messages.Body.prototype.hasDirect = function () {
	  return googleProtobuf.Message.getField(this, 3) != null;
	};

	/**
	    * optional RoomNotification room_notification = 4;
	    * @return {?proto.game_protobuf_messages.proto.messages.RoomNotification}
	    */
	proto.game_protobuf_messages.proto.messages.Body.prototype.getRoomNotification = function () {
	  return (/** @type{?proto.game_protobuf_messages.proto.messages.RoomNotification} */googleProtobuf.Message.getWrapperField(
	    this,
	    proto.game_protobuf_messages.proto.messages.RoomNotification,
	    4));

	};

	/**
	    * @param {?proto.game_protobuf_messages.proto.messages.RoomNotification|undefined} value
	    * @return {!proto.game_protobuf_messages.proto.messages.Body} returns this
	    */
	proto.game_protobuf_messages.proto.messages.Body.prototype.setRoomNotification = function (
	value)
	{
	  return googleProtobuf.Message.setOneofWrapperField(
	  this,
	  4,
	  proto.game_protobuf_messages.proto.messages.Body.oneofGroups_[0],
	  value);

	};

	/**
	    * Clears the message field making it undefined.
	    * @return {!proto.game_protobuf_messages.proto.messages.Body} returns this
	    */
	proto.game_protobuf_messages.proto.messages.Body.prototype.clearRoomNotification = function () {
	  return this.setRoomNotification(undefined);
	};

	/**
	    * Returns whether this field is set.
	    * @return {boolean}
	    */
	proto.game_protobuf_messages.proto.messages.Body.prototype.hasRoomNotification = function () {
	  return googleProtobuf.Message.getField(this, 4) != null;
	};

	/**
	    * optional EventsCommand events = 5;
	    * @return {?proto.game_protobuf_messages.proto.messages.EventsCommand}
	    */
	proto.game_protobuf_messages.proto.messages.Body.prototype.getEvents = function () {
	  return (/** @type{?proto.game_protobuf_messages.proto.messages.EventsCommand} */googleProtobuf.Message.getWrapperField(
	    this,
	    proto.game_protobuf_messages.proto.messages.EventsCommand,
	    5));

	};

	/**
	    * @param {?proto.game_protobuf_messages.proto.messages.EventsCommand|undefined} value
	    * @return {!proto.game_protobuf_messages.proto.messages.Body} returns this
	    */
	proto.game_protobuf_messages.proto.messages.Body.prototype.setEvents = function (
	value)
	{
	  return googleProtobuf.Message.setOneofWrapperField(
	  this,
	  5,
	  proto.game_protobuf_messages.proto.messages.Body.oneofGroups_[0],
	  value);

	};

	/**
	    * Clears the message field making it undefined.
	    * @return {!proto.game_protobuf_messages.proto.messages.Body} returns this
	    */
	proto.game_protobuf_messages.proto.messages.Body.prototype.clearEvents = function () {
	  return this.setEvents(undefined);
	};

	/**
	    * Returns whether this field is set.
	    * @return {boolean}
	    */
	proto.game_protobuf_messages.proto.messages.Body.prototype.hasEvents = function () {
	  return googleProtobuf.Message.getField(this, 5) != null;
	};

	/**
	    * optional StatisticCommand statistic = 50;
	    * @return {?proto.game_protobuf_messages.proto.messages.StatisticCommand}
	    */
	proto.game_protobuf_messages.proto.messages.Body.prototype.getStatistic = function () {
	  return (/** @type{?proto.game_protobuf_messages.proto.messages.StatisticCommand} */googleProtobuf.Message.getWrapperField(
	    this,
	    proto.game_protobuf_messages.proto.messages.StatisticCommand,
	    50));

	};

	/**
	    * @param {?proto.game_protobuf_messages.proto.messages.StatisticCommand|undefined} value
	    * @return {!proto.game_protobuf_messages.proto.messages.Body} returns this
	    */
	proto.game_protobuf_messages.proto.messages.Body.prototype.setStatistic = function (
	value)
	{
	  return googleProtobuf.Message.setOneofWrapperField(
	  this,
	  50,
	  proto.game_protobuf_messages.proto.messages.Body.oneofGroups_[0],
	  value);

	};

	/**
	    * Clears the message field making it undefined.
	    * @return {!proto.game_protobuf_messages.proto.messages.Body} returns this
	    */
	proto.game_protobuf_messages.proto.messages.Body.prototype.clearStatistic = function () {
	  return this.setStatistic(undefined);
	};

	/**
	    * Returns whether this field is set.
	    * @return {boolean}
	    */
	proto.game_protobuf_messages.proto.messages.Body.prototype.hasStatistic = function () {
	  return googleProtobuf.Message.getField(this, 50) != null;
	};

	/**
	    * optional RoomListCommand room_list = 51;
	    * @return {?proto.game_protobuf_messages.proto.messages.RoomListCommand}
	    */
	proto.game_protobuf_messages.proto.messages.Body.prototype.getRoomList = function () {
	  return (/** @type{?proto.game_protobuf_messages.proto.messages.RoomListCommand} */googleProtobuf.Message.getWrapperField(
	    this,
	    proto.game_protobuf_messages.proto.messages.RoomListCommand,
	    51));

	};

	/**
	    * @param {?proto.game_protobuf_messages.proto.messages.RoomListCommand|undefined} value
	    * @return {!proto.game_protobuf_messages.proto.messages.Body} returns this
	    */
	proto.game_protobuf_messages.proto.messages.Body.prototype.setRoomList = function (
	value)
	{
	  return googleProtobuf.Message.setOneofWrapperField(
	  this,
	  51,
	  proto.game_protobuf_messages.proto.messages.Body.oneofGroups_[0],
	  value);

	};

	/**
	    * Clears the message field making it undefined.
	    * @return {!proto.game_protobuf_messages.proto.messages.Body} returns this
	    */
	proto.game_protobuf_messages.proto.messages.Body.prototype.clearRoomList = function () {
	  return this.setRoomList(undefined);
	};

	/**
	    * Returns whether this field is set.
	    * @return {boolean}
	    */
	proto.game_protobuf_messages.proto.messages.Body.prototype.hasRoomList = function () {
	  return googleProtobuf.Message.getField(this, 51) != null;
	};

	/**
	    * optional ErrorCommand error = 127;
	    * @return {?proto.game_protobuf_messages.proto.messages.ErrorCommand}
	    */
	proto.game_protobuf_messages.proto.messages.Body.prototype.getError = function () {
	  return (/** @type{?proto.game_protobuf_messages.proto.messages.ErrorCommand} */googleProtobuf.Message.getWrapperField(
	    this,
	    proto.game_protobuf_messages.proto.messages.ErrorCommand,
	    127));

	};

	/**
	    * @param {?proto.game_protobuf_messages.proto.messages.ErrorCommand|undefined} value
	    * @return {!proto.game_protobuf_messages.proto.messages.Body} returns this
	    */
	proto.game_protobuf_messages.proto.messages.Body.prototype.setError = function (
	value)
	{
	  return googleProtobuf.Message.setOneofWrapperField(
	  this,
	  127,
	  proto.game_protobuf_messages.proto.messages.Body.oneofGroups_[0],
	  value);

	};

	/**
	    * Clears the message field making it undefined.
	    * @return {!proto.game_protobuf_messages.proto.messages.Body} returns this
	    */
	proto.game_protobuf_messages.proto.messages.Body.prototype.clearError = function () {
	  return this.setError(undefined);
	};

	/**
	    * Returns whether this field is set.
	    * @return {boolean}
	    */
	proto.game_protobuf_messages.proto.messages.Body.prototype.hasError = function () {
	  return googleProtobuf.Message.getField(this, 127) != null;
	};

	if (googleProtobuf.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.game_protobuf_messages.proto.messages.Command.prototype.toObject = function (
	  opt_includeInstance)
	  {
	    return proto.game_protobuf_messages.proto.messages.Command.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.game_protobuf_messages.proto.messages.Command} msg The msg instance to transform.
	      * @return {!Object}
	      * @suppress {unusedLocalVariables} f is only used for nested messages
	      */
	  proto.game_protobuf_messages.proto.messages.Command.toObject = function (
	  includeInstance,
	  msg)
	  {
	    var obj = {
	      cmd: googleProtobuf.Message.getFieldWithDefault(msg, 1, 0),
	      op: googleProtobuf.Message.getFieldWithDefault(msg, 2, 0),
	      body: msg.getBody_asB64() };


	    if (includeInstance) {
	      obj.$jspbMessageInstance = msg;
	    }
	    return obj;
	  };
	}

	/**
	   * Deserializes binary data (in protobuf wire format).
	   * @param {jspb.ByteSource} bytes The bytes to deserialize.
	   * @return {!proto.game_protobuf_messages.proto.messages.Command}
	   */
	proto.game_protobuf_messages.proto.messages.Command.deserializeBinary = function (
	bytes)
	{
	  var reader = new googleProtobuf.BinaryReader(bytes);
	  var msg = new proto.game_protobuf_messages.proto.messages.Command();
	  return proto.game_protobuf_messages.proto.messages.Command.deserializeBinaryFromReader(
	  msg,
	  reader);

	};

	/**
	    * Deserializes binary data (in protobuf wire format) from the
	    * given reader into the given message object.
	    * @param {!proto.game_protobuf_messages.proto.messages.Command} msg The message object to deserialize into.
	    * @param {!jspb.BinaryReader} reader The BinaryReader to use.
	    * @return {!proto.game_protobuf_messages.proto.messages.Command}
	    */
	proto.game_protobuf_messages.proto.messages.Command.deserializeBinaryFromReader = function (
	msg,
	reader)
	{
	  while (reader.nextField()) {
	    if (reader.isEndGroup()) {
	      break;
	    }
	    var field = reader.getFieldNumber();
	    switch (field) {
	      case 1:
	        var value = /** @type {!proto.game_protobuf_messages.proto.messages.CommandType} */reader.readEnum();
	        msg.setCmd(value);
	        break;
	      case 2:
	        var value = /** @type {!proto.game_protobuf_messages.proto.messages.OpType} */reader.readEnum();
	        msg.setOp(value);
	        break;
	      case 3:
	        var value = /** @type {!Uint8Array} */reader.readBytes();
	        msg.setBody(value);
	        break;
	      default:
	        reader.skipField();
	        break;}

	  }
	  return msg;
	};

	/**
	    * Serializes the message to binary data (in protobuf wire format).
	    * @return {!Uint8Array}
	    */
	proto.game_protobuf_messages.proto.messages.Command.prototype.serializeBinary = function () {
	  var writer = new googleProtobuf.BinaryWriter();
	  proto.game_protobuf_messages.proto.messages.Command.serializeBinaryToWriter(
	  this,
	  writer);

	  return writer.getResultBuffer();
	};

	/**
	    * Serializes the given message to binary data (in protobuf wire
	    * format), writing to the given BinaryWriter.
	    * @param {!proto.game_protobuf_messages.proto.messages.Command} message
	    * @param {!jspb.BinaryWriter} writer
	    * @suppress {unusedLocalVariables} f is only used for nested messages
	    */
	proto.game_protobuf_messages.proto.messages.Command.serializeBinaryToWriter = function (
	message,
	writer)
	{
	  var f = undefined;
	  f = message.getCmd();
	  if (f !== 0.0) {
	    writer.writeEnum(1, f);
	  }
	  f = message.getOp();
	  if (f !== 0.0) {
	    writer.writeEnum(2, f);
	  }
	  f = message.getBody_asU8();
	  if (f.length > 0) {
	    writer.writeBytes(3, f);
	  }
	};

	/**
	    * optional CommandType cmd = 1;
	    * @return {!proto.game_protobuf_messages.proto.messages.CommandType}
	    */
	proto.game_protobuf_messages.proto.messages.Command.prototype.getCmd = function () {
	  return (/** @type {!proto.game_protobuf_messages.proto.messages.CommandType} */googleProtobuf.Message.getFieldWithDefault(
	    this,
	    1,
	    0));

	};

	/**
	    * @param {!proto.game_protobuf_messages.proto.messages.CommandType} value
	    * @return {!proto.game_protobuf_messages.proto.messages.Command} returns this
	    */
	proto.game_protobuf_messages.proto.messages.Command.prototype.setCmd = function (
	value)
	{
	  return googleProtobuf.Message.setProto3EnumField(this, 1, value);
	};

	/**
	    * optional OpType op = 2;
	    * @return {!proto.game_protobuf_messages.proto.messages.OpType}
	    */
	proto.game_protobuf_messages.proto.messages.Command.prototype.getOp = function () {
	  return (/** @type {!proto.game_protobuf_messages.proto.messages.OpType} */googleProtobuf.Message.getFieldWithDefault(
	    this,
	    2,
	    0));

	};

	/**
	    * @param {!proto.game_protobuf_messages.proto.messages.OpType} value
	    * @return {!proto.game_protobuf_messages.proto.messages.Command} returns this
	    */
	proto.game_protobuf_messages.proto.messages.Command.prototype.setOp = function (
	value)
	{
	  return googleProtobuf.Message.setProto3EnumField(this, 2, value);
	};

	/**
	    * optional bytes body = 3;
	    * @return {!(string|Uint8Array)}
	    */
	proto.game_protobuf_messages.proto.messages.Command.prototype.getBody = function () {
	  return (/** @type {!(string|Uint8Array)} */googleProtobuf.Message.getFieldWithDefault(
	    this,
	    3,
	    ''));

	};

	/**
	    * optional bytes body = 3;
	    * This is a type-conversion wrapper around `getBody()`
	    * @return {string}
	    */
	proto.game_protobuf_messages.proto.messages.Command.prototype.getBody_asB64 = function () {
	  return (/** @type {string} */googleProtobuf.Message.bytesAsB64(this.getBody()));
	};

	/**
	    * optional bytes body = 3;
	    * Note that Uint8Array is not supported on all browsers.
	    * @see http://caniuse.com/Uint8Array
	    * This is a type-conversion wrapper around `getBody()`
	    * @return {!Uint8Array}
	    */
	proto.game_protobuf_messages.proto.messages.Command.prototype.getBody_asU8 = function () {
	  return (/** @type {!Uint8Array} */googleProtobuf.Message.bytesAsU8(this.getBody()));
	};

	/**
	    * @param {!(string|Uint8Array)} value
	    * @return {!proto.game_protobuf_messages.proto.messages.Command} returns this
	    */
	proto.game_protobuf_messages.proto.messages.Command.prototype.setBody = function (
	value)
	{
	  return googleProtobuf.Message.setProto3BytesField(this, 3, value);
	};

	/**
	    * @enum {number}
	    */
	proto.game_protobuf_messages.proto.messages.CommandType = {
	  UNKNOWN: 0,
	  SESSION: 1,
	  CONV: 2,
	  DIRECT: 3,
	  ERROR: 4,
	  LOBBY: 5,
	  STATISTIC: 6,
	  EVENTS: 7,
	  ACK: 8,
	  ECHO: 9 };


	/**
	              * @enum {number}
	              */
	proto.game_protobuf_messages.proto.messages.OpType = {
	  NONE: 0,
	  OPEN: 1,
	  OPENED: 2,
	  CLOSE: 3,
	  CLOSED: 4,
	  START: 30,
	  STARTED: 31,
	  ADD_RANDOM: 32,
	  RANDOM_ADDED: 33,
	  MATCH_RANDOM: 34,
	  RANDOM_MATCHED: 35,
	  ADD: 36,
	  ADDED: 37,
	  MEMBERS_JOINED: 38,
	  MEMBERS_ONLINE: 39,
	  REMOVE: 40,
	  REMOVED: 41,
	  MEMBERS_LEFT: 42,
	  MEMBERS_OFFLINE: 43,
	  UPDATE_MASTER_CLIENT: 44,
	  MASTER_CLIENT_UPDATED: 45,
	  MASTER_CLIENT_CHANGED: 46,
	  UPDATE: 47,
	  UPDATED: 48,
	  UPDATED_NOTIFY: 49,
	  UPDATE_SYSTEM_PROPERTY: 50,
	  SYSTEM_PROPERTY_UPDATED: 51,
	  SYSTEM_PROPERTY_UPDATED_NOTIFY: 52,
	  OPENED_NOTIFY: 53,
	  VISIBLE: 54,
	  VISIBLE_NOTIFY: 55,
	  UPDATE_PLAYER_PROP: 56,
	  PLAYER_PROP_UPDATED: 57,
	  PLAYER_PROPS: 58,
	  KICK: 59,
	  KICKED: 60,
	  KICKED_NOTICE: 61,
	  UPDATE_INTEREST_GROUPS: 62,
	  INTEREST_GROUPS_UPDATED: 65,
	  ROOM_LIST: 100,
	  FIND_FRIENDS: 101,
	  FOUND_FRIENDS: 102 };


	goog.object.extend(exports, proto);
	});

	var _proto$game_protobuf_$2 =






	messages_pb.game_protobuf_messages.proto.messages,Command = _proto$game_protobuf_$2.Command,Body$1 = _proto$game_protobuf_$2.Body,CommandType$2 = _proto$game_protobuf_$2.CommandType,OpType$2 = _proto$game_protobuf_$2.OpType;

	var CommandTypeSwap = _Object$keys(CommandType$2).reduce(
	function (obj, key) {return _Object$assign({}, obj, _defineProperty({}, CommandType$2[key], key));},
	{});

	var OpTypeSwap = _Object$keys(OpType$2).reduce(
	function (obj, key) {return _Object$assign({}, obj, _defineProperty({}, OpType$2[key], key));},
	{});


	var MAX_NO_PONG_TIMES = 2;

	var ERROR_EVENT = 'ERROR_EVENT';
	var DISCONNECT_EVENT = 'DISCONNECT_EVENT';

	/* eslint class-methods-use-this: ["error", { "exceptMethods": ["_getPingDuration", "_handleNotification", "_handleErrorMsg", "_handleUnknownMsg", "_getFastOpenUrl"] }] */var
	Connection = function (_EventEmitter) {_inherits(Connection, _EventEmitter);
	  function Connection() {_classCallCheck(this, Connection);var _this = _possibleConstructorReturn(this, (Connection.__proto__ || _Object$getPrototypeOf(Connection)).call(this));

	    _this._requests = {};
	    _this._msgId = 0;
	    _this._pingTimer = null;
	    _this._pongTimer = null;
	    // 消息处理及缓存
	    _this._isMessageQueueRunning = false;
	    _this._messageQueue = null;
	    _this._fsm = new StateMachine({
	      init: 'init',
	      final: 'closed',
	      transitions: [
	      { name: 'connect', from: 'init', to: 'connecting' },
	      { name: 'connected', from: 'connecting', to: 'connected' },
	      { name: 'connectFailed', from: 'connecting', to: 'init' },
	      { name: 'disconnect', from: 'connected', to: 'disconnected' },
	      {
	        name: 'close',
	        from: ['init', 'connecting', 'connected', 'disconnected'],
	        to: 'closed' }] });return _this;



	  }_createClass(Connection, [{ key: 'connect', value: function connect(

	    appId, server, gameVersion, userId, sessionToken) {var _this2 = this;
	      this._userId = userId;
	      this._fsm.connect();
	      return new _Promise(function (resolve, reject) {var
	        WebSocket = adapters.WebSocket;
	        var i = _this2._getMsgId();
	        var url = _this2._getFastOpenUrl(
	        server,
	        appId,
	        gameVersion,
	        userId,
	        sessionToken);

	        url = url + '&i=' + i;
	        debug('url: ' + url);
	        _this2._ws = new WebSocket(url, 'protobuf.1');
	        _this2._ws.binaryType = 'arraybuffer';
	        _this2._ws.onopen = function () {
	          debug(_this2._userId + ' : ' + _this2._flag + ' connection open');
	          if (_this2._fsm.is('closed')) {
	            _this2._ws.onopen = null;
	            _this2._ws.onmessage = null;
	            _this2._ws.onclose = null;
	            _this2._ws.onerror = null;
	            _this2._ws.close();
	            return;
	          }
	          _this2._connected();
	          _this2._fsm.connected();
	        };
	        _this2._ws.onclose = function () {
	          _this2._fsm.connectFailed();
	          reject(
	          new PlayError(PlayErrorCode.OPEN_WEBSOCKET_ERROR, 'websocket closed'));

	        };
	        _this2._ws.onerror = function (err) {
	          _this2._fsm.connectFailed();
	          reject(err);
	        };
	        // 标记
	        _this2._requests[i] = {
	          resolve: resolve,
	          reject: reject };

	      });
	    } }, { key: '_connected', value: function _connected()

	    {var _this3 = this;
	      // 每次连接成功后将会得到最新快照，之前的缓存没有意义了
	      this._isMessageQueueRunning = true;
	      this._messageQueue = [];
	      this._ping();
	      this._ws.onmessage = function (message) {
	        _this3._pong();
	        var command = Command.deserializeBinary(message.data);
	        var cmd = command.getCmd();
	        var op = command.getOp();
	        var body = Body$1.deserializeBinary(command.getBody());
	        debug(
	        _this3._userId + ' : ' + _this3._flag + ' <- ' + CommandTypeSwap[cmd] + '/' +
	        OpTypeSwap[op] + ': ' +
	        _JSON$stringify(body.toObject()));

	        if (_this3._isMessageQueueRunning) {
	          _this3._handleCommand(cmd, op, body);
	        } else {
	          debug('[DELAY] ' +
	          _this3._userId + ' : ' + _this3._flag + ' <- ' + CommandTypeSwap[cmd] + '/' +
	          OpTypeSwap[op] + ': ' +
	          _JSON$stringify(body.toObject()));

	          _this3._messageQueue.push({
	            cmd: cmd,
	            op: op,
	            body: body });

	        }
	      };
	      this._ws.onclose = function () {
	        _this3._stopKeppAlive();
	        _this3._fsm.disconnect();
	        _this3.emit(DISCONNECT_EVENT);
	      };
	    } }, { key: '_handleCommand', value: function _handleCommand(

	    cmd, op, body) {
	      if (body.hasResponse()) {
	        // 应答
	        var res = body.getResponse();
	        var i = res.getI();
	        if (this._requests[i]) {var _requests$i =
	          this._requests[i],resolve = _requests$i.resolve,reject = _requests$i.reject;
	          var errorInfo = res.getErrorInfo();
	          if (errorInfo) {
	            var code = errorInfo.getReasonCode();
	            var detail = errorInfo.getDetail();
	            reject(new PlayError(code, detail));
	          } else {
	            resolve({
	              cmd: cmd,
	              op: op,
	              res: res });

	          }
	        } else {
	          // 异常情况
	          error('error response: ' + _JSON$stringify(res.toObject()));
	        }
	      } else {
	        // 通知
	        this._handleNotification(cmd, op, body);
	      }
	    } }, { key: 'sendRequest', value: function sendRequest(

	    cmd, op, req) {var _this4 = this;
	      var msgId = this._getMsgId();
	      req.setI(msgId);
	      var body = new Body$1();
	      body.setRequest(req);
	      this.sendCommand(cmd, op, body);
	      return new _Promise(function (resolve, reject) {
	        _this4._requests[msgId] = {
	          resolve: resolve,
	          reject: reject };

	      });
	    } }, { key: 'sendCommand', value: function sendCommand(

	    cmd, op, body) {
	      var command = new Command();
	      command.setCmd(cmd);
	      command.setOp(op);
	      command.setBody(body.serializeBinary());
	      debug(
	      this._userId + ' : ' + this._flag + ' -> ' + CommandTypeSwap[cmd] + '/' +
	      OpTypeSwap[op] + ': ' +
	      _JSON$stringify(body.toObject()));

	      this._ws.send(command.serializeBinary().buffer);
	    } }, { key: 'close', value: function close()

	    {var _this5 = this;
	      if (this._fsm.cannot('close')) {
	        throw new Error('no close: ' + this._fsm.state);
	      }
	      this._stopKeppAlive();
	      return new _Promise(function (resolve, reject) {
	        if (_this5._ws) {
	          _this5._ws.onopen = null;
	          _this5._ws.onmessage = null;
	          debug(_this5._userId + ' : ' + _this5._flag + ' close');
	          _this5._ws.onclose = function () {
	            debug(_this5._userId + ' : ' + _this5._flag + ' closed');
	            resolve();
	          };
	          _this5._ws.onerror = function (err) {
	            reject(err);
	          };
	          _this5._ws.close();
	        } else {
	          resolve();
	        }
	      });
	    } }, { key: '_getFastOpenUrl', value: function _getFastOpenUrl(

	    server, appId, gameVersion, userId, sessionToken) {
	      throw new Error('must implement the method');
	    } }, { key: '_simulateDisconnection', value: function _simulateDisconnection()

	    {
	      this.close();
	      this.emit(DISCONNECT_EVENT);
	      return _Promise.resolve();
	    } }, { key: '_getMsgId', value: function _getMsgId()

	    {
	      this._msgId += 1;
	      return this._msgId;
	    } }, { key: '_ping', value: function _ping()

	    {var _this6 = this;
	      if (this._pingTimer) {
	        clearTimeout(this._pingTimer);
	        this._pingTimer = null;
	      }
	      this._pingTimer = setInterval(function () {
	        debug('ping');
	        _this6.sendCommand(CommandType$2.ECHO, OpType$2.NONE, new Body$1());
	      }, this._getPingDuration());
	    } }, { key: '_pong', value: function _pong()

	    {var _this7 = this;
	      if (this._pongTimer) {
	        clearTimeout(this._pongTimer);
	        this._pongTimer = null;
	      }
	      this._pongTimer = setTimeout(function () {
	        debug('pong timeout');
	        _this7._ws.close();
	      }, this._getPingDuration() * MAX_NO_PONG_TIMES);
	    } }, { key: '_stopKeppAlive', value: function _stopKeppAlive()

	    {
	      if (this._pingTimer) {
	        clearTimeout(this._pingTimer);
	        this._pingTimer = null;
	      }
	      if (this._pongTimer) {
	        clearTimeout(this._pongTimer);
	        this._pongTimer = null;
	      }
	    } }, { key: '_getPingDuration', value: function _getPingDuration()

	    {
	      throw new Error('must implement the method');
	    }

	    /* eslint no-unused-vars: ["error", { "args": "none" }] */ }, { key: '_handleNotification', value: function _handleNotification(
	    cmd, op, body) {
	      throw new Error('must implement the method');
	    } }, { key: '_handleErrorNotify', value: function _handleErrorNotify(

	    err) {
	      var errorInfo = err.getErrorInfo();
	      var code = errorInfo.getReasonCode();
	      var detail = errorInfo.getDetail();
	      this.emit(ERROR_EVENT, { code: code, detail: detail });
	    } }, { key: '_handleUnknownMsg', value: function _handleUnknownMsg(

	    cmd, op, body) {
	      error('[UNKNOWN COMMAND] ' +
	      this._userId + ' : ' +
	      this._flag + ' -> ' +
	      cmd + '/' + op + ': ' + _JSON$stringify(body.toObject()));

	    } }, { key: '_pauseMessageQueue', value: function _pauseMessageQueue()

	    {
	      this._isMessageQueueRunning = false;
	    } }, { key: '_resumeMessageQueue', value: function _resumeMessageQueue()

	    {
	      this._isMessageQueueRunning = true;
	      while (this._messageQueue.length > 0) {
	        var msg = this._messageQueue.shift();var
	        cmd = msg.cmd,op = msg.op,body = msg.body;
	        debug('[DELAY HANDLE] ' +
	        this._userId + ' : ' +
	        this._flag + ' <- ' +
	        cmd + '/' + op + ': ' + _JSON$stringify(body.toObject()));

	        this._handleCommand(cmd, op, body);
	      }
	    } }]);return Connection;}(eventemitter3);

	// 19.1.2.6 Object.getOwnPropertyDescriptor(O, P)

	var $getOwnPropertyDescriptor = _objectGopd.f;

	_objectSap('getOwnPropertyDescriptor', function () {
	  return function getOwnPropertyDescriptor(it, key) {
	    return $getOwnPropertyDescriptor(_toIobject(it), key);
	  };
	});

	var $Object = _core.Object;
	var getOwnPropertyDescriptor$1 = function getOwnPropertyDescriptor(it, key) {
	  return $Object.getOwnPropertyDescriptor(it, key);
	};

	var getOwnPropertyDescriptor = createCommonjsModule(function (module) {
	module.exports = { "default": getOwnPropertyDescriptor$1, __esModule: true };
	});

	unwrapExports(getOwnPropertyDescriptor);

	var get = createCommonjsModule(function (module, exports) {

	exports.__esModule = true;



	var _getPrototypeOf2 = _interopRequireDefault(getPrototypeOf);



	var _getOwnPropertyDescriptor2 = _interopRequireDefault(getOwnPropertyDescriptor);

	function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

	exports.default = function get(object, property, receiver) {
	  if (object === null) object = Function.prototype;
	  var desc = (0, _getOwnPropertyDescriptor2.default)(object, property);

	  if (desc === undefined) {
	    var parent = (0, _getPrototypeOf2.default)(object);

	    if (parent === null) {
	      return undefined;
	    } else {
	      return get(parent, property, receiver);
	    }
	  } else if ("value" in desc) {
	    return desc.value;
	  } else {
	    var getter = desc.get;

	    if (getter === undefined) {
	      return undefined;
	    }

	    return getter.call(receiver);
	  }
	};
	});

	var _get = unwrapExports(get);

	var strictUriEncode = str => encodeURIComponent(str).replace(/[!'()*]/g, x => `%${x.charCodeAt(0).toString(16).toUpperCase()}`);

	var token = '%[a-f0-9]{2}';
	var singleMatcher = new RegExp(token, 'gi');
	var multiMatcher = new RegExp('(' + token + ')+', 'gi');

	function decodeComponents(components, split) {
		try {
			// Try to decode the entire string first
			return decodeURIComponent(components.join(''));
		} catch (err) {
			// Do nothing
		}

		if (components.length === 1) {
			return components;
		}

		split = split || 1;

		// Split the array in 2 parts
		var left = components.slice(0, split);
		var right = components.slice(split);

		return Array.prototype.concat.call([], decodeComponents(left), decodeComponents(right));
	}

	function decode(input) {
		try {
			return decodeURIComponent(input);
		} catch (err) {
			var tokens = input.match(singleMatcher);

			for (var i = 1; i < tokens.length; i++) {
				input = decodeComponents(tokens, i).join('');

				tokens = input.match(singleMatcher);
			}

			return input;
		}
	}

	function customDecodeURIComponent(input) {
		// Keep track of all the replacements and prefill the map with the `BOM`
		var replaceMap = {
			'%FE%FF': '\uFFFD\uFFFD',
			'%FF%FE': '\uFFFD\uFFFD'
		};

		var match = multiMatcher.exec(input);
		while (match) {
			try {
				// Decode as big chunks as possible
				replaceMap[match[0]] = decodeURIComponent(match[0]);
			} catch (err) {
				var result = decode(match[0]);

				if (result !== match[0]) {
					replaceMap[match[0]] = result;
				}
			}

			match = multiMatcher.exec(input);
		}

		// Add `%C2` at the end of the map to make sure it does not replace the combinator before everything else
		replaceMap['%C2'] = '\uFFFD';

		var entries = Object.keys(replaceMap);

		for (var i = 0; i < entries.length; i++) {
			// Replace all decoded components
			var key = entries[i];
			input = input.replace(new RegExp(key, 'g'), replaceMap[key]);
		}

		return input;
	}

	var decodeUriComponent = function (encodedURI) {
		if (typeof encodedURI !== 'string') {
			throw new TypeError('Expected `encodedURI` to be of type `string`, got `' + typeof encodedURI + '`');
		}

		try {
			encodedURI = encodedURI.replace(/\+/g, ' ');

			// Try the built in decoder first
			return decodeURIComponent(encodedURI);
		} catch (err) {
			// Fallback to a more advanced decoder
			return customDecodeURIComponent(encodedURI);
		}
	};

	var splitOnFirst = (string, separator) => {
		if (!(typeof string === 'string' && typeof separator === 'string')) {
			throw new TypeError('Expected the arguments to be of type `string`');
		}

		if (separator === '') {
			return [string];
		}

		const separatorIndex = string.indexOf(separator);

		if (separatorIndex === -1) {
			return [string];
		}

		return [
			string.slice(0, separatorIndex),
			string.slice(separatorIndex + separator.length)
		];
	};

	var filterObj = function (obj, predicate) {
		var ret = {};
		var keys = Object.keys(obj);
		var isArr = Array.isArray(predicate);

		for (var i = 0; i < keys.length; i++) {
			var key = keys[i];
			var val = obj[key];

			if (isArr ? predicate.indexOf(key) !== -1 : predicate(key, val, obj)) {
				ret[key] = val;
			}
		}

		return ret;
	};

	var queryString = createCommonjsModule(function (module, exports) {





	const isNullOrUndefined = value => value === null || value === undefined;

	function encoderForArrayFormat(options) {
		switch (options.arrayFormat) {
			case 'index':
				return key => (result, value) => {
					const index = result.length;

					if (
						value === undefined ||
						(options.skipNull && value === null) ||
						(options.skipEmptyString && value === '')
					) {
						return result;
					}

					if (value === null) {
						return [...result, [encode(key, options), '[', index, ']'].join('')];
					}

					return [
						...result,
						[encode(key, options), '[', encode(index, options), ']=', encode(value, options)].join('')
					];
				};

			case 'bracket':
				return key => (result, value) => {
					if (
						value === undefined ||
						(options.skipNull && value === null) ||
						(options.skipEmptyString && value === '')
					) {
						return result;
					}

					if (value === null) {
						return [...result, [encode(key, options), '[]'].join('')];
					}

					return [...result, [encode(key, options), '[]=', encode(value, options)].join('')];
				};

			case 'comma':
			case 'separator':
				return key => (result, value) => {
					if (value === null || value === undefined || value.length === 0) {
						return result;
					}

					if (result.length === 0) {
						return [[encode(key, options), '=', encode(value, options)].join('')];
					}

					return [[result, encode(value, options)].join(options.arrayFormatSeparator)];
				};

			default:
				return key => (result, value) => {
					if (
						value === undefined ||
						(options.skipNull && value === null) ||
						(options.skipEmptyString && value === '')
					) {
						return result;
					}

					if (value === null) {
						return [...result, encode(key, options)];
					}

					return [...result, [encode(key, options), '=', encode(value, options)].join('')];
				};
		}
	}

	function parserForArrayFormat(options) {
		let result;

		switch (options.arrayFormat) {
			case 'index':
				return (key, value, accumulator) => {
					result = /\[(\d*)\]$/.exec(key);

					key = key.replace(/\[\d*\]$/, '');

					if (!result) {
						accumulator[key] = value;
						return;
					}

					if (accumulator[key] === undefined) {
						accumulator[key] = {};
					}

					accumulator[key][result[1]] = value;
				};

			case 'bracket':
				return (key, value, accumulator) => {
					result = /(\[\])$/.exec(key);
					key = key.replace(/\[\]$/, '');

					if (!result) {
						accumulator[key] = value;
						return;
					}

					if (accumulator[key] === undefined) {
						accumulator[key] = [value];
						return;
					}

					accumulator[key] = [].concat(accumulator[key], value);
				};

			case 'comma':
			case 'separator':
				return (key, value, accumulator) => {
					const isArray = typeof value === 'string' && value.includes(options.arrayFormatSeparator);
					const isEncodedArray = (typeof value === 'string' && !isArray && decode(value, options).includes(options.arrayFormatSeparator));
					value = isEncodedArray ? decode(value, options) : value;
					const newValue = isArray || isEncodedArray ? value.split(options.arrayFormatSeparator).map(item => decode(item, options)) : value === null ? value : decode(value, options);
					accumulator[key] = newValue;
				};

			default:
				return (key, value, accumulator) => {
					if (accumulator[key] === undefined) {
						accumulator[key] = value;
						return;
					}

					accumulator[key] = [].concat(accumulator[key], value);
				};
		}
	}

	function validateArrayFormatSeparator(value) {
		if (typeof value !== 'string' || value.length !== 1) {
			throw new TypeError('arrayFormatSeparator must be single character string');
		}
	}

	function encode(value, options) {
		if (options.encode) {
			return options.strict ? strictUriEncode(value) : encodeURIComponent(value);
		}

		return value;
	}

	function decode(value, options) {
		if (options.decode) {
			return decodeUriComponent(value);
		}

		return value;
	}

	function keysSorter(input) {
		if (Array.isArray(input)) {
			return input.sort();
		}

		if (typeof input === 'object') {
			return keysSorter(Object.keys(input))
				.sort((a, b) => Number(a) - Number(b))
				.map(key => input[key]);
		}

		return input;
	}

	function removeHash(input) {
		const hashStart = input.indexOf('#');
		if (hashStart !== -1) {
			input = input.slice(0, hashStart);
		}

		return input;
	}

	function getHash(url) {
		let hash = '';
		const hashStart = url.indexOf('#');
		if (hashStart !== -1) {
			hash = url.slice(hashStart);
		}

		return hash;
	}

	function extract(input) {
		input = removeHash(input);
		const queryStart = input.indexOf('?');
		if (queryStart === -1) {
			return '';
		}

		return input.slice(queryStart + 1);
	}

	function parseValue(value, options) {
		if (options.parseNumbers && !Number.isNaN(Number(value)) && (typeof value === 'string' && value.trim() !== '')) {
			value = Number(value);
		} else if (options.parseBooleans && value !== null && (value.toLowerCase() === 'true' || value.toLowerCase() === 'false')) {
			value = value.toLowerCase() === 'true';
		}

		return value;
	}

	function parse(query, options) {
		options = Object.assign({
			decode: true,
			sort: true,
			arrayFormat: 'none',
			arrayFormatSeparator: ',',
			parseNumbers: false,
			parseBooleans: false
		}, options);

		validateArrayFormatSeparator(options.arrayFormatSeparator);

		const formatter = parserForArrayFormat(options);

		// Create an object with no prototype
		const ret = Object.create(null);

		if (typeof query !== 'string') {
			return ret;
		}

		query = query.trim().replace(/^[?#&]/, '');

		if (!query) {
			return ret;
		}

		for (const param of query.split('&')) {
			if (param === '') {
				continue;
			}

			let [key, value] = splitOnFirst(options.decode ? param.replace(/\+/g, ' ') : param, '=');

			// Missing `=` should be `null`:
			// http://w3.org/TR/2012/WD-url-20120524/#collect-url-parameters
			value = value === undefined ? null : ['comma', 'separator'].includes(options.arrayFormat) ? value : decode(value, options);
			formatter(decode(key, options), value, ret);
		}

		for (const key of Object.keys(ret)) {
			const value = ret[key];
			if (typeof value === 'object' && value !== null) {
				for (const k of Object.keys(value)) {
					value[k] = parseValue(value[k], options);
				}
			} else {
				ret[key] = parseValue(value, options);
			}
		}

		if (options.sort === false) {
			return ret;
		}

		return (options.sort === true ? Object.keys(ret).sort() : Object.keys(ret).sort(options.sort)).reduce((result, key) => {
			const value = ret[key];
			if (Boolean(value) && typeof value === 'object' && !Array.isArray(value)) {
				// Sort object keys, not values
				result[key] = keysSorter(value);
			} else {
				result[key] = value;
			}

			return result;
		}, Object.create(null));
	}

	exports.extract = extract;
	exports.parse = parse;

	exports.stringify = (object, options) => {
		if (!object) {
			return '';
		}

		options = Object.assign({
			encode: true,
			strict: true,
			arrayFormat: 'none',
			arrayFormatSeparator: ','
		}, options);

		validateArrayFormatSeparator(options.arrayFormatSeparator);

		const shouldFilter = key => (
			(options.skipNull && isNullOrUndefined(object[key])) ||
			(options.skipEmptyString && object[key] === '')
		);

		const formatter = encoderForArrayFormat(options);

		const objectCopy = {};

		for (const key of Object.keys(object)) {
			if (!shouldFilter(key)) {
				objectCopy[key] = object[key];
			}
		}

		const keys = Object.keys(objectCopy);

		if (options.sort !== false) {
			keys.sort(options.sort);
		}

		return keys.map(key => {
			const value = object[key];

			if (value === undefined) {
				return '';
			}

			if (value === null) {
				return encode(key, options);
			}

			if (Array.isArray(value)) {
				return value
					.reduce(formatter(key), [])
					.join('&');
			}

			return encode(key, options) + '=' + encode(value, options);
		}).filter(x => x.length > 0).join('&');
	};

	exports.parseUrl = (url, options) => {
		options = Object.assign({
			decode: true
		}, options);

		const [url_, hash] = splitOnFirst(url, '#');

		return Object.assign(
			{
				url: url_.split('?')[0] || '',
				query: parse(extract(url), options)
			},
			options && options.parseFragmentIdentifier && hash ? {fragmentIdentifier: decode(hash, options)} : {}
		);
	};

	exports.stringifyUrl = (object, options) => {
		options = Object.assign({
			encode: true,
			strict: true
		}, options);

		const url = removeHash(object.url).split('?')[0] || '';
		const queryFromUrl = exports.extract(object.url);
		const parsedQueryFromUrl = exports.parse(queryFromUrl, {sort: false});

		const query = Object.assign(parsedQueryFromUrl, object.query);
		let queryString = exports.stringify(query, options);
		if (queryString) {
			queryString = `?${queryString}`;
		}

		let hash = getHash(object.url);
		if (object.fragmentIdentifier) {
			hash = `#${encode(object.fragmentIdentifier, options)}`;
		}

		return `${url}${queryString}${hash}`;
	};

	exports.pick = (input, filter, options) => {
		options = Object.assign({
			parseFragmentIdentifier: true
		}, options);

		const {url, query, fragmentIdentifier} = exports.parseUrl(input, options);
		return exports.stringifyUrl({
			url,
			query: filterObj(query, filter),
			fragmentIdentifier
		}, options);
	};

	exports.exclude = (input, filter, options) => {
		const exclusionFilter = Array.isArray(filter) ? key => !filter.includes(key) : (key, value) => !filter(key, value);

		return exports.pick(input, exclusionFilter, options);
	};
	});
	queryString.extract;
	queryString.parse;
	queryString.stringify;
	queryString.parseUrl;
	queryString.stringifyUrl;
	queryString.pick;
	queryString.exclude;

	var urlJoin = createCommonjsModule(function (module) {
	(function (name, context, definition) {
	  if (module.exports) module.exports = definition();
	  else context[name] = definition();
	})('urljoin', commonjsGlobal, function () {

	  function normalize (strArray) {
	    var resultArray = [];
	    if (strArray.length === 0) { return ''; }

	    if (typeof strArray[0] !== 'string') {
	      throw new TypeError('Url must be a string. Received ' + strArray[0]);
	    }

	    // If the first part is a plain protocol, we combine it with the next part.
	    if (strArray[0].match(/^[^/:]+:\/*$/) && strArray.length > 1) {
	      var first = strArray.shift();
	      strArray[0] = first + strArray[0];
	    }

	    // There must be two or three slashes in the file protocol, two slashes in anything else.
	    if (strArray[0].match(/^file:\/\/\//)) {
	      strArray[0] = strArray[0].replace(/^([^/:]+):\/*/, '$1:///');
	    } else {
	      strArray[0] = strArray[0].replace(/^([^/:]+):\/*/, '$1://');
	    }

	    for (var i = 0; i < strArray.length; i++) {
	      var component = strArray[i];

	      if (typeof component !== 'string') {
	        throw new TypeError('Url must be a string. Received ' + component);
	      }

	      if (component === '') { continue; }

	      if (i > 0) {
	        // Removing the starting slashes for each component but the first.
	        component = component.replace(/^[\/]+/, '');
	      }
	      if (i < strArray.length - 1) {
	        // Removing the ending slashes for each component but the last.
	        component = component.replace(/[\/]+$/, '');
	      } else {
	        // For the last component we will combine multiple slashes to a single one.
	        component = component.replace(/[\/]+$/, '/');
	      }

	      resultArray.push(component);

	    }

	    var str = resultArray.join('/');
	    // Each input component is now separated by a single slash except the possible first plain protocol part.

	    // remove trailing slash before parameters or hash
	    str = str.replace(/\/(\?|&|#[^!])/g, '$1');

	    // replace ? in parameters with &
	    var parts = str.split('?');
	    str = parts.shift() + (parts.length > 0 ? '?': '') + parts.join('&');

	    return str;
	  }

	  return function () {
	    var input;

	    if (typeof arguments[0] === 'object') {
	      input = arguments[0];
	    } else {
	      input = [].slice.call(arguments);
	    }

	    return normalize(input);
	  };

	});
	});

	var

	BoolValue = messages_pb.BoolValue;var _proto$game_protobuf_$1 =















	messages_pb.game_protobuf_messages.proto.messages,CommandType$1 = _proto$game_protobuf_$1.CommandType,OpType$1 = _proto$game_protobuf_$1.OpType,RequestMessage$1 = _proto$game_protobuf_$1.RequestMessage,CreateRoomRequest = _proto$game_protobuf_$1.CreateRoomRequest,JoinRoomRequest = _proto$game_protobuf_$1.JoinRoomRequest,RoomOptions = _proto$game_protobuf_$1.RoomOptions,UpdateSysPropertyRequest = _proto$game_protobuf_$1.UpdateSysPropertyRequest,RoomSystemProperty = _proto$game_protobuf_$1.RoomSystemProperty,UpdateMasterClientRequest = _proto$game_protobuf_$1.UpdateMasterClientRequest,KickMemberRequest = _proto$game_protobuf_$1.KickMemberRequest,AppInfo = _proto$game_protobuf_$1.AppInfo,DirectCommand = _proto$game_protobuf_$1.DirectCommand,Body = _proto$game_protobuf_$1.Body,UpdatePropertyRequest = _proto$game_protobuf_$1.UpdatePropertyRequest;

	var GAME_KEEPALIVE_DURATION = 7000;

	// 游戏连接抛出的事件
	var PLAYER_JOINED_EVENT = 'PLAYER_JOINED_EVENT';
	var PLAYER_LEFT_EVENT = 'PLAYER_LEFT_EVENT';
	var MASTER_CHANGED_EVENT = 'MASTER_CHANGED_EVENT';
	var ROOM_OPEN_CHANGED_EVENT = 'ROOM_OPEN_CHANGED_EVENT';
	var ROOM_VISIBLE_CHANGED_EVENT = 'ROOM_VISIBLE_CHANGED_EVENT';
	var ROOM_PROPERTIES_CHANGED_EVENT = 'ROOM_PROPERTIES_CHANGED_EVENT';
	var ROOM_SYSTEM_PROPERTIES_CHANGED_EVENT =
	'ROOM_SYSTEM_PROPERTIES_CHANGED_EVENT';
	var PLAYER_PROPERTIES_CHANGED_EVENT =
	'PLAYER_PROPERTIES_CHANGED_EVENT';
	var PLAYER_OFFLINE_EVENT = 'PLAYER_OFFLINE_EVENT';
	var PLAYER_ONLINE_EVENT = 'PLAYER_ONLINE_EVENT';
	var SEND_CUSTOM_EVENT = 'SEND_CUSTOM_EVENT';
	var ROOM_KICKED_EVENT = 'ROOM_KICKED_EVENT';

	var MAX_PLAYER_COUNT = 10;

	function convertToRoomOptions(roomName, options, expectedUserIds) {
	  var roomOptions = new RoomOptions();
	  if (roomName) {
	    roomOptions.setCid(roomName);
	  }
	  if (options) {var

	    open =








	    options.open,visible = options.visible,emptyRoomTtl = options.emptyRoomTtl,playerTtl = options.playerTtl,maxPlayerCount = options.maxPlayerCount,customRoomProperties = options.customRoomProperties,customRoomPropertyKeysForLobby = options.customRoomPropertyKeysForLobby,flag = options.flag,pluginName = options.pluginName;
	    if (open !== undefined) {
	      var o = new BoolValue();
	      o.setValue(open);
	      roomOptions.setOpen(o);
	    }
	    if (visible !== undefined) {
	      var v = new BoolValue();
	      v.setValue(visible);
	      roomOptions.setVisible(v);
	    }
	    if (emptyRoomTtl > 0) {
	      roomOptions.setEmptyRoomTtl(emptyRoomTtl);
	    }
	    if (playerTtl > 0) {
	      roomOptions.setPlayerTtl(playerTtl);
	    }
	    if (maxPlayerCount > 0 && maxPlayerCount < MAX_PLAYER_COUNT) {
	      roomOptions.setMaxMembers(maxPlayerCount);
	    }
	    if (customRoomProperties) {
	      roomOptions.setAttr(serializeObject(customRoomProperties));
	    }
	    if (customRoomPropertyKeysForLobby) {
	      roomOptions.setLobbyAttrKeysList(customRoomPropertyKeysForLobby);
	    }
	    if (flag !== undefined) {
	      roomOptions.setFlag(flag);
	    }
	    if (pluginName) {
	      roomOptions.setPluginName(pluginName);
	    }
	  }
	  if (expectedUserIds) {
	    roomOptions.setExpectMembersList(expectedUserIds);
	  }
	  return roomOptions;
	}

	/* eslint class-methods-use-this: ["error", { "exceptMethods": ["_getPingDuration", "_getFastOpenUrl"] }] */var
	GameConnection = function (_Connection) {_inherits(GameConnection, _Connection);
	  function GameConnection() {_classCallCheck(this, GameConnection);var _this = _possibleConstructorReturn(this, (GameConnection.__proto__ || _Object$getPrototypeOf(GameConnection)).call(this));

	    _this._flag = 'game';return _this;
	  }_createClass(GameConnection, [{ key: 'createRoom', value: function () {var _ref = _asyncToGenerator( /*#__PURE__*/regenerator.mark(function _callee(

	      roomId, roomOptions, expectedUserIds) {var req, roomOpts, createRoomReq, _ref2, res;return regenerator.wrap(function _callee$(_context) {while (1) {switch (_context.prev = _context.next) {case 0:
	                req = new RequestMessage$1();
	                roomOpts = convertToRoomOptions(roomId, roomOptions, expectedUserIds);
	                createRoomReq = new CreateRoomRequest();
	                createRoomReq.setRoomOptions(roomOpts);
	                req.setCreateRoom(createRoomReq);_context.next = 7;return _get(GameConnection.prototype.__proto__ || _Object$getPrototypeOf(GameConnection.prototype), 'sendRequest', this).call(this,

	                CommandType$1.CONV,
	                OpType$1.START,
	                req);case 7:_ref2 = _context.sent;res = _ref2.res;return _context.abrupt('return',

	                res.getCreateRoom().getRoomOptions());case 10:case 'end':return _context.stop();}}}, _callee, this);}));function createRoom(_x, _x2, _x3) {return _ref.apply(this, arguments);}return createRoom;}() }, { key: 'joinRoom', value: function () {var _ref3 = _asyncToGenerator( /*#__PURE__*/regenerator.mark(function _callee2(


	      roomName, matchProperties, expectedUserIds) {var req, joinRoomReq, roomOpts, _ref4, res;return regenerator.wrap(function _callee2$(_context2) {while (1) {switch (_context2.prev = _context2.next) {case 0:
	                req = new RequestMessage$1();
	                joinRoomReq = new JoinRoomRequest();
	                roomOpts = new RoomOptions();
	                roomOpts.setCid(roomName);
	                if (matchProperties) {
	                  joinRoomReq.setExpectAttr(serializeObject(matchProperties));
	                }
	                if (expectedUserIds) {
	                  roomOpts.setExpectMembersList(expectedUserIds);
	                }
	                joinRoomReq.setRoomOptions(roomOpts);
	                req.setJoinRoom(joinRoomReq);_context2.next = 10;return _get(GameConnection.prototype.__proto__ || _Object$getPrototypeOf(GameConnection.prototype), 'sendRequest', this).call(this,
	                CommandType$1.CONV, OpType$1.ADD, req);case 10:_ref4 = _context2.sent;res = _ref4.res;return _context2.abrupt('return',
	                res.getJoinRoom().getRoomOptions());case 13:case 'end':return _context2.stop();}}}, _callee2, this);}));function joinRoom(_x4, _x5, _x6) {return _ref3.apply(this, arguments);}return joinRoom;}() }, { key: 'leaveRoom', value: function () {var _ref5 = _asyncToGenerator( /*#__PURE__*/regenerator.mark(function _callee3() {var req;return regenerator.wrap(function _callee3$(_context3) {while (1) {switch (_context3.prev = _context3.next) {case 0:



	                req = new RequestMessage$1();_context3.next = 3;return _get(GameConnection.prototype.__proto__ || _Object$getPrototypeOf(GameConnection.prototype), 'sendRequest', this).call(this,
	                CommandType$1.CONV, OpType$1.REMOVE, req);case 3:case 'end':return _context3.stop();}}}, _callee3, this);}));function leaveRoom() {return _ref5.apply(this, arguments);}return leaveRoom;}() }, { key: 'setRoomSystemProps', value: function () {var _ref6 = _asyncToGenerator( /*#__PURE__*/regenerator.mark(function _callee4(


	      props) {var req, updateSysPropertyReq, _ref7, res;return regenerator.wrap(function _callee4$(_context4) {while (1) {switch (_context4.prev = _context4.next) {case 0:
	                req = new RequestMessage$1();
	                updateSysPropertyReq = new UpdateSysPropertyRequest();
	                updateSysPropertyReq.setSysAttr(props);
	                req.setUpdateSysProperty(updateSysPropertyReq);_context4.next = 6;return _get(GameConnection.prototype.__proto__ || _Object$getPrototypeOf(GameConnection.prototype), 'sendRequest', this).call(this,

	                CommandType$1.CONV,
	                OpType$1.UPDATE_SYSTEM_PROPERTY,
	                req);case 6:_ref7 = _context4.sent;res = _ref7.res;return _context4.abrupt('return',

	                res.getUpdateSysProperty().getSysAttr());case 9:case 'end':return _context4.stop();}}}, _callee4, this);}));function setRoomSystemProps(_x7) {return _ref6.apply(this, arguments);}return setRoomSystemProps;}() }, { key: 'setRoomOpen', value: function () {var _ref8 = _asyncToGenerator( /*#__PURE__*/regenerator.mark(function _callee5(


	      open) {var sysProps, o, res;return regenerator.wrap(function _callee5$(_context5) {while (1) {switch (_context5.prev = _context5.next) {case 0:
	                sysProps = new RoomSystemProperty();
	                o = new BoolValue();
	                o.setValue(open);
	                sysProps.setOpen(o);_context5.next = 6;return (
	                  this.setRoomSystemProps(sysProps));case 6:res = _context5.sent;return _context5.abrupt('return',
	                res.getOpen().getValue());case 8:case 'end':return _context5.stop();}}}, _callee5, this);}));function setRoomOpen(_x8) {return _ref8.apply(this, arguments);}return setRoomOpen;}() }, { key: 'setRoomVisible', value: function () {var _ref9 = _asyncToGenerator( /*#__PURE__*/regenerator.mark(function _callee6(


	      visible) {var sysProps, v, res;return regenerator.wrap(function _callee6$(_context6) {while (1) {switch (_context6.prev = _context6.next) {case 0:
	                sysProps = new RoomSystemProperty();
	                v = new BoolValue();
	                v.setValue(visible);
	                sysProps.setVisible(v);_context6.next = 6;return (
	                  this.setRoomSystemProps(sysProps));case 6:res = _context6.sent;return _context6.abrupt('return',
	                res.getVisible().getValue());case 8:case 'end':return _context6.stop();}}}, _callee6, this);}));function setRoomVisible(_x9) {return _ref9.apply(this, arguments);}return setRoomVisible;}() }, { key: 'setRoomMaxPlayerCount', value: function () {var _ref10 = _asyncToGenerator( /*#__PURE__*/regenerator.mark(function _callee7(


	      count) {var sysProps, res;return regenerator.wrap(function _callee7$(_context7) {while (1) {switch (_context7.prev = _context7.next) {case 0:
	                sysProps = new RoomSystemProperty();
	                sysProps.setMaxMembers(count);_context7.next = 4;return (
	                  this.setRoomSystemProps(sysProps));case 4:res = _context7.sent;return _context7.abrupt('return',
	                res.getMaxMembers());case 6:case 'end':return _context7.stop();}}}, _callee7, this);}));function setRoomMaxPlayerCount(_x10) {return _ref10.apply(this, arguments);}return setRoomMaxPlayerCount;}() }, { key: 'setRoomExpectedUserIds', value: function () {var _ref11 = _asyncToGenerator( /*#__PURE__*/regenerator.mark(function _callee8(


	      expectedUserIds) {var sysProps, res;return regenerator.wrap(function _callee8$(_context8) {while (1) {switch (_context8.prev = _context8.next) {case 0:
	                sysProps = new RoomSystemProperty();
	                sysProps.setExpectMembers(
	                _JSON$stringify({
	                  $set: expectedUserIds }));_context8.next = 4;return (


	                  this.setRoomSystemProps(sysProps));case 4:res = _context8.sent;return _context8.abrupt('return',
	                JSON.parse(res.getExpectMembers()));case 6:case 'end':return _context8.stop();}}}, _callee8, this);}));function setRoomExpectedUserIds(_x11) {return _ref11.apply(this, arguments);}return setRoomExpectedUserIds;}() }, { key: 'clearRoomExpectedUserIds', value: function () {var _ref12 = _asyncToGenerator( /*#__PURE__*/regenerator.mark(function _callee9() {var sysProps, res;return regenerator.wrap(function _callee9$(_context9) {while (1) {switch (_context9.prev = _context9.next) {case 0:



	                sysProps = new RoomSystemProperty();
	                sysProps.setExpectMembers(
	                _JSON$stringify({
	                  $drop: true }));_context9.next = 4;return (


	                  this.setRoomSystemProps(sysProps));case 4:res = _context9.sent;return _context9.abrupt('return',
	                JSON.parse(res.getExpectMembers()));case 6:case 'end':return _context9.stop();}}}, _callee9, this);}));function clearRoomExpectedUserIds() {return _ref12.apply(this, arguments);}return clearRoomExpectedUserIds;}() }, { key: 'addRoomExpectedUserIds', value: function () {var _ref13 = _asyncToGenerator( /*#__PURE__*/regenerator.mark(function _callee10(


	      expectedUserIds) {var sysProps, res;return regenerator.wrap(function _callee10$(_context10) {while (1) {switch (_context10.prev = _context10.next) {case 0:
	                sysProps = new RoomSystemProperty();
	                sysProps.setExpectMembers(
	                _JSON$stringify({
	                  $add: expectedUserIds }));_context10.next = 4;return (


	                  this.setRoomSystemProps(sysProps));case 4:res = _context10.sent;return _context10.abrupt('return',
	                JSON.parse(res.getExpectMembers()));case 6:case 'end':return _context10.stop();}}}, _callee10, this);}));function addRoomExpectedUserIds(_x12) {return _ref13.apply(this, arguments);}return addRoomExpectedUserIds;}() }, { key: 'removeRoomExpectedUserIds', value: function () {var _ref14 = _asyncToGenerator( /*#__PURE__*/regenerator.mark(function _callee11(


	      expectedUserIds) {var sysProps, res;return regenerator.wrap(function _callee11$(_context11) {while (1) {switch (_context11.prev = _context11.next) {case 0:
	                sysProps = new RoomSystemProperty();
	                sysProps.setExpectMembers(
	                _JSON$stringify({
	                  $remove: expectedUserIds }));_context11.next = 4;return (


	                  this.setRoomSystemProps(sysProps));case 4:res = _context11.sent;return _context11.abrupt('return',
	                JSON.parse(res.getExpectMembers()));case 6:case 'end':return _context11.stop();}}}, _callee11, this);}));function removeRoomExpectedUserIds(_x13) {return _ref14.apply(this, arguments);}return removeRoomExpectedUserIds;}() }, { key: 'setMaster', value: function () {var _ref15 = _asyncToGenerator( /*#__PURE__*/regenerator.mark(function _callee12(


	      newMasterId) {var req, updateMasterClientReq, _ref16, res;return regenerator.wrap(function _callee12$(_context12) {while (1) {switch (_context12.prev = _context12.next) {case 0:
	                req = new RequestMessage$1();
	                updateMasterClientReq = new UpdateMasterClientRequest();
	                updateMasterClientReq.setMasterActorId(newMasterId);
	                req.setUpdateMasterClient(updateMasterClientReq);_context12.next = 6;return _get(GameConnection.prototype.__proto__ || _Object$getPrototypeOf(GameConnection.prototype), 'sendRequest', this).call(this,

	                CommandType$1.CONV,
	                OpType$1.UPDATE_MASTER_CLIENT,
	                req);case 6:_ref16 = _context12.sent;res = _ref16.res;return _context12.abrupt('return',

	                res.getUpdateMasterClient().getMasterActorId());case 9:case 'end':return _context12.stop();}}}, _callee12, this);}));function setMaster(_x14) {return _ref15.apply(this, arguments);}return setMaster;}() }, { key: 'kickPlayer', value: function () {var _ref17 = _asyncToGenerator( /*#__PURE__*/regenerator.mark(function _callee13(


	      actorId, code, msg) {var req, kickReq, appInfo, _ref18, res;return regenerator.wrap(function _callee13$(_context13) {while (1) {switch (_context13.prev = _context13.next) {case 0:
	                req = new RequestMessage$1();
	                kickReq = new KickMemberRequest();
	                kickReq.setTargetActorId(actorId);
	                if (code !== null || msg !== null) {
	                  appInfo = new AppInfo();
	                  appInfo.setAppCode(code);
	                  appInfo.setAppMsg(msg);
	                  kickReq.setAppInfo(appInfo);
	                }
	                req.setKickMember(kickReq);_context13.next = 7;return _get(GameConnection.prototype.__proto__ || _Object$getPrototypeOf(GameConnection.prototype), 'sendRequest', this).call(this,
	                CommandType$1.CONV, OpType$1.KICK, req);case 7:_ref18 = _context13.sent;res = _ref18.res;return _context13.abrupt('return',
	                res.getKickMember().getTargetActorId());case 10:case 'end':return _context13.stop();}}}, _callee13, this);}));function kickPlayer(_x15, _x16, _x17) {return _ref17.apply(this, arguments);}return kickPlayer;}() }, { key: 'sendEvent', value: function () {var _ref19 = _asyncToGenerator( /*#__PURE__*/regenerator.mark(function _callee14(


	      eventId, eventData, options) {var direct, body;return regenerator.wrap(function _callee14$(_context14) {while (1) {switch (_context14.prev = _context14.next) {case 0:
	                direct = new DirectCommand();
	                direct.setEventId(eventId);
	                if (eventData) {
	                  // 序列化
	                  direct.setMsg(serializeObject(eventData));
	                }
	                if (options) {
	                  direct.setReceiverGroup(options.receiverGroup);
	                  direct.setToActorIdsList(options.targetActorIds);
	                } else {
	                  direct.setReceiverGroup(ReceiverGroup.All);
	                }
	                body = new Body();
	                body.setDirect(direct);_context14.next = 8;return _get(GameConnection.prototype.__proto__ || _Object$getPrototypeOf(GameConnection.prototype), 'sendCommand', this).call(this,
	                CommandType$1.DIRECT, OpType$1.NONE, body);case 8:case 'end':return _context14.stop();}}}, _callee14, this);}));function sendEvent(_x18, _x19, _x20) {return _ref19.apply(this, arguments);}return sendEvent;}() }, { key: 'setRoomCustomProperties', value: function () {var _ref20 = _asyncToGenerator( /*#__PURE__*/regenerator.mark(function _callee15(


	      properties, expectedValues) {var req, updatePropsReq, _ref21, res, changedProps;return regenerator.wrap(function _callee15$(_context15) {while (1) {switch (_context15.prev = _context15.next) {case 0:
	                req = new RequestMessage$1();
	                updatePropsReq = new UpdatePropertyRequest();
	                // 序列化属性
	                updatePropsReq.setAttr(serializeObject(properties));
	                if (expectedValues) {
	                  // 序列化 CAS 属性
	                  updatePropsReq.setExpectAttr(serializeObject(expectedValues));
	                }
	                req.setUpdateProperty(updatePropsReq);_context15.next = 7;return _get(GameConnection.prototype.__proto__ || _Object$getPrototypeOf(GameConnection.prototype), 'sendRequest', this).call(this,

	                CommandType$1.CONV,
	                OpType$1.UPDATE,
	                req);case 7:_ref21 = _context15.sent;res = _ref21.res;

	                // 反序列化 props
	                changedProps = deserializeObject(res.getUpdateProperty().getAttr());return _context15.abrupt('return',
	                changedProps);case 11:case 'end':return _context15.stop();}}}, _callee15, this);}));function setRoomCustomProperties(_x21, _x22) {return _ref20.apply(this, arguments);}return setRoomCustomProperties;}() }, { key: 'setPlayerCustomProperties', value: function () {var _ref22 = _asyncToGenerator( /*#__PURE__*/regenerator.mark(function _callee16(


	      actorId, properties, expectedValues) {var req, updatePropsReq, _ref23, res, aId, changedProps;return regenerator.wrap(function _callee16$(_context16) {while (1) {switch (_context16.prev = _context16.next) {case 0:
	                req = new RequestMessage$1();
	                updatePropsReq = new UpdatePropertyRequest();
	                updatePropsReq.setTargetActorId(actorId);
	                // 序列化属性
	                updatePropsReq.setAttr(serializeObject(properties));
	                if (expectedValues) {
	                  // 序列化 CAS 属性
	                  updatePropsReq.setExpectAttr(serializeObject(expectedValues));
	                }
	                req.setUpdateProperty(updatePropsReq);_context16.next = 8;return _get(GameConnection.prototype.__proto__ || _Object$getPrototypeOf(GameConnection.prototype), 'sendRequest', this).call(this,

	                CommandType$1.CONV,
	                OpType$1.UPDATE_PLAYER_PROP,
	                req);case 8:_ref23 = _context16.sent;res = _ref23.res;

	                // 反序列化 actor Id 和属性
	                aId = res.getUpdateProperty().getActorId();
	                changedProps = res.getUpdateProperty().getAttr();return _context16.abrupt('return',
	                {
	                  actorId: aId,
	                  changedProps: changedProps });case 13:case 'end':return _context16.stop();}}}, _callee16, this);}));function setPlayerCustomProperties(_x23, _x24, _x25) {return _ref22.apply(this, arguments);}return setPlayerCustomProperties;}() }, { key: '_getPingDuration', value: function _getPingDuration()



	    {
	      return GAME_KEEPALIVE_DURATION;
	    } }, { key: '_getFastOpenUrl', value: function _getFastOpenUrl(

	    server, appId, gameVersion, userId, sessionToken) {
	      var parsedUrl = queryString.parseUrl(server);var
	      url = parsedUrl.url,query = parsedUrl.query;
	      var queries = _Object$assign(query, {
	        appId: appId,
	        sdkVersion: version,
	        protocolVersion: protocolVersion,
	        gameVersion: gameVersion,
	        userId: userId,
	        sessionToken: sessionToken });

	      return urlJoin(url, 'session', '?' + queryString.stringify(queries));
	    } }, { key: '_handleNotification', value: function _handleNotification(

	    cmd, op, body) {
	      switch (cmd) {
	        case CommandType$1.CONV:
	          switch (op) {
	            case OpType$1.MEMBERS_JOINED:
	              this._handlePlayerJoined(body.getRoomNotification().getJoinRoom());
	              break;
	            case OpType$1.MEMBERS_LEFT:
	              this._handlePlayerLeftMsg(body.getRoomNotification().getLeftRoom());
	              break;
	            case OpType$1.MASTER_CLIENT_CHANGED:
	              this._handleMasterChangedMsg(
	              body.getRoomNotification().getUpdateMasterClient());

	              break;
	            case OpType$1.SYSTEM_PROPERTY_UPDATED_NOTIFY:
	              this._handleRoomSystemPropsChangedMsg(
	              body.getRoomNotification().getUpdateSysProperty());

	              break;
	            case OpType$1.UPDATED_NOTIFY:
	              this._handleRoomPropertiesChangedMsg(
	              body.getRoomNotification().getUpdateProperty());

	              break;
	            case OpType$1.PLAYER_PROPS:
	              this._handlePlayerPropertiesChangedMsg(
	              body.getRoomNotification().getUpdateProperty());

	              break;
	            case OpType$1.MEMBERS_OFFLINE:
	              this._handlePlayerOfflineMsg(body.getRoomNotification());
	              break;
	            case OpType$1.MEMBERS_ONLINE:
	              this._handlePlayerOnlineMsg(body.getRoomNotification());
	              break;
	            case OpType$1.KICKED_NOTICE:
	              this._handleKickedMsg(body.getRoomNotification());
	              break;
	}

	          break;
	        case CommandType$1.EVENTS:
	          // 目前不作处理
	          break;
	        case CommandType$1.DIRECT:
	          this._handleSendEventMsg(body.getDirect());
	          break;
	        case CommandType$1.ERROR:
	          _get(GameConnection.prototype.__proto__ || _Object$getPrototypeOf(GameConnection.prototype), '_handleErrorNotify', this).call(this, body.getError());
	          break;
	}

	    } }, { key: '_handlePlayerJoined', value: function _handlePlayerJoined(

	    joinRoomNotification) {
	      this.emit(PLAYER_JOINED_EVENT, joinRoomNotification.getMember());
	    } }, { key: '_handlePlayerLeftMsg', value: function _handlePlayerLeftMsg(

	    leftRoomNotification) {
	      var actorId = leftRoomNotification.getActorId();
	      this.emit(PLAYER_LEFT_EVENT, actorId);
	    } }, { key: '_handleMasterChangedMsg', value: function _handleMasterChangedMsg(

	    updateMasterCLientNotification) {
	      var newMasterId = updateMasterCLientNotification.getMasterActorId();
	      this.emit(MASTER_CHANGED_EVENT, newMasterId);
	    } }, { key: '_handleRoomPropertiesChangedMsg', value: function _handleRoomPropertiesChangedMsg(

	    updatePropertyNotification) {
	      // 反序列化
	      var changedProps = deserializeObject(
	      updatePropertyNotification.getAttr());

	      this.emit(ROOM_PROPERTIES_CHANGED_EVENT, changedProps);
	    } }, { key: '_handlePlayerPropertiesChangedMsg', value: function _handlePlayerPropertiesChangedMsg(

	    updatePropertyNotification) {
	      // 反序列化
	      var actorId = updatePropertyNotification.getActorId();
	      var changedProps = deserializeObject(
	      updatePropertyNotification.getAttr());

	      this.emit(PLAYER_PROPERTIES_CHANGED_EVENT, actorId, changedProps);
	    } }, { key: '_handlePlayerOfflineMsg', value: function _handlePlayerOfflineMsg(

	    roomNotification) {
	      var actorId = roomNotification.getInitByActor();
	      this.emit(PLAYER_OFFLINE_EVENT, actorId);
	    } }, { key: '_handlePlayerOnlineMsg', value: function _handlePlayerOnlineMsg(

	    roomNotification) {
	      var joinRoom = roomNotification.getJoinRoom();
	      var member = joinRoom.getMember();
	      // 更新 Player
	      var actorId = member.getActorId();
	      var props = deserializeObject(member.getAttr());
	      this.emit(PLAYER_ONLINE_EVENT, actorId, props);
	    } }, { key: '_handleSendEventMsg', value: function _handleSendEventMsg(

	    directCommand) {
	      var eventId = directCommand.getEventId();
	      // 反序列化
	      var eventData = null;
	      if (directCommand.getMsg()) {
	        eventData = deserializeObject(directCommand.getMsg());
	      }
	      var senderId = directCommand.getFromActorId();
	      this.emit(SEND_CUSTOM_EVENT, eventId, eventData, senderId);
	    } }, { key: '_handleKickedMsg', value: function _handleKickedMsg(

	    roomNotification) {
	      var appInfo = roomNotification.getAppInfo();
	      if (appInfo) {
	        this.emit(ROOM_KICKED_EVENT, {
	          code: appInfo.getAppCode(),
	          msg: appInfo.getAppMsg() });

	      } else {
	        this.emit(ROOM_KICKED_EVENT);
	      }
	    } }, { key: '_handleRoomSystemPropsChangedMsg', value: function _handleRoomSystemPropsChangedMsg(

	    updateStsPropertyNotification) {
	      var attr = updateStsPropertyNotification.getSysAttr();
	      var changedProps = {};
	      if (attr.getOpen()) {
	        changedProps.open = attr.getOpen().getValue();
	      }
	      if (attr.getVisible()) {
	        changedProps.visible = attr.getVisible().getValue();
	      }
	      if (attr.getMaxMembers()) {
	        changedProps.maxPlayerCount = attr.getMaxMembers();
	      }
	      if (attr.getExpectMembers()) {
	        changedProps.expectedUserIds = JSON.parse(attr.getExpectMembers());
	      }
	      this.emit(ROOM_SYSTEM_PROPERTIES_CHANGED_EVENT, changedProps);
	    } }]);return GameConnection;}(Connection);

	/**
	 * 事件
	 * @readonly
	 * @enum {String}
	 */
	var Event = {
	  /**
	               * 连接成功
	               * @event Play#CONNECTED
	               */
	  CONNECTED: 'connected',
	  /**
	                           * 连接失败
	                           *
	                           * @event Play#CONNECT_FAILED
	                           * @param {Object} payload
	                           * @param {Number} payload.code
	                           * @param {String} payload.detail
	                           */
	  CONNECT_FAILED: 'connectFailed',
	  /**
	                                    * 断开连接
	                                    * @event Play#DISCONNECTED
	                                    */
	  DISCONNECTED: 'disconnected',
	  /**
	                                 * 加入到大厅
	                                 * @event Play#LOBBY_JOINED
	                                 */
	  LOBBY_JOINED: 'lobbyJoined',
	  /**
	                                * 离开大厅
	                                * @event Play#LOBBY_LEFT
	                                */
	  LOBBY_LEFT: 'lobbyLeft',
	  /**
	                            * 大厅房间列表变化
	                            * @event Play#LOBBY_ROOM_LIST_UPDATED
	                            */
	  LOBBY_ROOM_LIST_UPDATED: 'lobbyRoomListUpdate',
	  /**
	                                                   * 创建房间成功
	                                                   * @event Play#ROOM_CREATED
	                                                   */
	  ROOM_CREATED: 'roomCreated',
	  /**
	                                * 创建房间失败
	                                * @event Play#ROOM_CREATE_FAILED
	                                * @param {Object} payload
	                                * @param {Number} payload.code
	                                * @param {String} payload.detail
	                                */
	  ROOM_CREATE_FAILED: 'roomCreateFailed',
	  /**
	                                           * 加入房间成功
	                                           * @event Play#ROOM_JOINED
	                                           */
	  ROOM_JOINED: 'roomJoined',
	  /**
	                              * 加入房间失败
	                              * @event Play#ROOM_JOIN_FAILED
	                              */
	  ROOM_JOIN_FAILED: 'roomJoinFailed',
	  /**
	                                       * 有新玩家加入房间
	                                       * @event Play#PLAYER_ROOM_JOINED
	                                       * @param {Object} payload
	                                       * @param {Player} payload.newPlayer
	                                       */
	  PLAYER_ROOM_JOINED: 'newPlayerJoinedRoom',
	  /**
	                                              * 有玩家离开房间
	                                              * @event Play#PLAYER_ROOM_LEFT
	                                              * @param {Object} payload
	                                              * @param {Player} payload.leftPlayer
	                                              */
	  PLAYER_ROOM_LEFT: 'playerLeftRoom',
	  /**
	                                       * 玩家活跃属性变化
	                                       * @event Play#PLAYER_ACTIVITY_CHANGED
	                                       * @param {Object} payload
	                                       * @param {Player} payload.player
	                                       */
	  PLAYER_ACTIVITY_CHANGED: 'playerActivityChanged',
	  /**
	                                                     * 主机变更
	                                                     * @event Play#MASTER_SWITCHED
	                                                     * @param {Object} payload
	                                                     * @param {Player} payload.newMaster
	                                                     */
	  MASTER_SWITCHED: 'masterSwitched',
	  /**
	                                      * 房间系统属性变化
	                                      * @event Play#ROOM_SYSTEM_PROPERTIES_CHANGED
	                                      * @param {Object} payload
	                                      * @param {Object} payload.changedProps
	                                      */
	  ROOM_SYSTEM_PROPERTIES_CHANGED: 'roomSystemPropertiesChanged',
	  /**
	                                                                  * 房间「开启 / 关闭」
	                                                                  * @event Play#ROOM_OPEN_CHANGED
	                                                                  * @param {Object} payload
	                                                                  * @param {Boolean} payload.open
	                                                                  */
	  ROOM_OPEN_CHANGED: 'roomOpenChanged',
	  /**
	                                         * 房间「可见 / 不可见」
	                                         * @event Play#ROOM_VISIBLE_CHANGED
	                                         * @param {Object} payload
	                                         * @param {Boolean} payload.visible
	                                         */
	  ROOM_VISIBLE_CHANGED: 'roomVisibleChanged',
	  /**
	                                               * 离开房间
	                                               * @event Play#ROOM_LEFT
	                                               */
	  ROOM_LEFT: 'roomLeft',
	  /**
	                          * 被踢出房间
	                          * @event Play#ROOM_KICKED
	                          * @param {Object} payload
	                          * @param {Number} payload.code
	                          * @param {String} payload.msg
	                          */
	  ROOM_KICKED: 'roomKicked',
	  /**
	                              * 房间自定义属性变化
	                              * @event Play#ROOM_CUSTOM_PROPERTIES_CHANGED
	                              * @param {Object} payload
	                              * @param {Object} payload.changedProps
	                              */
	  ROOM_CUSTOM_PROPERTIES_CHANGED: 'roomCustomPropertiesChanged',
	  /**
	                                                                  * 玩家自定义属性变化
	                                                                  * @event Play#PLAYER_CUSTOM_PROPERTIES_CHANGED
	                                                                  * @param {Object} payload
	                                                                  * @param {Player} payload.player
	                                                                  * @param {Object} payload.changedProps
	                                                                  */
	  PLAYER_CUSTOM_PROPERTIES_CHANGED: 'playerCustomPropertiesChanged',
	  /**
	                                                                      * 自定义事件
	                                                                      * @event Play#CUSTOM_EVENT
	                                                                      * @param {Object} payload
	                                                                      * @param {Number|String} payload.eventId
	                                                                      * @param {Object} payload.eventData
	                                                                      * @param {Number} payload.senderId
	                                                                      */
	  CUSTOM_EVENT: 'customEvent',
	  /**
	                                * 错误事件
	                                * @event Play#ERROR
	                                * @param {Object} payload
	                                * @param {Number} payload.code
	                                * @param {String} payload.detail
	                                */
	  ERROR: 'error' };

	/**
	                                              * 房间类
	                                              */var Room = function () {
	  function Room(client) {var _this = this;_classCallCheck(this, Room);
	    this._client = client;
	    this._fsm = new StateMachine({
	      init: 'init',
	      final: 'closed',
	      transitions: [
	      { name: 'join', from: 'init', to: 'joining' },
	      { name: 'joined', from: 'joining', to: 'game' },
	      { name: 'joinFailed', from: 'joining', to: 'init' },
	      { name: 'leave', from: 'game', to: 'leaving' },
	      { name: 'leaveFailed', from: 'leaving', to: 'game' },
	      { name: 'disconnect', from: 'game', to: 'disconnected' },
	      {
	        name: 'close',
	        from: ['init', 'joining', 'game', 'leaving', 'disconnected'],
	        to: 'closed' }],


	      methods: {
	        onEnterGame: function onEnterGame() {
	          // 为 reconnectAndRejoin() 保存房间 id
	          _this._lastRoomId = _this.name;
	          // 注册事件
	          _this._gameConn.on(ERROR_EVENT, function () {var _ref2 = _asyncToGenerator( /*#__PURE__*/regenerator.mark(function _callee(_ref) {var code = _ref.code,detail = _ref.detail;return regenerator.wrap(function _callee$(_context) {while (1) {switch (_context.prev = _context.next) {case 0:
	                      _this._gameConn.close();
	                      _this._client.emit(Event.ERROR, {
	                        code: code,
	                        detail: detail });case 2:case 'end':return _context.stop();}}}, _callee, _this);}));return function (_x) {return _ref2.apply(this, arguments);};}());


	          _this._gameConn.on(PLAYER_JOINED_EVENT, function (newPlayerData) {
	            var newPlayer = new Player(_this);
	            newPlayer._init(newPlayerData);
	            _this._addPlayer(newPlayer);
	            _this._client.emit(Event.PLAYER_ROOM_JOINED, {
	              newPlayer: newPlayer });

	          });
	          _this._gameConn.on(PLAYER_LEFT_EVENT, function (actorId) {
	            var leftPlayer = _this.getPlayer(actorId);
	            _this._removePlayer(actorId);
	            _this._client.emit(Event.PLAYER_ROOM_LEFT, {
	              leftPlayer: leftPlayer });

	          });
	          _this._gameConn.on(MASTER_CHANGED_EVENT, function (newMasterActorId) {
	            var newMaster = null;
	            _this._masterActorId = newMasterActorId;
	            if (newMasterActorId > 0) {
	              newMaster = _this.getPlayer(newMasterActorId);
	            }
	            _this._client.emit(Event.MASTER_SWITCHED, {
	              newMaster: newMaster });

	          });
	          _this._gameConn.on(ROOM_OPEN_CHANGED_EVENT, function (open) {
	            _this._open = open;
	            _this._client.emit(Event.ROOM_OPEN_CHANGED, {
	              open: open });

	          });
	          _this._gameConn.on(ROOM_VISIBLE_CHANGED_EVENT, function (visible) {
	            _this._visible = visible;
	            _this._client.emit(Event.ROOM_VISIBLE_CHANGED, {
	              visible: visible });

	          });
	          _this._gameConn.on(ROOM_PROPERTIES_CHANGED_EVENT, function (changedProps) {
	            _this._mergeProperties(changedProps);
	            _this._client.emit(Event.ROOM_CUSTOM_PROPERTIES_CHANGED, {
	              changedProps: changedProps });

	          });
	          _this._gameConn.on(
	          ROOM_SYSTEM_PROPERTIES_CHANGED_EVENT,
	          function (changedProps) {
	            _this._mergeSystemProps(changedProps);
	            _this._client.emit(Event.ROOM_SYSTEM_PROPERTIES_CHANGED, {
	              changedProps: changedProps });

	          });

	          _this._gameConn.on(
	          PLAYER_PROPERTIES_CHANGED_EVENT,
	          function (actorId, changedProps) {
	            var player = _this.getPlayer(actorId);
	            player._mergeProperties(changedProps);
	            _this._client.emit(Event.PLAYER_CUSTOM_PROPERTIES_CHANGED, {
	              player: player,
	              changedProps: changedProps });

	          });

	          _this._gameConn.on(PLAYER_OFFLINE_EVENT, function (actorId) {
	            var player = _this.getPlayer(actorId);
	            player._active = false;
	            _this._client.emit(Event.PLAYER_ACTIVITY_CHANGED, {
	              player: player });

	          });
	          _this._gameConn.on(PLAYER_ONLINE_EVENT, function (actorId, props) {
	            var player = _this.getPlayer(actorId);
	            player._mergeProperties(props);
	            player._active = true;
	            _this._client.emit(Event.PLAYER_ACTIVITY_CHANGED, {
	              player: player });

	          });
	          _this._gameConn.on(
	          SEND_CUSTOM_EVENT,
	          function (eventId, eventData, senderId) {
	            _this._client.emit(Event.CUSTOM_EVENT, {
	              eventId: eventId,
	              eventData: eventData,
	              senderId: senderId });

	          });

	          _this._gameConn.on(DISCONNECT_EVENT, function () {
	            _this._fsm.disconnect();
	            _this._client.emit(Event.DISCONNECTED);
	          });
	          _this._gameConn.on(ROOM_KICKED_EVENT, function () {var _ref3 = _asyncToGenerator( /*#__PURE__*/regenerator.mark(function _callee2(info) {return regenerator.wrap(function _callee2$(_context2) {while (1) {switch (_context2.prev = _context2.next) {case 0:_context2.next = 2;return (
	                        _this.close());case 2:
	                      if (info) {
	                        _this._client.emit(Event.ROOM_KICKED, info);
	                      } else {
	                        _this._client.emit(Event.ROOM_KICKED);
	                      }case 3:case 'end':return _context2.stop();}}}, _callee2, _this);}));return function (_x2) {return _ref3.apply(this, arguments);};}());

	        },
	        onExitGame: function onExitGame() {
	          _this._gameConn.removeAllListeners();
	        } } });


	  }_createClass(Room, [{ key: 'create', value: function () {var _ref4 = _asyncToGenerator( /*#__PURE__*/regenerator.mark(function _callee3(

	      roomName, roomOptions, expectedUserIds) {var _lobbyService, _ref5, cid, addr, _ref6, sessionToken, _client, _appId, _gameVersion, _userId, room;return regenerator.wrap(function _callee3$(_context3) {while (1) {switch (_context3.prev = _context3.next) {case 0:if (!(
	                roomName !== null && !(typeof roomName === 'string'))) {_context3.next = 2;break;}throw (
	                  new TypeError(roomName + ' is not a string'));case 2:if (!(

	                roomOptions !== null && !(roomOptions instanceof Object))) {_context3.next = 4;break;}throw (
	                  new TypeError(roomOptions + ' is not a Object'));case 4:if (!(

	                expectedUserIds !== null && !Array.isArray(expectedUserIds))) {_context3.next = 6;break;}throw (
	                  new TypeError(expectedUserIds + ' is not an Array with string'));case 6:

	                this._fsm.join();_context3.prev = 7;

	                _lobbyService = this._client._lobbyService;_context3.next = 11;return (
	                  _lobbyService.createRoom(roomName));case 11:_ref5 = _context3.sent;cid = _ref5.cid;addr = _ref5.addr;_context3.next = 16;return (
	                  _lobbyService.authorize());case 16:_ref6 = _context3.sent;sessionToken = _ref6.sessionToken;
	                // 合并
	                this._gameConn = new GameConnection();_client =
	                this._client, _appId = _client._appId, _gameVersion = _client._gameVersion, _userId = _client._userId;_context3.next = 22;return (
	                  this._gameConn.connect(
	                  _appId,
	                  addr,
	                  _gameVersion,
	                  _userId,
	                  sessionToken));case 22:_context3.next = 24;return (

	                  this._gameConn.createRoom(
	                  cid,
	                  roomOptions,
	                  expectedUserIds));case 24:room = _context3.sent;

	                this._init(room);
	                this._fsm.joined();_context3.next = 34;break;case 29:_context3.prev = 29;_context3.t0 = _context3['catch'](7);_context3.next = 33;return (

	                  this.close());case 33:throw _context3.t0;case 34:case 'end':return _context3.stop();}}}, _callee3, this, [[7, 29]]);}));function create(_x3, _x4, _x5) {return _ref4.apply(this, arguments);}return create;}() }, { key: 'join', value: function () {var _ref7 = _asyncToGenerator( /*#__PURE__*/regenerator.mark(function _callee4(




	      roomName, expectedUserIds) {var _lobbyService, _ref8, cid, addr, _ref9, sessionToken, _client2, _appId, _gameVersion, _userId, room;return regenerator.wrap(function _callee4$(_context4) {while (1) {switch (_context4.prev = _context4.next) {case 0:if (
	                typeof roomName === 'string') {_context4.next = 2;break;}throw (
	                  new TypeError(roomName + ' is not a string'));case 2:if (!(

	                expectedUserIds !== null && !Array.isArray(expectedUserIds))) {_context4.next = 4;break;}throw (
	                  new TypeError(expectedUserIds + ' is not an array with string'));case 4:

	                this._fsm.join();_context4.prev = 5;

	                _lobbyService = this._client._lobbyService;_context4.next = 9;return (
	                  _lobbyService.joinRoom({ roomName: roomName }));case 9:_ref8 = _context4.sent;cid = _ref8.cid;addr = _ref8.addr;_context4.next = 14;return (
	                  _lobbyService.authorize());case 14:_ref9 = _context4.sent;sessionToken = _ref9.sessionToken;
	                this._gameConn = new GameConnection();_client2 =
	                this._client, _appId = _client2._appId, _gameVersion = _client2._gameVersion, _userId = _client2._userId;_context4.next = 20;return (
	                  this._gameConn.connect(
	                  _appId,
	                  addr,
	                  _gameVersion,
	                  _userId,
	                  sessionToken));case 20:_context4.next = 22;return (

	                  this._gameConn.joinRoom(cid, null, expectedUserIds));case 22:room = _context4.sent;
	                this._init(room);
	                this._fsm.joined();_context4.next = 32;break;case 27:_context4.prev = 27;_context4.t0 = _context4['catch'](5);_context4.next = 31;return (

	                  this.close());case 31:throw _context4.t0;case 32:case 'end':return _context4.stop();}}}, _callee4, this, [[5, 27]]);}));function join(_x6, _x7) {return _ref7.apply(this, arguments);}return join;}() }, { key: 'joinRandom', value: function () {var _ref10 = _asyncToGenerator( /*#__PURE__*/regenerator.mark(function _callee5(




	      matchProperties, expectedUserIds) {var _lobbyService, _ref11, cid, addr, _ref12, sessionToken, _client3, _appId, _gameVersion, _userId, room;return regenerator.wrap(function _callee5$(_context5) {while (1) {switch (_context5.prev = _context5.next) {case 0:if (!(
	                matchProperties != null && !((typeof matchProperties === 'undefined' ? 'undefined' : _typeof(matchProperties)) === 'object'))) {_context5.next = 2;break;}throw (
	                  new TypeError(matchProperties + ' is not an object'));case 2:if (!(

	                expectedUserIds !== null && !Array.isArray(expectedUserIds))) {_context5.next = 4;break;}throw (
	                  new TypeError(expectedUserIds + ' is not an array with string'));case 4:

	                this._fsm.join();_context5.prev = 5;

	                _lobbyService = this._client._lobbyService;_context5.next = 9;return (
	                  _lobbyService.joinRandomRoom(
	                  matchProperties,
	                  expectedUserIds));case 9:_ref11 = _context5.sent;cid = _ref11.cid;addr = _ref11.addr;_context5.next = 14;return (

	                  _lobbyService.authorize());case 14:_ref12 = _context5.sent;sessionToken = _ref12.sessionToken;
	                this._gameConn = new GameConnection();_client3 =
	                this._client, _appId = _client3._appId, _gameVersion = _client3._gameVersion, _userId = _client3._userId;_context5.next = 20;return (
	                  this._gameConn.connect(
	                  _appId,
	                  addr,
	                  _gameVersion,
	                  _userId,
	                  sessionToken));case 20:_context5.next = 22;return (

	                  this._gameConn.joinRoom(cid, null, expectedUserIds));case 22:room = _context5.sent;
	                this._init(room);
	                this._fsm.joined();_context5.next = 32;break;case 27:_context5.prev = 27;_context5.t0 = _context5['catch'](5);_context5.next = 31;return (

	                  this.close());case 31:throw _context5.t0;case 32:case 'end':return _context5.stop();}}}, _callee5, this, [[5, 27]]);}));function joinRandom(_x8, _x9) {return _ref10.apply(this, arguments);}return joinRandom;}() }, { key: 'rejoin', value: function () {var _ref13 = _asyncToGenerator( /*#__PURE__*/regenerator.mark(function _callee6(




	      roomName) {var _lobbyService, _ref14, cid, addr, _ref15, sessionToken, _client4, _appId, _gameVersion, _userId, room;return regenerator.wrap(function _callee6$(_context6) {while (1) {switch (_context6.prev = _context6.next) {case 0:if (
	                typeof roomName === 'string') {_context6.next = 2;break;}throw (
	                  new TypeError(roomName + ' is not a string'));case 2:

	                this._fsm.join();_context6.prev = 3;

	                _lobbyService = this._client._lobbyService;_context6.next = 7;return (
	                  _lobbyService.joinRoom({
	                    roomName: roomName,
	                    rejoin: true }));case 7:_ref14 = _context6.sent;cid = _ref14.cid;addr = _ref14.addr;_context6.next = 12;return (

	                  _lobbyService.authorize());case 12:_ref15 = _context6.sent;sessionToken = _ref15.sessionToken;
	                this._gameConn = new GameConnection();_client4 =
	                this._client, _appId = _client4._appId, _gameVersion = _client4._gameVersion, _userId = _client4._userId;_context6.next = 18;return (
	                  this._gameConn.connect(
	                  _appId,
	                  addr,
	                  _gameVersion,
	                  _userId,
	                  sessionToken));case 18:_context6.next = 20;return (

	                  this._gameConn.joinRoom(cid));case 20:room = _context6.sent;
	                this._init(room);
	                this._fsm.joined();_context6.next = 30;break;case 25:_context6.prev = 25;_context6.t0 = _context6['catch'](3);_context6.next = 29;return (

	                  this.close());case 29:throw _context6.t0;case 30:case 'end':return _context6.stop();}}}, _callee6, this, [[3, 25]]);}));function rejoin(_x10) {return _ref13.apply(this, arguments);}return rejoin;}() }, { key: 'joinOrCreate', value: function () {var _ref16 = _asyncToGenerator( /*#__PURE__*/regenerator.mark(function _callee7(




	      roomName, roomOptions, expectedUserIds) {var _lobbyService, _ref17, cid, addr, roomCreated, _ref18, sessionToken, _client5, _appId, _gameVersion, _userId, room;return regenerator.wrap(function _callee7$(_context7) {while (1) {switch (_context7.prev = _context7.next) {case 0:if (
	                typeof roomName === 'string') {_context7.next = 2;break;}throw (
	                  new TypeError(roomName + ' is not a string'));case 2:if (!(

	                roomOptions !== null && !(roomOptions instanceof Object))) {_context7.next = 4;break;}throw (
	                  new TypeError(roomOptions + ' is not a Object'));case 4:if (!(

	                expectedUserIds !== null && !Array.isArray(expectedUserIds))) {_context7.next = 6;break;}throw (
	                  new TypeError(expectedUserIds + ' is not an array with string'));case 6:

	                this._fsm.join();_context7.prev = 7;

	                _lobbyService = this._client._lobbyService;_context7.next = 11;return (
	                  _lobbyService.joinRoom({
	                    roomName: roomName,
	                    createOnNotFound: true }));case 11:_ref17 = _context7.sent;cid = _ref17.cid;addr = _ref17.addr;roomCreated = _ref17.roomCreated;_context7.next = 17;return (

	                  _lobbyService.authorize());case 17:_ref18 = _context7.sent;sessionToken = _ref18.sessionToken;
	                this._gameConn = new GameConnection();_client5 =
	                this._client, _appId = _client5._appId, _gameVersion = _client5._gameVersion, _userId = _client5._userId;_context7.next = 23;return (
	                  this._gameConn.connect(
	                  _appId,
	                  addr,
	                  _gameVersion,
	                  _userId,
	                  sessionToken));case 23:

	                // 根据返回确定是创建还是加入房间
	                room = null;if (!
	                roomCreated) {_context7.next = 30;break;}_context7.next = 27;return (
	                  this._gameConn.createRoom(
	                  cid,
	                  roomOptions,
	                  expectedUserIds));case 27:room = _context7.sent;_context7.next = 33;break;case 30:_context7.next = 32;return (


	                  this._gameConn.joinRoom(cid, null, expectedUserIds));case 32:room = _context7.sent;case 33:

	                this._init(room);
	                this._fsm.joined();_context7.next = 42;break;case 37:_context7.prev = 37;_context7.t0 = _context7['catch'](7);_context7.next = 41;return (

	                  this.close());case 41:throw _context7.t0;case 42:case 'end':return _context7.stop();}}}, _callee7, this, [[7, 37]]);}));function joinOrCreate(_x11, _x12, _x13) {return _ref16.apply(this, arguments);}return joinOrCreate;}()




	    /**
	                                                                                                                                                                                                                                                  * 离开房间
	                                                                                                                                                                                                                                                  */ }, { key: 'leave', value: function () {var _ref19 = _asyncToGenerator( /*#__PURE__*/regenerator.mark(function _callee8() {return regenerator.wrap(function _callee8$(_context8) {while (1) {switch (_context8.prev = _context8.next) {case 0:

	                this._client._room = null;
	                this._fsm.leave();_context8.prev = 2;_context8.next = 5;return (

	                  this._gameConn.leaveRoom());case 5:_context8.next = 11;break;case 7:_context8.prev = 7;_context8.t0 = _context8['catch'](2);

	                this._fsm.leaveFailed();throw _context8.t0;case 11:_context8.next = 13;return (


	                  this.close());case 13:case 'end':return _context8.stop();}}}, _callee8, this, [[2, 7]]);}));function leave() {return _ref19.apply(this, arguments);}return leave;}()


	    /**
	                                                                                                                                                                                        * 关闭
	                                                                                                                                                                                        */ }, { key: 'close', value: function () {var _ref20 = _asyncToGenerator( /*#__PURE__*/regenerator.mark(function _callee9() {return regenerator.wrap(function _callee9$(_context9) {while (1) {switch (_context9.prev = _context9.next) {case 0:if (!

	                this._fsm.cannot('close')) {_context9.next = 2;break;}throw (
	                  new PlayError(
	                  PlayErrorCode.STATE_ERROR, 'Error state: ' +
	                  this._fsm.state));case 2:if (!


	                this._gameConn) {_context9.next = 5;break;}_context9.next = 5;return (
	                  this._gameConn.close());case 5:

	                this._client._room = null;
	                this._fsm.close();case 7:case 'end':return _context9.stop();}}}, _callee9, this);}));function close() {return _ref20.apply(this, arguments);}return close;}()


	    /**
	                                                                                                                                                                               * 设置房间开启 / 关闭
	                                                                                                                                                                               * @param {Boolean} open 是否开启
	                                                                                                                                                                               */ }, { key: 'setOpen', value: function setOpen(
	    open) {var _this2 = this;
	      if (!(typeof open === 'boolean')) {
	        throw new TypeError(open + ' is not a boolean value');
	      }
	      if (!this._fsm.is('game')) {
	        throw new PlayError(
	        PlayErrorCode.STATE_ERROR, 'Error state: ' +
	        this._fsm.state);

	      }
	      return this._gameConn.setRoomOpen(open).then(
	      tap(function (o) {
	        _this2._mergeSystemProps({ open: o });
	      }));

	    }

	    /**
	       * 设置房间可见 / 不可见
	       * @param {Boolean} visible 是否可见
	       */ }, { key: 'setVisible', value: function setVisible(
	    visible) {var _this3 = this;
	      if (!(typeof visible === 'boolean')) {
	        throw new TypeError(visible + ' is not a boolean value');
	      }
	      if (!this._fsm.is('game')) {
	        throw new PlayError(
	        PlayErrorCode.STATE_ERROR, 'Error state: ' +
	        this._fsm.state);

	      }
	      return this._gameConn.setRoomVisible(visible).then(
	      tap(function (v) {
	        _this3._mergeSystemProps({ visible: v });
	      }));

	    }

	    /**
	       * 设置房间允许的最大玩家数量
	       * @param {*} count 数量
	       */ }, { key: 'setMaxPlayerCount', value: function setMaxPlayerCount(
	    count) {var _this4 = this;
	      if (!(typeof count === 'number') || count < 1) {
	        throw new TypeError(count + ' is not a positive number');
	      }
	      if (!this._fsm.is('game')) {
	        throw new PlayError(
	        PlayErrorCode.STATE_ERROR, 'Error state: ' +
	        this._fsm.state);

	      }
	      return this._gameConn.setRoomMaxPlayerCount(count).then(
	      tap(function (c) {
	        _this4._mergeSystemProps({ maxPlayerCount: c });
	      }));

	    }

	    /**
	       * 设置房间占位玩家 Id 列表
	       * @param {*} expectedUserIds 玩家 Id 列表
	       */ }, { key: 'setExpectedUserIds', value: function setExpectedUserIds(
	    expectedUserIds) {var _this5 = this;
	      if (!Array.isArray(expectedUserIds)) {
	        throw new TypeError(expectedUserIds + ' is not an array');
	      }
	      if (!this._fsm.is('game')) {
	        throw new PlayError(
	        PlayErrorCode.STATE_ERROR, 'Error state: ' +
	        this._fsm.state);

	      }
	      return this._gameConn.setRoomExpectedUserIds(expectedUserIds).then(
	      tap(function (ids) {
	        _this5._mergeSystemProps({ expectedUserIds: ids });
	      }));

	    }

	    /**
	       * 清空房间占位玩家 Id 列表
	       */ }, { key: 'clearExpectedUserIds', value: function clearExpectedUserIds()
	    {var _this6 = this;
	      if (!this._fsm.is('game')) {
	        throw new PlayError(
	        PlayErrorCode.STATE_ERROR, 'Error state: ' +
	        this._fsm.state);

	      }
	      return this._gameConn.clearRoomExpectedUserIds().then(
	      tap(function (ids) {
	        _this6._mergeSystemProps({ expectedUserIds: ids });
	      }));

	    }

	    /**
	       * 增加房间占位玩家 Id 列表
	       * @param {*} expectedUserIds 增加的玩家 Id 列表
	       */ }, { key: 'addExpectedUserIds', value: function addExpectedUserIds(
	    expectedUserIds) {var _this7 = this;
	      if (!Array.isArray(expectedUserIds)) {
	        throw new TypeError(expectedUserIds + ' is not an array');
	      }
	      if (!this._fsm.is('game')) {
	        throw new PlayError(
	        PlayErrorCode.STATE_ERROR, 'Error state: ' +
	        this._fsm.state);

	      }
	      return this._gameConn.addRoomExpectedUserIds(expectedUserIds).then(
	      tap(function (ids) {
	        _this7._mergeSystemProps({ expectedUserIds: ids });
	      }));

	    }

	    /**
	       * 移除房间占位玩家 Id 列表
	       * @param {*} expectedUserIds 移除的玩家 Id 列表
	       */ }, { key: 'removeExpectedUserIds', value: function removeExpectedUserIds(
	    expectedUserIds) {var _this8 = this;
	      if (!Array.isArray(expectedUserIds)) {
	        throw new TypeError(expectedUserIds + ' is not an array');
	      }
	      if (!this._fsm.is('game')) {
	        throw new PlayError(
	        PlayErrorCode.STATE_ERROR, 'Error state: ' +
	        this._fsm.state);

	      }
	      return this._gameConn.removeRoomExpectedUserIds(expectedUserIds).then(
	      tap(function (ids) {
	        _this8._mergeSystemProps({ expectedUserIds: ids });
	      }));

	    }

	    /**
	       * 设置房主
	       * @param {Number} newMasterId 新房主 ID
	       */ }, { key: 'setMaster', value: function setMaster(
	    newMasterId) {var _this9 = this;
	      if (!(typeof newMasterId === 'number')) {
	        throw new TypeError(newMasterId + ' is not a number');
	      }
	      if (!this._fsm.is('game')) {
	        throw new PlayError(
	        PlayErrorCode.STATE_ERROR, 'Error state: ' +
	        this._fsm.state);

	      }
	      return this._gameConn.setMaster(newMasterId).then(
	      tap(function (masterId) {
	        _this9._masterActorId = masterId;
	      }));

	    }

	    /**
	       * 发送自定义消息
	       * @param {Number} eventId 事件 ID
	       * @param {Object} eventData 事件参数
	       * @param {Object} options 发送事件选项
	       * @param {ReceiverGroup} options.receiverGroup 接收组
	       * @param {Array.<Number>} options.targetActorIds 接收者 Id。如果设置，将会覆盖 receiverGroup
	       */ }, { key: 'sendEvent', value: function sendEvent(

	    eventId)


	    {var eventData = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : { receiverGroup: ReceiverGroup.All };
	      if (!(typeof eventId === 'number')) {
	        throw new TypeError(eventId + ' is not a number');
	      }
	      if (eventId < -128 || eventId > 127) {
	        throw new TypeError('eventId must be [-128, 127]');
	      }
	      if (!((typeof eventData === 'undefined' ? 'undefined' : _typeof(eventData)) === 'object')) {
	        throw new TypeError(eventData + ' is not an object');
	      }
	      if (!(options instanceof Object)) {
	        throw new TypeError(options + ' is not a Object');
	      }
	      if (
	      options.receiverGroup === undefined &&
	      options.targetActorIds === undefined)
	      {
	        throw new TypeError('receiverGroup and targetActorIds are null');
	      }
	      if (!this._fsm.is('game')) {
	        throw new PlayError(
	        PlayErrorCode.STATE_ERROR, 'Error state: ' +
	        this._fsm.state);

	      }
	      return this._gameConn.sendEvent(eventId, eventData, options);
	    } }, { key: '_init', value: function _init(

	    roomData) {var _this10 = this;
	      this._name = roomData.getCid();
	      this._open = roomData.getOpen().getValue();
	      this._visible = roomData.getVisible().getValue();
	      this._maxPlayerCount = roomData.getMaxMembers();
	      this._masterActorId = roomData.getMasterActorId();
	      this._expectedUserIds = roomData.getExpectMembersList();
	      this._players = {};
	      roomData.getMembersList().forEach(function (member) {
	        var player = new Player(_this10);
	        player._init(member);
	        _this10._players[player.actorId] = player;
	        if (player._userId === _this10._client._userId) {
	          _this10._player = player;
	        }
	      });
	      // 属性
	      if (roomData.getAttr()) {
	        this._properties = deserializeObject(roomData.getAttr());
	      } else {
	        this._properties = {};
	      }
	    }

	    /**
	       * 房间名称
	       * @type {String}
	       * @readonly
	       */ }, { key: 'getPlayer',



































































	    /**
	                                  * 根据 actorId 获取 Player 对象
	                                  * @param {Number} actorId 玩家在房间中的 Id
	                                  * @return {Player}
	                                  */value: function getPlayer(
	    actorId) {
	      if (typeof actorId !== 'number') {
	        throw new TypeError(actorId + ' is not a number');
	      }
	      if (actorId === 0) return null;
	      var player = this._players[actorId];
	      if (player === null) {
	        throw new Error('player with id:' + actorId + ' not found');
	      }
	      return player;
	    }

	    /**
	       * 获取房间内的玩家列表
	       * @type {Array.<Player>}
	       * @readonly
	       */ }, { key: 'setCustomProperties',




	    /**
	                                            * 设置房间的自定义属性
	                                            * @param {Object} properties 自定义属性
	                                            * @param {Object} [opts] 设置选项
	                                            * @param {Object} [opts.expectedValues] 期望属性，用于 CAS 检测
	                                            */value: function setCustomProperties(
	    properties) {var _this11 = this;var _ref21 = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},_ref21$expectedValues = _ref21.expectedValues,expectedValues = _ref21$expectedValues === undefined ? null : _ref21$expectedValues;
	      if ((typeof properties === 'undefined' ? 'undefined' : _typeof(properties)) !== 'object') {
	        throw new TypeError(properties + ' is not an object');
	      }
	      if (expectedValues && (typeof expectedValues === 'undefined' ? 'undefined' : _typeof(expectedValues)) !== 'object') {
	        throw new TypeError(expectedValues + ' is not an object');
	      }
	      if (!this._fsm.is('game')) {
	        throw new PlayError(
	        PlayErrorCode.STATE_ERROR, 'Error state: ' +
	        this._fsm.state);

	      }
	      return this._gameConn.
	      setRoomCustomProperties(properties, expectedValues).
	      then(
	      tap(function (res) {var
	        attr = res.attr;
	        if (attr) {
	          // 如果属性没变化，服务端则不会下发 attr 属性
	          _this11._mergeProperties(attr);
	        }
	      }));

	    } }, { key: 'setPlayerProperties', value: function setPlayerProperties(

	    actorId, properties, expectedValues) {
	      if (typeof actorId !== 'number') {
	        throw new TypeError(actorId + ' is not a number');
	      }
	      if ((typeof properties === 'undefined' ? 'undefined' : _typeof(properties)) !== 'object') {
	        throw new TypeError(properties + ' is not an object');
	      }
	      if (expectedValues && (typeof expectedValues === 'undefined' ? 'undefined' : _typeof(expectedValues)) !== 'object') {
	        throw new TypeError(expectedValues + ' is not an object');
	      }
	      if (!this._fsm.is('game')) {
	        throw new PlayError(
	        PlayErrorCode.STATE_ERROR, 'Error state: ' +
	        this._fsm.state);

	      }
	      return this._gameConn.setPlayerCustomProperties(
	      actorId,
	      properties,
	      expectedValues);

	    }

	    /**
	       * 踢人
	       * @param {Number} actorId 踢用户的 actorId
	       * @param {Object} [opts] 附带参数
	       * @param {Number} [opts.code] 编码
	       * @param {String} [opts.msg] 附带信息
	       */ }, { key: 'kickPlayer', value: function kickPlayer(
	    actorId) {var _this12 = this;var _ref22 = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},_ref22$code = _ref22.code,code = _ref22$code === undefined ? null : _ref22$code,_ref22$msg = _ref22.msg,msg = _ref22$msg === undefined ? null : _ref22$msg;
	      if (typeof actorId !== 'number') {
	        throw new TypeError(actorId + ' is not a number');
	      }
	      if (code && typeof code !== 'number') {
	        throw new TypeError(code + ' is not a number');
	      }
	      if (msg && typeof msg !== 'string') {
	        throw new TypeError(msg + ' is not a string');
	      }
	      if (!this._fsm.is('game')) {
	        throw new PlayError(
	        PlayErrorCode.STATE_ERROR, 'Error state: ' +
	        this._fsm.state);

	      }
	      return this._gameConn.kickPlayer(actorId, code, msg).then(
	      tap(function (aId) {
	        _this12._removePlayer(aId);
	      }));

	    } }, { key: 'pauseMessageQueue', value: function pauseMessageQueue()

	    {
	      if (!this._fsm.is('game')) {
	        throw new PlayError(
	        PlayErrorCode.STATE_ERROR, 'Error state: ' +
	        this._fsm.state);

	      }
	      this._gameConn._pauseMessageQueue();
	    } }, { key: 'resumeMessageQueue', value: function resumeMessageQueue()

	    {
	      if (!this._fsm.is('game')) {
	        throw new PlayError(
	        PlayErrorCode.STATE_ERROR, 'Error state: ' +
	        this._fsm.state);

	      }
	      this._gameConn._resumeMessageQueue();
	    } }, { key: '_addPlayer', value: function _addPlayer(

	    newPlayer) {
	      if (!(newPlayer instanceof Player)) {
	        throw new TypeError(newPlayer + ' is not a Player');
	      }
	      this._players[newPlayer.actorId] = newPlayer;
	    } }, { key: '_removePlayer', value: function _removePlayer(

	    actorId) {
	      delete this._players[actorId];
	    } }, { key: '_mergeProperties', value: function _mergeProperties(

	    changedProperties) {
	      this._properties = _Object$assign(this._properties, changedProperties);
	    } }, { key: '_mergeSystemProps', value: function _mergeSystemProps(

	    changedProps) {var
	      open = changedProps.open,visible = changedProps.visible,maxPlayerCount = changedProps.maxPlayerCount,expectedUserIds = changedProps.expectedUserIds;
	      if (open !== undefined) {
	        this._open = open;
	      }
	      if (visible !== undefined) {
	        this._visible = visible;
	      }
	      if (maxPlayerCount !== undefined) {
	        this._maxPlayerCount = maxPlayerCount;
	      }
	      if (expectedUserIds !== undefined) {
	        this._expectedUserIds = expectedUserIds;
	      }
	    } }, { key: '_simulateDisconnection', value: function _simulateDisconnection()

	    {
	      return this._gameConn._simulateDisconnection();
	    } }, { key: 'name', get: function get() {return this._name;} /**
	                                                                  * 房间是否开启
	                                                                  * @type {Boolean}
	                                                                  * @readonly
	                                                                  */ }, { key: 'open', get: function get() {return this._open;} /**
	                                                                                                                                 * 房间是否可见
	                                                                                                                                 * @type {Boolean}
	                                                                                                                                 * @readonly
	                                                                                                                                 */ }, { key: 'visible', get: function get() {return this._visible;} /**
	                                                                                                                                                                                                      * 房间允许的最大玩家数量
	                                                                                                                                                                                                      * @type {Number}
	                                                                                                                                                                                                      * @readonly
	                                                                                                                                                                                                      */ }, { key: 'maxPlayerCount', get: function get() {return this._maxPlayerCount;} /**
	                                                                                                                                                                                                                                                                                         * 获取房主
	                                                                                                                                                                                                                                                                                         * @type {Player}
	                                                                                                                                                                                                                                                                                         * @readonly
	                                                                                                                                                                                                                                                                                         */ }, { key: 'master', get: function get() {return this.getPlayer(this.masterId);} /**
	                                                                                                                                                                                                                                                                                                                                                                             * 房间主机玩家 ID
	                                                                                                                                                                                                                                                                                                                                                                             * @type {Number}
	                                                                                                                                                                                                                                                                                                                                                                             * @readonly
	                                                                                                                                                                                                                                                                                                                                                                             */ }, { key: 'masterId', get: function get() {return this._masterActorId;} /**
	                                                                                                                                                                                                                                                                                                                                                                                                                                                         * 邀请的好友 ID 列表
	                                                                                                                                                                                                                                                                                                                                                                                                                                                         * @type {Array.<String>}
	                                                                                                                                                                                                                                                                                                                                                                                                                                                         * @readonly
	                                                                                                                                                                                                                                                                                                                                                                                                                                                         */ }, { key: 'expectedUserIds', get: function get() {return this._expectedUserIds;} /**
	                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              * 获取自定义属性
	                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              * @type {Object}
	                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              * @readonly
	                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              */ }, { key: 'customProperties', get: function get() {return this._properties;} }, { key: 'playerList', get: function get() {return _Object$values(this._players);} }]);return Room;}();

	/**
	                                                                                                                                  * 大厅房间数据类
	                                                                                                                                  */var
	LobbyRoom = function () {function LobbyRoom() {_classCallCheck(this, LobbyRoom);}_createClass(LobbyRoom, [{ key: "roomName",
	    /**
	                                                                                                                              * 房间名称
	                                                                                                                              * @type {String}
	                                                                                                                              * @readonly
	                                                                                                                              */get: function get()
	    {
	      return this._roomName;
	    }

	    /**
	       * 房间最大玩家数
	       * @type {Number}
	       * @readonly
	       */ }, { key: "maxPlayerCount", get: function get()
	    {
	      return this._maxPlayerCount;
	    }

	    /**
	       * 邀请好友 ID 数组
	       * @type {Array.<String>}
	       * @readonly
	       */ }, { key: "expectedUserIds", get: function get()
	    {
	      return this._expectedUserIds;
	    }

	    /**
	       * 房间置空后销毁时间（秒）
	       * @type {Number}
	       * @readonly
	       */ }, { key: "emptyRoomTtl", get: function get()
	    {
	      return this._emptyRoomTtl;
	    }

	    /**
	       * 玩家离线后踢出房间时间（秒）
	       * @type {Number}
	       * @readonly
	       */ }, { key: "playerTtl", get: function get()
	    {
	      return this._playerTtl;
	    }

	    /**
	       * 当前房间玩家数量
	       * @type {Number}
	       * @readonly
	       */ }, { key: "playerCount", get: function get()
	    {
	      return this._playerCount;
	    }

	    /**
	       * 房间属性
	       * @type {Object}
	       * @readonly
	       */ }, { key: "customRoomProperties", get: function get()
	    {
	      return this._customRoomProperties;
	    }

	    /**
	       * 房间是否可见
	       * @type {Boolean}
	       * @readonly
	       */ }, { key: "visible", get: function get()
	    {
	      return this._visible === true;
	    }

	    /**
	       * 房间是否开启
	       * @type {Boolean}
	       * @readonly
	       */ }, { key: "open", get: function get()
	    {
	      return this._open === true;
	    } }]);return LobbyRoom;}();

	var _proto$game_protobuf_ =





	messages_pb.game_protobuf_messages.proto.messages,CommandType = _proto$game_protobuf_.CommandType,OpType = _proto$game_protobuf_.OpType,RequestMessage = _proto$game_protobuf_.RequestMessage;

	var LOBBY_KEEPALIVE_DURATION = 120000;

	// 大厅连接抛出的事件
	var ROOM_LIST_UPDATED_EVENT = 'ROOM_LIST_UPDATED_EVENT';

	function convertToLobbyRoom(roomOptions) {
	  var lobbyRoom = new LobbyRoom();
	  lobbyRoom._roomName = roomOptions.getCid();
	  lobbyRoom._visible = roomOptions.getVisible();
	  lobbyRoom._open = roomOptions.getOpen();
	  lobbyRoom._maxPlayerCount = roomOptions.getMaxMembers();
	  lobbyRoom._expectedUserIds = roomOptions.getExpectMembersList();
	  lobbyRoom._emptyRoomTtl = roomOptions.getEmptyRoomTtl();
	  lobbyRoom._playerTtl = roomOptions.getPlayerTtl();
	  lobbyRoom._playerCount = roomOptions.getMemberCount();
	  lobbyRoom._customRoomProperties = deserializeObject(roomOptions.getAttr());
	  return lobbyRoom;
	}

	/* eslint class-methods-use-this: ["error", { "exceptMethods": ["_getPingDuration", "_getFastOpenUrl"] }] */var
	LobbyConnection = function (_Connection) {_inherits(LobbyConnection, _Connection);
	  function LobbyConnection() {_classCallCheck(this, LobbyConnection);var _this = _possibleConstructorReturn(this, (LobbyConnection.__proto__ || _Object$getPrototypeOf(LobbyConnection)).call(this));

	    _this._flag = 'lobby';return _this;
	  }_createClass(LobbyConnection, [{ key: 'joinLobby', value: function () {var _ref = _asyncToGenerator( /*#__PURE__*/regenerator.mark(function _callee() {var req;return regenerator.wrap(function _callee$(_context) {while (1) {switch (_context.prev = _context.next) {case 0:if (


	                this._fsm.is('connected')) {_context.next = 2;break;}throw (
	                  new PlayError(
	                  PlayErrorCode.STATE_ERROR, 'Error state: ' +
	                  this._fsm.state));case 2:


	                req = new RequestMessage();_context.next = 5;return _get(LobbyConnection.prototype.__proto__ || _Object$getPrototypeOf(LobbyConnection.prototype), 'sendRequest', this).call(this,
	                CommandType.LOBBY, OpType.ADD, req);case 5:case 'end':return _context.stop();}}}, _callee, this);}));function joinLobby() {return _ref.apply(this, arguments);}return joinLobby;}() }, { key: 'leaveLobby', value: function () {var _ref2 = _asyncToGenerator( /*#__PURE__*/regenerator.mark(function _callee2() {var req;return regenerator.wrap(function _callee2$(_context2) {while (1) {switch (_context2.prev = _context2.next) {case 0:if (



	                this._fsm.is('connected')) {_context2.next = 2;break;}throw (
	                  new PlayError(
	                  PlayErrorCode.STATE_ERROR, 'Error state: ' +
	                  this._fsm.state));case 2:


	                req = new RequestMessage();_context2.next = 5;return _get(LobbyConnection.prototype.__proto__ || _Object$getPrototypeOf(LobbyConnection.prototype), 'sendRequest', this).call(this,
	                CommandType.LOBBY, OpType.REMOVE, req);case 5:case 'end':return _context2.stop();}}}, _callee2, this);}));function leaveLobby() {return _ref2.apply(this, arguments);}return leaveLobby;}() }, { key: '_getFastOpenUrl', value: function _getFastOpenUrl(


	    server, appId, gameVersion, userId, sessionToken) {
	      var queries = {
	        appId: appId,
	        sdkVersion: version,
	        protocolVersion: protocolVersion,
	        gameVersion: gameVersion,
	        userId: userId,
	        sessionToken: sessionToken };

	      return urlJoin(
	      server,
	      '/1/multiplayer/lobby/websocket', '?' +
	      queryString.stringify(queries));

	    } }, { key: '_getPingDuration', value: function _getPingDuration()

	    {
	      return LOBBY_KEEPALIVE_DURATION;
	    }

	    // 处理被动通知消息
	  }, { key: '_handleNotification', value: function _handleNotification(cmd, op, body) {
	      switch (cmd) {
	        case CommandType.LOBBY:
	          switch (op) {
	            case OpType.ROOM_LIST:
	              this._handleRoomListMsg(body);
	              break;
	            default:
	              _get(LobbyConnection.prototype.__proto__ || _Object$getPrototypeOf(LobbyConnection.prototype), '_handleUnknownMsg', this).call(this, cmd, op, body);
	              break;}

	          break;
	        case CommandType.STATISTIC:
	          // 目前不作处理
	          break;
	        case CommandType.ERROR:
	          _get(LobbyConnection.prototype.__proto__ || _Object$getPrototypeOf(LobbyConnection.prototype), '_handleErrorNotify', this).call(this, body.getError());
	          break;
	        default:
	          _get(LobbyConnection.prototype.__proto__ || _Object$getPrototypeOf(LobbyConnection.prototype), '_handleUnknownMsg', this).call(this, cmd, op, body);
	          break;}

	    } }, { key: '_handleRoomListMsg', value: function _handleRoomListMsg(

	    body) {
	      var roomList = [];
	      var list = body.getRoomList().getListList();
	      list.forEach(function (roomOptions) {
	        var lobbyRoom = convertToLobbyRoom(roomOptions);
	        roomList.push(lobbyRoom);
	      });
	      this.emit(ROOM_LIST_UPDATED_EVENT, roomList);
	    } }]);return LobbyConnection;}(Connection);

	/**
	                                   * 大厅类，用来请求和接收大厅相关事件
	                                   */var
	Lobby = function () {
	  function Lobby(client) {var _this = this;_classCallCheck(this, Lobby);
	    this._client = client;
	    this._fsm = new StateMachine({
	      init: 'init',
	      final: 'closed',
	      transitions: [
	      { name: 'join', from: 'init', to: 'joining' },
	      { name: 'joined', from: 'joining', to: 'lobby' },
	      { name: 'joinFailed', from: 'joining', to: 'init' },
	      { name: 'leave', from: 'lobby', to: 'leaving' },
	      {
	        name: 'close',
	        from: ['init', 'joining', 'lobby', 'leaving'],
	        to: 'closed' }],


	      methods: {
	        onEnterLobby: function onEnterLobby() {
	          _this._lobbyConn.on(ROOM_LIST_UPDATED_EVENT, function (roomList) {
	            // 房间列表更新
	            _this._lobbyRoomList = roomList;
	            _this._client.emit(Event.LOBBY_ROOM_LIST_UPDATED);
	          });
	        },
	        onExitLobby: function onExitLobby() {
	          _this._lobbyConn.removeAllListeners();
	        } } });


	  }_createClass(Lobby, [{ key: 'join', value: function () {var _ref = _asyncToGenerator( /*#__PURE__*/regenerator.mark(function _callee() {var lobbyInfo, _lobbyService, _lobbyInfo, url, sessionToken, _client, _appId, _gameVersion, _userId, lobbyUrl;return regenerator.wrap(function _callee$(_context) {while (1) {switch (_context.prev = _context.next) {case 0:if (!


	                this._fsm.cannot('join')) {_context.next = 2;break;}throw (
	                  new PlayError(
	                  PlayErrorCode.STATE_ERROR, 'Error state: ' +
	                  this._fsm.state));case 2:


	                this._fsm.join();
	                lobbyInfo = null;_context.prev = 4;

	                _lobbyService = this._client._lobbyService;_context.next = 8;return (
	                  _lobbyService.authorize());case 8:lobbyInfo = _context.sent;_context.next = 15;break;case 11:_context.prev = 11;_context.t0 = _context['catch'](4);

	                this._fsm.joinFailed();throw _context.t0;case 15:_context.prev = 15;_lobbyInfo =



	                lobbyInfo, url = _lobbyInfo.url, sessionToken = _lobbyInfo.sessionToken;_client =
	                this._client, _appId = _client._appId, _gameVersion = _client._gameVersion, _userId = _client._userId;
	                this._lobbyConn = new LobbyConnection();
	                // 微信小程序不支持使用 http 协议构造 WebSocket
	                lobbyUrl = url.
	                replace('https://', 'wss://').
	                replace('http://', 'ws://');
	                debug('lobby url: ' + lobbyUrl);_context.next = 23;return (
	                  this._lobbyConn.connect(
	                  _appId,
	                  lobbyUrl,
	                  _gameVersion,
	                  _userId,
	                  sessionToken));case 23:_context.next = 25;return (

	                  this._lobbyConn.joinLobby());case 25:
	                this._fsm.joined();_context.next = 35;break;case 28:_context.prev = 28;_context.t1 = _context['catch'](15);if (!

	                this._lobbyConn) {_context.next = 33;break;}_context.next = 33;return (
	                  this._lobbyConn.close());case 33:

	                this._fsm.joinFailed();throw _context.t1;case 35:case 'end':return _context.stop();}}}, _callee, this, [[4, 11], [15, 28]]);}));function join() {return _ref.apply(this, arguments);}return join;}() }, { key: 'leave', value: function () {var _ref2 = _asyncToGenerator( /*#__PURE__*/regenerator.mark(function _callee2() {return regenerator.wrap(function _callee2$(_context2) {while (1) {switch (_context2.prev = _context2.next) {case 0:_context2.prev = 0;_context2.next = 3;return (






	                  this._lobbyConn.leaveLobby());case 3:_context2.prev = 3;_context2.next = 6;return (

	                  this._lobbyConn.close());case 6:return _context2.finish(3);case 7:case 'end':return _context2.stop();}}}, _callee2, this, [[0,, 3, 7]]);}));function leave() {return _ref2.apply(this, arguments);}return leave;}() }, { key: 'close', value: function () {var _ref3 = _asyncToGenerator( /*#__PURE__*/regenerator.mark(function _callee3() {return regenerator.wrap(function _callee3$(_context3) {while (1) {switch (_context3.prev = _context3.next) {case 0:if (!




	                this._fsm.can('close')) {_context3.next = 3;break;}_context3.next = 3;return (
	                  this._lobbyConn.close());case 3:case 'end':return _context3.stop();}}}, _callee3, this);}));function close() {return _ref3.apply(this, arguments);}return close;}() }]);return Lobby;}();

	var DEFAULT_GAME_VERSION = '0.0.1';

	function isInternationalApp(appId) {
	  var suffix = appId.slice(-9);
	  return suffix === '-MdYXbMMI';
	}

	/**
	   * 多人对战游戏服务的客户端
	   * @param {Object} opts
	   * @param {String} opts.userId 玩家唯一 Id
	   * @param {String} opts.appId APP ID
	   * @param {String} opts.appKey APP KEY
	   * @param {Boolean} [opts.ssl] 是否使用 ssl，仅在 Client Engine 中可用
	   * @param {String} [opts.gameVersion] 游戏版本号
	   * @param {String} [opts.playServer] 路由地址
	   */var Client = function (_EventEmitter) {_inherits(Client, _EventEmitter);
	  function Client(opts) {_classCallCheck(this, Client);var _this = _possibleConstructorReturn(this, (Client.__proto__ || _Object$getPrototypeOf(Client)).call(this));

	    if (!(typeof opts.appId === 'string')) {
	      throw new TypeError(opts.appId + ' is not a string');
	    }
	    if (!(typeof opts.appKey === 'string')) {
	      throw new TypeError(opts.appKey + ' is not a string');
	    }
	    if (!(typeof opts.userId === 'string')) {
	      throw new TypeError(opts.userId + ' is not a string');
	    }
	    if (opts.feature !== undefined && !(typeof opts.feature === 'string')) {
	      throw new TypeError(opts.feature + ' is not a string');
	    }
	    if (opts.ssl !== undefined && !(typeof opts.ssl === 'boolean')) {
	      throw new TypeError(opts.ssl + ' is not a boolean');
	    }
	    if (
	    opts.gameVersion !== undefined &&
	    !(typeof opts.gameVersion === 'string'))
	    {
	      throw new TypeError(opts.gameVersion + ' is not a string');
	    }
	    if (
	    opts.playServer !== undefined &&
	    !(typeof opts.playServer === 'string'))
	    {
	      throw new TypeError(opts.playServer + ' is not a string');
	    }
	    if (opts.playServer === undefined && !isInternationalApp(opts.appId)) {
	      throw new Error('Please init with your server url.');
	    }
	    _this._userId = opts.userId;
	    _this._appId = opts.appId;
	    _this._appKey = opts.appKey;
	    _this._feature = opts.feature;
	    if (opts.ssl === false) {
	      _this._insecure = true;
	    }
	    if (opts.gameVersion) {
	      _this._gameVersion = opts.gameVersion;
	    } else {
	      _this._gameVersion = DEFAULT_GAME_VERSION;
	    }
	    _this._playServer = opts.playServer;return _this;
	  }

	  /**
	     * 建立连接
	     */_createClass(Client, [{ key: 'connect', value: function connect()
	    {
	      this._lobbyService = new LobbyService(this);
	      return this._lobbyService.authorize();
	    }

	    /**
	       * 重新连接
	       */ }, { key: 'reconnect', value: function () {var _ref = _asyncToGenerator( /*#__PURE__*/regenerator.mark(function _callee() {return regenerator.wrap(function _callee$(_context) {while (1) {switch (_context.prev = _context.next) {case 0:return _context.abrupt('return',

	                this._lobbyService.authorize());case 1:case 'end':return _context.stop();}}}, _callee, this);}));function reconnect() {return _ref.apply(this, arguments);}return reconnect;}()


	    /**
	                                                                                                                                                                                                 * 重新连接并自动加入房间
	                                                                                                                                                                                                 */ }, { key: 'reconnectAndRejoin', value: function () {var _ref2 = _asyncToGenerator( /*#__PURE__*/regenerator.mark(function _callee2() {return regenerator.wrap(function _callee2$(_context2) {while (1) {switch (_context2.prev = _context2.next) {case 0:if (

	                this.room) {_context2.next = 2;break;}throw (
	                  new Error('You have no room.'));case 2:return _context2.abrupt('return',

	                this.rejoinRoom(this.room.name));case 3:case 'end':return _context2.stop();}}}, _callee2, this);}));function reconnectAndRejoin() {return _ref2.apply(this, arguments);}return reconnectAndRejoin;}()


	    /**
	                                                                                                                                                                                                                       * 关闭
	                                                                                                                                                                                                                       */ }, { key: 'close', value: function () {var _ref3 = _asyncToGenerator( /*#__PURE__*/regenerator.mark(function _callee3() {return regenerator.wrap(function _callee3$(_context3) {while (1) {switch (_context3.prev = _context3.next) {case 0:if (!

	                this._lobby) {_context3.next = 3;break;}_context3.next = 3;return (
	                  this._lobby.close());case 3:if (!

	                this.room) {_context3.next = 6;break;}_context3.next = 6;return (
	                  this.room.close());case 6:

	                this._clear();case 7:case 'end':return _context3.stop();}}}, _callee3, this);}));function close() {return _ref3.apply(this, arguments);}return close;}()


	    /**
	                                                                                                                                                                          * 加入大厅
	                                                                                                                                                                          */ }, { key: 'joinLobby', value: function joinLobby()
	    {
	      if (this._lobby) {
	        // 已经存在 Lobby 对象
	        throw new Error('You are already in lobby.');
	      }
	      this._lobby = new Lobby(this);
	      return this._lobby.join();
	    }

	    /**
	       * 离开大厅
	       */ }, { key: 'leaveLobby', value: function leaveLobby()
	    {
	      if (!this._lobby) {
	        // 不存在 Lobby 对象
	        throw new Error('You are not in lobby yet');
	      }
	      return this._lobby.leave();
	    }

	    /**
	       * 创建房间
	       * @param {Object} [opts] 创建房间选项
	       * @param {String} [opts.roomName] 房间名称，在整个游戏中唯一，默认值为 null，则由服务端分配一个唯一 Id
	       * @param {Object} [opts.roomOptions] 创建房间选项，默认值为 null
	       * @param {Boolean} [opts.roomOptions.open] 房间是否打开
	       * @param {Boolean} [opts.roomOptions.visible] 房间是否可见，只有「可见」的房间会出现在房间列表里
	       * @param {Number} [opts.roomOptions.emptyRoomTtl] 房间为空后，延迟销毁的时间
	       * @param {Number} [opts.roomOptions.playerTtl] 玩家掉线后，延迟销毁的时间
	       * @param {Number} [opts.roomOptions.maxPlayerCount] 最大玩家数量
	       * @param {Object} [opts.roomOptions.customRoomProperties] 自定义房间属性
	       * @param {Array.<String>} [opts.roomOptions.customRoomPropertyKeysForLobby] 在大厅中可获得的房间属性「键」数组
	       * @param {CreateRoomFlag} [opts.roomOptions.flag] 创建房间标记，可多选
	       * @param {Array.<String>} [opts.expectedUserIds] 邀请好友 ID 数组，默认值为 null
	       */ }, { key: 'createRoom', value: function () {var _ref4 = _asyncToGenerator( /*#__PURE__*/regenerator.mark(function _callee4() {var _ref5 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] :




	        {},_ref5$roomName = _ref5.roomName,roomName = _ref5$roomName === undefined ? null : _ref5$roomName,_ref5$roomOptions = _ref5.roomOptions,roomOptions = _ref5$roomOptions === undefined ? null : _ref5$roomOptions,_ref5$expectedUserIds = _ref5.expectedUserIds,expectedUserIds = _ref5$expectedUserIds === undefined ? null : _ref5$expectedUserIds;return regenerator.wrap(function _callee4$(_context4) {while (1) {switch (_context4.prev = _context4.next) {case 0:if (!
	                this.room) {_context4.next = 2;break;}throw (

	                  new Error('You are already in room.'));case 2:

	                if (this._lobby) {
	                  this._lobby.close();
	                }
	                this._room = new Room(this);_context4.next = 6;return (
	                  this.room.create(roomName, roomOptions, expectedUserIds));case 6:return _context4.abrupt('return',
	                this.room);case 7:case 'end':return _context4.stop();}}}, _callee4, this);}));function createRoom() {return _ref4.apply(this, arguments);}return createRoom;}()


	    /**
	                                                                                                                                                                                 * 加入房间sss
	                                                                                                                                                                                 * @param {String} roomName 房间名称
	                                                                                                                                                                                 * @param {*} [expectedUserIds] 邀请好友 ID 数组，默认值为 null
	                                                                                                                                                                                 */ }, { key: 'joinRoom', value: function () {var _ref6 = _asyncToGenerator( /*#__PURE__*/regenerator.mark(function _callee5(
	      roomName) {var _ref7 = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},_ref7$expectedUserIds = _ref7.expectedUserIds,expectedUserIds = _ref7$expectedUserIds === undefined ? null : _ref7$expectedUserIds;return regenerator.wrap(function _callee5$(_context5) {while (1) {switch (_context5.prev = _context5.next) {case 0:if (!
	                this.room) {_context5.next = 2;break;}throw (

	                  new Error('You are already in room.'));case 2:

	                if (this._lobby) {
	                  this._lobby.close();
	                }
	                this._room = new Room(this);_context5.next = 6;return (
	                  this.room.join(roomName, expectedUserIds));case 6:return _context5.abrupt('return',
	                this.room);case 7:case 'end':return _context5.stop();}}}, _callee5, this);}));function joinRoom(_x3) {return _ref6.apply(this, arguments);}return joinRoom;}()


	    /**
	                                                                                                                                                                                * 重新加入房间
	                                                                                                                                                                                * @param {String} roomName 房间名称
	                                                                                                                                                                                */ }, { key: 'rejoinRoom', value: function () {var _ref8 = _asyncToGenerator( /*#__PURE__*/regenerator.mark(function _callee6(
	      roomName) {return regenerator.wrap(function _callee6$(_context6) {while (1) {switch (_context6.prev = _context6.next) {case 0:
	                if (this._lobby) {
	                  this._lobby.close();
	                }
	                this._room = new Room(this);_context6.next = 4;return (
	                  this.room.rejoin(roomName));case 4:return _context6.abrupt('return',
	                this.room);case 5:case 'end':return _context6.stop();}}}, _callee6, this);}));function rejoinRoom(_x4) {return _ref8.apply(this, arguments);}return rejoinRoom;}()


	    /**
	                                                                                                                                                                                    * 随机加入或创建房间
	                                                                                                                                                                                    * @param {String} roomName 房间名称
	                                                                                                                                                                                    * @param {Object} [opts] 创建房间选项
	                                                                                                                                                                                    * @param {Object} [opts.roomOptions] 创建房间选项，默认值为 null
	                                                                                                                                                                                    * @param {Boolean} [opts.roomOptions.open] 房间是否打开
	                                                                                                                                                                                    * @param {Boolean} [opts.roomOptions.visible] 房间是否可见，只有「可见」的房间会出现在房间列表里
	                                                                                                                                                                                    * @param {Number} [opts.roomOptions.emptyRoomTtl] 房间为空后，延迟销毁的时间
	                                                                                                                                                                                    * @param {Number} [opts.roomOptions.playerTtl] 玩家掉线后，延迟销毁的时间
	                                                                                                                                                                                    * @param {Number} [opts.roomOptions.maxPlayerCount] 最大玩家数量
	                                                                                                                                                                                    * @param {Object} [opts.roomOptions.customRoomProperties] 自定义房间属性
	                                                                                                                                                                                    * @param {Array.<String>} [opts.roomOptions.customRoomPropertyKeysForLobby] 在大厅中可获得的房间属性「键」数组
	                                                                                                                                                                                    * @param {CreateRoomFlag} [opts.roomOptions.flag] 创建房间标记，可多选
	                                                                                                                                                                                    * @param {Array.<String>} [opts.expectedUserIds] 邀请好友 ID 数组，默认值为 null
	                                                                                                                                                                                    */ }, { key: 'joinOrCreateRoom', value: function () {var _ref9 = _asyncToGenerator( /*#__PURE__*/regenerator.mark(function _callee7(

	      roomName) {var _ref10 = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] :
	        {},_ref10$roomOptions = _ref10.roomOptions,roomOptions = _ref10$roomOptions === undefined ? null : _ref10$roomOptions,_ref10$expectedUserId = _ref10.expectedUserIds,expectedUserIds = _ref10$expectedUserId === undefined ? null : _ref10$expectedUserId;return regenerator.wrap(function _callee7$(_context7) {while (1) {switch (_context7.prev = _context7.next) {case 0:if (!

	                this.room) {_context7.next = 2;break;}throw (

	                  new Error('You are already in room.'));case 2:

	                if (this._lobby) {
	                  this._lobby.close();
	                }
	                this._room = new Room(this);_context7.next = 6;return (
	                  this.room.joinOrCreate(roomName, roomOptions, expectedUserIds));case 6:return _context7.abrupt('return',
	                this.room);case 7:case 'end':return _context7.stop();}}}, _callee7, this);}));function joinOrCreateRoom(_x6) {return _ref9.apply(this, arguments);}return joinOrCreateRoom;}()


	    /**
	                                                                                                                                                                                                * 随机加入房间
	                                                                                                                                                                                                * @param {Object} [opts] 随机加入房间选项
	                                                                                                                                                                                                * @param {Object} [opts.matchProperties] 匹配属性，默认值为 null
	                                                                                                                                                                                                */ }, { key: 'joinRandomRoom', value: function () {var _ref11 = _asyncToGenerator( /*#__PURE__*/regenerator.mark(function _callee8() {var _ref12 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] :



	        {},_ref12$matchPropertie = _ref12.matchProperties,matchProperties = _ref12$matchPropertie === undefined ? null : _ref12$matchPropertie,_ref12$expectedUserId = _ref12.expectedUserIds,expectedUserIds = _ref12$expectedUserId === undefined ? null : _ref12$expectedUserId;return regenerator.wrap(function _callee8$(_context8) {while (1) {switch (_context8.prev = _context8.next) {case 0:if (!
	                this.room) {_context8.next = 2;break;}throw (

	                  new Error('You are already in room.'));case 2:

	                if (this._lobby) {
	                  this._lobby.close();
	                }
	                this._room = new Room(this);_context8.next = 6;return (
	                  this.room.joinRandom(matchProperties, expectedUserIds));case 6:return _context8.abrupt('return',
	                this.room);case 7:case 'end':return _context8.stop();}}}, _callee8, this);}));function joinRandomRoom() {return _ref11.apply(this, arguments);}return joinRandomRoom;}()


	    /**
	                                                                                                                                                                                          * 随机匹配，匹配成功后并不加入房间，而是返回房间 id
	                                                                                                                                                                                          * @param {Object} [opts] 随机加入房间选项
	                                                                                                                                                                                          * @param {Object} [opts.matchProperties] 匹配属性，默认值为 null
	                                                                                                                                                                                          */ }, { key: 'matchRandom', value: function matchRandom(

	    piggybackPeerId)

	    {var _ref13 = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},_ref13$matchPropertie = _ref13.matchProperties,matchProperties = _ref13$matchPropertie === undefined ? null : _ref13$matchPropertie,_ref13$expectedUserId = _ref13.expectedUserIds,expectedUserIds = _ref13$expectedUserId === undefined ? null : _ref13$expectedUserId;
	      return this._lobbyService.matchRandom(
	      piggybackPeerId,
	      matchProperties,
	      expectedUserIds);

	    }

	    /**
	       * 设置房间开启 / 关闭
	       * @param {Boolean} open 是否开启
	       */ }, { key: 'setRoomOpen', value: function setRoomOpen(
	    open) {
	      if (!this.room) {
	        throw new Error('You are not in room yet.');
	      }
	      return this.room.setOpen(open);
	    }

	    /**
	       * 设置房间可见 / 不可见
	       * @param {Boolean} visible 是否可见
	       */ }, { key: 'setRoomVisible', value: function setRoomVisible(
	    visible) {
	      if (!this.room) {
	        throw new Error('You are not in room yet.');
	      }
	      return this.room.setVisible(visible);
	    }

	    /**
	       * 设置房间允许的最大玩家数量
	       * @param {*} count 数量
	       */ }, { key: 'setRoomMaxPlayerCount', value: function setRoomMaxPlayerCount(
	    count) {
	      if (!this.room) {
	        throw new Error('You are not in room yet.');
	      }
	      return this.room.setMaxPlayerCount(count);
	    }

	    /**
	       * 设置房间占位玩家 Id 列表
	       * @param {*} expectedUserIds 玩家 Id 列表
	       */ }, { key: 'setRoomExpectedUserIds', value: function setRoomExpectedUserIds(
	    expectedUserIds) {
	      if (!this.room) {
	        throw new Error('You are not in room yet.');
	      }
	      return this.room.setExpectedUserIds(expectedUserIds);
	    }

	    /**
	       * 清空房间占位玩家 Id 列表
	       */ }, { key: 'clearRoomExpectedUserIds', value: function clearRoomExpectedUserIds()
	    {
	      if (!this.room) {
	        throw new Error('You are not in room yet.');
	      }
	      return this.room.clearExpectedUserIds();
	    }

	    /**
	       * 增加房间占位玩家 Id 列表
	       * @param {*} expectedUserIds 增加的玩家 Id 列表
	       */ }, { key: 'addRoomExpectedUserIds', value: function addRoomExpectedUserIds(
	    expectedUserIds) {
	      if (!this.room) {
	        throw new Error('You are not in room yet.');
	      }
	      return this.room.addExpectedUserIds(expectedUserIds);
	    }

	    /**
	       * 移除房间占位玩家 Id 列表
	       * @param {*} expectedUserIds 移除的玩家 Id 列表
	       */ }, { key: 'removeRoomExpectedUserIds', value: function removeRoomExpectedUserIds(
	    expectedUserIds) {
	      if (!this.room) {
	        throw new Error('You are not in room yet.');
	      }
	      return this.room.removeExpectedUserIds(expectedUserIds);
	    }

	    /**
	       * 设置房主
	       * @param {Number} newMasterId 新房主 ID
	       */ }, { key: 'setMaster', value: function setMaster(
	    newMasterId) {
	      if (!this.room) {
	        throw new Error('You are not in room yet.');
	      }
	      return this.room.setMaster(newMasterId);
	    }

	    /**
	       * 发送自定义消息
	       * @param {Number} eventId 事件 ID
	       * @param {Object} eventData 事件参数
	       * @param {Object} options 发送事件选项
	       * @param {ReceiverGroup} options.receiverGroup 接收组
	       * @param {Array.<Number>} options.targetActorIds 接收者 Id。如果设置，将会覆盖 receiverGroup
	       */ }, { key: 'sendEvent', value: function sendEvent(

	    eventId)


	    {var eventData = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : { receiverGroup: ReceiverGroup.All };
	      if (!this.room) {
	        throw new Error('You are not in room yet.');
	      }
	      return this.room.sendEvent(eventId, eventData, options);
	    }

	    /**
	       * 离开房间
	       */ }, { key: 'leaveRoom', value: function () {var _ref14 = _asyncToGenerator( /*#__PURE__*/regenerator.mark(function _callee9() {return regenerator.wrap(function _callee9$(_context9) {while (1) {switch (_context9.prev = _context9.next) {case 0:if (

	                this.room) {_context9.next = 2;break;}throw (
	                  new Error('You are not in room yet.'));case 2:_context9.next = 4;return (

	                  this.room.leave());case 4:case 'end':return _context9.stop();}}}, _callee9, this);}));function leaveRoom() {return _ref14.apply(this, arguments);}return leaveRoom;}()


	    /**
	                                                                                                                                                                                          * 踢人
	                                                                                                                                                                                          * @param {Number} actorId 踢用户的 actorId
	                                                                                                                                                                                          * @param {Object} [opts] 附带参数
	                                                                                                                                                                                          * @param {Number} [opts.code] 编码
	                                                                                                                                                                                          * @param {String} [opts.msg] 附带信息
	                                                                                                                                                                                          */ }, { key: 'kickPlayer', value: function kickPlayer(
	    actorId) {var _ref15 = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},_ref15$code = _ref15.code,code = _ref15$code === undefined ? null : _ref15$code,_ref15$msg = _ref15.msg,msg = _ref15$msg === undefined ? null : _ref15$msg;
	      if (!this.room) {
	        throw new Error('You are not in room yet.');
	      }
	      return this.room.kickPlayer(actorId, { code: code, msg: msg });
	    }

	    /**
	       * 暂停消息队列处理
	       * @return {void}
	       */ }, { key: 'pauseMessageQueue', value: function pauseMessageQueue()
	    {
	      if (!this.room) {
	        throw new Error('You are not in room yet.');
	      }
	      this.room.pauseMessageQueue();
	    }

	    /**
	       * 恢复消息队列处理
	       * @return {void}
	       */ }, { key: 'resumeMessageQueue', value: function resumeMessageQueue()
	    {
	      if (!this.room) {
	        throw new Error('You are not in room yet.');
	      }
	      this.room.resumeMessageQueue();
	    }

	    /**
	       * 获取当前所在房间
	       * @type {Room}
	       * @readonly
	       */ }, { key: '_clear',




























	    // 清理内存数据
	    value: function _clear() {
	      this.removeAllListeners();
	      this._lobbyRoomList = null;
	      this._masterServer = null;
	      this._gameServer = null;
	      this._lobby = null;
	      this._room = null;
	    }

	    // 模拟断线
	  }, { key: '_simulateDisconnection', value: function _simulateDisconnection() {
	      if (!this.room) {
	        throw new Error('You are not in room yet.');
	      }
	      return this.room._simulateDisconnection();
	    }

	    /**
	       * 获取用户 id
	       * @type {String}
	       * @readonly
	       */ }, { key: 'room', get: function get() {return this._room;} /**
	                                                                      * 获取当前玩家
	                                                                      * @type {Player}
	                                                                      * @readonly
	                                                                      */ }, { key: 'player', get: function get() {if (!this.room) {throw new Error('You are not in room yet.');}return this.room._player;} /**
	                                                                                                                                                                                                            * 获取房间列表
	                                                                                                                                                                                                            * @type {Array.<LobbyRoom>}
	                                                                                                                                                                                                            * @readonly
	                                                                                                                                                                                                            */ }, { key: 'lobbyRoomList', get: function get() {if (!this._lobby) {throw new Error('You are not in lobby yet.');}return this._lobby._lobbyRoomList;} }, { key: 'userId', get: function get() {return this._userId;} }]);return Client;}(eventemitter3);

	/**
	 * 创建房间标识
	 * @readonly
	 * @enum {Number}
	 */
	var CreateRoomFlag = {
	  /**
	                        * Master 掉线后固定 Master
	                        */
	  FixedMaster: 1,
	  /**
	                   * 只允许 Master 设置房间属性
	                   */
	  MasterUpdateRoomProperties: 2 };

	exports.Client = Client;
	exports.CreateRoomFlag = CreateRoomFlag;
	exports.Event = Event;
	exports.LogLevel = LogLevel;
	exports.PlayError = PlayError;
	exports.PlayErrorCode = PlayErrorCode;
	exports.Player = Player;
	exports.ReceiverGroup = ReceiverGroup;
	exports.Room = Room;
	exports.deserializeObject = deserializeObject;
	exports.registerType = registerType;
	exports.serializeObject = serializeObject;
	exports.setAdapters = setAdapters;
	exports.setLogger = setLogger;

	Object.defineProperty(exports, '__esModule', { value: true });

})));
//# sourceMappingURL=play.js.map
