UNPKG

gtfs-rt-bindings

Version:

Parse and serialize GTFS Realtime data encoded as protocol buffers.

9,721 lines 465 kB
/*eslint-disable block-scoped-var, id-length, no-control-regex, no-magic-numbers, no-prototype-builtins, no-redeclare, no-shadow, no-var, sort-vars*/
"use strict";

var $protobuf = require("protobufjs/minimal");

// Common aliases
var $Reader = $protobuf.Reader, $Writer = $protobuf.Writer, $util = $protobuf.util;

// Exported root namespace
var $root = $protobuf.roots["default"] || ($protobuf.roots["default"] = {});

$root.transit_realtime = (function() {

    /**
     * Namespace transit_realtime.
     * @exports transit_realtime
     * @namespace
     */
    var transit_realtime = {};

    transit_realtime.FeedMessage = (function() {

        /**
         * Properties of a FeedMessage.
         * @memberof transit_realtime
         * @interface IFeedMessage
         * @property {transit_realtime.IFeedHeader} header FeedMessage header
         * @property {Array.<transit_realtime.IFeedEntity>|null} [entity] FeedMessage entity
         */

        /**
         * Constructs a new FeedMessage.
         * @memberof transit_realtime
         * @classdesc Represents a FeedMessage.
         * @implements IFeedMessage
         * @constructor
         * @param {transit_realtime.IFeedMessage=} [properties] Properties to set
         */
        function FeedMessage(properties) {
            this.entity = [];
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null)
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * FeedMessage header.
         * @member {transit_realtime.IFeedHeader} header
         * @memberof transit_realtime.FeedMessage
         * @instance
         */
        FeedMessage.prototype.header = null;

        /**
         * FeedMessage entity.
         * @member {Array.<transit_realtime.IFeedEntity>} entity
         * @memberof transit_realtime.FeedMessage
         * @instance
         */
        FeedMessage.prototype.entity = $util.emptyArray;

        /**
         * Creates a new FeedMessage instance using the specified properties.
         * @function create
         * @memberof transit_realtime.FeedMessage
         * @static
         * @param {transit_realtime.IFeedMessage=} [properties] Properties to set
         * @returns {transit_realtime.FeedMessage} FeedMessage instance
         */
        FeedMessage.create = function create(properties) {
            return new FeedMessage(properties);
        };

        /**
         * Encodes the specified FeedMessage message. Does not implicitly {@link transit_realtime.FeedMessage.verify|verify} messages.
         * @function encode
         * @memberof transit_realtime.FeedMessage
         * @static
         * @param {transit_realtime.IFeedMessage} message FeedMessage message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        FeedMessage.encode = function encode(message, writer) {
            if (!writer)
                writer = $Writer.create();
            $root.transit_realtime.FeedHeader.encode(message.header, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim();
            if (message.entity != null && message.entity.length)
                for (var i = 0; i < message.entity.length; ++i)
                    $root.transit_realtime.FeedEntity.encode(message.entity[i], writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim();
            return writer;
        };

        /**
         * Encodes the specified FeedMessage message, length delimited. Does not implicitly {@link transit_realtime.FeedMessage.verify|verify} messages.
         * @function encodeDelimited
         * @memberof transit_realtime.FeedMessage
         * @static
         * @param {transit_realtime.IFeedMessage} message FeedMessage message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        FeedMessage.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer).ldelim();
        };

        /**
         * Decodes a FeedMessage message from the specified reader or buffer.
         * @function decode
         * @memberof transit_realtime.FeedMessage
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {transit_realtime.FeedMessage} FeedMessage
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        FeedMessage.decode = function decode(reader, length, error) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.transit_realtime.FeedMessage();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.header = $root.transit_realtime.FeedHeader.decode(reader, reader.uint32());
                        break;
                    }
                case 2: {
                        if (!(message.entity && message.entity.length))
                            message.entity = [];
                        message.entity.push($root.transit_realtime.FeedEntity.decode(reader, reader.uint32()));
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    break;
                }
            }
            if (!message.hasOwnProperty("header"))
                throw $util.ProtocolError("missing required 'header'", { instance: message });
            return message;
        };

        /**
         * Decodes a FeedMessage message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof transit_realtime.FeedMessage
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {transit_realtime.FeedMessage} FeedMessage
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        FeedMessage.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a FeedMessage message.
         * @function verify
         * @memberof transit_realtime.FeedMessage
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        FeedMessage.verify = function verify(message) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            {
                var error = $root.transit_realtime.FeedHeader.verify(message.header);
                if (error)
                    return "header." + error;
            }
            if (message.entity != null && message.hasOwnProperty("entity")) {
                if (!Array.isArray(message.entity))
                    return "entity: array expected";
                for (var i = 0; i < message.entity.length; ++i) {
                    var error = $root.transit_realtime.FeedEntity.verify(message.entity[i]);
                    if (error)
                        return "entity." + error;
                }
            }
            return null;
        };

        /**
         * Creates a FeedMessage message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof transit_realtime.FeedMessage
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {transit_realtime.FeedMessage} FeedMessage
         */
        FeedMessage.fromObject = function fromObject(object) {
            if (object instanceof $root.transit_realtime.FeedMessage)
                return object;
            var message = new $root.transit_realtime.FeedMessage();
            if (object.header != null) {
                if (typeof object.header !== "object")
                    throw TypeError(".transit_realtime.FeedMessage.header: object expected");
                message.header = $root.transit_realtime.FeedHeader.fromObject(object.header);
            }
            if (object.entity) {
                if (!Array.isArray(object.entity))
                    throw TypeError(".transit_realtime.FeedMessage.entity: array expected");
                message.entity = [];
                for (var i = 0; i < object.entity.length; ++i) {
                    if (typeof object.entity[i] !== "object")
                        throw TypeError(".transit_realtime.FeedMessage.entity: object expected");
                    message.entity[i] = $root.transit_realtime.FeedEntity.fromObject(object.entity[i]);
                }
            }
            return message;
        };

        /**
         * Creates a plain object from a FeedMessage message. Also converts values to other types if specified.
         * @function toObject
         * @memberof transit_realtime.FeedMessage
         * @static
         * @param {transit_realtime.FeedMessage} message FeedMessage
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        FeedMessage.toObject = function toObject(message, options) {
            if (!options)
                options = {};
            var object = {};
            if (options.arrays || options.defaults)
                object.entity = [];
            if (options.defaults)
                object.header = null;
            if (message.header != null && message.hasOwnProperty("header"))
                object.header = $root.transit_realtime.FeedHeader.toObject(message.header, options);
            if (message.entity && message.entity.length) {
                object.entity = [];
                for (var j = 0; j < message.entity.length; ++j)
                    object.entity[j] = $root.transit_realtime.FeedEntity.toObject(message.entity[j], options);
            }
            return object;
        };

        /**
         * Converts this FeedMessage to JSON.
         * @function toJSON
         * @memberof transit_realtime.FeedMessage
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        FeedMessage.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for FeedMessage
         * @function getTypeUrl
         * @memberof transit_realtime.FeedMessage
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        FeedMessage.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/transit_realtime.FeedMessage";
        };

        return FeedMessage;
    })();

    transit_realtime.FeedHeader = (function() {

        /**
         * Properties of a FeedHeader.
         * @memberof transit_realtime
         * @interface IFeedHeader
         * @property {string} gtfs_realtime_version FeedHeader gtfs_realtime_version
         * @property {transit_realtime.FeedHeader.Incrementality|null} [incrementality] FeedHeader incrementality
         * @property {number|null} [timestamp] FeedHeader timestamp
         * @property {string|null} [feed_version] FeedHeader feed_version
         */

        /**
         * Constructs a new FeedHeader.
         * @memberof transit_realtime
         * @classdesc Represents a FeedHeader.
         * @implements IFeedHeader
         * @constructor
         * @param {transit_realtime.IFeedHeader=} [properties] Properties to set
         */
        function FeedHeader(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null)
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * FeedHeader gtfs_realtime_version.
         * @member {string} gtfs_realtime_version
         * @memberof transit_realtime.FeedHeader
         * @instance
         */
        FeedHeader.prototype.gtfs_realtime_version = "";

        /**
         * FeedHeader incrementality.
         * @member {transit_realtime.FeedHeader.Incrementality} incrementality
         * @memberof transit_realtime.FeedHeader
         * @instance
         */
        FeedHeader.prototype.incrementality = 0;

        /**
         * FeedHeader timestamp.
         * @member {number} timestamp
         * @memberof transit_realtime.FeedHeader
         * @instance
         */
        FeedHeader.prototype.timestamp = $util.Long ? $util.Long.fromBits(0,0,true) : 0;

        /**
         * FeedHeader feed_version.
         * @member {string} feed_version
         * @memberof transit_realtime.FeedHeader
         * @instance
         */
        FeedHeader.prototype.feed_version = "";

        /**
         * Creates a new FeedHeader instance using the specified properties.
         * @function create
         * @memberof transit_realtime.FeedHeader
         * @static
         * @param {transit_realtime.IFeedHeader=} [properties] Properties to set
         * @returns {transit_realtime.FeedHeader} FeedHeader instance
         */
        FeedHeader.create = function create(properties) {
            return new FeedHeader(properties);
        };

        /**
         * Encodes the specified FeedHeader message. Does not implicitly {@link transit_realtime.FeedHeader.verify|verify} messages.
         * @function encode
         * @memberof transit_realtime.FeedHeader
         * @static
         * @param {transit_realtime.IFeedHeader} message FeedHeader message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        FeedHeader.encode = function encode(message, writer) {
            if (!writer)
                writer = $Writer.create();
            writer.uint32(/* id 1, wireType 2 =*/10).string(message.gtfs_realtime_version);
            if (message.incrementality != null && Object.hasOwnProperty.call(message, "incrementality"))
                writer.uint32(/* id 2, wireType 0 =*/16).int32(message.incrementality);
            if (message.timestamp != null && Object.hasOwnProperty.call(message, "timestamp"))
                writer.uint32(/* id 3, wireType 0 =*/24).uint64(message.timestamp);
            if (message.feed_version != null && Object.hasOwnProperty.call(message, "feed_version"))
                writer.uint32(/* id 4, wireType 2 =*/34).string(message.feed_version);
            return writer;
        };

        /**
         * Encodes the specified FeedHeader message, length delimited. Does not implicitly {@link transit_realtime.FeedHeader.verify|verify} messages.
         * @function encodeDelimited
         * @memberof transit_realtime.FeedHeader
         * @static
         * @param {transit_realtime.IFeedHeader} message FeedHeader message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        FeedHeader.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer).ldelim();
        };

        /**
         * Decodes a FeedHeader message from the specified reader or buffer.
         * @function decode
         * @memberof transit_realtime.FeedHeader
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {transit_realtime.FeedHeader} FeedHeader
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        FeedHeader.decode = function decode(reader, length, error) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.transit_realtime.FeedHeader();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.gtfs_realtime_version = reader.string();
                        break;
                    }
                case 2: {
                        message.incrementality = reader.int32();
                        break;
                    }
                case 3: {
                        message.timestamp = reader.uint64();
                        break;
                    }
                case 4: {
                        message.feed_version = reader.string();
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    break;
                }
            }
            if (!message.hasOwnProperty("gtfs_realtime_version"))
                throw $util.ProtocolError("missing required 'gtfs_realtime_version'", { instance: message });
            return message;
        };

        /**
         * Decodes a FeedHeader message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof transit_realtime.FeedHeader
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {transit_realtime.FeedHeader} FeedHeader
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        FeedHeader.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a FeedHeader message.
         * @function verify
         * @memberof transit_realtime.FeedHeader
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        FeedHeader.verify = function verify(message) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (!$util.isString(message.gtfs_realtime_version))
                return "gtfs_realtime_version: string expected";
            if (message.incrementality != null && message.hasOwnProperty("incrementality"))
                switch (message.incrementality) {
                default:
                    return "incrementality: enum value expected";
                case 0:
                case 1:
                    break;
                }
            if (message.timestamp != null && message.hasOwnProperty("timestamp"))
                if (!$util.isInteger(message.timestamp) && !(message.timestamp && $util.isInteger(message.timestamp.low) && $util.isInteger(message.timestamp.high)))
                    return "timestamp: integer|Long expected";
            if (message.feed_version != null && message.hasOwnProperty("feed_version"))
                if (!$util.isString(message.feed_version))
                    return "feed_version: string expected";
            return null;
        };

        /**
         * Creates a FeedHeader message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof transit_realtime.FeedHeader
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {transit_realtime.FeedHeader} FeedHeader
         */
        FeedHeader.fromObject = function fromObject(object) {
            if (object instanceof $root.transit_realtime.FeedHeader)
                return object;
            var message = new $root.transit_realtime.FeedHeader();
            if (object.gtfs_realtime_version != null)
                message.gtfs_realtime_version = String(object.gtfs_realtime_version);
            switch (object.incrementality) {
            default:
                if (typeof object.incrementality === "number") {
                    message.incrementality = object.incrementality;
                    break;
                }
                break;
            case "FULL_DATASET":
            case 0:
                message.incrementality = 0;
                break;
            case "DIFFERENTIAL":
            case 1:
                message.incrementality = 1;
                break;
            }
            if (object.timestamp != null)
                if ($util.Long)
                    (message.timestamp = $util.Long.fromValue(object.timestamp)).unsigned = true;
                else if (typeof object.timestamp === "string")
                    message.timestamp = parseInt(object.timestamp, 10);
                else if (typeof object.timestamp === "number")
                    message.timestamp = object.timestamp;
                else if (typeof object.timestamp === "object")
                    message.timestamp = new $util.LongBits(object.timestamp.low >>> 0, object.timestamp.high >>> 0).toNumber(true);
            if (object.feed_version != null)
                message.feed_version = String(object.feed_version);
            return message;
        };

        /**
         * Creates a plain object from a FeedHeader message. Also converts values to other types if specified.
         * @function toObject
         * @memberof transit_realtime.FeedHeader
         * @static
         * @param {transit_realtime.FeedHeader} message FeedHeader
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        FeedHeader.toObject = function toObject(message, options) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults) {
                object.gtfs_realtime_version = "";
                object.incrementality = options.enums === String ? "FULL_DATASET" : 0;
                if ($util.Long) {
                    var long = new $util.Long(0, 0, true);
                    object.timestamp = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : long;
                } else
                    object.timestamp = options.longs === String ? "0" : 0;
                object.feed_version = "";
            }
            if (message.gtfs_realtime_version != null && message.hasOwnProperty("gtfs_realtime_version"))
                object.gtfs_realtime_version = message.gtfs_realtime_version;
            if (message.incrementality != null && message.hasOwnProperty("incrementality"))
                object.incrementality = options.enums === String ? $root.transit_realtime.FeedHeader.Incrementality[message.incrementality] === undefined ? message.incrementality : $root.transit_realtime.FeedHeader.Incrementality[message.incrementality] : message.incrementality;
            if (message.timestamp != null && message.hasOwnProperty("timestamp"))
                if (typeof message.timestamp === "number")
                    object.timestamp = options.longs === String ? String(message.timestamp) : message.timestamp;
                else
                    object.timestamp = options.longs === String ? $util.Long.prototype.toString.call(message.timestamp) : options.longs === Number ? new $util.LongBits(message.timestamp.low >>> 0, message.timestamp.high >>> 0).toNumber(true) : message.timestamp;
            if (message.feed_version != null && message.hasOwnProperty("feed_version"))
                object.feed_version = message.feed_version;
            return object;
        };

        /**
         * Converts this FeedHeader to JSON.
         * @function toJSON
         * @memberof transit_realtime.FeedHeader
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        FeedHeader.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for FeedHeader
         * @function getTypeUrl
         * @memberof transit_realtime.FeedHeader
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        FeedHeader.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/transit_realtime.FeedHeader";
        };

        /**
         * Incrementality enum.
         * @name transit_realtime.FeedHeader.Incrementality
         * @enum {number}
         * @property {number} FULL_DATASET=0 FULL_DATASET value
         * @property {number} DIFFERENTIAL=1 DIFFERENTIAL value
         */
        FeedHeader.Incrementality = (function() {
            var valuesById = {}, values = Object.create(valuesById);
            values[valuesById[0] = "FULL_DATASET"] = 0;
            values[valuesById[1] = "DIFFERENTIAL"] = 1;
            return values;
        })();

        return FeedHeader;
    })();

    transit_realtime.FeedEntity = (function() {

        /**
         * Properties of a FeedEntity.
         * @memberof transit_realtime
         * @interface IFeedEntity
         * @property {string} id FeedEntity id
         * @property {boolean|null} [is_deleted] FeedEntity is_deleted
         * @property {transit_realtime.ITripUpdate|null} [trip_update] FeedEntity trip_update
         * @property {transit_realtime.IVehiclePosition|null} [vehicle] FeedEntity vehicle
         * @property {transit_realtime.IAlert|null} [alert] FeedEntity alert
         * @property {transit_realtime.IShape|null} [shape] FeedEntity shape
         * @property {transit_realtime.IStop|null} [stop] FeedEntity stop
         * @property {transit_realtime.ITripModifications|null} [trip_modifications] FeedEntity trip_modifications
         */

        /**
         * Constructs a new FeedEntity.
         * @memberof transit_realtime
         * @classdesc Represents a FeedEntity.
         * @implements IFeedEntity
         * @constructor
         * @param {transit_realtime.IFeedEntity=} [properties] Properties to set
         */
        function FeedEntity(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null)
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * FeedEntity id.
         * @member {string} id
         * @memberof transit_realtime.FeedEntity
         * @instance
         */
        FeedEntity.prototype.id = "";

        /**
         * FeedEntity is_deleted.
         * @member {boolean} is_deleted
         * @memberof transit_realtime.FeedEntity
         * @instance
         */
        FeedEntity.prototype.is_deleted = false;

        /**
         * FeedEntity trip_update.
         * @member {transit_realtime.ITripUpdate|null|undefined} trip_update
         * @memberof transit_realtime.FeedEntity
         * @instance
         */
        FeedEntity.prototype.trip_update = null;

        /**
         * FeedEntity vehicle.
         * @member {transit_realtime.IVehiclePosition|null|undefined} vehicle
         * @memberof transit_realtime.FeedEntity
         * @instance
         */
        FeedEntity.prototype.vehicle = null;

        /**
         * FeedEntity alert.
         * @member {transit_realtime.IAlert|null|undefined} alert
         * @memberof transit_realtime.FeedEntity
         * @instance
         */
        FeedEntity.prototype.alert = null;

        /**
         * FeedEntity shape.
         * @member {transit_realtime.IShape|null|undefined} shape
         * @memberof transit_realtime.FeedEntity
         * @instance
         */
        FeedEntity.prototype.shape = null;

        /**
         * FeedEntity stop.
         * @member {transit_realtime.IStop|null|undefined} stop
         * @memberof transit_realtime.FeedEntity
         * @instance
         */
        FeedEntity.prototype.stop = null;

        /**
         * FeedEntity trip_modifications.
         * @member {transit_realtime.ITripModifications|null|undefined} trip_modifications
         * @memberof transit_realtime.FeedEntity
         * @instance
         */
        FeedEntity.prototype.trip_modifications = null;

        /**
         * Creates a new FeedEntity instance using the specified properties.
         * @function create
         * @memberof transit_realtime.FeedEntity
         * @static
         * @param {transit_realtime.IFeedEntity=} [properties] Properties to set
         * @returns {transit_realtime.FeedEntity} FeedEntity instance
         */
        FeedEntity.create = function create(properties) {
            return new FeedEntity(properties);
        };

        /**
         * Encodes the specified FeedEntity message. Does not implicitly {@link transit_realtime.FeedEntity.verify|verify} messages.
         * @function encode
         * @memberof transit_realtime.FeedEntity
         * @static
         * @param {transit_realtime.IFeedEntity} message FeedEntity message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        FeedEntity.encode = function encode(message, writer) {
            if (!writer)
                writer = $Writer.create();
            writer.uint32(/* id 1, wireType 2 =*/10).string(message.id);
            if (message.is_deleted != null && Object.hasOwnProperty.call(message, "is_deleted"))
                writer.uint32(/* id 2, wireType 0 =*/16).bool(message.is_deleted);
            if (message.trip_update != null && Object.hasOwnProperty.call(message, "trip_update"))
                $root.transit_realtime.TripUpdate.encode(message.trip_update, writer.uint32(/* id 3, wireType 2 =*/26).fork()).ldelim();
            if (message.vehicle != null && Object.hasOwnProperty.call(message, "vehicle"))
                $root.transit_realtime.VehiclePosition.encode(message.vehicle, writer.uint32(/* id 4, wireType 2 =*/34).fork()).ldelim();
            if (message.alert != null && Object.hasOwnProperty.call(message, "alert"))
                $root.transit_realtime.Alert.encode(message.alert, writer.uint32(/* id 5, wireType 2 =*/42).fork()).ldelim();
            if (message.shape != null && Object.hasOwnProperty.call(message, "shape"))
                $root.transit_realtime.Shape.encode(message.shape, writer.uint32(/* id 6, wireType 2 =*/50).fork()).ldelim();
            if (message.stop != null && Object.hasOwnProperty.call(message, "stop"))
                $root.transit_realtime.Stop.encode(message.stop, writer.uint32(/* id 7, wireType 2 =*/58).fork()).ldelim();
            if (message.trip_modifications != null && Object.hasOwnProperty.call(message, "trip_modifications"))
                $root.transit_realtime.TripModifications.encode(message.trip_modifications, writer.uint32(/* id 8, wireType 2 =*/66).fork()).ldelim();
            return writer;
        };

        /**
         * Encodes the specified FeedEntity message, length delimited. Does not implicitly {@link transit_realtime.FeedEntity.verify|verify} messages.
         * @function encodeDelimited
         * @memberof transit_realtime.FeedEntity
         * @static
         * @param {transit_realtime.IFeedEntity} message FeedEntity message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        FeedEntity.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer).ldelim();
        };

        /**
         * Decodes a FeedEntity message from the specified reader or buffer.
         * @function decode
         * @memberof transit_realtime.FeedEntity
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {transit_realtime.FeedEntity} FeedEntity
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        FeedEntity.decode = function decode(reader, length, error) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.transit_realtime.FeedEntity();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.id = reader.string();
                        break;
                    }
                case 2: {
                        message.is_deleted = reader.bool();
                        break;
                    }
                case 3: {
                        message.trip_update = $root.transit_realtime.TripUpdate.decode(reader, reader.uint32());
                        break;
                    }
                case 4: {
                        message.vehicle = $root.transit_realtime.VehiclePosition.decode(reader, reader.uint32());
                        break;
                    }
                case 5: {
                        message.alert = $root.transit_realtime.Alert.decode(reader, reader.uint32());
                        break;
                    }
                case 6: {
                        message.shape = $root.transit_realtime.Shape.decode(reader, reader.uint32());
                        break;
                    }
                case 7: {
                        message.stop = $root.transit_realtime.Stop.decode(reader, reader.uint32());
                        break;
                    }
                case 8: {
                        message.trip_modifications = $root.transit_realtime.TripModifications.decode(reader, reader.uint32());
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    break;
                }
            }
            if (!message.hasOwnProperty("id"))
                throw $util.ProtocolError("missing required 'id'", { instance: message });
            return message;
        };

        /**
         * Decodes a FeedEntity message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof transit_realtime.FeedEntity
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {transit_realtime.FeedEntity} FeedEntity
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        FeedEntity.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a FeedEntity message.
         * @function verify
         * @memberof transit_realtime.FeedEntity
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        FeedEntity.verify = function verify(message) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (!$util.isString(message.id))
                return "id: string expected";
            if (message.is_deleted != null && message.hasOwnProperty("is_deleted"))
                if (typeof message.is_deleted !== "boolean")
                    return "is_deleted: boolean expected";
            if (message.trip_update != null && message.hasOwnProperty("trip_update")) {
                var error = $root.transit_realtime.TripUpdate.verify(message.trip_update);
                if (error)
                    return "trip_update." + error;
            }
            if (message.vehicle != null && message.hasOwnProperty("vehicle")) {
                var error = $root.transit_realtime.VehiclePosition.verify(message.vehicle);
                if (error)
                    return "vehicle." + error;
            }
            if (message.alert != null && message.hasOwnProperty("alert")) {
                var error = $root.transit_realtime.Alert.verify(message.alert);
                if (error)
                    return "alert." + error;
            }
            if (message.shape != null && message.hasOwnProperty("shape")) {
                var error = $root.transit_realtime.Shape.verify(message.shape);
                if (error)
                    return "shape." + error;
            }
            if (message.stop != null && message.hasOwnProperty("stop")) {
                var error = $root.transit_realtime.Stop.verify(message.stop);
                if (error)
                    return "stop." + error;
            }
            if (message.trip_modifications != null && message.hasOwnProperty("trip_modifications")) {
                var error = $root.transit_realtime.TripModifications.verify(message.trip_modifications);
                if (error)
                    return "trip_modifications." + error;
            }
            return null;
        };

        /**
         * Creates a FeedEntity message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof transit_realtime.FeedEntity
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {transit_realtime.FeedEntity} FeedEntity
         */
        FeedEntity.fromObject = function fromObject(object) {
            if (object instanceof $root.transit_realtime.FeedEntity)
                return object;
            var message = new $root.transit_realtime.FeedEntity();
            if (object.id != null)
                message.id = String(object.id);
            if (object.is_deleted != null)
                message.is_deleted = Boolean(object.is_deleted);
            if (object.trip_update != null) {
                if (typeof object.trip_update !== "object")
                    throw TypeError(".transit_realtime.FeedEntity.trip_update: object expected");
                message.trip_update = $root.transit_realtime.TripUpdate.fromObject(object.trip_update);
            }
            if (object.vehicle != null) {
                if (typeof object.vehicle !== "object")
                    throw TypeError(".transit_realtime.FeedEntity.vehicle: object expected");
                message.vehicle = $root.transit_realtime.VehiclePosition.fromObject(object.vehicle);
            }
            if (object.alert != null) {
                if (typeof object.alert !== "object")
                    throw TypeError(".transit_realtime.FeedEntity.alert: object expected");
                message.alert = $root.transit_realtime.Alert.fromObject(object.alert);
            }
            if (object.shape != null) {
                if (typeof object.shape !== "object")
                    throw TypeError(".transit_realtime.FeedEntity.shape: object expected");
                message.shape = $root.transit_realtime.Shape.fromObject(object.shape);
            }
            if (object.stop != null) {
                if (typeof object.stop !== "object")
                    throw TypeError(".transit_realtime.FeedEntity.stop: object expected");
                message.stop = $root.transit_realtime.Stop.fromObject(object.stop);
            }
            if (object.trip_modifications != null) {
                if (typeof object.trip_modifications !== "object")
                    throw TypeError(".transit_realtime.FeedEntity.trip_modifications: object expected");
                message.trip_modifications = $root.transit_realtime.TripModifications.fromObject(object.trip_modifications);
            }
            return message;
        };

        /**
         * Creates a plain object from a FeedEntity message. Also converts values to other types if specified.
         * @function toObject
         * @memberof transit_realtime.FeedEntity
         * @static
         * @param {transit_realtime.FeedEntity} message FeedEntity
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        FeedEntity.toObject = function toObject(message, options) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults) {
                object.id = "";
                object.is_deleted = false;
                object.trip_update = null;
                object.vehicle = null;
                object.alert = null;
                object.shape = null;
                object.stop = null;
                object.trip_modifications = null;
            }
            if (message.id != null && message.hasOwnProperty("id"))
                object.id = message.id;
            if (message.is_deleted != null && message.hasOwnProperty("is_deleted"))
                object.is_deleted = message.is_deleted;
            if (message.trip_update != null && message.hasOwnProperty("trip_update"))
                object.trip_update = $root.transit_realtime.TripUpdate.toObject(message.trip_update, options);
            if (message.vehicle != null && message.hasOwnProperty("vehicle"))
                object.vehicle = $root.transit_realtime.VehiclePosition.toObject(message.vehicle, options);
            if (message.alert != null && message.hasOwnProperty("alert"))
                object.alert = $root.transit_realtime.Alert.toObject(message.alert, options);
            if (message.shape != null && message.hasOwnProperty("shape"))
                object.shape = $root.transit_realtime.Shape.toObject(message.shape, options);
            if (message.stop != null && message.hasOwnProperty("stop"))
                object.stop = $root.transit_realtime.Stop.toObject(message.stop, options);
            if (message.trip_modifications != null && message.hasOwnProperty("trip_modifications"))
                object.trip_modifications = $root.transit_realtime.TripModifications.toObject(message.trip_modifications, options);
            return object;
        };

        /**
         * Converts this FeedEntity to JSON.
         * @function toJSON
         * @memberof transit_realtime.FeedEntity
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        FeedEntity.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for FeedEntity
         * @function getTypeUrl
         * @memberof transit_realtime.FeedEntity
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        FeedEntity.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/transit_realtime.FeedEntity";
        };

        return FeedEntity;
    })();

    transit_realtime.TripUpdate = (function() {

        /**
         * Properties of a TripUpdate.
         * @memberof transit_realtime
         * @interface ITripUpdate
         * @property {transit_realtime.ITripDescriptor} trip TripUpdate trip
         * @property {transit_realtime.IVehicleDescriptor|null} [vehicle] TripUpdate vehicle
         * @property {Array.<transit_realtime.TripUpdate.IStopTimeUpdate>|null} [stop_time_update] TripUpdate stop_time_update
         * @property {number|null} [timestamp] TripUpdate timestamp
         * @property {number|null} [delay] TripUpdate delay
         * @property {transit_realtime.TripUpdate.ITripProperties|null} [trip_properties] TripUpdate trip_properties
         */

        /**
         * Constructs a new TripUpdate.
         * @memberof transit_realtime
         * @classdesc Represents a TripUpdate.
         * @implements ITripUpdate
         * @constructor
         * @param {transit_realtime.ITripUpdate=} [properties] Properties to set
         */
        function TripUpdate(properties) {
            this.stop_time_update = [];
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null)
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * TripUpdate trip.
         * @member {transit_realtime.ITripDescriptor} trip
         * @memberof transit_realtime.TripUpdate
         * @instance
         */
        TripUpdate.prototype.trip = null;

        /**
         * TripUpdate vehicle.
         * @member {transit_realtime.IVehicleDescriptor|null|undefined} vehicle
         * @memberof transit_realtime.TripUpdate
         * @instance
         */
        TripUpdate.prototype.vehicle = null;

        /**
         * TripUpdate stop_time_update.
         * @member {Array.<transit_realtime.TripUpdate.IStopTimeUpdate>} stop_time_update
         * @memberof transit_realtime.TripUpdate
         * @instance
         */
        TripUpdate.prototype.stop_time_update = $util.emptyArray;

        /**
         * TripUpdate timestamp.
         * @member {number} timestamp
         * @memberof transit_realtime.TripUpdate
         * @instance
         */
        TripUpdate.prototype.timestamp = $util.Long ? $util.Long.fromBits(0,0,true) : 0;

        /**
         * TripUpdate delay.
         * @member {number} delay
         * @memberof transit_realtime.TripUpdate
         * @instance
         */
        TripUpdate.prototype.delay = 0;

        /**
         * TripUpdate trip_properties.
         * @member {transit_realtime.TripUpdate.ITripProperties|null|undefined} trip_properties
         * @memberof transit_realtime.TripUpdate
         * @instance
         */
        TripUpdate.prototype.trip_properties = null;

        /**
         * Creates a new TripUpdate instance using the specified properties.
         * @function create
         * @memberof transit_realtime.TripUpdate
         * @static
         * @param {transit_realtime.ITripUpdate=} [properties] Properties to set
         * @returns {transit_realtime.TripUpdate} TripUpdate instance
         */
        TripUpdate.create = function create(properties) {
            return new TripUpdate(properties);
        };

        /**
         * Encodes the specified TripUpdate message. Does not implicitly {@link transit_realtime.TripUpdate.verify|verify} messages.
         * @function encode
         * @memberof transit_realtime.TripUpdate
         * @static
         * @param {transit_realtime.ITripUpdate} message TripUpdate message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        TripUpdate.encode = function encode(message, writer) {
            if (!writer)
                writer = $Writer.create();
            $root.transit_realtime.TripDescriptor.encode(message.trip, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim();
            if (message.stop_time_update != null && message.stop_time_update.length)
                for (var i = 0; i < message.stop_time_update.length; ++i)
                    $root.transit_realtime.TripUpdate.StopTimeUpdate.encode(message.stop_time_update[i], writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim();
            if (message.vehicle != null && Object.hasOwnProperty.call(message, "vehicle"))
                $root.transit_realtime.VehicleDescriptor.encode(message.vehicle, writer.uint32(/* id 3, wireType 2 =*/26).fork()).ldelim();
            if (message.timestamp != null && Object.hasOwnProperty.call(message, "timestamp"))
                writer.uint32(/* id 4, wireType 0 =*/32).uint64(message.timestamp);
            if (message.delay != null && Object.hasOwnProperty.call(message, "delay"))
                writer.uint32(/* id 5, wireType 0 =*/40).int32(message.delay);
            if (message.trip_properties != null && Object.hasOwnProperty.call(message, "trip_properties"))
                $root.transit_realtime.TripUpdate.TripProperties.encode(message.trip_properties, writer.uint32(/* id 6, wireType 2 =*/50).fork()).ldelim();
            return writer;
        };

        /**
         * Encodes the specified TripUpdate message, length delimited. Does not implicitly {@link transit_realtime.TripUpdate.verify|verify} messages.
         * @function encodeDelimited
         * @memberof transit_realtime.TripUpdate
         * @static
         * @param {transit_realtime.ITripUpdate} message TripUpdate message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        TripUpdate.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer).ldelim();
        };

        /**
         * Decodes a TripUpdate message from the specified reader or buffer.
         * @function decode
         * @memberof transit_realtime.TripUpdate
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {transit_realtime.TripUpdate} TripUpdate
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        TripUpdate.decode = function decode(reader, length, error) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.transit_realtime.TripUpdate();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.trip = $root.transit_realtime.TripDescriptor.decode(reader, reader.uint32());
                        break;
                    }
                case 3: {
                        message.vehicle = $root.transit_realtime.VehicleDescriptor.decode(reader, reader.uint32());
                        break;
                    }
                case 2: {
                        if (!(message.stop_time_update && message.stop_time_update.length))
                            message.stop_time_update = [];
                        message.stop_time_update.push($root.transit_realtime.TripUpdate.StopTimeUpdate.decode(reader, reader.uint32()));
                        break;
                    }
                case 4: {
                        message.timestamp = reader.uint64();
                        break;
                    }
                case 5: {
                        message.delay = reader.int32();
                        break;
                    }
                case 6: {
                        message.trip_properties = $root.transit_realtime.TripUpdate.TripProperties.decode(reader, reader.uint32());
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    break;
                }
            }
            if (!message.hasOwnProperty("trip"))
                throw $util.ProtocolError("missing required 'trip'", { instance: message });
            return message;
        };

        /**
         * Decodes a TripUpdate message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof transit_realtime.TripUpdate
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {transit_realtime.TripUpdate} TripUpdate
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        TripUpdate.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a TripUpdate message.
         * @function verify
         * @memberof transit_realtime.TripUpdate
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        TripUpdate.verify = function verify(message) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            {
                var error = $root.transit_realtime.TripDescriptor.verify(message.trip);
                if (error)
                    return "trip." + error;
            }
            if (message.vehicle != null && message.hasOwnProperty("vehicle")) {
                var error = $root.transit_realtime.VehicleDescriptor.verify(message.vehicle);
                if (error)
                    return "vehicle." + error;
            }
            if (message.stop_time_update != null && message.hasOwnProperty("stop_time_update")) {
                if (!Array.isArray(message.stop_time_update))
                    return "stop_time_update: array expected";
                for (var i = 0; i < message.stop_time_update.length; ++i) {
                    var error = $root.transit_realtime.TripUpdate.StopTimeUpdate.verify(message.stop_time_update[i]);
                    if (error)
                        return "stop_time_update." + error;
                }
            }
            if (message.timestamp != null && message.hasOwnProperty("timestamp"))
                if (!$util.isInteger(message.timestamp) && !(message.timestamp && $util.isInteger(message.timestamp.low) && $util.isInteger(message.timestamp.high)))
                    return "timestamp: integer|Long expected";
            if (message.delay != null && message.hasOwnProperty("delay"))
                if (!$util.isInteger(message.delay))
                    return "delay: integer expected";
            if (message.trip_properties != null && message.hasOwnProperty("trip_properties")) {
                var error = $root.transit_realtime.TripUpdate.TripProperties.verify(message.trip_properties);
                if (error)
                    return "trip_properties." + error;
            }
            return null;
        };

        /**
         * Creates a TripUpdate message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof transit_realtime.TripUpdate
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {transit_realtime.TripUpdate} TripUpdate
         */
        TripUpdate.fromObject = function fromObject(object) {
            if (object instanceof $root.transit_realtime.TripUpdate)
                return object;
            var message = new $root.transit_realtime.TripUpdate();
            if (object.trip != null) {
                if (typeof object.trip !== "object")
                    throw TypeError(".transit_realtime.TripUpdate.trip: object expected");
                message.trip = $root.transit_realtime.TripDescriptor.fromObject(object.trip);
            }
            if (object.vehicle != null) {
                if (typeof object.vehicle !== "object")
                    throw TypeError(".transit_realtime.TripUpdate.vehicle: object expected");
                message.vehicle = $root.transit_realtime.VehicleDescriptor.fromObject(object.vehicle);
            }
            if (object.stop_time_update) {
                if (!Array.isArray(object.stop_time_update))
                    throw TypeError(".transit_realtime.TripUpdate.stop_time_update: array expected");
                message.stop_time_update = [];
                for (var i = 0; i < object.stop_time_update.length; ++i) {
                    if (typeof object.stop_time_update[i] !== "object")
                        throw TypeError(".transit_realtime.TripUpdate.stop_time_update: object expected");
                    message.stop_time_update[i] = $root.transit_realtime.TripUpdate.StopTimeUpdate.fromObject(object.stop_time_update[i]);
                }
            }
            if (object.timestamp != null)
                if ($util.Long)
                    (message.timestamp = $util.Long.fromValue(object.timestamp)).unsigned = true;
                else if (typeof object.timestamp === "string")
                    message.timestamp = parseInt(object.timestamp, 10);
                else if (typeof object.timestamp === "number")
                    message.timestamp = object.timestamp;
                else if (typeof object.timestamp === "object")
                    message.timestamp = new $util.LongBits(object.timestamp.low >>> 0, object.timestamp.high >>> 0).toNumber(true);
            if (object.delay != null)
                message.delay = object.delay | 0;
            if (object.trip_properties != null) {
                if (typeof object.trip_properties !== "object")
                    throw TypeError(".transit_realtime.TripUpdate.trip_properties: object expected");
                message.trip_properties = $root.transit_realtime.TripUpdate.TripProperties.fromObject(object.trip_properties);
            }
            return message;
        };

        /**
         * Creates a plain object from a TripUpdate message. Also converts values to other types if specified.
         * @function toObject
         * @memberof transit_realtime.TripUpdate
         * @static
         * @param {transit_realtime.TripUpdate} message TripUpdate
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        TripUpdate.toObject = function toObject(message, options) {
            if (!options)
                options = {};
            var object = {};
            if (options.arrays || options.defaults)
                object.stop_time_update = [];
            if (options.defaults) {
                object.trip = null;
                object.vehicle = null;
                if ($util.Long) {
                    var long = new $util.Long(0, 0, true);
                    object.timestamp = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : long;
                } else
                    object.timestamp = options.longs === String ? "0" : 0;
                object.delay = 0;
                object.trip_properties = null;
            }
            if (message.trip != null && message.hasOwnProperty("trip"))
                object.trip = $root.transit_realtime.TripDescriptor.toObject(message.trip, options);
            if (message.stop_time_update && message.stop_time_update.length) {
                object.stop_time_update = [];
                for (var j = 0; j < message.stop_time_update.length; ++j)
                    object.stop_time_update[j] = $root.transit_realtime.TripUpdate.StopTimeUpdate.toObject(message.stop_time_update[j], options);
            }
            if (message.vehicle != null && message.hasOwnProperty("vehicle"))
                object.vehicle = $root.transit_realtime.VehicleDescriptor.toObject(message.vehicle, options);
            if (message.timestamp != null && message.hasOwnProperty("timestamp"))
                if (typeof message.timestamp === "number")
                    object.timestamp = options.longs === String ? String(message.timestamp) : message.timestamp;
                else
                    object.timestamp = options.longs === String ? $util.Long.prototype.toString.call(message.timestamp) : options.longs === Number ? new $util.LongBits(message.timestamp.low >>> 0, message.timestamp.high >>> 0).toNumber(true) : message.timestamp;
            if (message.delay != null && message.hasOwnProperty("delay"))
                object.delay = message.delay;
            if (message.trip_properties != null && message.hasOwnProperty("trip_properties"))
                object.trip_properties = $root.transit_realtime.TripUpdate.TripProperties.toObject(message.trip_properties, options);
            return object;
        };

        /**
         * Converts this TripUpdate to JSON.
         * @function toJSON
         * @memberof transit_realtime.TripUpdate
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        TripUpdate.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for TripUpdate
         * @function getTypeUrl
         * @memberof transit_realtime.TripUpdate
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        TripUpdate.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/transit_realtime.TripUpdate";
        };

        TripUpdate.StopTimeEvent = (function() {

            /**
             * Properties of a StopTimeEvent.
             * @memberof transit_realtime.TripUpdate
             * @interface IStopTimeEvent
             * @property {number|null} [delay] StopTimeEvent delay
             * @property {number|null} [time] StopTimeEvent time
             * @property {number|null} [uncertainty] StopTimeEvent uncertainty
             * @property {number|null} [scheduled_time] StopTimeEvent scheduled_time
             */

            /**
             * Constructs a new StopTimeEvent.
             * @memberof transit_realtime.TripUpdate
             * @classdesc Represents a StopTimeEvent.
             * @implements IStopTimeEvent
             * @constructor
             * @param {transit_realtime.TripUpdate.IStopTimeEvent=} [properties] Properties to set
             */
            function StopTimeEvent(properties) {
                if (properties)
                    for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                        if (properties[keys[i]] != null)
                            this[keys[i]] = properties[keys[i]];
            }

            /**
             * StopTimeEvent delay.
             * @member {number} delay
             * @memberof transit_realtime.TripUpdate.StopTimeEvent
             * @instance
             */
            StopTimeEvent.prototype.delay = 0;

            /**
             * StopTimeEvent time.
             * @member {number} time
             * @memberof transit_realtime.TripUpdate.StopTimeEvent
             * @instance
             */
            StopTimeEvent.prototype.time = $util.Long ? $util.Long.fromBits(0,0,false) : 0;

            /**
             * StopTimeEvent uncertainty.
             * @member {number} uncertainty
             * @memberof transit_realtime.TripUpdate.StopTimeEvent
             * @instance
             */
            StopTimeEvent.prototype.uncertainty = 0;

            /**
             * StopTimeEvent scheduled_time.
             * @member {number} scheduled_time
             * @memberof transit_realtime.TripUpdate.StopTimeEvent
             * @instance
             */
            StopTimeEvent.prototype.scheduled_time = $util.Long ? $util.Long.fromBits(0,0,false) : 0;

            /**
             * Creates a new StopTimeEvent instance using the specified properties.
             * @function create
             * @memberof transit_realtime.TripUpdate.StopTimeEvent
             * @static
             * @param {transit_realtime.TripUpdate.IStopTimeEvent=} [properties] Properties to set
             * @returns {transit_realtime.TripUpdate.StopTimeEvent} StopTimeEvent instance
             */
            StopTimeEvent.create = function create(properties) {
                return new StopTimeEvent(properties);
            };

            /**
             * Encodes the specified StopTimeEvent message. Does not implicitly {@link transit_realtime.TripUpdate.StopTimeEvent.verify|verify} messages.
             * @function encode
             * @memberof transit_realtime.TripUpdate.StopTimeEvent
             * @static
             * @param {transit_realtime.TripUpdate.IStopTimeEvent} message StopTimeEvent message or plain object to encode
             * @param {$protobuf.Writer} [writer] Writer to encode to
             * @returns {$protobuf.Writer} Writer
             */
            StopTimeEvent.encode = function encode(message, writer) {
                if (!writer)
                    writer = $Writer.create();
                if (message.delay != null && Object.hasOwnProperty.call(message, "delay"))
                    writer.uint32(/* id 1, wireType 0 =*/8).int32(message.delay);
                if (message.time != null && Object.hasOwnProperty.call(message, "time"))
                    writer.uint32(/* id 2, wireType 0 =*/16).int64(message.time);
                if (message.uncertainty != null && Object.hasOwnProperty.call(message, "uncertainty"))
                    writer.uint32(/* id 3, wireType 0 =*/24).int32(message.uncertainty);
                if (message.scheduled_time != null && Object.hasOwnProperty.call(message, "scheduled_time"))
                    writer.uint32(/* id 4, wireType 0 =*/32).int64(message.scheduled_time);
                return writer;
            };

            /**
             * Encodes the specified StopTimeEvent message, length delimited. Does not implicitly {@link transit_realtime.TripUpdate.StopTimeEvent.verify|verify} messages.
             * @function encodeDelimited
             * @memberof transit_realtime.TripUpdate.StopTimeEvent
             * @static
             * @param {transit_realtime.TripUpdate.IStopTimeEvent} message StopTimeEvent message or plain object to encode
             * @param {$protobuf.Writer} [writer] Writer to encode to
             * @returns {$protobuf.Writer} Writer
             */
            StopTimeEvent.encodeDelimited = function encodeDelimited(message, writer) {
                return this.encode(message, writer).ldelim();
            };

            /**
             * Decodes a StopTimeEvent message from the specified reader or buffer.
             * @function decode
             * @memberof transit_realtime.TripUpdate.StopTimeEvent
             * @static
             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
             * @param {number} [length] Message length if known beforehand
             * @returns {transit_realtime.TripUpdate.StopTimeEvent} StopTimeEvent
             * @throws {Error} If the payload is not a reader or valid buffer
             * @throws {$protobuf.util.ProtocolError} If required fields are missing
             */
            StopTimeEvent.decode = function decode(reader, length, error) {
                if (!(reader instanceof $Reader))
                    reader = $Reader.create(reader);
                var end = length === undefined ? reader.len : reader.pos + length, message = new $root.transit_realtime.TripUpdate.StopTimeEvent();
                while (reader.pos < end) {
                    var tag = reader.uint32();
                    if (tag === error)
                        break;
                    switch (tag >>> 3) {
                    case 1: {
                            message.delay = reader.int32();
                            break;
                        }
                    case 2: {
                            message.time = reader.int64();
                            break;
                        }
                    case 3: {
                            message.uncertainty = reader.int32();
                            break;
                        }
                    case 4: {
                            message.scheduled_time = reader.int64();
                            break;
                        }
                    default:
                        reader.skipType(tag & 7);
                        break;
                    }
                }
                return message;
            };

            /**
             * Decodes a StopTimeEvent message from the specified reader or buffer, length delimited.
             * @function decodeDelimited
             * @memberof transit_realtime.TripUpdate.StopTimeEvent
             * @static
             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
             * @returns {transit_realtime.TripUpdate.StopTimeEvent} StopTimeEvent
             * @throws {Error} If the payload is not a reader or valid buffer
             * @throws {$protobuf.util.ProtocolError} If required fields are missing
             */
            StopTimeEvent.decodeDelimited = function decodeDelimited(reader) {
                if (!(reader instanceof $Reader))
                    reader = new $Reader(reader);
                return this.decode(reader, reader.uint32());
            };

            /**
             * Verifies a StopTimeEvent message.
             * @function verify
             * @memberof transit_realtime.TripUpdate.StopTimeEvent
             * @static
             * @param {Object.<string,*>} message Plain object to verify
             * @returns {string|null} `null` if valid, otherwise the reason why it is not
             */
            StopTimeEvent.verify = function verify(message) {
                if (typeof message !== "object" || message === null)
                    return "object expected";
                if (message.delay != null && message.hasOwnProperty("delay"))
                    if (!$util.isInteger(message.delay))
                        return "delay: integer expected";
                if (message.time != null && message.hasOwnProperty("time"))
                    if (!$util.isInteger(message.time) && !(message.time && $util.isInteger(message.time.low) && $util.isInteger(message.time.high)))
                        return "time: integer|Long expected";
                if (message.uncertainty != null && message.hasOwnProperty("uncertainty"))
                    if (!$util.isInteger(message.uncertainty))
                        return "uncertainty: integer expected";
                if (message.scheduled_time != null && message.hasOwnProperty("scheduled_time"))
                    if (!$util.isInteger(message.scheduled_time) && !(message.scheduled_time && $util.isInteger(message.scheduled_time.low) && $util.isInteger(message.scheduled_time.high)))
                        return "scheduled_time: integer|Long expected";
                return null;
            };

            /**
             * Creates a StopTimeEvent message from a plain object. Also converts values to their respective internal types.
             * @function fromObject
             * @memberof transit_realtime.TripUpdate.StopTimeEvent
             * @static
             * @param {Object.<string,*>} object Plain object
             * @returns {transit_realtime.TripUpdate.StopTimeEvent} StopTimeEvent
             */
            StopTimeEvent.fromObject = function fromObject(object) {
                if (object instanceof $root.transit_realtime.TripUpdate.StopTimeEvent)
                    return object;
                var message = new $root.transit_realtime.TripUpdate.StopTimeEvent();
                if (object.delay != null)
                    message.delay = object.delay | 0;
                if (object.time != null)
                    if ($util.Long)
                        (message.time = $util.Long.fromValue(object.time)).unsigned = false;
                    else if (typeof object.time === "string")
                        message.time = parseInt(object.time, 10);
                    else if (typeof object.time === "number")
                        message.time = object.time;
                    else if (typeof object.time === "object")
                        message.time = new $util.LongBits(object.time.low >>> 0, object.time.high >>> 0).toNumber();
                if (object.uncertainty != null)
                    message.uncertainty = object.uncertainty | 0;
                if (object.scheduled_time != null)
                    if ($util.Long)
                        (message.scheduled_time = $util.Long.fromValue(object.scheduled_time)).unsigned = false;
                    else if (typeof object.scheduled_time === "string")
                        message.scheduled_time = parseInt(object.scheduled_time, 10);
                    else if (typeof object.scheduled_time === "number")
                        message.scheduled_time = object.scheduled_time;
                    else if (typeof object.scheduled_time === "object")
                        message.scheduled_time = new $util.LongBits(object.scheduled_time.low >>> 0, object.scheduled_time.high >>> 0).toNumber();
                return message;
            };

            /**
             * Creates a plain object from a StopTimeEvent message. Also converts values to other types if specified.
             * @function toObject
             * @memberof transit_realtime.TripUpdate.StopTimeEvent
             * @static
             * @param {transit_realtime.TripUpdate.StopTimeEvent} message StopTimeEvent
             * @param {$protobuf.IConversionOptions} [options] Conversion options
             * @returns {Object.<string,*>} Plain object
             */
            StopTimeEvent.toObject = function toObject(message, options) {
                if (!options)
                    options = {};
                var object = {};
                if (options.defaults) {
                    object.delay = 0;
                    if ($util.Long) {
                        var long = new $util.Long(0, 0, false);
                        object.time = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : long;
                    } else
                        object.time = options.longs === String ? "0" : 0;
                    object.uncertainty = 0;
                    if ($util.Long) {
                        var long = new $util.Long(0, 0, false);
                        object.scheduled_time = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : long;
                    } else
                        object.scheduled_time = options.longs === String ? "0" : 0;
                }
                if (message.delay != null && message.hasOwnProperty("delay"))
                    object.delay = message.delay;
                if (message.time != null && message.hasOwnProperty("time"))
                    if (typeof message.time === "number")
                        object.time = options.longs === String ? String(message.time) : message.time;
                    else
                        object.time = options.longs === String ? $util.Long.prototype.toString.call(message.time) : options.longs === Number ? new $util.LongBits(message.time.low >>> 0, message.time.high >>> 0).toNumber() : message.time;
                if (message.uncertainty != null && message.hasOwnProperty("uncertainty"))
                    object.uncertainty = message.uncertainty;
                if (message.scheduled_time != null && message.hasOwnProperty("scheduled_time"))
                    if (typeof message.scheduled_time === "number")
                        object.scheduled_time = options.longs === String ? String(message.scheduled_time) : message.scheduled_time;
                    else
                        object.scheduled_time = options.longs === String ? $util.Long.prototype.toString.call(message.scheduled_time) : options.longs === Number ? new $util.LongBits(message.scheduled_time.low >>> 0, message.scheduled_time.high >>> 0).toNumber() : message.scheduled_time;
                return object;
            };

            /**
             * Converts this StopTimeEvent to JSON.
             * @function toJSON
             * @memberof transit_realtime.TripUpdate.StopTimeEvent
             * @instance
             * @returns {Object.<string,*>} JSON object
             */
            StopTimeEvent.prototype.toJSON = function toJSON() {
                return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
            };

            /**
             * Gets the default type url for StopTimeEvent
             * @function getTypeUrl
             * @memberof transit_realtime.TripUpdate.StopTimeEvent
             * @static
             * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
             * @returns {string} The default type url
             */
            StopTimeEvent.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                if (typeUrlPrefix === undefined) {
                    typeUrlPrefix = "type.googleapis.com";
                }
                return typeUrlPrefix + "/transit_realtime.TripUpdate.StopTimeEvent";
            };

            return StopTimeEvent;
        })();

        TripUpdate.StopTimeUpdate = (function() {

            /**
             * Properties of a StopTimeUpdate.
             * @memberof transit_realtime.TripUpdate
             * @interface IStopTimeUpdate
             * @property {number|null} [stop_sequence] StopTimeUpdate stop_sequence
             * @property {string|null} [stop_id] StopTimeUpdate stop_id
             * @property {transit_realtime.TripUpdate.IStopTimeEvent|null} [arrival] StopTimeUpdate arrival
             * @property {transit_realtime.TripUpdate.IStopTimeEvent|null} [departure] StopTimeUpdate departure
             * @property {transit_realtime.VehiclePosition.OccupancyStatus|null} [departure_occupancy_status] StopTimeUpdate departure_occupancy_status
             * @property {transit_realtime.TripUpdate.StopTimeUpdate.ScheduleRelationship|null} [schedule_relationship] StopTimeUpdate schedule_relationship
             * @property {transit_realtime.TripUpdate.StopTimeUpdate.IStopTimeProperties|null} [stop_time_properties] StopTimeUpdate stop_time_properties
             */

            /**
             * Constructs a new StopTimeUpdate.
             * @memberof transit_realtime.TripUpdate
             * @classdesc Represents a StopTimeUpdate.
             * @implements IStopTimeUpdate
             * @constructor
             * @param {transit_realtime.TripUpdate.IStopTimeUpdate=} [properties] Properties to set
             */
            function StopTimeUpdate(properties) {
                if (properties)
                    for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                        if (properties[keys[i]] != null)
                            this[keys[i]] = properties[keys[i]];
            }

            /**
             * StopTimeUpdate stop_sequence.
             * @member {number} stop_sequence
             * @memberof transit_realtime.TripUpdate.StopTimeUpdate
             * @instance
             */
            StopTimeUpdate.prototype.stop_sequence = 0;

            /**
             * StopTimeUpdate stop_id.
             * @member {string} stop_id
             * @memberof transit_realtime.TripUpdate.StopTimeUpdate
             * @instance
             */
            StopTimeUpdate.prototype.stop_id = "";

            /**
             * StopTimeUpdate arrival.
             * @member {transit_realtime.TripUpdate.IStopTimeEvent|null|undefined} arrival
             * @memberof transit_realtime.TripUpdate.StopTimeUpdate
             * @instance
             */
            StopTimeUpdate.prototype.arrival = null;

            /**
             * StopTimeUpdate departure.
             * @member {transit_realtime.TripUpdate.IStopTimeEvent|null|undefined} departure
             * @memberof transit_realtime.TripUpdate.StopTimeUpdate
             * @instance
             */
            StopTimeUpdate.prototype.departure = null;

            /**
             * StopTimeUpdate departure_occupancy_status.
             * @member {transit_realtime.VehiclePosition.OccupancyStatus} departure_occupancy_status
             * @memberof transit_realtime.TripUpdate.StopTimeUpdate
             * @instance
             */
            StopTimeUpdate.prototype.departure_occupancy_status = 0;

            /**
             * StopTimeUpdate schedule_relationship.
             * @member {transit_realtime.TripUpdate.StopTimeUpdate.ScheduleRelationship} schedule_relationship
             * @memberof transit_realtime.TripUpdate.StopTimeUpdate
             * @instance
             */
            StopTimeUpdate.prototype.schedule_relationship = 0;

            /**
             * StopTimeUpdate stop_time_properties.
             * @member {transit_realtime.TripUpdate.StopTimeUpdate.IStopTimeProperties|null|undefined} stop_time_properties
             * @memberof transit_realtime.TripUpdate.StopTimeUpdate
             * @instance
             */
            StopTimeUpdate.prototype.stop_time_properties = null;

            /**
             * Creates a new StopTimeUpdate instance using the specified properties.
             * @function create
             * @memberof transit_realtime.TripUpdate.StopTimeUpdate
             * @static
             * @param {transit_realtime.TripUpdate.IStopTimeUpdate=} [properties] Properties to set
             * @returns {transit_realtime.TripUpdate.StopTimeUpdate} StopTimeUpdate instance
             */
            StopTimeUpdate.create = function create(properties) {
                return new StopTimeUpdate(properties);
            };

            /**
             * Encodes the specified StopTimeUpdate message. Does not implicitly {@link transit_realtime.TripUpdate.StopTimeUpdate.verify|verify} messages.
             * @function encode
             * @memberof transit_realtime.TripUpdate.StopTimeUpdate
             * @static
             * @param {transit_realtime.TripUpdate.IStopTimeUpdate} message StopTimeUpdate message or plain object to encode
             * @param {$protobuf.Writer} [writer] Writer to encode to
             * @returns {$protobuf.Writer} Writer
             */
            StopTimeUpdate.encode = function encode(message, writer) {
                if (!writer)
                    writer = $Writer.create();
                if (message.stop_sequence != null && Object.hasOwnProperty.call(message, "stop_sequence"))
                    writer.uint32(/* id 1, wireType 0 =*/8).uint32(message.stop_sequence);
                if (message.arrival != null && Object.hasOwnProperty.call(message, "arrival"))
                    $root.transit_realtime.TripUpdate.StopTimeEvent.encode(message.arrival, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim();
                if (message.departure != null && Object.hasOwnProperty.call(message, "departure"))
                    $root.transit_realtime.TripUpdate.StopTimeEvent.encode(message.departure, writer.uint32(/* id 3, wireType 2 =*/26).fork()).ldelim();
                if (message.stop_id != null && Object.hasOwnProperty.call(message, "stop_id"))
                    writer.uint32(/* id 4, wireType 2 =*/34).string(message.stop_id);
                if (message.schedule_relationship != null && Object.hasOwnProperty.call(message, "schedule_relationship"))
                    writer.uint32(/* id 5, wireType 0 =*/40).int32(message.schedule_relationship);
                if (message.stop_time_properties != null && Object.hasOwnProperty.call(message, "stop_time_properties"))
                    $root.transit_realtime.TripUpdate.StopTimeUpdate.StopTimeProperties.encode(message.stop_time_properties, writer.uint32(/* id 6, wireType 2 =*/50).fork()).ldelim();
                if (message.departure_occupancy_status != null && Object.hasOwnProperty.call(message, "departure_occupancy_status"))
                    writer.uint32(/* id 7, wireType 0 =*/56).int32(message.departure_occupancy_status);
                return writer;
            };

            /**
             * Encodes the specified StopTimeUpdate message, length delimited. Does not implicitly {@link transit_realtime.TripUpdate.StopTimeUpdate.verify|verify} messages.
             * @function encodeDelimited
             * @memberof transit_realtime.TripUpdate.StopTimeUpdate
             * @static
             * @param {transit_realtime.TripUpdate.IStopTimeUpdate} message StopTimeUpdate message or plain object to encode
             * @param {$protobuf.Writer} [writer] Writer to encode to
             * @returns {$protobuf.Writer} Writer
             */
            StopTimeUpdate.encodeDelimited = function encodeDelimited(message, writer) {
                return this.encode(message, writer).ldelim();
            };

            /**
             * Decodes a StopTimeUpdate message from the specified reader or buffer.
             * @function decode
             * @memberof transit_realtime.TripUpdate.StopTimeUpdate
             * @static
             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
             * @param {number} [length] Message length if known beforehand
             * @returns {transit_realtime.TripUpdate.StopTimeUpdate} StopTimeUpdate
             * @throws {Error} If the payload is not a reader or valid buffer
             * @throws {$protobuf.util.ProtocolError} If required fields are missing
             */
            StopTimeUpdate.decode = function decode(reader, length, error) {
                if (!(reader instanceof $Reader))
                    reader = $Reader.create(reader);
                var end = length === undefined ? reader.len : reader.pos + length, message = new $root.transit_realtime.TripUpdate.StopTimeUpdate();
                while (reader.pos < end) {
                    var tag = reader.uint32();
                    if (tag === error)
                        break;
                    switch (tag >>> 3) {
                    case 1: {
                            message.stop_sequence = reader.uint32();
                            break;
                        }
                    case 4: {
                            message.stop_id = reader.string();
                            break;
                        }
                    case 2: {
                            message.arrival = $root.transit_realtime.TripUpdate.StopTimeEvent.decode(reader, reader.uint32());
                            break;
                        }
                    case 3: {
                            message.departure = $root.transit_realtime.TripUpdate.StopTimeEvent.decode(reader, reader.uint32());
                            break;
                        }
                    case 7: {
                            message.departure_occupancy_status = reader.int32();
                            break;
                        }
                    case 5: {
                            message.schedule_relationship = reader.int32();
                            break;
                        }
                    case 6: {
                            message.stop_time_properties = $root.transit_realtime.TripUpdate.StopTimeUpdate.StopTimeProperties.decode(reader, reader.uint32());
                            break;
                        }
                    default:
                        reader.skipType(tag & 7);
                        break;
                    }
                }
                return message;
            };

            /**
             * Decodes a StopTimeUpdate message from the specified reader or buffer, length delimited.
             * @function decodeDelimited
             * @memberof transit_realtime.TripUpdate.StopTimeUpdate
             * @static
             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
             * @returns {transit_realtime.TripUpdate.StopTimeUpdate} StopTimeUpdate
             * @throws {Error} If the payload is not a reader or valid buffer
             * @throws {$protobuf.util.ProtocolError} If required fields are missing
             */
            StopTimeUpdate.decodeDelimited = function decodeDelimited(reader) {
                if (!(reader instanceof $Reader))
                    reader = new $Reader(reader);
                return this.decode(reader, reader.uint32());
            };

            /**
             * Verifies a StopTimeUpdate message.
             * @function verify
             * @memberof transit_realtime.TripUpdate.StopTimeUpdate
             * @static
             * @param {Object.<string,*>} message Plain object to verify
             * @returns {string|null} `null` if valid, otherwise the reason why it is not
             */
            StopTimeUpdate.verify = function verify(message) {
                if (typeof message !== "object" || message === null)
                    return "object expected";
                if (message.stop_sequence != null && message.hasOwnProperty("stop_sequence"))
                    if (!$util.isInteger(message.stop_sequence))
                        return "stop_sequence: integer expected";
                if (message.stop_id != null && message.hasOwnProperty("stop_id"))
                    if (!$util.isString(message.stop_id))
                        return "stop_id: string expected";
                if (message.arrival != null && message.hasOwnProperty("arrival")) {
                    var error = $root.transit_realtime.TripUpdate.StopTimeEvent.verify(message.arrival);
                    if (error)
                        return "arrival." + error;
                }
                if (message.departure != null && message.hasOwnProperty("departure")) {
                    var error = $root.transit_realtime.TripUpdate.StopTimeEvent.verify(message.departure);
                    if (error)
                        return "departure." + error;
                }
                if (message.departure_occupancy_status != null && message.hasOwnProperty("departure_occupancy_status"))
                    switch (message.departure_occupancy_status) {
                    default:
                        return "departure_occupancy_status: enum value expected";
                    case 0:
                    case 1:
                    case 2:
                    case 3:
                    case 4:
                    case 5:
                    case 6:
                    case 7:
                    case 8:
                        break;
                    }
                if (message.schedule_relationship != null && message.hasOwnProperty("schedule_relationship"))
                    switch (message.schedule_relationship) {
                    default:
                        return "schedule_relationship: enum value expected";
                    case 0:
                    case 1:
                    case 2:
                    case 3:
                        break;
                    }
                if (message.stop_time_properties != null && message.hasOwnProperty("stop_time_properties")) {
                    var error = $root.transit_realtime.TripUpdate.StopTimeUpdate.StopTimeProperties.verify(message.stop_time_properties);
                    if (error)
                        return "stop_time_properties." + error;
                }
                return null;
            };

            /**
             * Creates a StopTimeUpdate message from a plain object. Also converts values to their respective internal types.
             * @function fromObject
             * @memberof transit_realtime.TripUpdate.StopTimeUpdate
             * @static
             * @param {Object.<string,*>} object Plain object
             * @returns {transit_realtime.TripUpdate.StopTimeUpdate} StopTimeUpdate
             */
            StopTimeUpdate.fromObject = function fromObject(object) {
                if (object instanceof $root.transit_realtime.TripUpdate.StopTimeUpdate)
                    return object;
                var message = new $root.transit_realtime.TripUpdate.StopTimeUpdate();
                if (object.stop_sequence != null)
                    message.stop_sequence = object.stop_sequence >>> 0;
                if (object.stop_id != null)
                    message.stop_id = String(object.stop_id);
                if (object.arrival != null) {
                    if (typeof object.arrival !== "object")
                        throw TypeError(".transit_realtime.TripUpdate.StopTimeUpdate.arrival: object expected");
                    message.arrival = $root.transit_realtime.TripUpdate.StopTimeEvent.fromObject(object.arrival);
                }
                if (object.departure != null) {
                    if (typeof object.departure !== "object")
                        throw TypeError(".transit_realtime.TripUpdate.StopTimeUpdate.departure: object expected");
                    message.departure = $root.transit_realtime.TripUpdate.StopTimeEvent.fromObject(object.departure);
                }
                switch (object.departure_occupancy_status) {
                default:
                    if (typeof object.departure_occupancy_status === "number") {
                        message.departure_occupancy_status = object.departure_occupancy_status;
                        break;
                    }
                    break;
                case "EMPTY":
                case 0:
                    message.departure_occupancy_status = 0;
                    break;
                case "MANY_SEATS_AVAILABLE":
                case 1:
                    message.departure_occupancy_status = 1;
                    break;
                case "FEW_SEATS_AVAILABLE":
                case 2:
                    message.departure_occupancy_status = 2;
                    break;
                case "STANDING_ROOM_ONLY":
                case 3:
                    message.departure_occupancy_status = 3;
                    break;
                case "CRUSHED_STANDING_ROOM_ONLY":
                case 4:
                    message.departure_occupancy_status = 4;
                    break;
                case "FULL":
                case 5:
                    message.departure_occupancy_status = 5;
                    break;
                case "NOT_ACCEPTING_PASSENGERS":
                case 6:
                    message.departure_occupancy_status = 6;
                    break;
                case "NO_DATA_AVAILABLE":
                case 7:
                    message.departure_occupancy_status = 7;
                    break;
                case "NOT_BOARDABLE":
                case 8:
                    message.departure_occupancy_status = 8;
                    break;
                }
                switch (object.schedule_relationship) {
                default:
                    if (typeof object.schedule_relationship === "number") {
                        message.schedule_relationship = object.schedule_relationship;
                        break;
                    }
                    break;
                case "SCHEDULED":
                case 0:
                    message.schedule_relationship = 0;
                    break;
                case "SKIPPED":
                case 1:
                    message.schedule_relationship = 1;
                    break;
                case "NO_DATA":
                case 2:
                    message.schedule_relationship = 2;
                    break;
                case "UNSCHEDULED":
                case 3:
                    message.schedule_relationship = 3;
                    break;
                }
                if (object.stop_time_properties != null) {
                    if (typeof object.stop_time_properties !== "object")
                        throw TypeError(".transit_realtime.TripUpdate.StopTimeUpdate.stop_time_properties: object expected");
                    message.stop_time_properties = $root.transit_realtime.TripUpdate.StopTimeUpdate.StopTimeProperties.fromObject(object.stop_time_properties);
                }
                return message;
            };

            /**
             * Creates a plain object from a StopTimeUpdate message. Also converts values to other types if specified.
             * @function toObject
             * @memberof transit_realtime.TripUpdate.StopTimeUpdate
             * @static
             * @param {transit_realtime.TripUpdate.StopTimeUpdate} message StopTimeUpdate
             * @param {$protobuf.IConversionOptions} [options] Conversion options
             * @returns {Object.<string,*>} Plain object
             */
            StopTimeUpdate.toObject = function toObject(message, options) {
                if (!options)
                    options = {};
                var object = {};
                if (options.defaults) {
                    object.stop_sequence = 0;
                    object.arrival = null;
                    object.departure = null;
                    object.stop_id = "";
                    object.schedule_relationship = options.enums === String ? "SCHEDULED" : 0;
                    object.stop_time_properties = null;
                    object.departure_occupancy_status = options.enums === String ? "EMPTY" : 0;
                }
                if (message.stop_sequence != null && message.hasOwnProperty("stop_sequence"))
                    object.stop_sequence = message.stop_sequence;
                if (message.arrival != null && message.hasOwnProperty("arrival"))
                    object.arrival = $root.transit_realtime.TripUpdate.StopTimeEvent.toObject(message.arrival, options);
                if (message.departure != null && message.hasOwnProperty("departure"))
                    object.departure = $root.transit_realtime.TripUpdate.StopTimeEvent.toObject(message.departure, options);
                if (message.stop_id != null && message.hasOwnProperty("stop_id"))
                    object.stop_id = message.stop_id;
                if (message.schedule_relationship != null && message.hasOwnProperty("schedule_relationship"))
                    object.schedule_relationship = options.enums === String ? $root.transit_realtime.TripUpdate.StopTimeUpdate.ScheduleRelationship[message.schedule_relationship] === undefined ? message.schedule_relationship : $root.transit_realtime.TripUpdate.StopTimeUpdate.ScheduleRelationship[message.schedule_relationship] : message.schedule_relationship;
                if (message.stop_time_properties != null && message.hasOwnProperty("stop_time_properties"))
                    object.stop_time_properties = $root.transit_realtime.TripUpdate.StopTimeUpdate.StopTimeProperties.toObject(message.stop_time_properties, options);
                if (message.departure_occupancy_status != null && message.hasOwnProperty("departure_occupancy_status"))
                    object.departure_occupancy_status = options.enums === String ? $root.transit_realtime.VehiclePosition.OccupancyStatus[message.departure_occupancy_status] === undefined ? message.departure_occupancy_status : $root.transit_realtime.VehiclePosition.OccupancyStatus[message.departure_occupancy_status] : message.departure_occupancy_status;
                return object;
            };

            /**
             * Converts this StopTimeUpdate to JSON.
             * @function toJSON
             * @memberof transit_realtime.TripUpdate.StopTimeUpdate
             * @instance
             * @returns {Object.<string,*>} JSON object
             */
            StopTimeUpdate.prototype.toJSON = function toJSON() {
                return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
            };

            /**
             * Gets the default type url for StopTimeUpdate
             * @function getTypeUrl
             * @memberof transit_realtime.TripUpdate.StopTimeUpdate
             * @static
             * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
             * @returns {string} The default type url
             */
            StopTimeUpdate.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                if (typeUrlPrefix === undefined) {
                    typeUrlPrefix = "type.googleapis.com";
                }
                return typeUrlPrefix + "/transit_realtime.TripUpdate.StopTimeUpdate";
            };

            /**
             * ScheduleRelationship enum.
             * @name transit_realtime.TripUpdate.StopTimeUpdate.ScheduleRelationship
             * @enum {number}
             * @property {number} SCHEDULED=0 SCHEDULED value
             * @property {number} SKIPPED=1 SKIPPED value
             * @property {number} NO_DATA=2 NO_DATA value
             * @property {number} UNSCHEDULED=3 UNSCHEDULED value
             */
            StopTimeUpdate.ScheduleRelationship = (function() {
                var valuesById = {}, values = Object.create(valuesById);
                values[valuesById[0] = "SCHEDULED"] = 0;
                values[valuesById[1] = "SKIPPED"] = 1;
                values[valuesById[2] = "NO_DATA"] = 2;
                values[valuesById[3] = "UNSCHEDULED"] = 3;
                return values;
            })();

            StopTimeUpdate.StopTimeProperties = (function() {

                /**
                 * Properties of a StopTimeProperties.
                 * @memberof transit_realtime.TripUpdate.StopTimeUpdate
                 * @interface IStopTimeProperties
                 * @property {string|null} [assigned_stop_id] StopTimeProperties assigned_stop_id
                 * @property {string|null} [stop_headsign] StopTimeProperties stop_headsign
                 * @property {transit_realtime.TripUpdate.StopTimeUpdate.StopTimeProperties.DropOffPickupType|null} [pickup_type] StopTimeProperties pickup_type
                 * @property {transit_realtime.TripUpdate.StopTimeUpdate.StopTimeProperties.DropOffPickupType|null} [drop_off_type] StopTimeProperties drop_off_type
                 */

                /**
                 * Constructs a new StopTimeProperties.
                 * @memberof transit_realtime.TripUpdate.StopTimeUpdate
                 * @classdesc Represents a StopTimeProperties.
                 * @implements IStopTimeProperties
                 * @constructor
                 * @param {transit_realtime.TripUpdate.StopTimeUpdate.IStopTimeProperties=} [properties] Properties to set
                 */
                function StopTimeProperties(properties) {
                    if (properties)
                        for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                            if (properties[keys[i]] != null)
                                this[keys[i]] = properties[keys[i]];
                }

                /**
                 * StopTimeProperties assigned_stop_id.
                 * @member {string} assigned_stop_id
                 * @memberof transit_realtime.TripUpdate.StopTimeUpdate.StopTimeProperties
                 * @instance
                 */
                StopTimeProperties.prototype.assigned_stop_id = "";

                /**
                 * StopTimeProperties stop_headsign.
                 * @member {string} stop_headsign
                 * @memberof transit_realtime.TripUpdate.StopTimeUpdate.StopTimeProperties
                 * @instance
                 */
                StopTimeProperties.prototype.stop_headsign = "";

                /**
                 * StopTimeProperties pickup_type.
                 * @member {transit_realtime.TripUpdate.StopTimeUpdate.StopTimeProperties.DropOffPickupType} pickup_type
                 * @memberof transit_realtime.TripUpdate.StopTimeUpdate.StopTimeProperties
                 * @instance
                 */
                StopTimeProperties.prototype.pickup_type = 0;

                /**
                 * StopTimeProperties drop_off_type.
                 * @member {transit_realtime.TripUpdate.StopTimeUpdate.StopTimeProperties.DropOffPickupType} drop_off_type
                 * @memberof transit_realtime.TripUpdate.StopTimeUpdate.StopTimeProperties
                 * @instance
                 */
                StopTimeProperties.prototype.drop_off_type = 0;

                /**
                 * Creates a new StopTimeProperties instance using the specified properties.
                 * @function create
                 * @memberof transit_realtime.TripUpdate.StopTimeUpdate.StopTimeProperties
                 * @static
                 * @param {transit_realtime.TripUpdate.StopTimeUpdate.IStopTimeProperties=} [properties] Properties to set
                 * @returns {transit_realtime.TripUpdate.StopTimeUpdate.StopTimeProperties} StopTimeProperties instance
                 */
                StopTimeProperties.create = function create(properties) {
                    return new StopTimeProperties(properties);
                };

                /**
                 * Encodes the specified StopTimeProperties message. Does not implicitly {@link transit_realtime.TripUpdate.StopTimeUpdate.StopTimeProperties.verify|verify} messages.
                 * @function encode
                 * @memberof transit_realtime.TripUpdate.StopTimeUpdate.StopTimeProperties
                 * @static
                 * @param {transit_realtime.TripUpdate.StopTimeUpdate.IStopTimeProperties} message StopTimeProperties message or plain object to encode
                 * @param {$protobuf.Writer} [writer] Writer to encode to
                 * @returns {$protobuf.Writer} Writer
                 */
                StopTimeProperties.encode = function encode(message, writer) {
                    if (!writer)
                        writer = $Writer.create();
                    if (message.assigned_stop_id != null && Object.hasOwnProperty.call(message, "assigned_stop_id"))
                        writer.uint32(/* id 1, wireType 2 =*/10).string(message.assigned_stop_id);
                    if (message.stop_headsign != null && Object.hasOwnProperty.call(message, "stop_headsign"))
                        writer.uint32(/* id 2, wireType 2 =*/18).string(message.stop_headsign);
                    if (message.pickup_type != null && Object.hasOwnProperty.call(message, "pickup_type"))
                        writer.uint32(/* id 3, wireType 0 =*/24).int32(message.pickup_type);
                    if (message.drop_off_type != null && Object.hasOwnProperty.call(message, "drop_off_type"))
                        writer.uint32(/* id 4, wireType 0 =*/32).int32(message.drop_off_type);
                    return writer;
                };

                /**
                 * Encodes the specified StopTimeProperties message, length delimited. Does not implicitly {@link transit_realtime.TripUpdate.StopTimeUpdate.StopTimeProperties.verify|verify} messages.
                 * @function encodeDelimited
                 * @memberof transit_realtime.TripUpdate.StopTimeUpdate.StopTimeProperties
                 * @static
                 * @param {transit_realtime.TripUpdate.StopTimeUpdate.IStopTimeProperties} message StopTimeProperties message or plain object to encode
                 * @param {$protobuf.Writer} [writer] Writer to encode to
                 * @returns {$protobuf.Writer} Writer
                 */
                StopTimeProperties.encodeDelimited = function encodeDelimited(message, writer) {
                    return this.encode(message, writer).ldelim();
                };

                /**
                 * Decodes a StopTimeProperties message from the specified reader or buffer.
                 * @function decode
                 * @memberof transit_realtime.TripUpdate.StopTimeUpdate.StopTimeProperties
                 * @static
                 * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                 * @param {number} [length] Message length if known beforehand
                 * @returns {transit_realtime.TripUpdate.StopTimeUpdate.StopTimeProperties} StopTimeProperties
                 * @throws {Error} If the payload is not a reader or valid buffer
                 * @throws {$protobuf.util.ProtocolError} If required fields are missing
                 */
                StopTimeProperties.decode = function decode(reader, length, error) {
                    if (!(reader instanceof $Reader))
                        reader = $Reader.create(reader);
                    var end = length === undefined ? reader.len : reader.pos + length, message = new $root.transit_realtime.TripUpdate.StopTimeUpdate.StopTimeProperties();
                    while (reader.pos < end) {
                        var tag = reader.uint32();
                        if (tag === error)
                            break;
                        switch (tag >>> 3) {
                        case 1: {
                                message.assigned_stop_id = reader.string();
                                break;
                            }
                        case 2: {
                                message.stop_headsign = reader.string();
                                break;
                            }
                        case 3: {
                                message.pickup_type = reader.int32();
                                break;
                            }
                        case 4: {
                                message.drop_off_type = reader.int32();
                                break;
                            }
                        default:
                            reader.skipType(tag & 7);
                            break;
                        }
                    }
                    return message;
                };

                /**
                 * Decodes a StopTimeProperties message from the specified reader or buffer, length delimited.
                 * @function decodeDelimited
                 * @memberof transit_realtime.TripUpdate.StopTimeUpdate.StopTimeProperties
                 * @static
                 * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                 * @returns {transit_realtime.TripUpdate.StopTimeUpdate.StopTimeProperties} StopTimeProperties
                 * @throws {Error} If the payload is not a reader or valid buffer
                 * @throws {$protobuf.util.ProtocolError} If required fields are missing
                 */
                StopTimeProperties.decodeDelimited = function decodeDelimited(reader) {
                    if (!(reader instanceof $Reader))
                        reader = new $Reader(reader);
                    return this.decode(reader, reader.uint32());
                };

                /**
                 * Verifies a StopTimeProperties message.
                 * @function verify
                 * @memberof transit_realtime.TripUpdate.StopTimeUpdate.StopTimeProperties
                 * @static
                 * @param {Object.<string,*>} message Plain object to verify
                 * @returns {string|null} `null` if valid, otherwise the reason why it is not
                 */
                StopTimeProperties.verify = function verify(message) {
                    if (typeof message !== "object" || message === null)
                        return "object expected";
                    if (message.assigned_stop_id != null && message.hasOwnProperty("assigned_stop_id"))
                        if (!$util.isString(message.assigned_stop_id))
                            return "assigned_stop_id: string expected";
                    if (message.stop_headsign != null && message.hasOwnProperty("stop_headsign"))
                        if (!$util.isString(message.stop_headsign))
                            return "stop_headsign: string expected";
                    if (message.pickup_type != null && message.hasOwnProperty("pickup_type"))
                        switch (message.pickup_type) {
                        default:
                            return "pickup_type: enum value expected";
                        case 0:
                        case 1:
                        case 2:
                        case 3:
                            break;
                        }
                    if (message.drop_off_type != null && message.hasOwnProperty("drop_off_type"))
                        switch (message.drop_off_type) {
                        default:
                            return "drop_off_type: enum value expected";
                        case 0:
                        case 1:
                        case 2:
                        case 3:
                            break;
                        }
                    return null;
                };

                /**
                 * Creates a StopTimeProperties message from a plain object. Also converts values to their respective internal types.
                 * @function fromObject
                 * @memberof transit_realtime.TripUpdate.StopTimeUpdate.StopTimeProperties
                 * @static
                 * @param {Object.<string,*>} object Plain object
                 * @returns {transit_realtime.TripUpdate.StopTimeUpdate.StopTimeProperties} StopTimeProperties
                 */
                StopTimeProperties.fromObject = function fromObject(object) {
                    if (object instanceof $root.transit_realtime.TripUpdate.StopTimeUpdate.StopTimeProperties)
                        return object;
                    var message = new $root.transit_realtime.TripUpdate.StopTimeUpdate.StopTimeProperties();
                    if (object.assigned_stop_id != null)
                        message.assigned_stop_id = String(object.assigned_stop_id);
                    if (object.stop_headsign != null)
                        message.stop_headsign = String(object.stop_headsign);
                    switch (object.pickup_type) {
                    default:
                        if (typeof object.pickup_type === "number") {
                            message.pickup_type = object.pickup_type;
                            break;
                        }
                        break;
                    case "REGULAR":
                    case 0:
                        message.pickup_type = 0;
                        break;
                    case "NONE":
                    case 1:
                        message.pickup_type = 1;
                        break;
                    case "PHONE_AGENCY":
                    case 2:
                        message.pickup_type = 2;
                        break;
                    case "COORDINATE_WITH_DRIVER":
                    case 3:
                        message.pickup_type = 3;
                        break;
                    }
                    switch (object.drop_off_type) {
                    default:
                        if (typeof object.drop_off_type === "number") {
                            message.drop_off_type = object.drop_off_type;
                            break;
                        }
                        break;
                    case "REGULAR":
                    case 0:
                        message.drop_off_type = 0;
                        break;
                    case "NONE":
                    case 1:
                        message.drop_off_type = 1;
                        break;
                    case "PHONE_AGENCY":
                    case 2:
                        message.drop_off_type = 2;
                        break;
                    case "COORDINATE_WITH_DRIVER":
                    case 3:
                        message.drop_off_type = 3;
                        break;
                    }
                    return message;
                };

                /**
                 * Creates a plain object from a StopTimeProperties message. Also converts values to other types if specified.
                 * @function toObject
                 * @memberof transit_realtime.TripUpdate.StopTimeUpdate.StopTimeProperties
                 * @static
                 * @param {transit_realtime.TripUpdate.StopTimeUpdate.StopTimeProperties} message StopTimeProperties
                 * @param {$protobuf.IConversionOptions} [options] Conversion options
                 * @returns {Object.<string,*>} Plain object
                 */
                StopTimeProperties.toObject = function toObject(message, options) {
                    if (!options)
                        options = {};
                    var object = {};
                    if (options.defaults) {
                        object.assigned_stop_id = "";
                        object.stop_headsign = "";
                        object.pickup_type = options.enums === String ? "REGULAR" : 0;
                        object.drop_off_type = options.enums === String ? "REGULAR" : 0;
                    }
                    if (message.assigned_stop_id != null && message.hasOwnProperty("assigned_stop_id"))
                        object.assigned_stop_id = message.assigned_stop_id;
                    if (message.stop_headsign != null && message.hasOwnProperty("stop_headsign"))
                        object.stop_headsign = message.stop_headsign;
                    if (message.pickup_type != null && message.hasOwnProperty("pickup_type"))
                        object.pickup_type = options.enums === String ? $root.transit_realtime.TripUpdate.StopTimeUpdate.StopTimeProperties.DropOffPickupType[message.pickup_type] === undefined ? message.pickup_type : $root.transit_realtime.TripUpdate.StopTimeUpdate.StopTimeProperties.DropOffPickupType[message.pickup_type] : message.pickup_type;
                    if (message.drop_off_type != null && message.hasOwnProperty("drop_off_type"))
                        object.drop_off_type = options.enums === String ? $root.transit_realtime.TripUpdate.StopTimeUpdate.StopTimeProperties.DropOffPickupType[message.drop_off_type] === undefined ? message.drop_off_type : $root.transit_realtime.TripUpdate.StopTimeUpdate.StopTimeProperties.DropOffPickupType[message.drop_off_type] : message.drop_off_type;
                    return object;
                };

                /**
                 * Converts this StopTimeProperties to JSON.
                 * @function toJSON
                 * @memberof transit_realtime.TripUpdate.StopTimeUpdate.StopTimeProperties
                 * @instance
                 * @returns {Object.<string,*>} JSON object
                 */
                StopTimeProperties.prototype.toJSON = function toJSON() {
                    return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                };

                /**
                 * Gets the default type url for StopTimeProperties
                 * @function getTypeUrl
                 * @memberof transit_realtime.TripUpdate.StopTimeUpdate.StopTimeProperties
                 * @static
                 * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                 * @returns {string} The default type url
                 */
                StopTimeProperties.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                    if (typeUrlPrefix === undefined) {
                        typeUrlPrefix = "type.googleapis.com";
                    }
                    return typeUrlPrefix + "/transit_realtime.TripUpdate.StopTimeUpdate.StopTimeProperties";
                };

                /**
                 * DropOffPickupType enum.
                 * @name transit_realtime.TripUpdate.StopTimeUpdate.StopTimeProperties.DropOffPickupType
                 * @enum {number}
                 * @property {number} REGULAR=0 REGULAR value
                 * @property {number} NONE=1 NONE value
                 * @property {number} PHONE_AGENCY=2 PHONE_AGENCY value
                 * @property {number} COORDINATE_WITH_DRIVER=3 COORDINATE_WITH_DRIVER value
                 */
                StopTimeProperties.DropOffPickupType = (function() {
                    var valuesById = {}, values = Object.create(valuesById);
                    values[valuesById[0] = "REGULAR"] = 0;
                    values[valuesById[1] = "NONE"] = 1;
                    values[valuesById[2] = "PHONE_AGENCY"] = 2;
                    values[valuesById[3] = "COORDINATE_WITH_DRIVER"] = 3;
                    return values;
                })();

                return StopTimeProperties;
            })();

            return StopTimeUpdate;
        })();

        TripUpdate.TripProperties = (function() {

            /**
             * Properties of a TripProperties.
             * @memberof transit_realtime.TripUpdate
             * @interface ITripProperties
             * @property {string|null} [trip_id] TripProperties trip_id
             * @property {string|null} [start_date] TripProperties start_date
             * @property {string|null} [start_time] TripProperties start_time
             * @property {string|null} [shape_id] TripProperties shape_id
             * @property {string|null} [trip_headsign] TripProperties trip_headsign
             * @property {string|null} [trip_short_name] TripProperties trip_short_name
             */

            /**
             * Constructs a new TripProperties.
             * @memberof transit_realtime.TripUpdate
             * @classdesc Represents a TripProperties.
             * @implements ITripProperties
             * @constructor
             * @param {transit_realtime.TripUpdate.ITripProperties=} [properties] Properties to set
             */
            function TripProperties(properties) {
                if (properties)
                    for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                        if (properties[keys[i]] != null)
                            this[keys[i]] = properties[keys[i]];
            }

            /**
             * TripProperties trip_id.
             * @member {string} trip_id
             * @memberof transit_realtime.TripUpdate.TripProperties
             * @instance
             */
            TripProperties.prototype.trip_id = "";

            /**
             * TripProperties start_date.
             * @member {string} start_date
             * @memberof transit_realtime.TripUpdate.TripProperties
             * @instance
             */
            TripProperties.prototype.start_date = "";

            /**
             * TripProperties start_time.
             * @member {string} start_time
             * @memberof transit_realtime.TripUpdate.TripProperties
             * @instance
             */
            TripProperties.prototype.start_time = "";

            /**
             * TripProperties shape_id.
             * @member {string} shape_id
             * @memberof transit_realtime.TripUpdate.TripProperties
             * @instance
             */
            TripProperties.prototype.shape_id = "";

            /**
             * TripProperties trip_headsign.
             * @member {string} trip_headsign
             * @memberof transit_realtime.TripUpdate.TripProperties
             * @instance
             */
            TripProperties.prototype.trip_headsign = "";

            /**
             * TripProperties trip_short_name.
             * @member {string} trip_short_name
             * @memberof transit_realtime.TripUpdate.TripProperties
             * @instance
             */
            TripProperties.prototype.trip_short_name = "";

            /**
             * Creates a new TripProperties instance using the specified properties.
             * @function create
             * @memberof transit_realtime.TripUpdate.TripProperties
             * @static
             * @param {transit_realtime.TripUpdate.ITripProperties=} [properties] Properties to set
             * @returns {transit_realtime.TripUpdate.TripProperties} TripProperties instance
             */
            TripProperties.create = function create(properties) {
                return new TripProperties(properties);
            };

            /**
             * Encodes the specified TripProperties message. Does not implicitly {@link transit_realtime.TripUpdate.TripProperties.verify|verify} messages.
             * @function encode
             * @memberof transit_realtime.TripUpdate.TripProperties
             * @static
             * @param {transit_realtime.TripUpdate.ITripProperties} message TripProperties message or plain object to encode
             * @param {$protobuf.Writer} [writer] Writer to encode to
             * @returns {$protobuf.Writer} Writer
             */
            TripProperties.encode = function encode(message, writer) {
                if (!writer)
                    writer = $Writer.create();
                if (message.trip_id != null && Object.hasOwnProperty.call(message, "trip_id"))
                    writer.uint32(/* id 1, wireType 2 =*/10).string(message.trip_id);
                if (message.start_date != null && Object.hasOwnProperty.call(message, "start_date"))
                    writer.uint32(/* id 2, wireType 2 =*/18).string(message.start_date);
                if (message.start_time != null && Object.hasOwnProperty.call(message, "start_time"))
                    writer.uint32(/* id 3, wireType 2 =*/26).string(message.start_time);
                if (message.shape_id != null && Object.hasOwnProperty.call(message, "shape_id"))
                    writer.uint32(/* id 4, wireType 2 =*/34).string(message.shape_id);
                if (message.trip_headsign != null && Object.hasOwnProperty.call(message, "trip_headsign"))
                    writer.uint32(/* id 5, wireType 2 =*/42).string(message.trip_headsign);
                if (message.trip_short_name != null && Object.hasOwnProperty.call(message, "trip_short_name"))
                    writer.uint32(/* id 6, wireType 2 =*/50).string(message.trip_short_name);
                return writer;
            };

            /**
             * Encodes the specified TripProperties message, length delimited. Does not implicitly {@link transit_realtime.TripUpdate.TripProperties.verify|verify} messages.
             * @function encodeDelimited
             * @memberof transit_realtime.TripUpdate.TripProperties
             * @static
             * @param {transit_realtime.TripUpdate.ITripProperties} message TripProperties message or plain object to encode
             * @param {$protobuf.Writer} [writer] Writer to encode to
             * @returns {$protobuf.Writer} Writer
             */
            TripProperties.encodeDelimited = function encodeDelimited(message, writer) {
                return this.encode(message, writer).ldelim();
            };

            /**
             * Decodes a TripProperties message from the specified reader or buffer.
             * @function decode
             * @memberof transit_realtime.TripUpdate.TripProperties
             * @static
             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
             * @param {number} [length] Message length if known beforehand
             * @returns {transit_realtime.TripUpdate.TripProperties} TripProperties
             * @throws {Error} If the payload is not a reader or valid buffer
             * @throws {$protobuf.util.ProtocolError} If required fields are missing
             */
            TripProperties.decode = function decode(reader, length, error) {
                if (!(reader instanceof $Reader))
                    reader = $Reader.create(reader);
                var end = length === undefined ? reader.len : reader.pos + length, message = new $root.transit_realtime.TripUpdate.TripProperties();
                while (reader.pos < end) {
                    var tag = reader.uint32();
                    if (tag === error)
                        break;
                    switch (tag >>> 3) {
                    case 1: {
                            message.trip_id = reader.string();
                            break;
                        }
                    case 2: {
                            message.start_date = reader.string();
                            break;
                        }
                    case 3: {
                            message.start_time = reader.string();
                            break;
                        }
                    case 4: {
                            message.shape_id = reader.string();
                            break;
                        }
                    case 5: {
                            message.trip_headsign = reader.string();
                            break;
                        }
                    case 6: {
                            message.trip_short_name = reader.string();
                            break;
                        }
                    default:
                        reader.skipType(tag & 7);
                        break;
                    }
                }
                return message;
            };

            /**
             * Decodes a TripProperties message from the specified reader or buffer, length delimited.
             * @function decodeDelimited
             * @memberof transit_realtime.TripUpdate.TripProperties
             * @static
             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
             * @returns {transit_realtime.TripUpdate.TripProperties} TripProperties
             * @throws {Error} If the payload is not a reader or valid buffer
             * @throws {$protobuf.util.ProtocolError} If required fields are missing
             */
            TripProperties.decodeDelimited = function decodeDelimited(reader) {
                if (!(reader instanceof $Reader))
                    reader = new $Reader(reader);
                return this.decode(reader, reader.uint32());
            };

            /**
             * Verifies a TripProperties message.
             * @function verify
             * @memberof transit_realtime.TripUpdate.TripProperties
             * @static
             * @param {Object.<string,*>} message Plain object to verify
             * @returns {string|null} `null` if valid, otherwise the reason why it is not
             */
            TripProperties.verify = function verify(message) {
                if (typeof message !== "object" || message === null)
                    return "object expected";
                if (message.trip_id != null && message.hasOwnProperty("trip_id"))
                    if (!$util.isString(message.trip_id))
                        return "trip_id: string expected";
                if (message.start_date != null && message.hasOwnProperty("start_date"))
                    if (!$util.isString(message.start_date))
                        return "start_date: string expected";
                if (message.start_time != null && message.hasOwnProperty("start_time"))
                    if (!$util.isString(message.start_time))
                        return "start_time: string expected";
                if (message.shape_id != null && message.hasOwnProperty("shape_id"))
                    if (!$util.isString(message.shape_id))
                        return "shape_id: string expected";
                if (message.trip_headsign != null && message.hasOwnProperty("trip_headsign"))
                    if (!$util.isString(message.trip_headsign))
                        return "trip_headsign: string expected";
                if (message.trip_short_name != null && message.hasOwnProperty("trip_short_name"))
                    if (!$util.isString(message.trip_short_name))
                        return "trip_short_name: string expected";
                return null;
            };

            /**
             * Creates a TripProperties message from a plain object. Also converts values to their respective internal types.
             * @function fromObject
             * @memberof transit_realtime.TripUpdate.TripProperties
             * @static
             * @param {Object.<string,*>} object Plain object
             * @returns {transit_realtime.TripUpdate.TripProperties} TripProperties
             */
            TripProperties.fromObject = function fromObject(object) {
                if (object instanceof $root.transit_realtime.TripUpdate.TripProperties)
                    return object;
                var message = new $root.transit_realtime.TripUpdate.TripProperties();
                if (object.trip_id != null)
                    message.trip_id = String(object.trip_id);
                if (object.start_date != null)
                    message.start_date = String(object.start_date);
                if (object.start_time != null)
                    message.start_time = String(object.start_time);
                if (object.shape_id != null)
                    message.shape_id = String(object.shape_id);
                if (object.trip_headsign != null)
                    message.trip_headsign = String(object.trip_headsign);
                if (object.trip_short_name != null)
                    message.trip_short_name = String(object.trip_short_name);
                return message;
            };

            /**
             * Creates a plain object from a TripProperties message. Also converts values to other types if specified.
             * @function toObject
             * @memberof transit_realtime.TripUpdate.TripProperties
             * @static
             * @param {transit_realtime.TripUpdate.TripProperties} message TripProperties
             * @param {$protobuf.IConversionOptions} [options] Conversion options
             * @returns {Object.<string,*>} Plain object
             */
            TripProperties.toObject = function toObject(message, options) {
                if (!options)
                    options = {};
                var object = {};
                if (options.defaults) {
                    object.trip_id = "";
                    object.start_date = "";
                    object.start_time = "";
                    object.shape_id = "";
                    object.trip_headsign = "";
                    object.trip_short_name = "";
                }
                if (message.trip_id != null && message.hasOwnProperty("trip_id"))
                    object.trip_id = message.trip_id;
                if (message.start_date != null && message.hasOwnProperty("start_date"))
                    object.start_date = message.start_date;
                if (message.start_time != null && message.hasOwnProperty("start_time"))
                    object.start_time = message.start_time;
                if (message.shape_id != null && message.hasOwnProperty("shape_id"))
                    object.shape_id = message.shape_id;
                if (message.trip_headsign != null && message.hasOwnProperty("trip_headsign"))
                    object.trip_headsign = message.trip_headsign;
                if (message.trip_short_name != null && message.hasOwnProperty("trip_short_name"))
                    object.trip_short_name = message.trip_short_name;
                return object;
            };

            /**
             * Converts this TripProperties to JSON.
             * @function toJSON
             * @memberof transit_realtime.TripUpdate.TripProperties
             * @instance
             * @returns {Object.<string,*>} JSON object
             */
            TripProperties.prototype.toJSON = function toJSON() {
                return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
            };

            /**
             * Gets the default type url for TripProperties
             * @function getTypeUrl
             * @memberof transit_realtime.TripUpdate.TripProperties
             * @static
             * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
             * @returns {string} The default type url
             */
            TripProperties.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                if (typeUrlPrefix === undefined) {
                    typeUrlPrefix = "type.googleapis.com";
                }
                return typeUrlPrefix + "/transit_realtime.TripUpdate.TripProperties";
            };

            return TripProperties;
        })();

        return TripUpdate;
    })();

    transit_realtime.VehiclePosition = (function() {

        /**
         * Properties of a VehiclePosition.
         * @memberof transit_realtime
         * @interface IVehiclePosition
         * @property {transit_realtime.ITripDescriptor|null} [trip] VehiclePosition trip
         * @property {transit_realtime.IVehicleDescriptor|null} [vehicle] VehiclePosition vehicle
         * @property {transit_realtime.IPosition|null} [position] VehiclePosition position
         * @property {number|null} [current_stop_sequence] VehiclePosition current_stop_sequence
         * @property {string|null} [stop_id] VehiclePosition stop_id
         * @property {transit_realtime.VehiclePosition.VehicleStopStatus|null} [current_status] VehiclePosition current_status
         * @property {number|null} [timestamp] VehiclePosition timestamp
         * @property {transit_realtime.VehiclePosition.CongestionLevel|null} [congestion_level] VehiclePosition congestion_level
         * @property {transit_realtime.VehiclePosition.OccupancyStatus|null} [occupancy_status] VehiclePosition occupancy_status
         * @property {number|null} [occupancy_percentage] VehiclePosition occupancy_percentage
         * @property {Array.<transit_realtime.VehiclePosition.ICarriageDetails>|null} [multi_carriage_details] VehiclePosition multi_carriage_details
         */

        /**
         * Constructs a new VehiclePosition.
         * @memberof transit_realtime
         * @classdesc Represents a VehiclePosition.
         * @implements IVehiclePosition
         * @constructor
         * @param {transit_realtime.IVehiclePosition=} [properties] Properties to set
         */
        function VehiclePosition(properties) {
            this.multi_carriage_details = [];
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null)
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * VehiclePosition trip.
         * @member {transit_realtime.ITripDescriptor|null|undefined} trip
         * @memberof transit_realtime.VehiclePosition
         * @instance
         */
        VehiclePosition.prototype.trip = null;

        /**
         * VehiclePosition vehicle.
         * @member {transit_realtime.IVehicleDescriptor|null|undefined} vehicle
         * @memberof transit_realtime.VehiclePosition
         * @instance
         */
        VehiclePosition.prototype.vehicle = null;

        /**
         * VehiclePosition position.
         * @member {transit_realtime.IPosition|null|undefined} position
         * @memberof transit_realtime.VehiclePosition
         * @instance
         */
        VehiclePosition.prototype.position = null;

        /**
         * VehiclePosition current_stop_sequence.
         * @member {number} current_stop_sequence
         * @memberof transit_realtime.VehiclePosition
         * @instance
         */
        VehiclePosition.prototype.current_stop_sequence = 0;

        /**
         * VehiclePosition stop_id.
         * @member {string} stop_id
         * @memberof transit_realtime.VehiclePosition
         * @instance
         */
        VehiclePosition.prototype.stop_id = "";

        /**
         * VehiclePosition current_status.
         * @member {transit_realtime.VehiclePosition.VehicleStopStatus} current_status
         * @memberof transit_realtime.VehiclePosition
         * @instance
         */
        VehiclePosition.prototype.current_status = 2;

        /**
         * VehiclePosition timestamp.
         * @member {number} timestamp
         * @memberof transit_realtime.VehiclePosition
         * @instance
         */
        VehiclePosition.prototype.timestamp = $util.Long ? $util.Long.fromBits(0,0,true) : 0;

        /**
         * VehiclePosition congestion_level.
         * @member {transit_realtime.VehiclePosition.CongestionLevel} congestion_level
         * @memberof transit_realtime.VehiclePosition
         * @instance
         */
        VehiclePosition.prototype.congestion_level = 0;

        /**
         * VehiclePosition occupancy_status.
         * @member {transit_realtime.VehiclePosition.OccupancyStatus} occupancy_status
         * @memberof transit_realtime.VehiclePosition
         * @instance
         */
        VehiclePosition.prototype.occupancy_status = 0;

        /**
         * VehiclePosition occupancy_percentage.
         * @member {number} occupancy_percentage
         * @memberof transit_realtime.VehiclePosition
         * @instance
         */
        VehiclePosition.prototype.occupancy_percentage = 0;

        /**
         * VehiclePosition multi_carriage_details.
         * @member {Array.<transit_realtime.VehiclePosition.ICarriageDetails>} multi_carriage_details
         * @memberof transit_realtime.VehiclePosition
         * @instance
         */
        VehiclePosition.prototype.multi_carriage_details = $util.emptyArray;

        /**
         * Creates a new VehiclePosition instance using the specified properties.
         * @function create
         * @memberof transit_realtime.VehiclePosition
         * @static
         * @param {transit_realtime.IVehiclePosition=} [properties] Properties to set
         * @returns {transit_realtime.VehiclePosition} VehiclePosition instance
         */
        VehiclePosition.create = function create(properties) {
            return new VehiclePosition(properties);
        };

        /**
         * Encodes the specified VehiclePosition message. Does not implicitly {@link transit_realtime.VehiclePosition.verify|verify} messages.
         * @function encode
         * @memberof transit_realtime.VehiclePosition
         * @static
         * @param {transit_realtime.IVehiclePosition} message VehiclePosition message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        VehiclePosition.encode = function encode(message, writer) {
            if (!writer)
                writer = $Writer.create();
            if (message.trip != null && Object.hasOwnProperty.call(message, "trip"))
                $root.transit_realtime.TripDescriptor.encode(message.trip, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim();
            if (message.position != null && Object.hasOwnProperty.call(message, "position"))
                $root.transit_realtime.Position.encode(message.position, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim();
            if (message.current_stop_sequence != null && Object.hasOwnProperty.call(message, "current_stop_sequence"))
                writer.uint32(/* id 3, wireType 0 =*/24).uint32(message.current_stop_sequence);
            if (message.current_status != null && Object.hasOwnProperty.call(message, "current_status"))
                writer.uint32(/* id 4, wireType 0 =*/32).int32(message.current_status);
            if (message.timestamp != null && Object.hasOwnProperty.call(message, "timestamp"))
                writer.uint32(/* id 5, wireType 0 =*/40).uint64(message.timestamp);
            if (message.congestion_level != null && Object.hasOwnProperty.call(message, "congestion_level"))
                writer.uint32(/* id 6, wireType 0 =*/48).int32(message.congestion_level);
            if (message.stop_id != null && Object.hasOwnProperty.call(message, "stop_id"))
                writer.uint32(/* id 7, wireType 2 =*/58).string(message.stop_id);
            if (message.vehicle != null && Object.hasOwnProperty.call(message, "vehicle"))
                $root.transit_realtime.VehicleDescriptor.encode(message.vehicle, writer.uint32(/* id 8, wireType 2 =*/66).fork()).ldelim();
            if (message.occupancy_status != null && Object.hasOwnProperty.call(message, "occupancy_status"))
                writer.uint32(/* id 9, wireType 0 =*/72).int32(message.occupancy_status);
            if (message.occupancy_percentage != null && Object.hasOwnProperty.call(message, "occupancy_percentage"))
                writer.uint32(/* id 10, wireType 0 =*/80).uint32(message.occupancy_percentage);
            if (message.multi_carriage_details != null && message.multi_carriage_details.length)
                for (var i = 0; i < message.multi_carriage_details.length; ++i)
                    $root.transit_realtime.VehiclePosition.CarriageDetails.encode(message.multi_carriage_details[i], writer.uint32(/* id 11, wireType 2 =*/90).fork()).ldelim();
            return writer;
        };

        /**
         * Encodes the specified VehiclePosition message, length delimited. Does not implicitly {@link transit_realtime.VehiclePosition.verify|verify} messages.
         * @function encodeDelimited
         * @memberof transit_realtime.VehiclePosition
         * @static
         * @param {transit_realtime.IVehiclePosition} message VehiclePosition message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        VehiclePosition.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer).ldelim();
        };

        /**
         * Decodes a VehiclePosition message from the specified reader or buffer.
         * @function decode
         * @memberof transit_realtime.VehiclePosition
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {transit_realtime.VehiclePosition} VehiclePosition
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        VehiclePosition.decode = function decode(reader, length, error) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.transit_realtime.VehiclePosition();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.trip = $root.transit_realtime.TripDescriptor.decode(reader, reader.uint32());
                        break;
                    }
                case 8: {
                        message.vehicle = $root.transit_realtime.VehicleDescriptor.decode(reader, reader.uint32());
                        break;
                    }
                case 2: {
                        message.position = $root.transit_realtime.Position.decode(reader, reader.uint32());
                        break;
                    }
                case 3: {
                        message.current_stop_sequence = reader.uint32();
                        break;
                    }
                case 7: {
                        message.stop_id = reader.string();
                        break;
                    }
                case 4: {
                        message.current_status = reader.int32();
                        break;
                    }
                case 5: {
                        message.timestamp = reader.uint64();
                        break;
                    }
                case 6: {
                        message.congestion_level = reader.int32();
                        break;
                    }
                case 9: {
                        message.occupancy_status = reader.int32();
                        break;
                    }
                case 10: {
                        message.occupancy_percentage = reader.uint32();
                        break;
                    }
                case 11: {
                        if (!(message.multi_carriage_details && message.multi_carriage_details.length))
                            message.multi_carriage_details = [];
                        message.multi_carriage_details.push($root.transit_realtime.VehiclePosition.CarriageDetails.decode(reader, reader.uint32()));
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a VehiclePosition message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof transit_realtime.VehiclePosition
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {transit_realtime.VehiclePosition} VehiclePosition
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        VehiclePosition.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a VehiclePosition message.
         * @function verify
         * @memberof transit_realtime.VehiclePosition
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        VehiclePosition.verify = function verify(message) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.trip != null && message.hasOwnProperty("trip")) {
                var error = $root.transit_realtime.TripDescriptor.verify(message.trip);
                if (error)
                    return "trip." + error;
            }
            if (message.vehicle != null && message.hasOwnProperty("vehicle")) {
                var error = $root.transit_realtime.VehicleDescriptor.verify(message.vehicle);
                if (error)
                    return "vehicle." + error;
            }
            if (message.position != null && message.hasOwnProperty("position")) {
                var error = $root.transit_realtime.Position.verify(message.position);
                if (error)
                    return "position." + error;
            }
            if (message.current_stop_sequence != null && message.hasOwnProperty("current_stop_sequence"))
                if (!$util.isInteger(message.current_stop_sequence))
                    return "current_stop_sequence: integer expected";
            if (message.stop_id != null && message.hasOwnProperty("stop_id"))
                if (!$util.isString(message.stop_id))
                    return "stop_id: string expected";
            if (message.current_status != null && message.hasOwnProperty("current_status"))
                switch (message.current_status) {
                default:
                    return "current_status: enum value expected";
                case 0:
                case 1:
                case 2:
                    break;
                }
            if (message.timestamp != null && message.hasOwnProperty("timestamp"))
                if (!$util.isInteger(message.timestamp) && !(message.timestamp && $util.isInteger(message.timestamp.low) && $util.isInteger(message.timestamp.high)))
                    return "timestamp: integer|Long expected";
            if (message.congestion_level != null && message.hasOwnProperty("congestion_level"))
                switch (message.congestion_level) {
                default:
                    return "congestion_level: enum value expected";
                case 0:
                case 1:
                case 2:
                case 3:
                case 4:
                    break;
                }
            if (message.occupancy_status != null && message.hasOwnProperty("occupancy_status"))
                switch (message.occupancy_status) {
                default:
                    return "occupancy_status: enum value expected";
                case 0:
                case 1:
                case 2:
                case 3:
                case 4:
                case 5:
                case 6:
                case 7:
                case 8:
                    break;
                }
            if (message.occupancy_percentage != null && message.hasOwnProperty("occupancy_percentage"))
                if (!$util.isInteger(message.occupancy_percentage))
                    return "occupancy_percentage: integer expected";
            if (message.multi_carriage_details != null && message.hasOwnProperty("multi_carriage_details")) {
                if (!Array.isArray(message.multi_carriage_details))
                    return "multi_carriage_details: array expected";
                for (var i = 0; i < message.multi_carriage_details.length; ++i) {
                    var error = $root.transit_realtime.VehiclePosition.CarriageDetails.verify(message.multi_carriage_details[i]);
                    if (error)
                        return "multi_carriage_details." + error;
                }
            }
            return null;
        };

        /**
         * Creates a VehiclePosition message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof transit_realtime.VehiclePosition
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {transit_realtime.VehiclePosition} VehiclePosition
         */
        VehiclePosition.fromObject = function fromObject(object) {
            if (object instanceof $root.transit_realtime.VehiclePosition)
                return object;
            var message = new $root.transit_realtime.VehiclePosition();
            if (object.trip != null) {
                if (typeof object.trip !== "object")
                    throw TypeError(".transit_realtime.VehiclePosition.trip: object expected");
                message.trip = $root.transit_realtime.TripDescriptor.fromObject(object.trip);
            }
            if (object.vehicle != null) {
                if (typeof object.vehicle !== "object")
                    throw TypeError(".transit_realtime.VehiclePosition.vehicle: object expected");
                message.vehicle = $root.transit_realtime.VehicleDescriptor.fromObject(object.vehicle);
            }
            if (object.position != null) {
                if (typeof object.position !== "object")
                    throw TypeError(".transit_realtime.VehiclePosition.position: object expected");
                message.position = $root.transit_realtime.Position.fromObject(object.position);
            }
            if (object.current_stop_sequence != null)
                message.current_stop_sequence = object.current_stop_sequence >>> 0;
            if (object.stop_id != null)
                message.stop_id = String(object.stop_id);
            switch (object.current_status) {
            case "INCOMING_AT":
            case 0:
                message.current_status = 0;
                break;
            case "STOPPED_AT":
            case 1:
                message.current_status = 1;
                break;
            default:
                if (typeof object.current_status === "number") {
                    message.current_status = object.current_status;
                    break;
                }
                break;
            case "IN_TRANSIT_TO":
            case 2:
                message.current_status = 2;
                break;
            }
            if (object.timestamp != null)
                if ($util.Long)
                    (message.timestamp = $util.Long.fromValue(object.timestamp)).unsigned = true;
                else if (typeof object.timestamp === "string")
                    message.timestamp = parseInt(object.timestamp, 10);
                else if (typeof object.timestamp === "number")
                    message.timestamp = object.timestamp;
                else if (typeof object.timestamp === "object")
                    message.timestamp = new $util.LongBits(object.timestamp.low >>> 0, object.timestamp.high >>> 0).toNumber(true);
            switch (object.congestion_level) {
            default:
                if (typeof object.congestion_level === "number") {
                    message.congestion_level = object.congestion_level;
                    break;
                }
                break;
            case "UNKNOWN_CONGESTION_LEVEL":
            case 0:
                message.congestion_level = 0;
                break;
            case "RUNNING_SMOOTHLY":
            case 1:
                message.congestion_level = 1;
                break;
            case "STOP_AND_GO":
            case 2:
                message.congestion_level = 2;
                break;
            case "CONGESTION":
            case 3:
                message.congestion_level = 3;
                break;
            case "SEVERE_CONGESTION":
            case 4:
                message.congestion_level = 4;
                break;
            }
            switch (object.occupancy_status) {
            default:
                if (typeof object.occupancy_status === "number") {
                    message.occupancy_status = object.occupancy_status;
                    break;
                }
                break;
            case "EMPTY":
            case 0:
                message.occupancy_status = 0;
                break;
            case "MANY_SEATS_AVAILABLE":
            case 1:
                message.occupancy_status = 1;
                break;
            case "FEW_SEATS_AVAILABLE":
            case 2:
                message.occupancy_status = 2;
                break;
            case "STANDING_ROOM_ONLY":
            case 3:
                message.occupancy_status = 3;
                break;
            case "CRUSHED_STANDING_ROOM_ONLY":
            case 4:
                message.occupancy_status = 4;
                break;
            case "FULL":
            case 5:
                message.occupancy_status = 5;
                break;
            case "NOT_ACCEPTING_PASSENGERS":
            case 6:
                message.occupancy_status = 6;
                break;
            case "NO_DATA_AVAILABLE":
            case 7:
                message.occupancy_status = 7;
                break;
            case "NOT_BOARDABLE":
            case 8:
                message.occupancy_status = 8;
                break;
            }
            if (object.occupancy_percentage != null)
                message.occupancy_percentage = object.occupancy_percentage >>> 0;
            if (object.multi_carriage_details) {
                if (!Array.isArray(object.multi_carriage_details))
                    throw TypeError(".transit_realtime.VehiclePosition.multi_carriage_details: array expected");
                message.multi_carriage_details = [];
                for (var i = 0; i < object.multi_carriage_details.length; ++i) {
                    if (typeof object.multi_carriage_details[i] !== "object")
                        throw TypeError(".transit_realtime.VehiclePosition.multi_carriage_details: object expected");
                    message.multi_carriage_details[i] = $root.transit_realtime.VehiclePosition.CarriageDetails.fromObject(object.multi_carriage_details[i]);
                }
            }
            return message;
        };

        /**
         * Creates a plain object from a VehiclePosition message. Also converts values to other types if specified.
         * @function toObject
         * @memberof transit_realtime.VehiclePosition
         * @static
         * @param {transit_realtime.VehiclePosition} message VehiclePosition
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        VehiclePosition.toObject = function toObject(message, options) {
            if (!options)
                options = {};
            var object = {};
            if (options.arrays || options.defaults)
                object.multi_carriage_details = [];
            if (options.defaults) {
                object.trip = null;
                object.position = null;
                object.current_stop_sequence = 0;
                object.current_status = options.enums === String ? "IN_TRANSIT_TO" : 2;
                if ($util.Long) {
                    var long = new $util.Long(0, 0, true);
                    object.timestamp = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : long;
                } else
                    object.timestamp = options.longs === String ? "0" : 0;
                object.congestion_level = options.enums === String ? "UNKNOWN_CONGESTION_LEVEL" : 0;
                object.stop_id = "";
                object.vehicle = null;
                object.occupancy_status = options.enums === String ? "EMPTY" : 0;
                object.occupancy_percentage = 0;
            }
            if (message.trip != null && message.hasOwnProperty("trip"))
                object.trip = $root.transit_realtime.TripDescriptor.toObject(message.trip, options);
            if (message.position != null && message.hasOwnProperty("position"))
                object.position = $root.transit_realtime.Position.toObject(message.position, options);
            if (message.current_stop_sequence != null && message.hasOwnProperty("current_stop_sequence"))
                object.current_stop_sequence = message.current_stop_sequence;
            if (message.current_status != null && message.hasOwnProperty("current_status"))
                object.current_status = options.enums === String ? $root.transit_realtime.VehiclePosition.VehicleStopStatus[message.current_status] === undefined ? message.current_status : $root.transit_realtime.VehiclePosition.VehicleStopStatus[message.current_status] : message.current_status;
            if (message.timestamp != null && message.hasOwnProperty("timestamp"))
                if (typeof message.timestamp === "number")
                    object.timestamp = options.longs === String ? String(message.timestamp) : message.timestamp;
                else
                    object.timestamp = options.longs === String ? $util.Long.prototype.toString.call(message.timestamp) : options.longs === Number ? new $util.LongBits(message.timestamp.low >>> 0, message.timestamp.high >>> 0).toNumber(true) : message.timestamp;
            if (message.congestion_level != null && message.hasOwnProperty("congestion_level"))
                object.congestion_level = options.enums === String ? $root.transit_realtime.VehiclePosition.CongestionLevel[message.congestion_level] === undefined ? message.congestion_level : $root.transit_realtime.VehiclePosition.CongestionLevel[message.congestion_level] : message.congestion_level;
            if (message.stop_id != null && message.hasOwnProperty("stop_id"))
                object.stop_id = message.stop_id;
            if (message.vehicle != null && message.hasOwnProperty("vehicle"))
                object.vehicle = $root.transit_realtime.VehicleDescriptor.toObject(message.vehicle, options);
            if (message.occupancy_status != null && message.hasOwnProperty("occupancy_status"))
                object.occupancy_status = options.enums === String ? $root.transit_realtime.VehiclePosition.OccupancyStatus[message.occupancy_status] === undefined ? message.occupancy_status : $root.transit_realtime.VehiclePosition.OccupancyStatus[message.occupancy_status] : message.occupancy_status;
            if (message.occupancy_percentage != null && message.hasOwnProperty("occupancy_percentage"))
                object.occupancy_percentage = message.occupancy_percentage;
            if (message.multi_carriage_details && message.multi_carriage_details.length) {
                object.multi_carriage_details = [];
                for (var j = 0; j < message.multi_carriage_details.length; ++j)
                    object.multi_carriage_details[j] = $root.transit_realtime.VehiclePosition.CarriageDetails.toObject(message.multi_carriage_details[j], options);
            }
            return object;
        };

        /**
         * Converts this VehiclePosition to JSON.
         * @function toJSON
         * @memberof transit_realtime.VehiclePosition
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        VehiclePosition.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for VehiclePosition
         * @function getTypeUrl
         * @memberof transit_realtime.VehiclePosition
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        VehiclePosition.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/transit_realtime.VehiclePosition";
        };

        /**
         * VehicleStopStatus enum.
         * @name transit_realtime.VehiclePosition.VehicleStopStatus
         * @enum {number}
         * @property {number} INCOMING_AT=0 INCOMING_AT value
         * @property {number} STOPPED_AT=1 STOPPED_AT value
         * @property {number} IN_TRANSIT_TO=2 IN_TRANSIT_TO value
         */
        VehiclePosition.VehicleStopStatus = (function() {
            var valuesById = {}, values = Object.create(valuesById);
            values[valuesById[0] = "INCOMING_AT"] = 0;
            values[valuesById[1] = "STOPPED_AT"] = 1;
            values[valuesById[2] = "IN_TRANSIT_TO"] = 2;
            return values;
        })();

        /**
         * CongestionLevel enum.
         * @name transit_realtime.VehiclePosition.CongestionLevel
         * @enum {number}
         * @property {number} UNKNOWN_CONGESTION_LEVEL=0 UNKNOWN_CONGESTION_LEVEL value
         * @property {number} RUNNING_SMOOTHLY=1 RUNNING_SMOOTHLY value
         * @property {number} STOP_AND_GO=2 STOP_AND_GO value
         * @property {number} CONGESTION=3 CONGESTION value
         * @property {number} SEVERE_CONGESTION=4 SEVERE_CONGESTION value
         */
        VehiclePosition.CongestionLevel = (function() {
            var valuesById = {}, values = Object.create(valuesById);
            values[valuesById[0] = "UNKNOWN_CONGESTION_LEVEL"] = 0;
            values[valuesById[1] = "RUNNING_SMOOTHLY"] = 1;
            values[valuesById[2] = "STOP_AND_GO"] = 2;
            values[valuesById[3] = "CONGESTION"] = 3;
            values[valuesById[4] = "SEVERE_CONGESTION"] = 4;
            return values;
        })();

        /**
         * OccupancyStatus enum.
         * @name transit_realtime.VehiclePosition.OccupancyStatus
         * @enum {number}
         * @property {number} EMPTY=0 EMPTY value
         * @property {number} MANY_SEATS_AVAILABLE=1 MANY_SEATS_AVAILABLE value
         * @property {number} FEW_SEATS_AVAILABLE=2 FEW_SEATS_AVAILABLE value
         * @property {number} STANDING_ROOM_ONLY=3 STANDING_ROOM_ONLY value
         * @property {number} CRUSHED_STANDING_ROOM_ONLY=4 CRUSHED_STANDING_ROOM_ONLY value
         * @property {number} FULL=5 FULL value
         * @property {number} NOT_ACCEPTING_PASSENGERS=6 NOT_ACCEPTING_PASSENGERS value
         * @property {number} NO_DATA_AVAILABLE=7 NO_DATA_AVAILABLE value
         * @property {number} NOT_BOARDABLE=8 NOT_BOARDABLE value
         */
        VehiclePosition.OccupancyStatus = (function() {
            var valuesById = {}, values = Object.create(valuesById);
            values[valuesById[0] = "EMPTY"] = 0;
            values[valuesById[1] = "MANY_SEATS_AVAILABLE"] = 1;
            values[valuesById[2] = "FEW_SEATS_AVAILABLE"] = 2;
            values[valuesById[3] = "STANDING_ROOM_ONLY"] = 3;
            values[valuesById[4] = "CRUSHED_STANDING_ROOM_ONLY"] = 4;
            values[valuesById[5] = "FULL"] = 5;
            values[valuesById[6] = "NOT_ACCEPTING_PASSENGERS"] = 6;
            values[valuesById[7] = "NO_DATA_AVAILABLE"] = 7;
            values[valuesById[8] = "NOT_BOARDABLE"] = 8;
            return values;
        })();

        VehiclePosition.CarriageDetails = (function() {

            /**
             * Properties of a CarriageDetails.
             * @memberof transit_realtime.VehiclePosition
             * @interface ICarriageDetails
             * @property {string|null} [id] CarriageDetails id
             * @property {string|null} [label] CarriageDetails label
             * @property {transit_realtime.VehiclePosition.OccupancyStatus|null} [occupancy_status] CarriageDetails occupancy_status
             * @property {number|null} [occupancy_percentage] CarriageDetails occupancy_percentage
             * @property {number|null} [carriage_sequence] CarriageDetails carriage_sequence
             */

            /**
             * Constructs a new CarriageDetails.
             * @memberof transit_realtime.VehiclePosition
             * @classdesc Represents a CarriageDetails.
             * @implements ICarriageDetails
             * @constructor
             * @param {transit_realtime.VehiclePosition.ICarriageDetails=} [properties] Properties to set
             */
            function CarriageDetails(properties) {
                if (properties)
                    for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                        if (properties[keys[i]] != null)
                            this[keys[i]] = properties[keys[i]];
            }

            /**
             * CarriageDetails id.
             * @member {string} id
             * @memberof transit_realtime.VehiclePosition.CarriageDetails
             * @instance
             */
            CarriageDetails.prototype.id = "";

            /**
             * CarriageDetails label.
             * @member {string} label
             * @memberof transit_realtime.VehiclePosition.CarriageDetails
             * @instance
             */
            CarriageDetails.prototype.label = "";

            /**
             * CarriageDetails occupancy_status.
             * @member {transit_realtime.VehiclePosition.OccupancyStatus} occupancy_status
             * @memberof transit_realtime.VehiclePosition.CarriageDetails
             * @instance
             */
            CarriageDetails.prototype.occupancy_status = 7;

            /**
             * CarriageDetails occupancy_percentage.
             * @member {number} occupancy_percentage
             * @memberof transit_realtime.VehiclePosition.CarriageDetails
             * @instance
             */
            CarriageDetails.prototype.occupancy_percentage = -1;

            /**
             * CarriageDetails carriage_sequence.
             * @member {number} carriage_sequence
             * @memberof transit_realtime.VehiclePosition.CarriageDetails
             * @instance
             */
            CarriageDetails.prototype.carriage_sequence = 0;

            /**
             * Creates a new CarriageDetails instance using the specified properties.
             * @function create
             * @memberof transit_realtime.VehiclePosition.CarriageDetails
             * @static
             * @param {transit_realtime.VehiclePosition.ICarriageDetails=} [properties] Properties to set
             * @returns {transit_realtime.VehiclePosition.CarriageDetails} CarriageDetails instance
             */
            CarriageDetails.create = function create(properties) {
                return new CarriageDetails(properties);
            };

            /**
             * Encodes the specified CarriageDetails message. Does not implicitly {@link transit_realtime.VehiclePosition.CarriageDetails.verify|verify} messages.
             * @function encode
             * @memberof transit_realtime.VehiclePosition.CarriageDetails
             * @static
             * @param {transit_realtime.VehiclePosition.ICarriageDetails} message CarriageDetails message or plain object to encode
             * @param {$protobuf.Writer} [writer] Writer to encode to
             * @returns {$protobuf.Writer} Writer
             */
            CarriageDetails.encode = function encode(message, writer) {
                if (!writer)
                    writer = $Writer.create();
                if (message.id != null && Object.hasOwnProperty.call(message, "id"))
                    writer.uint32(/* id 1, wireType 2 =*/10).string(message.id);
                if (message.label != null && Object.hasOwnProperty.call(message, "label"))
                    writer.uint32(/* id 2, wireType 2 =*/18).string(message.label);
                if (message.occupancy_status != null && Object.hasOwnProperty.call(message, "occupancy_status"))
                    writer.uint32(/* id 3, wireType 0 =*/24).int32(message.occupancy_status);
                if (message.occupancy_percentage != null && Object.hasOwnProperty.call(message, "occupancy_percentage"))
                    writer.uint32(/* id 4, wireType 0 =*/32).int32(message.occupancy_percentage);
                if (message.carriage_sequence != null && Object.hasOwnProperty.call(message, "carriage_sequence"))
                    writer.uint32(/* id 5, wireType 0 =*/40).uint32(message.carriage_sequence);
                return writer;
            };

            /**
             * Encodes the specified CarriageDetails message, length delimited. Does not implicitly {@link transit_realtime.VehiclePosition.CarriageDetails.verify|verify} messages.
             * @function encodeDelimited
             * @memberof transit_realtime.VehiclePosition.CarriageDetails
             * @static
             * @param {transit_realtime.VehiclePosition.ICarriageDetails} message CarriageDetails message or plain object to encode
             * @param {$protobuf.Writer} [writer] Writer to encode to
             * @returns {$protobuf.Writer} Writer
             */
            CarriageDetails.encodeDelimited = function encodeDelimited(message, writer) {
                return this.encode(message, writer).ldelim();
            };

            /**
             * Decodes a CarriageDetails message from the specified reader or buffer.
             * @function decode
             * @memberof transit_realtime.VehiclePosition.CarriageDetails
             * @static
             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
             * @param {number} [length] Message length if known beforehand
             * @returns {transit_realtime.VehiclePosition.CarriageDetails} CarriageDetails
             * @throws {Error} If the payload is not a reader or valid buffer
             * @throws {$protobuf.util.ProtocolError} If required fields are missing
             */
            CarriageDetails.decode = function decode(reader, length, error) {
                if (!(reader instanceof $Reader))
                    reader = $Reader.create(reader);
                var end = length === undefined ? reader.len : reader.pos + length, message = new $root.transit_realtime.VehiclePosition.CarriageDetails();
                while (reader.pos < end) {
                    var tag = reader.uint32();
                    if (tag === error)
                        break;
                    switch (tag >>> 3) {
                    case 1: {
                            message.id = reader.string();
                            break;
                        }
                    case 2: {
                            message.label = reader.string();
                            break;
                        }
                    case 3: {
                            message.occupancy_status = reader.int32();
                            break;
                        }
                    case 4: {
                            message.occupancy_percentage = reader.int32();
                            break;
                        }
                    case 5: {
                            message.carriage_sequence = reader.uint32();
                            break;
                        }
                    default:
                        reader.skipType(tag & 7);
                        break;
                    }
                }
                return message;
            };

            /**
             * Decodes a CarriageDetails message from the specified reader or buffer, length delimited.
             * @function decodeDelimited
             * @memberof transit_realtime.VehiclePosition.CarriageDetails
             * @static
             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
             * @returns {transit_realtime.VehiclePosition.CarriageDetails} CarriageDetails
             * @throws {Error} If the payload is not a reader or valid buffer
             * @throws {$protobuf.util.ProtocolError} If required fields are missing
             */
            CarriageDetails.decodeDelimited = function decodeDelimited(reader) {
                if (!(reader instanceof $Reader))
                    reader = new $Reader(reader);
                return this.decode(reader, reader.uint32());
            };

            /**
             * Verifies a CarriageDetails message.
             * @function verify
             * @memberof transit_realtime.VehiclePosition.CarriageDetails
             * @static
             * @param {Object.<string,*>} message Plain object to verify
             * @returns {string|null} `null` if valid, otherwise the reason why it is not
             */
            CarriageDetails.verify = function verify(message) {
                if (typeof message !== "object" || message === null)
                    return "object expected";
                if (message.id != null && message.hasOwnProperty("id"))
                    if (!$util.isString(message.id))
                        return "id: string expected";
                if (message.label != null && message.hasOwnProperty("label"))
                    if (!$util.isString(message.label))
                        return "label: string expected";
                if (message.occupancy_status != null && message.hasOwnProperty("occupancy_status"))
                    switch (message.occupancy_status) {
                    default:
                        return "occupancy_status: enum value expected";
                    case 0:
                    case 1:
                    case 2:
                    case 3:
                    case 4:
                    case 5:
                    case 6:
                    case 7:
                    case 8:
                        break;
                    }
                if (message.occupancy_percentage != null && message.hasOwnProperty("occupancy_percentage"))
                    if (!$util.isInteger(message.occupancy_percentage))
                        return "occupancy_percentage: integer expected";
                if (message.carriage_sequence != null && message.hasOwnProperty("carriage_sequence"))
                    if (!$util.isInteger(message.carriage_sequence))
                        return "carriage_sequence: integer expected";
                return null;
            };

            /**
             * Creates a CarriageDetails message from a plain object. Also converts values to their respective internal types.
             * @function fromObject
             * @memberof transit_realtime.VehiclePosition.CarriageDetails
             * @static
             * @param {Object.<string,*>} object Plain object
             * @returns {transit_realtime.VehiclePosition.CarriageDetails} CarriageDetails
             */
            CarriageDetails.fromObject = function fromObject(object) {
                if (object instanceof $root.transit_realtime.VehiclePosition.CarriageDetails)
                    return object;
                var message = new $root.transit_realtime.VehiclePosition.CarriageDetails();
                if (object.id != null)
                    message.id = String(object.id);
                if (object.label != null)
                    message.label = String(object.label);
                switch (object.occupancy_status) {
                case "EMPTY":
                case 0:
                    message.occupancy_status = 0;
                    break;
                case "MANY_SEATS_AVAILABLE":
                case 1:
                    message.occupancy_status = 1;
                    break;
                case "FEW_SEATS_AVAILABLE":
                case 2:
                    message.occupancy_status = 2;
                    break;
                case "STANDING_ROOM_ONLY":
                case 3:
                    message.occupancy_status = 3;
                    break;
                case "CRUSHED_STANDING_ROOM_ONLY":
                case 4:
                    message.occupancy_status = 4;
                    break;
                case "FULL":
                case 5:
                    message.occupancy_status = 5;
                    break;
                case "NOT_ACCEPTING_PASSENGERS":
                case 6:
                    message.occupancy_status = 6;
                    break;
                default:
                    if (typeof object.occupancy_status === "number") {
                        message.occupancy_status = object.occupancy_status;
                        break;
                    }
                    break;
                case "NO_DATA_AVAILABLE":
                case 7:
                    message.occupancy_status = 7;
                    break;
                case "NOT_BOARDABLE":
                case 8:
                    message.occupancy_status = 8;
                    break;
                }
                if (object.occupancy_percentage != null)
                    message.occupancy_percentage = object.occupancy_percentage | 0;
                if (object.carriage_sequence != null)
                    message.carriage_sequence = object.carriage_sequence >>> 0;
                return message;
            };

            /**
             * Creates a plain object from a CarriageDetails message. Also converts values to other types if specified.
             * @function toObject
             * @memberof transit_realtime.VehiclePosition.CarriageDetails
             * @static
             * @param {transit_realtime.VehiclePosition.CarriageDetails} message CarriageDetails
             * @param {$protobuf.IConversionOptions} [options] Conversion options
             * @returns {Object.<string,*>} Plain object
             */
            CarriageDetails.toObject = function toObject(message, options) {
                if (!options)
                    options = {};
                var object = {};
                if (options.defaults) {
                    object.id = "";
                    object.label = "";
                    object.occupancy_status = options.enums === String ? "NO_DATA_AVAILABLE" : 7;
                    object.occupancy_percentage = -1;
                    object.carriage_sequence = 0;
                }
                if (message.id != null && message.hasOwnProperty("id"))
                    object.id = message.id;
                if (message.label != null && message.hasOwnProperty("label"))
                    object.label = message.label;
                if (message.occupancy_status != null && message.hasOwnProperty("occupancy_status"))
                    object.occupancy_status = options.enums === String ? $root.transit_realtime.VehiclePosition.OccupancyStatus[message.occupancy_status] === undefined ? message.occupancy_status : $root.transit_realtime.VehiclePosition.OccupancyStatus[message.occupancy_status] : message.occupancy_status;
                if (message.occupancy_percentage != null && message.hasOwnProperty("occupancy_percentage"))
                    object.occupancy_percentage = message.occupancy_percentage;
                if (message.carriage_sequence != null && message.hasOwnProperty("carriage_sequence"))
                    object.carriage_sequence = message.carriage_sequence;
                return object;
            };

            /**
             * Converts this CarriageDetails to JSON.
             * @function toJSON
             * @memberof transit_realtime.VehiclePosition.CarriageDetails
             * @instance
             * @returns {Object.<string,*>} JSON object
             */
            CarriageDetails.prototype.toJSON = function toJSON() {
                return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
            };

            /**
             * Gets the default type url for CarriageDetails
             * @function getTypeUrl
             * @memberof transit_realtime.VehiclePosition.CarriageDetails
             * @static
             * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
             * @returns {string} The default type url
             */
            CarriageDetails.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                if (typeUrlPrefix === undefined) {
                    typeUrlPrefix = "type.googleapis.com";
                }
                return typeUrlPrefix + "/transit_realtime.VehiclePosition.CarriageDetails";
            };

            return CarriageDetails;
        })();

        return VehiclePosition;
    })();

    transit_realtime.Alert = (function() {

        /**
         * Properties of an Alert.
         * @memberof transit_realtime
         * @interface IAlert
         * @property {Array.<transit_realtime.ITimeRange>|null} [active_period] Alert active_period
         * @property {Array.<transit_realtime.IEntitySelector>|null} [informed_entity] Alert informed_entity
         * @property {transit_realtime.Alert.Cause|null} [cause] Alert cause
         * @property {transit_realtime.Alert.Effect|null} [effect] Alert effect
         * @property {transit_realtime.ITranslatedString|null} [url] Alert url
         * @property {transit_realtime.ITranslatedString|null} [header_text] Alert header_text
         * @property {transit_realtime.ITranslatedString|null} [description_text] Alert description_text
         * @property {transit_realtime.ITranslatedString|null} [tts_header_text] Alert tts_header_text
         * @property {transit_realtime.ITranslatedString|null} [tts_description_text] Alert tts_description_text
         * @property {transit_realtime.Alert.SeverityLevel|null} [severity_level] Alert severity_level
         * @property {transit_realtime.ITranslatedImage|null} [image] Alert image
         * @property {transit_realtime.ITranslatedString|null} [image_alternative_text] Alert image_alternative_text
         * @property {transit_realtime.ITranslatedString|null} [cause_detail] Alert cause_detail
         * @property {transit_realtime.ITranslatedString|null} [effect_detail] Alert effect_detail
         */

        /**
         * Constructs a new Alert.
         * @memberof transit_realtime
         * @classdesc Represents an Alert.
         * @implements IAlert
         * @constructor
         * @param {transit_realtime.IAlert=} [properties] Properties to set
         */
        function Alert(properties) {
            this.active_period = [];
            this.informed_entity = [];
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null)
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * Alert active_period.
         * @member {Array.<transit_realtime.ITimeRange>} active_period
         * @memberof transit_realtime.Alert
         * @instance
         */
        Alert.prototype.active_period = $util.emptyArray;

        /**
         * Alert informed_entity.
         * @member {Array.<transit_realtime.IEntitySelector>} informed_entity
         * @memberof transit_realtime.Alert
         * @instance
         */
        Alert.prototype.informed_entity = $util.emptyArray;

        /**
         * Alert cause.
         * @member {transit_realtime.Alert.Cause} cause
         * @memberof transit_realtime.Alert
         * @instance
         */
        Alert.prototype.cause = 1;

        /**
         * Alert effect.
         * @member {transit_realtime.Alert.Effect} effect
         * @memberof transit_realtime.Alert
         * @instance
         */
        Alert.prototype.effect = 8;

        /**
         * Alert url.
         * @member {transit_realtime.ITranslatedString|null|undefined} url
         * @memberof transit_realtime.Alert
         * @instance
         */
        Alert.prototype.url = null;

        /**
         * Alert header_text.
         * @member {transit_realtime.ITranslatedString|null|undefined} header_text
         * @memberof transit_realtime.Alert
         * @instance
         */
        Alert.prototype.header_text = null;

        /**
         * Alert description_text.
         * @member {transit_realtime.ITranslatedString|null|undefined} description_text
         * @memberof transit_realtime.Alert
         * @instance
         */
        Alert.prototype.description_text = null;

        /**
         * Alert tts_header_text.
         * @member {transit_realtime.ITranslatedString|null|undefined} tts_header_text
         * @memberof transit_realtime.Alert
         * @instance
         */
        Alert.prototype.tts_header_text = null;

        /**
         * Alert tts_description_text.
         * @member {transit_realtime.ITranslatedString|null|undefined} tts_description_text
         * @memberof transit_realtime.Alert
         * @instance
         */
        Alert.prototype.tts_description_text = null;

        /**
         * Alert severity_level.
         * @member {transit_realtime.Alert.SeverityLevel} severity_level
         * @memberof transit_realtime.Alert
         * @instance
         */
        Alert.prototype.severity_level = 1;

        /**
         * Alert image.
         * @member {transit_realtime.ITranslatedImage|null|undefined} image
         * @memberof transit_realtime.Alert
         * @instance
         */
        Alert.prototype.image = null;

        /**
         * Alert image_alternative_text.
         * @member {transit_realtime.ITranslatedString|null|undefined} image_alternative_text
         * @memberof transit_realtime.Alert
         * @instance
         */
        Alert.prototype.image_alternative_text = null;

        /**
         * Alert cause_detail.
         * @member {transit_realtime.ITranslatedString|null|undefined} cause_detail
         * @memberof transit_realtime.Alert
         * @instance
         */
        Alert.prototype.cause_detail = null;

        /**
         * Alert effect_detail.
         * @member {transit_realtime.ITranslatedString|null|undefined} effect_detail
         * @memberof transit_realtime.Alert
         * @instance
         */
        Alert.prototype.effect_detail = null;

        /**
         * Creates a new Alert instance using the specified properties.
         * @function create
         * @memberof transit_realtime.Alert
         * @static
         * @param {transit_realtime.IAlert=} [properties] Properties to set
         * @returns {transit_realtime.Alert} Alert instance
         */
        Alert.create = function create(properties) {
            return new Alert(properties);
        };

        /**
         * Encodes the specified Alert message. Does not implicitly {@link transit_realtime.Alert.verify|verify} messages.
         * @function encode
         * @memberof transit_realtime.Alert
         * @static
         * @param {transit_realtime.IAlert} message Alert message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        Alert.encode = function encode(message, writer) {
            if (!writer)
                writer = $Writer.create();
            if (message.active_period != null && message.active_period.length)
                for (var i = 0; i < message.active_period.length; ++i)
                    $root.transit_realtime.TimeRange.encode(message.active_period[i], writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim();
            if (message.informed_entity != null && message.informed_entity.length)
                for (var i = 0; i < message.informed_entity.length; ++i)
                    $root.transit_realtime.EntitySelector.encode(message.informed_entity[i], writer.uint32(/* id 5, wireType 2 =*/42).fork()).ldelim();
            if (message.cause != null && Object.hasOwnProperty.call(message, "cause"))
                writer.uint32(/* id 6, wireType 0 =*/48).int32(message.cause);
            if (message.effect != null && Object.hasOwnProperty.call(message, "effect"))
                writer.uint32(/* id 7, wireType 0 =*/56).int32(message.effect);
            if (message.url != null && Object.hasOwnProperty.call(message, "url"))
                $root.transit_realtime.TranslatedString.encode(message.url, writer.uint32(/* id 8, wireType 2 =*/66).fork()).ldelim();
            if (message.header_text != null && Object.hasOwnProperty.call(message, "header_text"))
                $root.transit_realtime.TranslatedString.encode(message.header_text, writer.uint32(/* id 10, wireType 2 =*/82).fork()).ldelim();
            if (message.description_text != null && Object.hasOwnProperty.call(message, "description_text"))
                $root.transit_realtime.TranslatedString.encode(message.description_text, writer.uint32(/* id 11, wireType 2 =*/90).fork()).ldelim();
            if (message.tts_header_text != null && Object.hasOwnProperty.call(message, "tts_header_text"))
                $root.transit_realtime.TranslatedString.encode(message.tts_header_text, writer.uint32(/* id 12, wireType 2 =*/98).fork()).ldelim();
            if (message.tts_description_text != null && Object.hasOwnProperty.call(message, "tts_description_text"))
                $root.transit_realtime.TranslatedString.encode(message.tts_description_text, writer.uint32(/* id 13, wireType 2 =*/106).fork()).ldelim();
            if (message.severity_level != null && Object.hasOwnProperty.call(message, "severity_level"))
                writer.uint32(/* id 14, wireType 0 =*/112).int32(message.severity_level);
            if (message.image != null && Object.hasOwnProperty.call(message, "image"))
                $root.transit_realtime.TranslatedImage.encode(message.image, writer.uint32(/* id 15, wireType 2 =*/122).fork()).ldelim();
            if (message.image_alternative_text != null && Object.hasOwnProperty.call(message, "image_alternative_text"))
                $root.transit_realtime.TranslatedString.encode(message.image_alternative_text, writer.uint32(/* id 16, wireType 2 =*/130).fork()).ldelim();
            if (message.cause_detail != null && Object.hasOwnProperty.call(message, "cause_detail"))
                $root.transit_realtime.TranslatedString.encode(message.cause_detail, writer.uint32(/* id 17, wireType 2 =*/138).fork()).ldelim();
            if (message.effect_detail != null && Object.hasOwnProperty.call(message, "effect_detail"))
                $root.transit_realtime.TranslatedString.encode(message.effect_detail, writer.uint32(/* id 18, wireType 2 =*/146).fork()).ldelim();
            return writer;
        };

        /**
         * Encodes the specified Alert message, length delimited. Does not implicitly {@link transit_realtime.Alert.verify|verify} messages.
         * @function encodeDelimited
         * @memberof transit_realtime.Alert
         * @static
         * @param {transit_realtime.IAlert} message Alert message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        Alert.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer).ldelim();
        };

        /**
         * Decodes an Alert message from the specified reader or buffer.
         * @function decode
         * @memberof transit_realtime.Alert
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {transit_realtime.Alert} Alert
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        Alert.decode = function decode(reader, length, error) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.transit_realtime.Alert();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        if (!(message.active_period && message.active_period.length))
                            message.active_period = [];
                        message.active_period.push($root.transit_realtime.TimeRange.decode(reader, reader.uint32()));
                        break;
                    }
                case 5: {
                        if (!(message.informed_entity && message.informed_entity.length))
                            message.informed_entity = [];
                        message.informed_entity.push($root.transit_realtime.EntitySelector.decode(reader, reader.uint32()));
                        break;
                    }
                case 6: {
                        message.cause = reader.int32();
                        break;
                    }
                case 7: {
                        message.effect = reader.int32();
                        break;
                    }
                case 8: {
                        message.url = $root.transit_realtime.TranslatedString.decode(reader, reader.uint32());
                        break;
                    }
                case 10: {
                        message.header_text = $root.transit_realtime.TranslatedString.decode(reader, reader.uint32());
                        break;
                    }
                case 11: {
                        message.description_text = $root.transit_realtime.TranslatedString.decode(reader, reader.uint32());
                        break;
                    }
                case 12: {
                        message.tts_header_text = $root.transit_realtime.TranslatedString.decode(reader, reader.uint32());
                        break;
                    }
                case 13: {
                        message.tts_description_text = $root.transit_realtime.TranslatedString.decode(reader, reader.uint32());
                        break;
                    }
                case 14: {
                        message.severity_level = reader.int32();
                        break;
                    }
                case 15: {
                        message.image = $root.transit_realtime.TranslatedImage.decode(reader, reader.uint32());
                        break;
                    }
                case 16: {
                        message.image_alternative_text = $root.transit_realtime.TranslatedString.decode(reader, reader.uint32());
                        break;
                    }
                case 17: {
                        message.cause_detail = $root.transit_realtime.TranslatedString.decode(reader, reader.uint32());
                        break;
                    }
                case 18: {
                        message.effect_detail = $root.transit_realtime.TranslatedString.decode(reader, reader.uint32());
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes an Alert message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof transit_realtime.Alert
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {transit_realtime.Alert} Alert
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        Alert.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies an Alert message.
         * @function verify
         * @memberof transit_realtime.Alert
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        Alert.verify = function verify(message) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.active_period != null && message.hasOwnProperty("active_period")) {
                if (!Array.isArray(message.active_period))
                    return "active_period: array expected";
                for (var i = 0; i < message.active_period.length; ++i) {
                    var error = $root.transit_realtime.TimeRange.verify(message.active_period[i]);
                    if (error)
                        return "active_period." + error;
                }
            }
            if (message.informed_entity != null && message.hasOwnProperty("informed_entity")) {
                if (!Array.isArray(message.informed_entity))
                    return "informed_entity: array expected";
                for (var i = 0; i < message.informed_entity.length; ++i) {
                    var error = $root.transit_realtime.EntitySelector.verify(message.informed_entity[i]);
                    if (error)
                        return "informed_entity." + error;
                }
            }
            if (message.cause != null && message.hasOwnProperty("cause"))
                switch (message.cause) {
                default:
                    return "cause: enum value expected";
                case 1:
                case 2:
                case 3:
                case 4:
                case 5:
                case 6:
                case 7:
                case 8:
                case 9:
                case 10:
                case 11:
                case 12:
                    break;
                }
            if (message.effect != null && message.hasOwnProperty("effect"))
                switch (message.effect) {
                default:
                    return "effect: enum value expected";
                case 1:
                case 2:
                case 3:
                case 4:
                case 5:
                case 6:
                case 7:
                case 8:
                case 9:
                case 10:
                case 11:
                    break;
                }
            if (message.url != null && message.hasOwnProperty("url")) {
                var error = $root.transit_realtime.TranslatedString.verify(message.url);
                if (error)
                    return "url." + error;
            }
            if (message.header_text != null && message.hasOwnProperty("header_text")) {
                var error = $root.transit_realtime.TranslatedString.verify(message.header_text);
                if (error)
                    return "header_text." + error;
            }
            if (message.description_text != null && message.hasOwnProperty("description_text")) {
                var error = $root.transit_realtime.TranslatedString.verify(message.description_text);
                if (error)
                    return "description_text." + error;
            }
            if (message.tts_header_text != null && message.hasOwnProperty("tts_header_text")) {
                var error = $root.transit_realtime.TranslatedString.verify(message.tts_header_text);
                if (error)
                    return "tts_header_text." + error;
            }
            if (message.tts_description_text != null && message.hasOwnProperty("tts_description_text")) {
                var error = $root.transit_realtime.TranslatedString.verify(message.tts_description_text);
                if (error)
                    return "tts_description_text." + error;
            }
            if (message.severity_level != null && message.hasOwnProperty("severity_level"))
                switch (message.severity_level) {
                default:
                    return "severity_level: enum value expected";
                case 1:
                case 2:
                case 3:
                case 4:
                    break;
                }
            if (message.image != null && message.hasOwnProperty("image")) {
                var error = $root.transit_realtime.TranslatedImage.verify(message.image);
                if (error)
                    return "image." + error;
            }
            if (message.image_alternative_text != null && message.hasOwnProperty("image_alternative_text")) {
                var error = $root.transit_realtime.TranslatedString.verify(message.image_alternative_text);
                if (error)
                    return "image_alternative_text." + error;
            }
            if (message.cause_detail != null && message.hasOwnProperty("cause_detail")) {
                var error = $root.transit_realtime.TranslatedString.verify(message.cause_detail);
                if (error)
                    return "cause_detail." + error;
            }
            if (message.effect_detail != null && message.hasOwnProperty("effect_detail")) {
                var error = $root.transit_realtime.TranslatedString.verify(message.effect_detail);
                if (error)
                    return "effect_detail." + error;
            }
            return null;
        };

        /**
         * Creates an Alert message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof transit_realtime.Alert
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {transit_realtime.Alert} Alert
         */
        Alert.fromObject = function fromObject(object) {
            if (object instanceof $root.transit_realtime.Alert)
                return object;
            var message = new $root.transit_realtime.Alert();
            if (object.active_period) {
                if (!Array.isArray(object.active_period))
                    throw TypeError(".transit_realtime.Alert.active_period: array expected");
                message.active_period = [];
                for (var i = 0; i < object.active_period.length; ++i) {
                    if (typeof object.active_period[i] !== "object")
                        throw TypeError(".transit_realtime.Alert.active_period: object expected");
                    message.active_period[i] = $root.transit_realtime.TimeRange.fromObject(object.active_period[i]);
                }
            }
            if (object.informed_entity) {
                if (!Array.isArray(object.informed_entity))
                    throw TypeError(".transit_realtime.Alert.informed_entity: array expected");
                message.informed_entity = [];
                for (var i = 0; i < object.informed_entity.length; ++i) {
                    if (typeof object.informed_entity[i] !== "object")
                        throw TypeError(".transit_realtime.Alert.informed_entity: object expected");
                    message.informed_entity[i] = $root.transit_realtime.EntitySelector.fromObject(object.informed_entity[i]);
                }
            }
            switch (object.cause) {
            default:
                if (typeof object.cause === "number") {
                    message.cause = object.cause;
                    break;
                }
                break;
            case "UNKNOWN_CAUSE":
            case 1:
                message.cause = 1;
                break;
            case "OTHER_CAUSE":
            case 2:
                message.cause = 2;
                break;
            case "TECHNICAL_PROBLEM":
            case 3:
                message.cause = 3;
                break;
            case "STRIKE":
            case 4:
                message.cause = 4;
                break;
            case "DEMONSTRATION":
            case 5:
                message.cause = 5;
                break;
            case "ACCIDENT":
            case 6:
                message.cause = 6;
                break;
            case "HOLIDAY":
            case 7:
                message.cause = 7;
                break;
            case "WEATHER":
            case 8:
                message.cause = 8;
                break;
            case "MAINTENANCE":
            case 9:
                message.cause = 9;
                break;
            case "CONSTRUCTION":
            case 10:
                message.cause = 10;
                break;
            case "POLICE_ACTIVITY":
            case 11:
                message.cause = 11;
                break;
            case "MEDICAL_EMERGENCY":
            case 12:
                message.cause = 12;
                break;
            }
            switch (object.effect) {
            case "NO_SERVICE":
            case 1:
                message.effect = 1;
                break;
            case "REDUCED_SERVICE":
            case 2:
                message.effect = 2;
                break;
            case "SIGNIFICANT_DELAYS":
            case 3:
                message.effect = 3;
                break;
            case "DETOUR":
            case 4:
                message.effect = 4;
                break;
            case "ADDITIONAL_SERVICE":
            case 5:
                message.effect = 5;
                break;
            case "MODIFIED_SERVICE":
            case 6:
                message.effect = 6;
                break;
            case "OTHER_EFFECT":
            case 7:
                message.effect = 7;
                break;
            default:
                if (typeof object.effect === "number") {
                    message.effect = object.effect;
                    break;
                }
                break;
            case "UNKNOWN_EFFECT":
            case 8:
                message.effect = 8;
                break;
            case "STOP_MOVED":
            case 9:
                message.effect = 9;
                break;
            case "NO_EFFECT":
            case 10:
                message.effect = 10;
                break;
            case "ACCESSIBILITY_ISSUE":
            case 11:
                message.effect = 11;
                break;
            }
            if (object.url != null) {
                if (typeof object.url !== "object")
                    throw TypeError(".transit_realtime.Alert.url: object expected");
                message.url = $root.transit_realtime.TranslatedString.fromObject(object.url);
            }
            if (object.header_text != null) {
                if (typeof object.header_text !== "object")
                    throw TypeError(".transit_realtime.Alert.header_text: object expected");
                message.header_text = $root.transit_realtime.TranslatedString.fromObject(object.header_text);
            }
            if (object.description_text != null) {
                if (typeof object.description_text !== "object")
                    throw TypeError(".transit_realtime.Alert.description_text: object expected");
                message.description_text = $root.transit_realtime.TranslatedString.fromObject(object.description_text);
            }
            if (object.tts_header_text != null) {
                if (typeof object.tts_header_text !== "object")
                    throw TypeError(".transit_realtime.Alert.tts_header_text: object expected");
                message.tts_header_text = $root.transit_realtime.TranslatedString.fromObject(object.tts_header_text);
            }
            if (object.tts_description_text != null) {
                if (typeof object.tts_description_text !== "object")
                    throw TypeError(".transit_realtime.Alert.tts_description_text: object expected");
                message.tts_description_text = $root.transit_realtime.TranslatedString.fromObject(object.tts_description_text);
            }
            switch (object.severity_level) {
            default:
                if (typeof object.severity_level === "number") {
                    message.severity_level = object.severity_level;
                    break;
                }
                break;
            case "UNKNOWN_SEVERITY":
            case 1:
                message.severity_level = 1;
                break;
            case "INFO":
            case 2:
                message.severity_level = 2;
                break;
            case "WARNING":
            case 3:
                message.severity_level = 3;
                break;
            case "SEVERE":
            case 4:
                message.severity_level = 4;
                break;
            }
            if (object.image != null) {
                if (typeof object.image !== "object")
                    throw TypeError(".transit_realtime.Alert.image: object expected");
                message.image = $root.transit_realtime.TranslatedImage.fromObject(object.image);
            }
            if (object.image_alternative_text != null) {
                if (typeof object.image_alternative_text !== "object")
                    throw TypeError(".transit_realtime.Alert.image_alternative_text: object expected");
                message.image_alternative_text = $root.transit_realtime.TranslatedString.fromObject(object.image_alternative_text);
            }
            if (object.cause_detail != null) {
                if (typeof object.cause_detail !== "object")
                    throw TypeError(".transit_realtime.Alert.cause_detail: object expected");
                message.cause_detail = $root.transit_realtime.TranslatedString.fromObject(object.cause_detail);
            }
            if (object.effect_detail != null) {
                if (typeof object.effect_detail !== "object")
                    throw TypeError(".transit_realtime.Alert.effect_detail: object expected");
                message.effect_detail = $root.transit_realtime.TranslatedString.fromObject(object.effect_detail);
            }
            return message;
        };

        /**
         * Creates a plain object from an Alert message. Also converts values to other types if specified.
         * @function toObject
         * @memberof transit_realtime.Alert
         * @static
         * @param {transit_realtime.Alert} message Alert
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        Alert.toObject = function toObject(message, options) {
            if (!options)
                options = {};
            var object = {};
            if (options.arrays || options.defaults) {
                object.active_period = [];
                object.informed_entity = [];
            }
            if (options.defaults) {
                object.cause = options.enums === String ? "UNKNOWN_CAUSE" : 1;
                object.effect = options.enums === String ? "UNKNOWN_EFFECT" : 8;
                object.url = null;
                object.header_text = null;
                object.description_text = null;
                object.tts_header_text = null;
                object.tts_description_text = null;
                object.severity_level = options.enums === String ? "UNKNOWN_SEVERITY" : 1;
                object.image = null;
                object.image_alternative_text = null;
                object.cause_detail = null;
                object.effect_detail = null;
            }
            if (message.active_period && message.active_period.length) {
                object.active_period = [];
                for (var j = 0; j < message.active_period.length; ++j)
                    object.active_period[j] = $root.transit_realtime.TimeRange.toObject(message.active_period[j], options);
            }
            if (message.informed_entity && message.informed_entity.length) {
                object.informed_entity = [];
                for (var j = 0; j < message.informed_entity.length; ++j)
                    object.informed_entity[j] = $root.transit_realtime.EntitySelector.toObject(message.informed_entity[j], options);
            }
            if (message.cause != null && message.hasOwnProperty("cause"))
                object.cause = options.enums === String ? $root.transit_realtime.Alert.Cause[message.cause] === undefined ? message.cause : $root.transit_realtime.Alert.Cause[message.cause] : message.cause;
            if (message.effect != null && message.hasOwnProperty("effect"))
                object.effect = options.enums === String ? $root.transit_realtime.Alert.Effect[message.effect] === undefined ? message.effect : $root.transit_realtime.Alert.Effect[message.effect] : message.effect;
            if (message.url != null && message.hasOwnProperty("url"))
                object.url = $root.transit_realtime.TranslatedString.toObject(message.url, options);
            if (message.header_text != null && message.hasOwnProperty("header_text"))
                object.header_text = $root.transit_realtime.TranslatedString.toObject(message.header_text, options);
            if (message.description_text != null && message.hasOwnProperty("description_text"))
                object.description_text = $root.transit_realtime.TranslatedString.toObject(message.description_text, options);
            if (message.tts_header_text != null && message.hasOwnProperty("tts_header_text"))
                object.tts_header_text = $root.transit_realtime.TranslatedString.toObject(message.tts_header_text, options);
            if (message.tts_description_text != null && message.hasOwnProperty("tts_description_text"))
                object.tts_description_text = $root.transit_realtime.TranslatedString.toObject(message.tts_description_text, options);
            if (message.severity_level != null && message.hasOwnProperty("severity_level"))
                object.severity_level = options.enums === String ? $root.transit_realtime.Alert.SeverityLevel[message.severity_level] === undefined ? message.severity_level : $root.transit_realtime.Alert.SeverityLevel[message.severity_level] : message.severity_level;
            if (message.image != null && message.hasOwnProperty("image"))
                object.image = $root.transit_realtime.TranslatedImage.toObject(message.image, options);
            if (message.image_alternative_text != null && message.hasOwnProperty("image_alternative_text"))
                object.image_alternative_text = $root.transit_realtime.TranslatedString.toObject(message.image_alternative_text, options);
            if (message.cause_detail != null && message.hasOwnProperty("cause_detail"))
                object.cause_detail = $root.transit_realtime.TranslatedString.toObject(message.cause_detail, options);
            if (message.effect_detail != null && message.hasOwnProperty("effect_detail"))
                object.effect_detail = $root.transit_realtime.TranslatedString.toObject(message.effect_detail, options);
            return object;
        };

        /**
         * Converts this Alert to JSON.
         * @function toJSON
         * @memberof transit_realtime.Alert
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        Alert.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for Alert
         * @function getTypeUrl
         * @memberof transit_realtime.Alert
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        Alert.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/transit_realtime.Alert";
        };

        /**
         * Cause enum.
         * @name transit_realtime.Alert.Cause
         * @enum {number}
         * @property {number} UNKNOWN_CAUSE=1 UNKNOWN_CAUSE value
         * @property {number} OTHER_CAUSE=2 OTHER_CAUSE value
         * @property {number} TECHNICAL_PROBLEM=3 TECHNICAL_PROBLEM value
         * @property {number} STRIKE=4 STRIKE value
         * @property {number} DEMONSTRATION=5 DEMONSTRATION value
         * @property {number} ACCIDENT=6 ACCIDENT value
         * @property {number} HOLIDAY=7 HOLIDAY value
         * @property {number} WEATHER=8 WEATHER value
         * @property {number} MAINTENANCE=9 MAINTENANCE value
         * @property {number} CONSTRUCTION=10 CONSTRUCTION value
         * @property {number} POLICE_ACTIVITY=11 POLICE_ACTIVITY value
         * @property {number} MEDICAL_EMERGENCY=12 MEDICAL_EMERGENCY value
         */
        Alert.Cause = (function() {
            var valuesById = {}, values = Object.create(valuesById);
            values[valuesById[1] = "UNKNOWN_CAUSE"] = 1;
            values[valuesById[2] = "OTHER_CAUSE"] = 2;
            values[valuesById[3] = "TECHNICAL_PROBLEM"] = 3;
            values[valuesById[4] = "STRIKE"] = 4;
            values[valuesById[5] = "DEMONSTRATION"] = 5;
            values[valuesById[6] = "ACCIDENT"] = 6;
            values[valuesById[7] = "HOLIDAY"] = 7;
            values[valuesById[8] = "WEATHER"] = 8;
            values[valuesById[9] = "MAINTENANCE"] = 9;
            values[valuesById[10] = "CONSTRUCTION"] = 10;
            values[valuesById[11] = "POLICE_ACTIVITY"] = 11;
            values[valuesById[12] = "MEDICAL_EMERGENCY"] = 12;
            return values;
        })();

        /**
         * Effect enum.
         * @name transit_realtime.Alert.Effect
         * @enum {number}
         * @property {number} NO_SERVICE=1 NO_SERVICE value
         * @property {number} REDUCED_SERVICE=2 REDUCED_SERVICE value
         * @property {number} SIGNIFICANT_DELAYS=3 SIGNIFICANT_DELAYS value
         * @property {number} DETOUR=4 DETOUR value
         * @property {number} ADDITIONAL_SERVICE=5 ADDITIONAL_SERVICE value
         * @property {number} MODIFIED_SERVICE=6 MODIFIED_SERVICE value
         * @property {number} OTHER_EFFECT=7 OTHER_EFFECT value
         * @property {number} UNKNOWN_EFFECT=8 UNKNOWN_EFFECT value
         * @property {number} STOP_MOVED=9 STOP_MOVED value
         * @property {number} NO_EFFECT=10 NO_EFFECT value
         * @property {number} ACCESSIBILITY_ISSUE=11 ACCESSIBILITY_ISSUE value
         */
        Alert.Effect = (function() {
            var valuesById = {}, values = Object.create(valuesById);
            values[valuesById[1] = "NO_SERVICE"] = 1;
            values[valuesById[2] = "REDUCED_SERVICE"] = 2;
            values[valuesById[3] = "SIGNIFICANT_DELAYS"] = 3;
            values[valuesById[4] = "DETOUR"] = 4;
            values[valuesById[5] = "ADDITIONAL_SERVICE"] = 5;
            values[valuesById[6] = "MODIFIED_SERVICE"] = 6;
            values[valuesById[7] = "OTHER_EFFECT"] = 7;
            values[valuesById[8] = "UNKNOWN_EFFECT"] = 8;
            values[valuesById[9] = "STOP_MOVED"] = 9;
            values[valuesById[10] = "NO_EFFECT"] = 10;
            values[valuesById[11] = "ACCESSIBILITY_ISSUE"] = 11;
            return values;
        })();

        /**
         * SeverityLevel enum.
         * @name transit_realtime.Alert.SeverityLevel
         * @enum {number}
         * @property {number} UNKNOWN_SEVERITY=1 UNKNOWN_SEVERITY value
         * @property {number} INFO=2 INFO value
         * @property {number} WARNING=3 WARNING value
         * @property {number} SEVERE=4 SEVERE value
         */
        Alert.SeverityLevel = (function() {
            var valuesById = {}, values = Object.create(valuesById);
            values[valuesById[1] = "UNKNOWN_SEVERITY"] = 1;
            values[valuesById[2] = "INFO"] = 2;
            values[valuesById[3] = "WARNING"] = 3;
            values[valuesById[4] = "SEVERE"] = 4;
            return values;
        })();

        return Alert;
    })();

    transit_realtime.TimeRange = (function() {

        /**
         * Properties of a TimeRange.
         * @memberof transit_realtime
         * @interface ITimeRange
         * @property {number|null} [start] TimeRange start
         * @property {number|null} [end] TimeRange end
         */

        /**
         * Constructs a new TimeRange.
         * @memberof transit_realtime
         * @classdesc Represents a TimeRange.
         * @implements ITimeRange
         * @constructor
         * @param {transit_realtime.ITimeRange=} [properties] Properties to set
         */
        function TimeRange(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null)
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * TimeRange start.
         * @member {number} start
         * @memberof transit_realtime.TimeRange
         * @instance
         */
        TimeRange.prototype.start = $util.Long ? $util.Long.fromBits(0,0,true) : 0;

        /**
         * TimeRange end.
         * @member {number} end
         * @memberof transit_realtime.TimeRange
         * @instance
         */
        TimeRange.prototype.end = $util.Long ? $util.Long.fromBits(0,0,true) : 0;

        /**
         * Creates a new TimeRange instance using the specified properties.
         * @function create
         * @memberof transit_realtime.TimeRange
         * @static
         * @param {transit_realtime.ITimeRange=} [properties] Properties to set
         * @returns {transit_realtime.TimeRange} TimeRange instance
         */
        TimeRange.create = function create(properties) {
            return new TimeRange(properties);
        };

        /**
         * Encodes the specified TimeRange message. Does not implicitly {@link transit_realtime.TimeRange.verify|verify} messages.
         * @function encode
         * @memberof transit_realtime.TimeRange
         * @static
         * @param {transit_realtime.ITimeRange} message TimeRange message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        TimeRange.encode = function encode(message, writer) {
            if (!writer)
                writer = $Writer.create();
            if (message.start != null && Object.hasOwnProperty.call(message, "start"))
                writer.uint32(/* id 1, wireType 0 =*/8).uint64(message.start);
            if (message.end != null && Object.hasOwnProperty.call(message, "end"))
                writer.uint32(/* id 2, wireType 0 =*/16).uint64(message.end);
            return writer;
        };

        /**
         * Encodes the specified TimeRange message, length delimited. Does not implicitly {@link transit_realtime.TimeRange.verify|verify} messages.
         * @function encodeDelimited
         * @memberof transit_realtime.TimeRange
         * @static
         * @param {transit_realtime.ITimeRange} message TimeRange message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        TimeRange.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer).ldelim();
        };

        /**
         * Decodes a TimeRange message from the specified reader or buffer.
         * @function decode
         * @memberof transit_realtime.TimeRange
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {transit_realtime.TimeRange} TimeRange
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        TimeRange.decode = function decode(reader, length, error) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.transit_realtime.TimeRange();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.start = reader.uint64();
                        break;
                    }
                case 2: {
                        message.end = reader.uint64();
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a TimeRange message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof transit_realtime.TimeRange
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {transit_realtime.TimeRange} TimeRange
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        TimeRange.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a TimeRange message.
         * @function verify
         * @memberof transit_realtime.TimeRange
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        TimeRange.verify = function verify(message) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.start != null && message.hasOwnProperty("start"))
                if (!$util.isInteger(message.start) && !(message.start && $util.isInteger(message.start.low) && $util.isInteger(message.start.high)))
                    return "start: integer|Long expected";
            if (message.end != null && message.hasOwnProperty("end"))
                if (!$util.isInteger(message.end) && !(message.end && $util.isInteger(message.end.low) && $util.isInteger(message.end.high)))
                    return "end: integer|Long expected";
            return null;
        };

        /**
         * Creates a TimeRange message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof transit_realtime.TimeRange
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {transit_realtime.TimeRange} TimeRange
         */
        TimeRange.fromObject = function fromObject(object) {
            if (object instanceof $root.transit_realtime.TimeRange)
                return object;
            var message = new $root.transit_realtime.TimeRange();
            if (object.start != null)
                if ($util.Long)
                    (message.start = $util.Long.fromValue(object.start)).unsigned = true;
                else if (typeof object.start === "string")
                    message.start = parseInt(object.start, 10);
                else if (typeof object.start === "number")
                    message.start = object.start;
                else if (typeof object.start === "object")
                    message.start = new $util.LongBits(object.start.low >>> 0, object.start.high >>> 0).toNumber(true);
            if (object.end != null)
                if ($util.Long)
                    (message.end = $util.Long.fromValue(object.end)).unsigned = true;
                else if (typeof object.end === "string")
                    message.end = parseInt(object.end, 10);
                else if (typeof object.end === "number")
                    message.end = object.end;
                else if (typeof object.end === "object")
                    message.end = new $util.LongBits(object.end.low >>> 0, object.end.high >>> 0).toNumber(true);
            return message;
        };

        /**
         * Creates a plain object from a TimeRange message. Also converts values to other types if specified.
         * @function toObject
         * @memberof transit_realtime.TimeRange
         * @static
         * @param {transit_realtime.TimeRange} message TimeRange
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        TimeRange.toObject = function toObject(message, options) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults) {
                if ($util.Long) {
                    var long = new $util.Long(0, 0, true);
                    object.start = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : long;
                } else
                    object.start = options.longs === String ? "0" : 0;
                if ($util.Long) {
                    var long = new $util.Long(0, 0, true);
                    object.end = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : long;
                } else
                    object.end = options.longs === String ? "0" : 0;
            }
            if (message.start != null && message.hasOwnProperty("start"))
                if (typeof message.start === "number")
                    object.start = options.longs === String ? String(message.start) : message.start;
                else
                    object.start = options.longs === String ? $util.Long.prototype.toString.call(message.start) : options.longs === Number ? new $util.LongBits(message.start.low >>> 0, message.start.high >>> 0).toNumber(true) : message.start;
            if (message.end != null && message.hasOwnProperty("end"))
                if (typeof message.end === "number")
                    object.end = options.longs === String ? String(message.end) : message.end;
                else
                    object.end = options.longs === String ? $util.Long.prototype.toString.call(message.end) : options.longs === Number ? new $util.LongBits(message.end.low >>> 0, message.end.high >>> 0).toNumber(true) : message.end;
            return object;
        };

        /**
         * Converts this TimeRange to JSON.
         * @function toJSON
         * @memberof transit_realtime.TimeRange
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        TimeRange.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for TimeRange
         * @function getTypeUrl
         * @memberof transit_realtime.TimeRange
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        TimeRange.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/transit_realtime.TimeRange";
        };

        return TimeRange;
    })();

    transit_realtime.Position = (function() {

        /**
         * Properties of a Position.
         * @memberof transit_realtime
         * @interface IPosition
         * @property {number} latitude Position latitude
         * @property {number} longitude Position longitude
         * @property {number|null} [bearing] Position bearing
         * @property {number|null} [odometer] Position odometer
         * @property {number|null} [speed] Position speed
         */

        /**
         * Constructs a new Position.
         * @memberof transit_realtime
         * @classdesc Represents a Position.
         * @implements IPosition
         * @constructor
         * @param {transit_realtime.IPosition=} [properties] Properties to set
         */
        function Position(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null)
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * Position latitude.
         * @member {number} latitude
         * @memberof transit_realtime.Position
         * @instance
         */
        Position.prototype.latitude = 0;

        /**
         * Position longitude.
         * @member {number} longitude
         * @memberof transit_realtime.Position
         * @instance
         */
        Position.prototype.longitude = 0;

        /**
         * Position bearing.
         * @member {number} bearing
         * @memberof transit_realtime.Position
         * @instance
         */
        Position.prototype.bearing = 0;

        /**
         * Position odometer.
         * @member {number} odometer
         * @memberof transit_realtime.Position
         * @instance
         */
        Position.prototype.odometer = 0;

        /**
         * Position speed.
         * @member {number} speed
         * @memberof transit_realtime.Position
         * @instance
         */
        Position.prototype.speed = 0;

        /**
         * Creates a new Position instance using the specified properties.
         * @function create
         * @memberof transit_realtime.Position
         * @static
         * @param {transit_realtime.IPosition=} [properties] Properties to set
         * @returns {transit_realtime.Position} Position instance
         */
        Position.create = function create(properties) {
            return new Position(properties);
        };

        /**
         * Encodes the specified Position message. Does not implicitly {@link transit_realtime.Position.verify|verify} messages.
         * @function encode
         * @memberof transit_realtime.Position
         * @static
         * @param {transit_realtime.IPosition} message Position message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        Position.encode = function encode(message, writer) {
            if (!writer)
                writer = $Writer.create();
            writer.uint32(/* id 1, wireType 5 =*/13).float(message.latitude);
            writer.uint32(/* id 2, wireType 5 =*/21).float(message.longitude);
            if (message.bearing != null && Object.hasOwnProperty.call(message, "bearing"))
                writer.uint32(/* id 3, wireType 5 =*/29).float(message.bearing);
            if (message.odometer != null && Object.hasOwnProperty.call(message, "odometer"))
                writer.uint32(/* id 4, wireType 1 =*/33).double(message.odometer);
            if (message.speed != null && Object.hasOwnProperty.call(message, "speed"))
                writer.uint32(/* id 5, wireType 5 =*/45).float(message.speed);
            return writer;
        };

        /**
         * Encodes the specified Position message, length delimited. Does not implicitly {@link transit_realtime.Position.verify|verify} messages.
         * @function encodeDelimited
         * @memberof transit_realtime.Position
         * @static
         * @param {transit_realtime.IPosition} message Position message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        Position.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer).ldelim();
        };

        /**
         * Decodes a Position message from the specified reader or buffer.
         * @function decode
         * @memberof transit_realtime.Position
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {transit_realtime.Position} Position
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        Position.decode = function decode(reader, length, error) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.transit_realtime.Position();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.latitude = reader.float();
                        break;
                    }
                case 2: {
                        message.longitude = reader.float();
                        break;
                    }
                case 3: {
                        message.bearing = reader.float();
                        break;
                    }
                case 4: {
                        message.odometer = reader.double();
                        break;
                    }
                case 5: {
                        message.speed = reader.float();
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    break;
                }
            }
            if (!message.hasOwnProperty("latitude"))
                throw $util.ProtocolError("missing required 'latitude'", { instance: message });
            if (!message.hasOwnProperty("longitude"))
                throw $util.ProtocolError("missing required 'longitude'", { instance: message });
            return message;
        };

        /**
         * Decodes a Position message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof transit_realtime.Position
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {transit_realtime.Position} Position
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        Position.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a Position message.
         * @function verify
         * @memberof transit_realtime.Position
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        Position.verify = function verify(message) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (typeof message.latitude !== "number")
                return "latitude: number expected";
            if (typeof message.longitude !== "number")
                return "longitude: number expected";
            if (message.bearing != null && message.hasOwnProperty("bearing"))
                if (typeof message.bearing !== "number")
                    return "bearing: number expected";
            if (message.odometer != null && message.hasOwnProperty("odometer"))
                if (typeof message.odometer !== "number")
                    return "odometer: number expected";
            if (message.speed != null && message.hasOwnProperty("speed"))
                if (typeof message.speed !== "number")
                    return "speed: number expected";
            return null;
        };

        /**
         * Creates a Position message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof transit_realtime.Position
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {transit_realtime.Position} Position
         */
        Position.fromObject = function fromObject(object) {
            if (object instanceof $root.transit_realtime.Position)
                return object;
            var message = new $root.transit_realtime.Position();
            if (object.latitude != null)
                message.latitude = Number(object.latitude);
            if (object.longitude != null)
                message.longitude = Number(object.longitude);
            if (object.bearing != null)
                message.bearing = Number(object.bearing);
            if (object.odometer != null)
                message.odometer = Number(object.odometer);
            if (object.speed != null)
                message.speed = Number(object.speed);
            return message;
        };

        /**
         * Creates a plain object from a Position message. Also converts values to other types if specified.
         * @function toObject
         * @memberof transit_realtime.Position
         * @static
         * @param {transit_realtime.Position} message Position
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        Position.toObject = function toObject(message, options) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults) {
                object.latitude = 0;
                object.longitude = 0;
                object.bearing = 0;
                object.odometer = 0;
                object.speed = 0;
            }
            if (message.latitude != null && message.hasOwnProperty("latitude"))
                object.latitude = options.json && !isFinite(message.latitude) ? String(message.latitude) : message.latitude;
            if (message.longitude != null && message.hasOwnProperty("longitude"))
                object.longitude = options.json && !isFinite(message.longitude) ? String(message.longitude) : message.longitude;
            if (message.bearing != null && message.hasOwnProperty("bearing"))
                object.bearing = options.json && !isFinite(message.bearing) ? String(message.bearing) : message.bearing;
            if (message.odometer != null && message.hasOwnProperty("odometer"))
                object.odometer = options.json && !isFinite(message.odometer) ? String(message.odometer) : message.odometer;
            if (message.speed != null && message.hasOwnProperty("speed"))
                object.speed = options.json && !isFinite(message.speed) ? String(message.speed) : message.speed;
            return object;
        };

        /**
         * Converts this Position to JSON.
         * @function toJSON
         * @memberof transit_realtime.Position
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        Position.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for Position
         * @function getTypeUrl
         * @memberof transit_realtime.Position
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        Position.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/transit_realtime.Position";
        };

        return Position;
    })();

    transit_realtime.TripDescriptor = (function() {

        /**
         * Properties of a TripDescriptor.
         * @memberof transit_realtime
         * @interface ITripDescriptor
         * @property {string|null} [trip_id] TripDescriptor trip_id
         * @property {string|null} [route_id] TripDescriptor route_id
         * @property {number|null} [direction_id] TripDescriptor direction_id
         * @property {string|null} [start_time] TripDescriptor start_time
         * @property {string|null} [start_date] TripDescriptor start_date
         * @property {transit_realtime.TripDescriptor.ScheduleRelationship|null} [schedule_relationship] TripDescriptor schedule_relationship
         * @property {transit_realtime.TripDescriptor.IModifiedTripSelector|null} [modified_trip] TripDescriptor modified_trip
         */

        /**
         * Constructs a new TripDescriptor.
         * @memberof transit_realtime
         * @classdesc Represents a TripDescriptor.
         * @implements ITripDescriptor
         * @constructor
         * @param {transit_realtime.ITripDescriptor=} [properties] Properties to set
         */
        function TripDescriptor(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null)
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * TripDescriptor trip_id.
         * @member {string} trip_id
         * @memberof transit_realtime.TripDescriptor
         * @instance
         */
        TripDescriptor.prototype.trip_id = "";

        /**
         * TripDescriptor route_id.
         * @member {string} route_id
         * @memberof transit_realtime.TripDescriptor
         * @instance
         */
        TripDescriptor.prototype.route_id = "";

        /**
         * TripDescriptor direction_id.
         * @member {number} direction_id
         * @memberof transit_realtime.TripDescriptor
         * @instance
         */
        TripDescriptor.prototype.direction_id = 0;

        /**
         * TripDescriptor start_time.
         * @member {string} start_time
         * @memberof transit_realtime.TripDescriptor
         * @instance
         */
        TripDescriptor.prototype.start_time = "";

        /**
         * TripDescriptor start_date.
         * @member {string} start_date
         * @memberof transit_realtime.TripDescriptor
         * @instance
         */
        TripDescriptor.prototype.start_date = "";

        /**
         * TripDescriptor schedule_relationship.
         * @member {transit_realtime.TripDescriptor.ScheduleRelationship} schedule_relationship
         * @memberof transit_realtime.TripDescriptor
         * @instance
         */
        TripDescriptor.prototype.schedule_relationship = 0;

        /**
         * TripDescriptor modified_trip.
         * @member {transit_realtime.TripDescriptor.IModifiedTripSelector|null|undefined} modified_trip
         * @memberof transit_realtime.TripDescriptor
         * @instance
         */
        TripDescriptor.prototype.modified_trip = null;

        /**
         * Creates a new TripDescriptor instance using the specified properties.
         * @function create
         * @memberof transit_realtime.TripDescriptor
         * @static
         * @param {transit_realtime.ITripDescriptor=} [properties] Properties to set
         * @returns {transit_realtime.TripDescriptor} TripDescriptor instance
         */
        TripDescriptor.create = function create(properties) {
            return new TripDescriptor(properties);
        };

        /**
         * Encodes the specified TripDescriptor message. Does not implicitly {@link transit_realtime.TripDescriptor.verify|verify} messages.
         * @function encode
         * @memberof transit_realtime.TripDescriptor
         * @static
         * @param {transit_realtime.ITripDescriptor} message TripDescriptor message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        TripDescriptor.encode = function encode(message, writer) {
            if (!writer)
                writer = $Writer.create();
            if (message.trip_id != null && Object.hasOwnProperty.call(message, "trip_id"))
                writer.uint32(/* id 1, wireType 2 =*/10).string(message.trip_id);
            if (message.start_time != null && Object.hasOwnProperty.call(message, "start_time"))
                writer.uint32(/* id 2, wireType 2 =*/18).string(message.start_time);
            if (message.start_date != null && Object.hasOwnProperty.call(message, "start_date"))
                writer.uint32(/* id 3, wireType 2 =*/26).string(message.start_date);
            if (message.schedule_relationship != null && Object.hasOwnProperty.call(message, "schedule_relationship"))
                writer.uint32(/* id 4, wireType 0 =*/32).int32(message.schedule_relationship);
            if (message.route_id != null && Object.hasOwnProperty.call(message, "route_id"))
                writer.uint32(/* id 5, wireType 2 =*/42).string(message.route_id);
            if (message.direction_id != null && Object.hasOwnProperty.call(message, "direction_id"))
                writer.uint32(/* id 6, wireType 0 =*/48).uint32(message.direction_id);
            if (message.modified_trip != null && Object.hasOwnProperty.call(message, "modified_trip"))
                $root.transit_realtime.TripDescriptor.ModifiedTripSelector.encode(message.modified_trip, writer.uint32(/* id 7, wireType 2 =*/58).fork()).ldelim();
            return writer;
        };

        /**
         * Encodes the specified TripDescriptor message, length delimited. Does not implicitly {@link transit_realtime.TripDescriptor.verify|verify} messages.
         * @function encodeDelimited
         * @memberof transit_realtime.TripDescriptor
         * @static
         * @param {transit_realtime.ITripDescriptor} message TripDescriptor message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        TripDescriptor.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer).ldelim();
        };

        /**
         * Decodes a TripDescriptor message from the specified reader or buffer.
         * @function decode
         * @memberof transit_realtime.TripDescriptor
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {transit_realtime.TripDescriptor} TripDescriptor
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        TripDescriptor.decode = function decode(reader, length, error) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.transit_realtime.TripDescriptor();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.trip_id = reader.string();
                        break;
                    }
                case 5: {
                        message.route_id = reader.string();
                        break;
                    }
                case 6: {
                        message.direction_id = reader.uint32();
                        break;
                    }
                case 2: {
                        message.start_time = reader.string();
                        break;
                    }
                case 3: {
                        message.start_date = reader.string();
                        break;
                    }
                case 4: {
                        message.schedule_relationship = reader.int32();
                        break;
                    }
                case 7: {
                        message.modified_trip = $root.transit_realtime.TripDescriptor.ModifiedTripSelector.decode(reader, reader.uint32());
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a TripDescriptor message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof transit_realtime.TripDescriptor
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {transit_realtime.TripDescriptor} TripDescriptor
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        TripDescriptor.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a TripDescriptor message.
         * @function verify
         * @memberof transit_realtime.TripDescriptor
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        TripDescriptor.verify = function verify(message) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.trip_id != null && message.hasOwnProperty("trip_id"))
                if (!$util.isString(message.trip_id))
                    return "trip_id: string expected";
            if (message.route_id != null && message.hasOwnProperty("route_id"))
                if (!$util.isString(message.route_id))
                    return "route_id: string expected";
            if (message.direction_id != null && message.hasOwnProperty("direction_id"))
                if (!$util.isInteger(message.direction_id))
                    return "direction_id: integer expected";
            if (message.start_time != null && message.hasOwnProperty("start_time"))
                if (!$util.isString(message.start_time))
                    return "start_time: string expected";
            if (message.start_date != null && message.hasOwnProperty("start_date"))
                if (!$util.isString(message.start_date))
                    return "start_date: string expected";
            if (message.schedule_relationship != null && message.hasOwnProperty("schedule_relationship"))
                switch (message.schedule_relationship) {
                default:
                    return "schedule_relationship: enum value expected";
                case 0:
                case 1:
                case 2:
                case 3:
                case 5:
                case 6:
                case 7:
                case 8:
                    break;
                }
            if (message.modified_trip != null && message.hasOwnProperty("modified_trip")) {
                var error = $root.transit_realtime.TripDescriptor.ModifiedTripSelector.verify(message.modified_trip);
                if (error)
                    return "modified_trip." + error;
            }
            return null;
        };

        /**
         * Creates a TripDescriptor message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof transit_realtime.TripDescriptor
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {transit_realtime.TripDescriptor} TripDescriptor
         */
        TripDescriptor.fromObject = function fromObject(object) {
            if (object instanceof $root.transit_realtime.TripDescriptor)
                return object;
            var message = new $root.transit_realtime.TripDescriptor();
            if (object.trip_id != null)
                message.trip_id = String(object.trip_id);
            if (object.route_id != null)
                message.route_id = String(object.route_id);
            if (object.direction_id != null)
                message.direction_id = object.direction_id >>> 0;
            if (object.start_time != null)
                message.start_time = String(object.start_time);
            if (object.start_date != null)
                message.start_date = String(object.start_date);
            switch (object.schedule_relationship) {
            default:
                if (typeof object.schedule_relationship === "number") {
                    message.schedule_relationship = object.schedule_relationship;
                    break;
                }
                break;
            case "SCHEDULED":
            case 0:
                message.schedule_relationship = 0;
                break;
            case "ADDED":
            case 1:
                message.schedule_relationship = 1;
                break;
            case "UNSCHEDULED":
            case 2:
                message.schedule_relationship = 2;
                break;
            case "CANCELED":
            case 3:
                message.schedule_relationship = 3;
                break;
            case "REPLACEMENT":
            case 5:
                message.schedule_relationship = 5;
                break;
            case "DUPLICATED":
            case 6:
                message.schedule_relationship = 6;
                break;
            case "DELETED":
            case 7:
                message.schedule_relationship = 7;
                break;
            case "NEW":
            case 8:
                message.schedule_relationship = 8;
                break;
            }
            if (object.modified_trip != null) {
                if (typeof object.modified_trip !== "object")
                    throw TypeError(".transit_realtime.TripDescriptor.modified_trip: object expected");
                message.modified_trip = $root.transit_realtime.TripDescriptor.ModifiedTripSelector.fromObject(object.modified_trip);
            }
            return message;
        };

        /**
         * Creates a plain object from a TripDescriptor message. Also converts values to other types if specified.
         * @function toObject
         * @memberof transit_realtime.TripDescriptor
         * @static
         * @param {transit_realtime.TripDescriptor} message TripDescriptor
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        TripDescriptor.toObject = function toObject(message, options) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults) {
                object.trip_id = "";
                object.start_time = "";
                object.start_date = "";
                object.schedule_relationship = options.enums === String ? "SCHEDULED" : 0;
                object.route_id = "";
                object.direction_id = 0;
                object.modified_trip = null;
            }
            if (message.trip_id != null && message.hasOwnProperty("trip_id"))
                object.trip_id = message.trip_id;
            if (message.start_time != null && message.hasOwnProperty("start_time"))
                object.start_time = message.start_time;
            if (message.start_date != null && message.hasOwnProperty("start_date"))
                object.start_date = message.start_date;
            if (message.schedule_relationship != null && message.hasOwnProperty("schedule_relationship"))
                object.schedule_relationship = options.enums === String ? $root.transit_realtime.TripDescriptor.ScheduleRelationship[message.schedule_relationship] === undefined ? message.schedule_relationship : $root.transit_realtime.TripDescriptor.ScheduleRelationship[message.schedule_relationship] : message.schedule_relationship;
            if (message.route_id != null && message.hasOwnProperty("route_id"))
                object.route_id = message.route_id;
            if (message.direction_id != null && message.hasOwnProperty("direction_id"))
                object.direction_id = message.direction_id;
            if (message.modified_trip != null && message.hasOwnProperty("modified_trip"))
                object.modified_trip = $root.transit_realtime.TripDescriptor.ModifiedTripSelector.toObject(message.modified_trip, options);
            return object;
        };

        /**
         * Converts this TripDescriptor to JSON.
         * @function toJSON
         * @memberof transit_realtime.TripDescriptor
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        TripDescriptor.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for TripDescriptor
         * @function getTypeUrl
         * @memberof transit_realtime.TripDescriptor
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        TripDescriptor.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/transit_realtime.TripDescriptor";
        };

        /**
         * ScheduleRelationship enum.
         * @name transit_realtime.TripDescriptor.ScheduleRelationship
         * @enum {number}
         * @property {number} SCHEDULED=0 SCHEDULED value
         * @property {number} ADDED=1 ADDED value
         * @property {number} UNSCHEDULED=2 UNSCHEDULED value
         * @property {number} CANCELED=3 CANCELED value
         * @property {number} REPLACEMENT=5 REPLACEMENT value
         * @property {number} DUPLICATED=6 DUPLICATED value
         * @property {number} DELETED=7 DELETED value
         * @property {number} NEW=8 NEW value
         */
        TripDescriptor.ScheduleRelationship = (function() {
            var valuesById = {}, values = Object.create(valuesById);
            values[valuesById[0] = "SCHEDULED"] = 0;
            values[valuesById[1] = "ADDED"] = 1;
            values[valuesById[2] = "UNSCHEDULED"] = 2;
            values[valuesById[3] = "CANCELED"] = 3;
            values[valuesById[5] = "REPLACEMENT"] = 5;
            values[valuesById[6] = "DUPLICATED"] = 6;
            values[valuesById[7] = "DELETED"] = 7;
            values[valuesById[8] = "NEW"] = 8;
            return values;
        })();

        TripDescriptor.ModifiedTripSelector = (function() {

            /**
             * Properties of a ModifiedTripSelector.
             * @memberof transit_realtime.TripDescriptor
             * @interface IModifiedTripSelector
             * @property {string|null} [modifications_id] ModifiedTripSelector modifications_id
             * @property {string|null} [affected_trip_id] ModifiedTripSelector affected_trip_id
             * @property {string|null} [start_time] ModifiedTripSelector start_time
             * @property {string|null} [start_date] ModifiedTripSelector start_date
             */

            /**
             * Constructs a new ModifiedTripSelector.
             * @memberof transit_realtime.TripDescriptor
             * @classdesc Represents a ModifiedTripSelector.
             * @implements IModifiedTripSelector
             * @constructor
             * @param {transit_realtime.TripDescriptor.IModifiedTripSelector=} [properties] Properties to set
             */
            function ModifiedTripSelector(properties) {
                if (properties)
                    for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                        if (properties[keys[i]] != null)
                            this[keys[i]] = properties[keys[i]];
            }

            /**
             * ModifiedTripSelector modifications_id.
             * @member {string} modifications_id
             * @memberof transit_realtime.TripDescriptor.ModifiedTripSelector
             * @instance
             */
            ModifiedTripSelector.prototype.modifications_id = "";

            /**
             * ModifiedTripSelector affected_trip_id.
             * @member {string} affected_trip_id
             * @memberof transit_realtime.TripDescriptor.ModifiedTripSelector
             * @instance
             */
            ModifiedTripSelector.prototype.affected_trip_id = "";

            /**
             * ModifiedTripSelector start_time.
             * @member {string} start_time
             * @memberof transit_realtime.TripDescriptor.ModifiedTripSelector
             * @instance
             */
            ModifiedTripSelector.prototype.start_time = "";

            /**
             * ModifiedTripSelector start_date.
             * @member {string} start_date
             * @memberof transit_realtime.TripDescriptor.ModifiedTripSelector
             * @instance
             */
            ModifiedTripSelector.prototype.start_date = "";

            /**
             * Creates a new ModifiedTripSelector instance using the specified properties.
             * @function create
             * @memberof transit_realtime.TripDescriptor.ModifiedTripSelector
             * @static
             * @param {transit_realtime.TripDescriptor.IModifiedTripSelector=} [properties] Properties to set
             * @returns {transit_realtime.TripDescriptor.ModifiedTripSelector} ModifiedTripSelector instance
             */
            ModifiedTripSelector.create = function create(properties) {
                return new ModifiedTripSelector(properties);
            };

            /**
             * Encodes the specified ModifiedTripSelector message. Does not implicitly {@link transit_realtime.TripDescriptor.ModifiedTripSelector.verify|verify} messages.
             * @function encode
             * @memberof transit_realtime.TripDescriptor.ModifiedTripSelector
             * @static
             * @param {transit_realtime.TripDescriptor.IModifiedTripSelector} message ModifiedTripSelector message or plain object to encode
             * @param {$protobuf.Writer} [writer] Writer to encode to
             * @returns {$protobuf.Writer} Writer
             */
            ModifiedTripSelector.encode = function encode(message, writer) {
                if (!writer)
                    writer = $Writer.create();
                if (message.modifications_id != null && Object.hasOwnProperty.call(message, "modifications_id"))
                    writer.uint32(/* id 1, wireType 2 =*/10).string(message.modifications_id);
                if (message.affected_trip_id != null && Object.hasOwnProperty.call(message, "affected_trip_id"))
                    writer.uint32(/* id 2, wireType 2 =*/18).string(message.affected_trip_id);
                if (message.start_time != null && Object.hasOwnProperty.call(message, "start_time"))
                    writer.uint32(/* id 3, wireType 2 =*/26).string(message.start_time);
                if (message.start_date != null && Object.hasOwnProperty.call(message, "start_date"))
                    writer.uint32(/* id 4, wireType 2 =*/34).string(message.start_date);
                return writer;
            };

            /**
             * Encodes the specified ModifiedTripSelector message, length delimited. Does not implicitly {@link transit_realtime.TripDescriptor.ModifiedTripSelector.verify|verify} messages.
             * @function encodeDelimited
             * @memberof transit_realtime.TripDescriptor.ModifiedTripSelector
             * @static
             * @param {transit_realtime.TripDescriptor.IModifiedTripSelector} message ModifiedTripSelector message or plain object to encode
             * @param {$protobuf.Writer} [writer] Writer to encode to
             * @returns {$protobuf.Writer} Writer
             */
            ModifiedTripSelector.encodeDelimited = function encodeDelimited(message, writer) {
                return this.encode(message, writer).ldelim();
            };

            /**
             * Decodes a ModifiedTripSelector message from the specified reader or buffer.
             * @function decode
             * @memberof transit_realtime.TripDescriptor.ModifiedTripSelector
             * @static
             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
             * @param {number} [length] Message length if known beforehand
             * @returns {transit_realtime.TripDescriptor.ModifiedTripSelector} ModifiedTripSelector
             * @throws {Error} If the payload is not a reader or valid buffer
             * @throws {$protobuf.util.ProtocolError} If required fields are missing
             */
            ModifiedTripSelector.decode = function decode(reader, length, error) {
                if (!(reader instanceof $Reader))
                    reader = $Reader.create(reader);
                var end = length === undefined ? reader.len : reader.pos + length, message = new $root.transit_realtime.TripDescriptor.ModifiedTripSelector();
                while (reader.pos < end) {
                    var tag = reader.uint32();
                    if (tag === error)
                        break;
                    switch (tag >>> 3) {
                    case 1: {
                            message.modifications_id = reader.string();
                            break;
                        }
                    case 2: {
                            message.affected_trip_id = reader.string();
                            break;
                        }
                    case 3: {
                            message.start_time = reader.string();
                            break;
                        }
                    case 4: {
                            message.start_date = reader.string();
                            break;
                        }
                    default:
                        reader.skipType(tag & 7);
                        break;
                    }
                }
                return message;
            };

            /**
             * Decodes a ModifiedTripSelector message from the specified reader or buffer, length delimited.
             * @function decodeDelimited
             * @memberof transit_realtime.TripDescriptor.ModifiedTripSelector
             * @static
             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
             * @returns {transit_realtime.TripDescriptor.ModifiedTripSelector} ModifiedTripSelector
             * @throws {Error} If the payload is not a reader or valid buffer
             * @throws {$protobuf.util.ProtocolError} If required fields are missing
             */
            ModifiedTripSelector.decodeDelimited = function decodeDelimited(reader) {
                if (!(reader instanceof $Reader))
                    reader = new $Reader(reader);
                return this.decode(reader, reader.uint32());
            };

            /**
             * Verifies a ModifiedTripSelector message.
             * @function verify
             * @memberof transit_realtime.TripDescriptor.ModifiedTripSelector
             * @static
             * @param {Object.<string,*>} message Plain object to verify
             * @returns {string|null} `null` if valid, otherwise the reason why it is not
             */
            ModifiedTripSelector.verify = function verify(message) {
                if (typeof message !== "object" || message === null)
                    return "object expected";
                if (message.modifications_id != null && message.hasOwnProperty("modifications_id"))
                    if (!$util.isString(message.modifications_id))
                        return "modifications_id: string expected";
                if (message.affected_trip_id != null && message.hasOwnProperty("affected_trip_id"))
                    if (!$util.isString(message.affected_trip_id))
                        return "affected_trip_id: string expected";
                if (message.start_time != null && message.hasOwnProperty("start_time"))
                    if (!$util.isString(message.start_time))
                        return "start_time: string expected";
                if (message.start_date != null && message.hasOwnProperty("start_date"))
                    if (!$util.isString(message.start_date))
                        return "start_date: string expected";
                return null;
            };

            /**
             * Creates a ModifiedTripSelector message from a plain object. Also converts values to their respective internal types.
             * @function fromObject
             * @memberof transit_realtime.TripDescriptor.ModifiedTripSelector
             * @static
             * @param {Object.<string,*>} object Plain object
             * @returns {transit_realtime.TripDescriptor.ModifiedTripSelector} ModifiedTripSelector
             */
            ModifiedTripSelector.fromObject = function fromObject(object) {
                if (object instanceof $root.transit_realtime.TripDescriptor.ModifiedTripSelector)
                    return object;
                var message = new $root.transit_realtime.TripDescriptor.ModifiedTripSelector();
                if (object.modifications_id != null)
                    message.modifications_id = String(object.modifications_id);
                if (object.affected_trip_id != null)
                    message.affected_trip_id = String(object.affected_trip_id);
                if (object.start_time != null)
                    message.start_time = String(object.start_time);
                if (object.start_date != null)
                    message.start_date = String(object.start_date);
                return message;
            };

            /**
             * Creates a plain object from a ModifiedTripSelector message. Also converts values to other types if specified.
             * @function toObject
             * @memberof transit_realtime.TripDescriptor.ModifiedTripSelector
             * @static
             * @param {transit_realtime.TripDescriptor.ModifiedTripSelector} message ModifiedTripSelector
             * @param {$protobuf.IConversionOptions} [options] Conversion options
             * @returns {Object.<string,*>} Plain object
             */
            ModifiedTripSelector.toObject = function toObject(message, options) {
                if (!options)
                    options = {};
                var object = {};
                if (options.defaults) {
                    object.modifications_id = "";
                    object.affected_trip_id = "";
                    object.start_time = "";
                    object.start_date = "";
                }
                if (message.modifications_id != null && message.hasOwnProperty("modifications_id"))
                    object.modifications_id = message.modifications_id;
                if (message.affected_trip_id != null && message.hasOwnProperty("affected_trip_id"))
                    object.affected_trip_id = message.affected_trip_id;
                if (message.start_time != null && message.hasOwnProperty("start_time"))
                    object.start_time = message.start_time;
                if (message.start_date != null && message.hasOwnProperty("start_date"))
                    object.start_date = message.start_date;
                return object;
            };

            /**
             * Converts this ModifiedTripSelector to JSON.
             * @function toJSON
             * @memberof transit_realtime.TripDescriptor.ModifiedTripSelector
             * @instance
             * @returns {Object.<string,*>} JSON object
             */
            ModifiedTripSelector.prototype.toJSON = function toJSON() {
                return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
            };

            /**
             * Gets the default type url for ModifiedTripSelector
             * @function getTypeUrl
             * @memberof transit_realtime.TripDescriptor.ModifiedTripSelector
             * @static
             * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
             * @returns {string} The default type url
             */
            ModifiedTripSelector.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                if (typeUrlPrefix === undefined) {
                    typeUrlPrefix = "type.googleapis.com";
                }
                return typeUrlPrefix + "/transit_realtime.TripDescriptor.ModifiedTripSelector";
            };

            return ModifiedTripSelector;
        })();

        return TripDescriptor;
    })();

    transit_realtime.VehicleDescriptor = (function() {

        /**
         * Properties of a VehicleDescriptor.
         * @memberof transit_realtime
         * @interface IVehicleDescriptor
         * @property {string|null} [id] VehicleDescriptor id
         * @property {string|null} [label] VehicleDescriptor label
         * @property {string|null} [license_plate] VehicleDescriptor license_plate
         * @property {transit_realtime.VehicleDescriptor.WheelchairAccessible|null} [wheelchair_accessible] VehicleDescriptor wheelchair_accessible
         */

        /**
         * Constructs a new VehicleDescriptor.
         * @memberof transit_realtime
         * @classdesc Represents a VehicleDescriptor.
         * @implements IVehicleDescriptor
         * @constructor
         * @param {transit_realtime.IVehicleDescriptor=} [properties] Properties to set
         */
        function VehicleDescriptor(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null)
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * VehicleDescriptor id.
         * @member {string} id
         * @memberof transit_realtime.VehicleDescriptor
         * @instance
         */
        VehicleDescriptor.prototype.id = "";

        /**
         * VehicleDescriptor label.
         * @member {string} label
         * @memberof transit_realtime.VehicleDescriptor
         * @instance
         */
        VehicleDescriptor.prototype.label = "";

        /**
         * VehicleDescriptor license_plate.
         * @member {string} license_plate
         * @memberof transit_realtime.VehicleDescriptor
         * @instance
         */
        VehicleDescriptor.prototype.license_plate = "";

        /**
         * VehicleDescriptor wheelchair_accessible.
         * @member {transit_realtime.VehicleDescriptor.WheelchairAccessible} wheelchair_accessible
         * @memberof transit_realtime.VehicleDescriptor
         * @instance
         */
        VehicleDescriptor.prototype.wheelchair_accessible = 0;

        /**
         * Creates a new VehicleDescriptor instance using the specified properties.
         * @function create
         * @memberof transit_realtime.VehicleDescriptor
         * @static
         * @param {transit_realtime.IVehicleDescriptor=} [properties] Properties to set
         * @returns {transit_realtime.VehicleDescriptor} VehicleDescriptor instance
         */
        VehicleDescriptor.create = function create(properties) {
            return new VehicleDescriptor(properties);
        };

        /**
         * Encodes the specified VehicleDescriptor message. Does not implicitly {@link transit_realtime.VehicleDescriptor.verify|verify} messages.
         * @function encode
         * @memberof transit_realtime.VehicleDescriptor
         * @static
         * @param {transit_realtime.IVehicleDescriptor} message VehicleDescriptor message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        VehicleDescriptor.encode = function encode(message, writer) {
            if (!writer)
                writer = $Writer.create();
            if (message.id != null && Object.hasOwnProperty.call(message, "id"))
                writer.uint32(/* id 1, wireType 2 =*/10).string(message.id);
            if (message.label != null && Object.hasOwnProperty.call(message, "label"))
                writer.uint32(/* id 2, wireType 2 =*/18).string(message.label);
            if (message.license_plate != null && Object.hasOwnProperty.call(message, "license_plate"))
                writer.uint32(/* id 3, wireType 2 =*/26).string(message.license_plate);
            if (message.wheelchair_accessible != null && Object.hasOwnProperty.call(message, "wheelchair_accessible"))
                writer.uint32(/* id 4, wireType 0 =*/32).int32(message.wheelchair_accessible);
            return writer;
        };

        /**
         * Encodes the specified VehicleDescriptor message, length delimited. Does not implicitly {@link transit_realtime.VehicleDescriptor.verify|verify} messages.
         * @function encodeDelimited
         * @memberof transit_realtime.VehicleDescriptor
         * @static
         * @param {transit_realtime.IVehicleDescriptor} message VehicleDescriptor message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        VehicleDescriptor.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer).ldelim();
        };

        /**
         * Decodes a VehicleDescriptor message from the specified reader or buffer.
         * @function decode
         * @memberof transit_realtime.VehicleDescriptor
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {transit_realtime.VehicleDescriptor} VehicleDescriptor
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        VehicleDescriptor.decode = function decode(reader, length, error) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.transit_realtime.VehicleDescriptor();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.id = reader.string();
                        break;
                    }
                case 2: {
                        message.label = reader.string();
                        break;
                    }
                case 3: {
                        message.license_plate = reader.string();
                        break;
                    }
                case 4: {
                        message.wheelchair_accessible = reader.int32();
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a VehicleDescriptor message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof transit_realtime.VehicleDescriptor
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {transit_realtime.VehicleDescriptor} VehicleDescriptor
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        VehicleDescriptor.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a VehicleDescriptor message.
         * @function verify
         * @memberof transit_realtime.VehicleDescriptor
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        VehicleDescriptor.verify = function verify(message) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.id != null && message.hasOwnProperty("id"))
                if (!$util.isString(message.id))
                    return "id: string expected";
            if (message.label != null && message.hasOwnProperty("label"))
                if (!$util.isString(message.label))
                    return "label: string expected";
            if (message.license_plate != null && message.hasOwnProperty("license_plate"))
                if (!$util.isString(message.license_plate))
                    return "license_plate: string expected";
            if (message.wheelchair_accessible != null && message.hasOwnProperty("wheelchair_accessible"))
                switch (message.wheelchair_accessible) {
                default:
                    return "wheelchair_accessible: enum value expected";
                case 0:
                case 1:
                case 2:
                case 3:
                    break;
                }
            return null;
        };

        /**
         * Creates a VehicleDescriptor message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof transit_realtime.VehicleDescriptor
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {transit_realtime.VehicleDescriptor} VehicleDescriptor
         */
        VehicleDescriptor.fromObject = function fromObject(object) {
            if (object instanceof $root.transit_realtime.VehicleDescriptor)
                return object;
            var message = new $root.transit_realtime.VehicleDescriptor();
            if (object.id != null)
                message.id = String(object.id);
            if (object.label != null)
                message.label = String(object.label);
            if (object.license_plate != null)
                message.license_plate = String(object.license_plate);
            switch (object.wheelchair_accessible) {
            default:
                if (typeof object.wheelchair_accessible === "number") {
                    message.wheelchair_accessible = object.wheelchair_accessible;
                    break;
                }
                break;
            case "NO_VALUE":
            case 0:
                message.wheelchair_accessible = 0;
                break;
            case "UNKNOWN":
            case 1:
                message.wheelchair_accessible = 1;
                break;
            case "WHEELCHAIR_ACCESSIBLE":
            case 2:
                message.wheelchair_accessible = 2;
                break;
            case "WHEELCHAIR_INACCESSIBLE":
            case 3:
                message.wheelchair_accessible = 3;
                break;
            }
            return message;
        };

        /**
         * Creates a plain object from a VehicleDescriptor message. Also converts values to other types if specified.
         * @function toObject
         * @memberof transit_realtime.VehicleDescriptor
         * @static
         * @param {transit_realtime.VehicleDescriptor} message VehicleDescriptor
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        VehicleDescriptor.toObject = function toObject(message, options) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults) {
                object.id = "";
                object.label = "";
                object.license_plate = "";
                object.wheelchair_accessible = options.enums === String ? "NO_VALUE" : 0;
            }
            if (message.id != null && message.hasOwnProperty("id"))
                object.id = message.id;
            if (message.label != null && message.hasOwnProperty("label"))
                object.label = message.label;
            if (message.license_plate != null && message.hasOwnProperty("license_plate"))
                object.license_plate = message.license_plate;
            if (message.wheelchair_accessible != null && message.hasOwnProperty("wheelchair_accessible"))
                object.wheelchair_accessible = options.enums === String ? $root.transit_realtime.VehicleDescriptor.WheelchairAccessible[message.wheelchair_accessible] === undefined ? message.wheelchair_accessible : $root.transit_realtime.VehicleDescriptor.WheelchairAccessible[message.wheelchair_accessible] : message.wheelchair_accessible;
            return object;
        };

        /**
         * Converts this VehicleDescriptor to JSON.
         * @function toJSON
         * @memberof transit_realtime.VehicleDescriptor
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        VehicleDescriptor.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for VehicleDescriptor
         * @function getTypeUrl
         * @memberof transit_realtime.VehicleDescriptor
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        VehicleDescriptor.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/transit_realtime.VehicleDescriptor";
        };

        /**
         * WheelchairAccessible enum.
         * @name transit_realtime.VehicleDescriptor.WheelchairAccessible
         * @enum {number}
         * @property {number} NO_VALUE=0 NO_VALUE value
         * @property {number} UNKNOWN=1 UNKNOWN value
         * @property {number} WHEELCHAIR_ACCESSIBLE=2 WHEELCHAIR_ACCESSIBLE value
         * @property {number} WHEELCHAIR_INACCESSIBLE=3 WHEELCHAIR_INACCESSIBLE value
         */
        VehicleDescriptor.WheelchairAccessible = (function() {
            var valuesById = {}, values = Object.create(valuesById);
            values[valuesById[0] = "NO_VALUE"] = 0;
            values[valuesById[1] = "UNKNOWN"] = 1;
            values[valuesById[2] = "WHEELCHAIR_ACCESSIBLE"] = 2;
            values[valuesById[3] = "WHEELCHAIR_INACCESSIBLE"] = 3;
            return values;
        })();

        return VehicleDescriptor;
    })();

    transit_realtime.EntitySelector = (function() {

        /**
         * Properties of an EntitySelector.
         * @memberof transit_realtime
         * @interface IEntitySelector
         * @property {string|null} [agency_id] EntitySelector agency_id
         * @property {string|null} [route_id] EntitySelector route_id
         * @property {number|null} [route_type] EntitySelector route_type
         * @property {transit_realtime.ITripDescriptor|null} [trip] EntitySelector trip
         * @property {string|null} [stop_id] EntitySelector stop_id
         * @property {number|null} [direction_id] EntitySelector direction_id
         */

        /**
         * Constructs a new EntitySelector.
         * @memberof transit_realtime
         * @classdesc Represents an EntitySelector.
         * @implements IEntitySelector
         * @constructor
         * @param {transit_realtime.IEntitySelector=} [properties] Properties to set
         */
        function EntitySelector(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null)
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * EntitySelector agency_id.
         * @member {string} agency_id
         * @memberof transit_realtime.EntitySelector
         * @instance
         */
        EntitySelector.prototype.agency_id = "";

        /**
         * EntitySelector route_id.
         * @member {string} route_id
         * @memberof transit_realtime.EntitySelector
         * @instance
         */
        EntitySelector.prototype.route_id = "";

        /**
         * EntitySelector route_type.
         * @member {number} route_type
         * @memberof transit_realtime.EntitySelector
         * @instance
         */
        EntitySelector.prototype.route_type = 0;

        /**
         * EntitySelector trip.
         * @member {transit_realtime.ITripDescriptor|null|undefined} trip
         * @memberof transit_realtime.EntitySelector
         * @instance
         */
        EntitySelector.prototype.trip = null;

        /**
         * EntitySelector stop_id.
         * @member {string} stop_id
         * @memberof transit_realtime.EntitySelector
         * @instance
         */
        EntitySelector.prototype.stop_id = "";

        /**
         * EntitySelector direction_id.
         * @member {number} direction_id
         * @memberof transit_realtime.EntitySelector
         * @instance
         */
        EntitySelector.prototype.direction_id = 0;

        /**
         * Creates a new EntitySelector instance using the specified properties.
         * @function create
         * @memberof transit_realtime.EntitySelector
         * @static
         * @param {transit_realtime.IEntitySelector=} [properties] Properties to set
         * @returns {transit_realtime.EntitySelector} EntitySelector instance
         */
        EntitySelector.create = function create(properties) {
            return new EntitySelector(properties);
        };

        /**
         * Encodes the specified EntitySelector message. Does not implicitly {@link transit_realtime.EntitySelector.verify|verify} messages.
         * @function encode
         * @memberof transit_realtime.EntitySelector
         * @static
         * @param {transit_realtime.IEntitySelector} message EntitySelector message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        EntitySelector.encode = function encode(message, writer) {
            if (!writer)
                writer = $Writer.create();
            if (message.agency_id != null && Object.hasOwnProperty.call(message, "agency_id"))
                writer.uint32(/* id 1, wireType 2 =*/10).string(message.agency_id);
            if (message.route_id != null && Object.hasOwnProperty.call(message, "route_id"))
                writer.uint32(/* id 2, wireType 2 =*/18).string(message.route_id);
            if (message.route_type != null && Object.hasOwnProperty.call(message, "route_type"))
                writer.uint32(/* id 3, wireType 0 =*/24).int32(message.route_type);
            if (message.trip != null && Object.hasOwnProperty.call(message, "trip"))
                $root.transit_realtime.TripDescriptor.encode(message.trip, writer.uint32(/* id 4, wireType 2 =*/34).fork()).ldelim();
            if (message.stop_id != null && Object.hasOwnProperty.call(message, "stop_id"))
                writer.uint32(/* id 5, wireType 2 =*/42).string(message.stop_id);
            if (message.direction_id != null && Object.hasOwnProperty.call(message, "direction_id"))
                writer.uint32(/* id 6, wireType 0 =*/48).uint32(message.direction_id);
            return writer;
        };

        /**
         * Encodes the specified EntitySelector message, length delimited. Does not implicitly {@link transit_realtime.EntitySelector.verify|verify} messages.
         * @function encodeDelimited
         * @memberof transit_realtime.EntitySelector
         * @static
         * @param {transit_realtime.IEntitySelector} message EntitySelector message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        EntitySelector.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer).ldelim();
        };

        /**
         * Decodes an EntitySelector message from the specified reader or buffer.
         * @function decode
         * @memberof transit_realtime.EntitySelector
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {transit_realtime.EntitySelector} EntitySelector
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        EntitySelector.decode = function decode(reader, length, error) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.transit_realtime.EntitySelector();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.agency_id = reader.string();
                        break;
                    }
                case 2: {
                        message.route_id = reader.string();
                        break;
                    }
                case 3: {
                        message.route_type = reader.int32();
                        break;
                    }
                case 4: {
                        message.trip = $root.transit_realtime.TripDescriptor.decode(reader, reader.uint32());
                        break;
                    }
                case 5: {
                        message.stop_id = reader.string();
                        break;
                    }
                case 6: {
                        message.direction_id = reader.uint32();
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes an EntitySelector message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof transit_realtime.EntitySelector
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {transit_realtime.EntitySelector} EntitySelector
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        EntitySelector.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies an EntitySelector message.
         * @function verify
         * @memberof transit_realtime.EntitySelector
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        EntitySelector.verify = function verify(message) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.agency_id != null && message.hasOwnProperty("agency_id"))
                if (!$util.isString(message.agency_id))
                    return "agency_id: string expected";
            if (message.route_id != null && message.hasOwnProperty("route_id"))
                if (!$util.isString(message.route_id))
                    return "route_id: string expected";
            if (message.route_type != null && message.hasOwnProperty("route_type"))
                if (!$util.isInteger(message.route_type))
                    return "route_type: integer expected";
            if (message.trip != null && message.hasOwnProperty("trip")) {
                var error = $root.transit_realtime.TripDescriptor.verify(message.trip);
                if (error)
                    return "trip." + error;
            }
            if (message.stop_id != null && message.hasOwnProperty("stop_id"))
                if (!$util.isString(message.stop_id))
                    return "stop_id: string expected";
            if (message.direction_id != null && message.hasOwnProperty("direction_id"))
                if (!$util.isInteger(message.direction_id))
                    return "direction_id: integer expected";
            return null;
        };

        /**
         * Creates an EntitySelector message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof transit_realtime.EntitySelector
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {transit_realtime.EntitySelector} EntitySelector
         */
        EntitySelector.fromObject = function fromObject(object) {
            if (object instanceof $root.transit_realtime.EntitySelector)
                return object;
            var message = new $root.transit_realtime.EntitySelector();
            if (object.agency_id != null)
                message.agency_id = String(object.agency_id);
            if (object.route_id != null)
                message.route_id = String(object.route_id);
            if (object.route_type != null)
                message.route_type = object.route_type | 0;
            if (object.trip != null) {
                if (typeof object.trip !== "object")
                    throw TypeError(".transit_realtime.EntitySelector.trip: object expected");
                message.trip = $root.transit_realtime.TripDescriptor.fromObject(object.trip);
            }
            if (object.stop_id != null)
                message.stop_id = String(object.stop_id);
            if (object.direction_id != null)
                message.direction_id = object.direction_id >>> 0;
            return message;
        };

        /**
         * Creates a plain object from an EntitySelector message. Also converts values to other types if specified.
         * @function toObject
         * @memberof transit_realtime.EntitySelector
         * @static
         * @param {transit_realtime.EntitySelector} message EntitySelector
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        EntitySelector.toObject = function toObject(message, options) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults) {
                object.agency_id = "";
                object.route_id = "";
                object.route_type = 0;
                object.trip = null;
                object.stop_id = "";
                object.direction_id = 0;
            }
            if (message.agency_id != null && message.hasOwnProperty("agency_id"))
                object.agency_id = message.agency_id;
            if (message.route_id != null && message.hasOwnProperty("route_id"))
                object.route_id = message.route_id;
            if (message.route_type != null && message.hasOwnProperty("route_type"))
                object.route_type = message.route_type;
            if (message.trip != null && message.hasOwnProperty("trip"))
                object.trip = $root.transit_realtime.TripDescriptor.toObject(message.trip, options);
            if (message.stop_id != null && message.hasOwnProperty("stop_id"))
                object.stop_id = message.stop_id;
            if (message.direction_id != null && message.hasOwnProperty("direction_id"))
                object.direction_id = message.direction_id;
            return object;
        };

        /**
         * Converts this EntitySelector to JSON.
         * @function toJSON
         * @memberof transit_realtime.EntitySelector
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        EntitySelector.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for EntitySelector
         * @function getTypeUrl
         * @memberof transit_realtime.EntitySelector
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        EntitySelector.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/transit_realtime.EntitySelector";
        };

        return EntitySelector;
    })();

    transit_realtime.TranslatedString = (function() {

        /**
         * Properties of a TranslatedString.
         * @memberof transit_realtime
         * @interface ITranslatedString
         * @property {Array.<transit_realtime.TranslatedString.ITranslation>|null} [translation] TranslatedString translation
         */

        /**
         * Constructs a new TranslatedString.
         * @memberof transit_realtime
         * @classdesc Represents a TranslatedString.
         * @implements ITranslatedString
         * @constructor
         * @param {transit_realtime.ITranslatedString=} [properties] Properties to set
         */
        function TranslatedString(properties) {
            this.translation = [];
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null)
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * TranslatedString translation.
         * @member {Array.<transit_realtime.TranslatedString.ITranslation>} translation
         * @memberof transit_realtime.TranslatedString
         * @instance
         */
        TranslatedString.prototype.translation = $util.emptyArray;

        /**
         * Creates a new TranslatedString instance using the specified properties.
         * @function create
         * @memberof transit_realtime.TranslatedString
         * @static
         * @param {transit_realtime.ITranslatedString=} [properties] Properties to set
         * @returns {transit_realtime.TranslatedString} TranslatedString instance
         */
        TranslatedString.create = function create(properties) {
            return new TranslatedString(properties);
        };

        /**
         * Encodes the specified TranslatedString message. Does not implicitly {@link transit_realtime.TranslatedString.verify|verify} messages.
         * @function encode
         * @memberof transit_realtime.TranslatedString
         * @static
         * @param {transit_realtime.ITranslatedString} message TranslatedString message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        TranslatedString.encode = function encode(message, writer) {
            if (!writer)
                writer = $Writer.create();
            if (message.translation != null && message.translation.length)
                for (var i = 0; i < message.translation.length; ++i)
                    $root.transit_realtime.TranslatedString.Translation.encode(message.translation[i], writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim();
            return writer;
        };

        /**
         * Encodes the specified TranslatedString message, length delimited. Does not implicitly {@link transit_realtime.TranslatedString.verify|verify} messages.
         * @function encodeDelimited
         * @memberof transit_realtime.TranslatedString
         * @static
         * @param {transit_realtime.ITranslatedString} message TranslatedString message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        TranslatedString.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer).ldelim();
        };

        /**
         * Decodes a TranslatedString message from the specified reader or buffer.
         * @function decode
         * @memberof transit_realtime.TranslatedString
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {transit_realtime.TranslatedString} TranslatedString
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        TranslatedString.decode = function decode(reader, length, error) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.transit_realtime.TranslatedString();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        if (!(message.translation && message.translation.length))
                            message.translation = [];
                        message.translation.push($root.transit_realtime.TranslatedString.Translation.decode(reader, reader.uint32()));
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a TranslatedString message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof transit_realtime.TranslatedString
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {transit_realtime.TranslatedString} TranslatedString
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        TranslatedString.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a TranslatedString message.
         * @function verify
         * @memberof transit_realtime.TranslatedString
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        TranslatedString.verify = function verify(message) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.translation != null && message.hasOwnProperty("translation")) {
                if (!Array.isArray(message.translation))
                    return "translation: array expected";
                for (var i = 0; i < message.translation.length; ++i) {
                    var error = $root.transit_realtime.TranslatedString.Translation.verify(message.translation[i]);
                    if (error)
                        return "translation." + error;
                }
            }
            return null;
        };

        /**
         * Creates a TranslatedString message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof transit_realtime.TranslatedString
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {transit_realtime.TranslatedString} TranslatedString
         */
        TranslatedString.fromObject = function fromObject(object) {
            if (object instanceof $root.transit_realtime.TranslatedString)
                return object;
            var message = new $root.transit_realtime.TranslatedString();
            if (object.translation) {
                if (!Array.isArray(object.translation))
                    throw TypeError(".transit_realtime.TranslatedString.translation: array expected");
                message.translation = [];
                for (var i = 0; i < object.translation.length; ++i) {
                    if (typeof object.translation[i] !== "object")
                        throw TypeError(".transit_realtime.TranslatedString.translation: object expected");
                    message.translation[i] = $root.transit_realtime.TranslatedString.Translation.fromObject(object.translation[i]);
                }
            }
            return message;
        };

        /**
         * Creates a plain object from a TranslatedString message. Also converts values to other types if specified.
         * @function toObject
         * @memberof transit_realtime.TranslatedString
         * @static
         * @param {transit_realtime.TranslatedString} message TranslatedString
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        TranslatedString.toObject = function toObject(message, options) {
            if (!options)
                options = {};
            var object = {};
            if (options.arrays || options.defaults)
                object.translation = [];
            if (message.translation && message.translation.length) {
                object.translation = [];
                for (var j = 0; j < message.translation.length; ++j)
                    object.translation[j] = $root.transit_realtime.TranslatedString.Translation.toObject(message.translation[j], options);
            }
            return object;
        };

        /**
         * Converts this TranslatedString to JSON.
         * @function toJSON
         * @memberof transit_realtime.TranslatedString
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        TranslatedString.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for TranslatedString
         * @function getTypeUrl
         * @memberof transit_realtime.TranslatedString
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        TranslatedString.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/transit_realtime.TranslatedString";
        };

        TranslatedString.Translation = (function() {

            /**
             * Properties of a Translation.
             * @memberof transit_realtime.TranslatedString
             * @interface ITranslation
             * @property {string} text Translation text
             * @property {string|null} [language] Translation language
             */

            /**
             * Constructs a new Translation.
             * @memberof transit_realtime.TranslatedString
             * @classdesc Represents a Translation.
             * @implements ITranslation
             * @constructor
             * @param {transit_realtime.TranslatedString.ITranslation=} [properties] Properties to set
             */
            function Translation(properties) {
                if (properties)
                    for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                        if (properties[keys[i]] != null)
                            this[keys[i]] = properties[keys[i]];
            }

            /**
             * Translation text.
             * @member {string} text
             * @memberof transit_realtime.TranslatedString.Translation
             * @instance
             */
            Translation.prototype.text = "";

            /**
             * Translation language.
             * @member {string} language
             * @memberof transit_realtime.TranslatedString.Translation
             * @instance
             */
            Translation.prototype.language = "";

            /**
             * Creates a new Translation instance using the specified properties.
             * @function create
             * @memberof transit_realtime.TranslatedString.Translation
             * @static
             * @param {transit_realtime.TranslatedString.ITranslation=} [properties] Properties to set
             * @returns {transit_realtime.TranslatedString.Translation} Translation instance
             */
            Translation.create = function create(properties) {
                return new Translation(properties);
            };

            /**
             * Encodes the specified Translation message. Does not implicitly {@link transit_realtime.TranslatedString.Translation.verify|verify} messages.
             * @function encode
             * @memberof transit_realtime.TranslatedString.Translation
             * @static
             * @param {transit_realtime.TranslatedString.ITranslation} message Translation message or plain object to encode
             * @param {$protobuf.Writer} [writer] Writer to encode to
             * @returns {$protobuf.Writer} Writer
             */
            Translation.encode = function encode(message, writer) {
                if (!writer)
                    writer = $Writer.create();
                writer.uint32(/* id 1, wireType 2 =*/10).string(message.text);
                if (message.language != null && Object.hasOwnProperty.call(message, "language"))
                    writer.uint32(/* id 2, wireType 2 =*/18).string(message.language);
                return writer;
            };

            /**
             * Encodes the specified Translation message, length delimited. Does not implicitly {@link transit_realtime.TranslatedString.Translation.verify|verify} messages.
             * @function encodeDelimited
             * @memberof transit_realtime.TranslatedString.Translation
             * @static
             * @param {transit_realtime.TranslatedString.ITranslation} message Translation message or plain object to encode
             * @param {$protobuf.Writer} [writer] Writer to encode to
             * @returns {$protobuf.Writer} Writer
             */
            Translation.encodeDelimited = function encodeDelimited(message, writer) {
                return this.encode(message, writer).ldelim();
            };

            /**
             * Decodes a Translation message from the specified reader or buffer.
             * @function decode
             * @memberof transit_realtime.TranslatedString.Translation
             * @static
             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
             * @param {number} [length] Message length if known beforehand
             * @returns {transit_realtime.TranslatedString.Translation} Translation
             * @throws {Error} If the payload is not a reader or valid buffer
             * @throws {$protobuf.util.ProtocolError} If required fields are missing
             */
            Translation.decode = function decode(reader, length, error) {
                if (!(reader instanceof $Reader))
                    reader = $Reader.create(reader);
                var end = length === undefined ? reader.len : reader.pos + length, message = new $root.transit_realtime.TranslatedString.Translation();
                while (reader.pos < end) {
                    var tag = reader.uint32();
                    if (tag === error)
                        break;
                    switch (tag >>> 3) {
                    case 1: {
                            message.text = reader.string();
                            break;
                        }
                    case 2: {
                            message.language = reader.string();
                            break;
                        }
                    default:
                        reader.skipType(tag & 7);
                        break;
                    }
                }
                if (!message.hasOwnProperty("text"))
                    throw $util.ProtocolError("missing required 'text'", { instance: message });
                return message;
            };

            /**
             * Decodes a Translation message from the specified reader or buffer, length delimited.
             * @function decodeDelimited
             * @memberof transit_realtime.TranslatedString.Translation
             * @static
             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
             * @returns {transit_realtime.TranslatedString.Translation} Translation
             * @throws {Error} If the payload is not a reader or valid buffer
             * @throws {$protobuf.util.ProtocolError} If required fields are missing
             */
            Translation.decodeDelimited = function decodeDelimited(reader) {
                if (!(reader instanceof $Reader))
                    reader = new $Reader(reader);
                return this.decode(reader, reader.uint32());
            };

            /**
             * Verifies a Translation message.
             * @function verify
             * @memberof transit_realtime.TranslatedString.Translation
             * @static
             * @param {Object.<string,*>} message Plain object to verify
             * @returns {string|null} `null` if valid, otherwise the reason why it is not
             */
            Translation.verify = function verify(message) {
                if (typeof message !== "object" || message === null)
                    return "object expected";
                if (!$util.isString(message.text))
                    return "text: string expected";
                if (message.language != null && message.hasOwnProperty("language"))
                    if (!$util.isString(message.language))
                        return "language: string expected";
                return null;
            };

            /**
             * Creates a Translation message from a plain object. Also converts values to their respective internal types.
             * @function fromObject
             * @memberof transit_realtime.TranslatedString.Translation
             * @static
             * @param {Object.<string,*>} object Plain object
             * @returns {transit_realtime.TranslatedString.Translation} Translation
             */
            Translation.fromObject = function fromObject(object) {
                if (object instanceof $root.transit_realtime.TranslatedString.Translation)
                    return object;
                var message = new $root.transit_realtime.TranslatedString.Translation();
                if (object.text != null)
                    message.text = String(object.text);
                if (object.language != null)
                    message.language = String(object.language);
                return message;
            };

            /**
             * Creates a plain object from a Translation message. Also converts values to other types if specified.
             * @function toObject
             * @memberof transit_realtime.TranslatedString.Translation
             * @static
             * @param {transit_realtime.TranslatedString.Translation} message Translation
             * @param {$protobuf.IConversionOptions} [options] Conversion options
             * @returns {Object.<string,*>} Plain object
             */
            Translation.toObject = function toObject(message, options) {
                if (!options)
                    options = {};
                var object = {};
                if (options.defaults) {
                    object.text = "";
                    object.language = "";
                }
                if (message.text != null && message.hasOwnProperty("text"))
                    object.text = message.text;
                if (message.language != null && message.hasOwnProperty("language"))
                    object.language = message.language;
                return object;
            };

            /**
             * Converts this Translation to JSON.
             * @function toJSON
             * @memberof transit_realtime.TranslatedString.Translation
             * @instance
             * @returns {Object.<string,*>} JSON object
             */
            Translation.prototype.toJSON = function toJSON() {
                return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
            };

            /**
             * Gets the default type url for Translation
             * @function getTypeUrl
             * @memberof transit_realtime.TranslatedString.Translation
             * @static
             * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
             * @returns {string} The default type url
             */
            Translation.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                if (typeUrlPrefix === undefined) {
                    typeUrlPrefix = "type.googleapis.com";
                }
                return typeUrlPrefix + "/transit_realtime.TranslatedString.Translation";
            };

            return Translation;
        })();

        return TranslatedString;
    })();

    transit_realtime.TranslatedImage = (function() {

        /**
         * Properties of a TranslatedImage.
         * @memberof transit_realtime
         * @interface ITranslatedImage
         * @property {Array.<transit_realtime.TranslatedImage.ILocalizedImage>|null} [localized_image] TranslatedImage localized_image
         */

        /**
         * Constructs a new TranslatedImage.
         * @memberof transit_realtime
         * @classdesc Represents a TranslatedImage.
         * @implements ITranslatedImage
         * @constructor
         * @param {transit_realtime.ITranslatedImage=} [properties] Properties to set
         */
        function TranslatedImage(properties) {
            this.localized_image = [];
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null)
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * TranslatedImage localized_image.
         * @member {Array.<transit_realtime.TranslatedImage.ILocalizedImage>} localized_image
         * @memberof transit_realtime.TranslatedImage
         * @instance
         */
        TranslatedImage.prototype.localized_image = $util.emptyArray;

        /**
         * Creates a new TranslatedImage instance using the specified properties.
         * @function create
         * @memberof transit_realtime.TranslatedImage
         * @static
         * @param {transit_realtime.ITranslatedImage=} [properties] Properties to set
         * @returns {transit_realtime.TranslatedImage} TranslatedImage instance
         */
        TranslatedImage.create = function create(properties) {
            return new TranslatedImage(properties);
        };

        /**
         * Encodes the specified TranslatedImage message. Does not implicitly {@link transit_realtime.TranslatedImage.verify|verify} messages.
         * @function encode
         * @memberof transit_realtime.TranslatedImage
         * @static
         * @param {transit_realtime.ITranslatedImage} message TranslatedImage message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        TranslatedImage.encode = function encode(message, writer) {
            if (!writer)
                writer = $Writer.create();
            if (message.localized_image != null && message.localized_image.length)
                for (var i = 0; i < message.localized_image.length; ++i)
                    $root.transit_realtime.TranslatedImage.LocalizedImage.encode(message.localized_image[i], writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim();
            return writer;
        };

        /**
         * Encodes the specified TranslatedImage message, length delimited. Does not implicitly {@link transit_realtime.TranslatedImage.verify|verify} messages.
         * @function encodeDelimited
         * @memberof transit_realtime.TranslatedImage
         * @static
         * @param {transit_realtime.ITranslatedImage} message TranslatedImage message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        TranslatedImage.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer).ldelim();
        };

        /**
         * Decodes a TranslatedImage message from the specified reader or buffer.
         * @function decode
         * @memberof transit_realtime.TranslatedImage
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {transit_realtime.TranslatedImage} TranslatedImage
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        TranslatedImage.decode = function decode(reader, length, error) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.transit_realtime.TranslatedImage();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        if (!(message.localized_image && message.localized_image.length))
                            message.localized_image = [];
                        message.localized_image.push($root.transit_realtime.TranslatedImage.LocalizedImage.decode(reader, reader.uint32()));
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a TranslatedImage message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof transit_realtime.TranslatedImage
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {transit_realtime.TranslatedImage} TranslatedImage
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        TranslatedImage.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a TranslatedImage message.
         * @function verify
         * @memberof transit_realtime.TranslatedImage
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        TranslatedImage.verify = function verify(message) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.localized_image != null && message.hasOwnProperty("localized_image")) {
                if (!Array.isArray(message.localized_image))
                    return "localized_image: array expected";
                for (var i = 0; i < message.localized_image.length; ++i) {
                    var error = $root.transit_realtime.TranslatedImage.LocalizedImage.verify(message.localized_image[i]);
                    if (error)
                        return "localized_image." + error;
                }
            }
            return null;
        };

        /**
         * Creates a TranslatedImage message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof transit_realtime.TranslatedImage
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {transit_realtime.TranslatedImage} TranslatedImage
         */
        TranslatedImage.fromObject = function fromObject(object) {
            if (object instanceof $root.transit_realtime.TranslatedImage)
                return object;
            var message = new $root.transit_realtime.TranslatedImage();
            if (object.localized_image) {
                if (!Array.isArray(object.localized_image))
                    throw TypeError(".transit_realtime.TranslatedImage.localized_image: array expected");
                message.localized_image = [];
                for (var i = 0; i < object.localized_image.length; ++i) {
                    if (typeof object.localized_image[i] !== "object")
                        throw TypeError(".transit_realtime.TranslatedImage.localized_image: object expected");
                    message.localized_image[i] = $root.transit_realtime.TranslatedImage.LocalizedImage.fromObject(object.localized_image[i]);
                }
            }
            return message;
        };

        /**
         * Creates a plain object from a TranslatedImage message. Also converts values to other types if specified.
         * @function toObject
         * @memberof transit_realtime.TranslatedImage
         * @static
         * @param {transit_realtime.TranslatedImage} message TranslatedImage
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        TranslatedImage.toObject = function toObject(message, options) {
            if (!options)
                options = {};
            var object = {};
            if (options.arrays || options.defaults)
                object.localized_image = [];
            if (message.localized_image && message.localized_image.length) {
                object.localized_image = [];
                for (var j = 0; j < message.localized_image.length; ++j)
                    object.localized_image[j] = $root.transit_realtime.TranslatedImage.LocalizedImage.toObject(message.localized_image[j], options);
            }
            return object;
        };

        /**
         * Converts this TranslatedImage to JSON.
         * @function toJSON
         * @memberof transit_realtime.TranslatedImage
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        TranslatedImage.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for TranslatedImage
         * @function getTypeUrl
         * @memberof transit_realtime.TranslatedImage
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        TranslatedImage.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/transit_realtime.TranslatedImage";
        };

        TranslatedImage.LocalizedImage = (function() {

            /**
             * Properties of a LocalizedImage.
             * @memberof transit_realtime.TranslatedImage
             * @interface ILocalizedImage
             * @property {string} url LocalizedImage url
             * @property {string} media_type LocalizedImage media_type
             * @property {string|null} [language] LocalizedImage language
             */

            /**
             * Constructs a new LocalizedImage.
             * @memberof transit_realtime.TranslatedImage
             * @classdesc Represents a LocalizedImage.
             * @implements ILocalizedImage
             * @constructor
             * @param {transit_realtime.TranslatedImage.ILocalizedImage=} [properties] Properties to set
             */
            function LocalizedImage(properties) {
                if (properties)
                    for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                        if (properties[keys[i]] != null)
                            this[keys[i]] = properties[keys[i]];
            }

            /**
             * LocalizedImage url.
             * @member {string} url
             * @memberof transit_realtime.TranslatedImage.LocalizedImage
             * @instance
             */
            LocalizedImage.prototype.url = "";

            /**
             * LocalizedImage media_type.
             * @member {string} media_type
             * @memberof transit_realtime.TranslatedImage.LocalizedImage
             * @instance
             */
            LocalizedImage.prototype.media_type = "";

            /**
             * LocalizedImage language.
             * @member {string} language
             * @memberof transit_realtime.TranslatedImage.LocalizedImage
             * @instance
             */
            LocalizedImage.prototype.language = "";

            /**
             * Creates a new LocalizedImage instance using the specified properties.
             * @function create
             * @memberof transit_realtime.TranslatedImage.LocalizedImage
             * @static
             * @param {transit_realtime.TranslatedImage.ILocalizedImage=} [properties] Properties to set
             * @returns {transit_realtime.TranslatedImage.LocalizedImage} LocalizedImage instance
             */
            LocalizedImage.create = function create(properties) {
                return new LocalizedImage(properties);
            };

            /**
             * Encodes the specified LocalizedImage message. Does not implicitly {@link transit_realtime.TranslatedImage.LocalizedImage.verify|verify} messages.
             * @function encode
             * @memberof transit_realtime.TranslatedImage.LocalizedImage
             * @static
             * @param {transit_realtime.TranslatedImage.ILocalizedImage} message LocalizedImage message or plain object to encode
             * @param {$protobuf.Writer} [writer] Writer to encode to
             * @returns {$protobuf.Writer} Writer
             */
            LocalizedImage.encode = function encode(message, writer) {
                if (!writer)
                    writer = $Writer.create();
                writer.uint32(/* id 1, wireType 2 =*/10).string(message.url);
                writer.uint32(/* id 2, wireType 2 =*/18).string(message.media_type);
                if (message.language != null && Object.hasOwnProperty.call(message, "language"))
                    writer.uint32(/* id 3, wireType 2 =*/26).string(message.language);
                return writer;
            };

            /**
             * Encodes the specified LocalizedImage message, length delimited. Does not implicitly {@link transit_realtime.TranslatedImage.LocalizedImage.verify|verify} messages.
             * @function encodeDelimited
             * @memberof transit_realtime.TranslatedImage.LocalizedImage
             * @static
             * @param {transit_realtime.TranslatedImage.ILocalizedImage} message LocalizedImage message or plain object to encode
             * @param {$protobuf.Writer} [writer] Writer to encode to
             * @returns {$protobuf.Writer} Writer
             */
            LocalizedImage.encodeDelimited = function encodeDelimited(message, writer) {
                return this.encode(message, writer).ldelim();
            };

            /**
             * Decodes a LocalizedImage message from the specified reader or buffer.
             * @function decode
             * @memberof transit_realtime.TranslatedImage.LocalizedImage
             * @static
             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
             * @param {number} [length] Message length if known beforehand
             * @returns {transit_realtime.TranslatedImage.LocalizedImage} LocalizedImage
             * @throws {Error} If the payload is not a reader or valid buffer
             * @throws {$protobuf.util.ProtocolError} If required fields are missing
             */
            LocalizedImage.decode = function decode(reader, length, error) {
                if (!(reader instanceof $Reader))
                    reader = $Reader.create(reader);
                var end = length === undefined ? reader.len : reader.pos + length, message = new $root.transit_realtime.TranslatedImage.LocalizedImage();
                while (reader.pos < end) {
                    var tag = reader.uint32();
                    if (tag === error)
                        break;
                    switch (tag >>> 3) {
                    case 1: {
                            message.url = reader.string();
                            break;
                        }
                    case 2: {
                            message.media_type = reader.string();
                            break;
                        }
                    case 3: {
                            message.language = reader.string();
                            break;
                        }
                    default:
                        reader.skipType(tag & 7);
                        break;
                    }
                }
                if (!message.hasOwnProperty("url"))
                    throw $util.ProtocolError("missing required 'url'", { instance: message });
                if (!message.hasOwnProperty("media_type"))
                    throw $util.ProtocolError("missing required 'media_type'", { instance: message });
                return message;
            };

            /**
             * Decodes a LocalizedImage message from the specified reader or buffer, length delimited.
             * @function decodeDelimited
             * @memberof transit_realtime.TranslatedImage.LocalizedImage
             * @static
             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
             * @returns {transit_realtime.TranslatedImage.LocalizedImage} LocalizedImage
             * @throws {Error} If the payload is not a reader or valid buffer
             * @throws {$protobuf.util.ProtocolError} If required fields are missing
             */
            LocalizedImage.decodeDelimited = function decodeDelimited(reader) {
                if (!(reader instanceof $Reader))
                    reader = new $Reader(reader);
                return this.decode(reader, reader.uint32());
            };

            /**
             * Verifies a LocalizedImage message.
             * @function verify
             * @memberof transit_realtime.TranslatedImage.LocalizedImage
             * @static
             * @param {Object.<string,*>} message Plain object to verify
             * @returns {string|null} `null` if valid, otherwise the reason why it is not
             */
            LocalizedImage.verify = function verify(message) {
                if (typeof message !== "object" || message === null)
                    return "object expected";
                if (!$util.isString(message.url))
                    return "url: string expected";
                if (!$util.isString(message.media_type))
                    return "media_type: string expected";
                if (message.language != null && message.hasOwnProperty("language"))
                    if (!$util.isString(message.language))
                        return "language: string expected";
                return null;
            };

            /**
             * Creates a LocalizedImage message from a plain object. Also converts values to their respective internal types.
             * @function fromObject
             * @memberof transit_realtime.TranslatedImage.LocalizedImage
             * @static
             * @param {Object.<string,*>} object Plain object
             * @returns {transit_realtime.TranslatedImage.LocalizedImage} LocalizedImage
             */
            LocalizedImage.fromObject = function fromObject(object) {
                if (object instanceof $root.transit_realtime.TranslatedImage.LocalizedImage)
                    return object;
                var message = new $root.transit_realtime.TranslatedImage.LocalizedImage();
                if (object.url != null)
                    message.url = String(object.url);
                if (object.media_type != null)
                    message.media_type = String(object.media_type);
                if (object.language != null)
                    message.language = String(object.language);
                return message;
            };

            /**
             * Creates a plain object from a LocalizedImage message. Also converts values to other types if specified.
             * @function toObject
             * @memberof transit_realtime.TranslatedImage.LocalizedImage
             * @static
             * @param {transit_realtime.TranslatedImage.LocalizedImage} message LocalizedImage
             * @param {$protobuf.IConversionOptions} [options] Conversion options
             * @returns {Object.<string,*>} Plain object
             */
            LocalizedImage.toObject = function toObject(message, options) {
                if (!options)
                    options = {};
                var object = {};
                if (options.defaults) {
                    object.url = "";
                    object.media_type = "";
                    object.language = "";
                }
                if (message.url != null && message.hasOwnProperty("url"))
                    object.url = message.url;
                if (message.media_type != null && message.hasOwnProperty("media_type"))
                    object.media_type = message.media_type;
                if (message.language != null && message.hasOwnProperty("language"))
                    object.language = message.language;
                return object;
            };

            /**
             * Converts this LocalizedImage to JSON.
             * @function toJSON
             * @memberof transit_realtime.TranslatedImage.LocalizedImage
             * @instance
             * @returns {Object.<string,*>} JSON object
             */
            LocalizedImage.prototype.toJSON = function toJSON() {
                return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
            };

            /**
             * Gets the default type url for LocalizedImage
             * @function getTypeUrl
             * @memberof transit_realtime.TranslatedImage.LocalizedImage
             * @static
             * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
             * @returns {string} The default type url
             */
            LocalizedImage.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                if (typeUrlPrefix === undefined) {
                    typeUrlPrefix = "type.googleapis.com";
                }
                return typeUrlPrefix + "/transit_realtime.TranslatedImage.LocalizedImage";
            };

            return LocalizedImage;
        })();

        return TranslatedImage;
    })();

    transit_realtime.Shape = (function() {

        /**
         * Properties of a Shape.
         * @memberof transit_realtime
         * @interface IShape
         * @property {string|null} [shape_id] Shape shape_id
         * @property {string|null} [encoded_polyline] Shape encoded_polyline
         */

        /**
         * Constructs a new Shape.
         * @memberof transit_realtime
         * @classdesc Represents a Shape.
         * @implements IShape
         * @constructor
         * @param {transit_realtime.IShape=} [properties] Properties to set
         */
        function Shape(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null)
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * Shape shape_id.
         * @member {string} shape_id
         * @memberof transit_realtime.Shape
         * @instance
         */
        Shape.prototype.shape_id = "";

        /**
         * Shape encoded_polyline.
         * @member {string} encoded_polyline
         * @memberof transit_realtime.Shape
         * @instance
         */
        Shape.prototype.encoded_polyline = "";

        /**
         * Creates a new Shape instance using the specified properties.
         * @function create
         * @memberof transit_realtime.Shape
         * @static
         * @param {transit_realtime.IShape=} [properties] Properties to set
         * @returns {transit_realtime.Shape} Shape instance
         */
        Shape.create = function create(properties) {
            return new Shape(properties);
        };

        /**
         * Encodes the specified Shape message. Does not implicitly {@link transit_realtime.Shape.verify|verify} messages.
         * @function encode
         * @memberof transit_realtime.Shape
         * @static
         * @param {transit_realtime.IShape} message Shape message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        Shape.encode = function encode(message, writer) {
            if (!writer)
                writer = $Writer.create();
            if (message.shape_id != null && Object.hasOwnProperty.call(message, "shape_id"))
                writer.uint32(/* id 1, wireType 2 =*/10).string(message.shape_id);
            if (message.encoded_polyline != null && Object.hasOwnProperty.call(message, "encoded_polyline"))
                writer.uint32(/* id 2, wireType 2 =*/18).string(message.encoded_polyline);
            return writer;
        };

        /**
         * Encodes the specified Shape message, length delimited. Does not implicitly {@link transit_realtime.Shape.verify|verify} messages.
         * @function encodeDelimited
         * @memberof transit_realtime.Shape
         * @static
         * @param {transit_realtime.IShape} message Shape message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        Shape.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer).ldelim();
        };

        /**
         * Decodes a Shape message from the specified reader or buffer.
         * @function decode
         * @memberof transit_realtime.Shape
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {transit_realtime.Shape} Shape
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        Shape.decode = function decode(reader, length, error) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.transit_realtime.Shape();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.shape_id = reader.string();
                        break;
                    }
                case 2: {
                        message.encoded_polyline = reader.string();
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a Shape message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof transit_realtime.Shape
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {transit_realtime.Shape} Shape
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        Shape.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a Shape message.
         * @function verify
         * @memberof transit_realtime.Shape
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        Shape.verify = function verify(message) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.shape_id != null && message.hasOwnProperty("shape_id"))
                if (!$util.isString(message.shape_id))
                    return "shape_id: string expected";
            if (message.encoded_polyline != null && message.hasOwnProperty("encoded_polyline"))
                if (!$util.isString(message.encoded_polyline))
                    return "encoded_polyline: string expected";
            return null;
        };

        /**
         * Creates a Shape message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof transit_realtime.Shape
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {transit_realtime.Shape} Shape
         */
        Shape.fromObject = function fromObject(object) {
            if (object instanceof $root.transit_realtime.Shape)
                return object;
            var message = new $root.transit_realtime.Shape();
            if (object.shape_id != null)
                message.shape_id = String(object.shape_id);
            if (object.encoded_polyline != null)
                message.encoded_polyline = String(object.encoded_polyline);
            return message;
        };

        /**
         * Creates a plain object from a Shape message. Also converts values to other types if specified.
         * @function toObject
         * @memberof transit_realtime.Shape
         * @static
         * @param {transit_realtime.Shape} message Shape
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        Shape.toObject = function toObject(message, options) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults) {
                object.shape_id = "";
                object.encoded_polyline = "";
            }
            if (message.shape_id != null && message.hasOwnProperty("shape_id"))
                object.shape_id = message.shape_id;
            if (message.encoded_polyline != null && message.hasOwnProperty("encoded_polyline"))
                object.encoded_polyline = message.encoded_polyline;
            return object;
        };

        /**
         * Converts this Shape to JSON.
         * @function toJSON
         * @memberof transit_realtime.Shape
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        Shape.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for Shape
         * @function getTypeUrl
         * @memberof transit_realtime.Shape
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        Shape.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/transit_realtime.Shape";
        };

        return Shape;
    })();

    transit_realtime.Stop = (function() {

        /**
         * Properties of a Stop.
         * @memberof transit_realtime
         * @interface IStop
         * @property {string|null} [stop_id] Stop stop_id
         * @property {transit_realtime.ITranslatedString|null} [stop_code] Stop stop_code
         * @property {transit_realtime.ITranslatedString|null} [stop_name] Stop stop_name
         * @property {transit_realtime.ITranslatedString|null} [tts_stop_name] Stop tts_stop_name
         * @property {transit_realtime.ITranslatedString|null} [stop_desc] Stop stop_desc
         * @property {number|null} [stop_lat] Stop stop_lat
         * @property {number|null} [stop_lon] Stop stop_lon
         * @property {string|null} [zone_id] Stop zone_id
         * @property {transit_realtime.ITranslatedString|null} [stop_url] Stop stop_url
         * @property {string|null} [parent_station] Stop parent_station
         * @property {string|null} [stop_timezone] Stop stop_timezone
         * @property {transit_realtime.Stop.WheelchairBoarding|null} [wheelchair_boarding] Stop wheelchair_boarding
         * @property {string|null} [level_id] Stop level_id
         * @property {transit_realtime.ITranslatedString|null} [platform_code] Stop platform_code
         */

        /**
         * Constructs a new Stop.
         * @memberof transit_realtime
         * @classdesc Represents a Stop.
         * @implements IStop
         * @constructor
         * @param {transit_realtime.IStop=} [properties] Properties to set
         */
        function Stop(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null)
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * Stop stop_id.
         * @member {string} stop_id
         * @memberof transit_realtime.Stop
         * @instance
         */
        Stop.prototype.stop_id = "";

        /**
         * Stop stop_code.
         * @member {transit_realtime.ITranslatedString|null|undefined} stop_code
         * @memberof transit_realtime.Stop
         * @instance
         */
        Stop.prototype.stop_code = null;

        /**
         * Stop stop_name.
         * @member {transit_realtime.ITranslatedString|null|undefined} stop_name
         * @memberof transit_realtime.Stop
         * @instance
         */
        Stop.prototype.stop_name = null;

        /**
         * Stop tts_stop_name.
         * @member {transit_realtime.ITranslatedString|null|undefined} tts_stop_name
         * @memberof transit_realtime.Stop
         * @instance
         */
        Stop.prototype.tts_stop_name = null;

        /**
         * Stop stop_desc.
         * @member {transit_realtime.ITranslatedString|null|undefined} stop_desc
         * @memberof transit_realtime.Stop
         * @instance
         */
        Stop.prototype.stop_desc = null;

        /**
         * Stop stop_lat.
         * @member {number} stop_lat
         * @memberof transit_realtime.Stop
         * @instance
         */
        Stop.prototype.stop_lat = 0;

        /**
         * Stop stop_lon.
         * @member {number} stop_lon
         * @memberof transit_realtime.Stop
         * @instance
         */
        Stop.prototype.stop_lon = 0;

        /**
         * Stop zone_id.
         * @member {string} zone_id
         * @memberof transit_realtime.Stop
         * @instance
         */
        Stop.prototype.zone_id = "";

        /**
         * Stop stop_url.
         * @member {transit_realtime.ITranslatedString|null|undefined} stop_url
         * @memberof transit_realtime.Stop
         * @instance
         */
        Stop.prototype.stop_url = null;

        /**
         * Stop parent_station.
         * @member {string} parent_station
         * @memberof transit_realtime.Stop
         * @instance
         */
        Stop.prototype.parent_station = "";

        /**
         * Stop stop_timezone.
         * @member {string} stop_timezone
         * @memberof transit_realtime.Stop
         * @instance
         */
        Stop.prototype.stop_timezone = "";

        /**
         * Stop wheelchair_boarding.
         * @member {transit_realtime.Stop.WheelchairBoarding} wheelchair_boarding
         * @memberof transit_realtime.Stop
         * @instance
         */
        Stop.prototype.wheelchair_boarding = 0;

        /**
         * Stop level_id.
         * @member {string} level_id
         * @memberof transit_realtime.Stop
         * @instance
         */
        Stop.prototype.level_id = "";

        /**
         * Stop platform_code.
         * @member {transit_realtime.ITranslatedString|null|undefined} platform_code
         * @memberof transit_realtime.Stop
         * @instance
         */
        Stop.prototype.platform_code = null;

        /**
         * Creates a new Stop instance using the specified properties.
         * @function create
         * @memberof transit_realtime.Stop
         * @static
         * @param {transit_realtime.IStop=} [properties] Properties to set
         * @returns {transit_realtime.Stop} Stop instance
         */
        Stop.create = function create(properties) {
            return new Stop(properties);
        };

        /**
         * Encodes the specified Stop message. Does not implicitly {@link transit_realtime.Stop.verify|verify} messages.
         * @function encode
         * @memberof transit_realtime.Stop
         * @static
         * @param {transit_realtime.IStop} message Stop message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        Stop.encode = function encode(message, writer) {
            if (!writer)
                writer = $Writer.create();
            if (message.stop_id != null && Object.hasOwnProperty.call(message, "stop_id"))
                writer.uint32(/* id 1, wireType 2 =*/10).string(message.stop_id);
            if (message.stop_code != null && Object.hasOwnProperty.call(message, "stop_code"))
                $root.transit_realtime.TranslatedString.encode(message.stop_code, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim();
            if (message.stop_name != null && Object.hasOwnProperty.call(message, "stop_name"))
                $root.transit_realtime.TranslatedString.encode(message.stop_name, writer.uint32(/* id 3, wireType 2 =*/26).fork()).ldelim();
            if (message.tts_stop_name != null && Object.hasOwnProperty.call(message, "tts_stop_name"))
                $root.transit_realtime.TranslatedString.encode(message.tts_stop_name, writer.uint32(/* id 4, wireType 2 =*/34).fork()).ldelim();
            if (message.stop_desc != null && Object.hasOwnProperty.call(message, "stop_desc"))
                $root.transit_realtime.TranslatedString.encode(message.stop_desc, writer.uint32(/* id 5, wireType 2 =*/42).fork()).ldelim();
            if (message.stop_lat != null && Object.hasOwnProperty.call(message, "stop_lat"))
                writer.uint32(/* id 6, wireType 5 =*/53).float(message.stop_lat);
            if (message.stop_lon != null && Object.hasOwnProperty.call(message, "stop_lon"))
                writer.uint32(/* id 7, wireType 5 =*/61).float(message.stop_lon);
            if (message.zone_id != null && Object.hasOwnProperty.call(message, "zone_id"))
                writer.uint32(/* id 8, wireType 2 =*/66).string(message.zone_id);
            if (message.stop_url != null && Object.hasOwnProperty.call(message, "stop_url"))
                $root.transit_realtime.TranslatedString.encode(message.stop_url, writer.uint32(/* id 9, wireType 2 =*/74).fork()).ldelim();
            if (message.parent_station != null && Object.hasOwnProperty.call(message, "parent_station"))
                writer.uint32(/* id 11, wireType 2 =*/90).string(message.parent_station);
            if (message.stop_timezone != null && Object.hasOwnProperty.call(message, "stop_timezone"))
                writer.uint32(/* id 12, wireType 2 =*/98).string(message.stop_timezone);
            if (message.wheelchair_boarding != null && Object.hasOwnProperty.call(message, "wheelchair_boarding"))
                writer.uint32(/* id 13, wireType 0 =*/104).int32(message.wheelchair_boarding);
            if (message.level_id != null && Object.hasOwnProperty.call(message, "level_id"))
                writer.uint32(/* id 14, wireType 2 =*/114).string(message.level_id);
            if (message.platform_code != null && Object.hasOwnProperty.call(message, "platform_code"))
                $root.transit_realtime.TranslatedString.encode(message.platform_code, writer.uint32(/* id 15, wireType 2 =*/122).fork()).ldelim();
            return writer;
        };

        /**
         * Encodes the specified Stop message, length delimited. Does not implicitly {@link transit_realtime.Stop.verify|verify} messages.
         * @function encodeDelimited
         * @memberof transit_realtime.Stop
         * @static
         * @param {transit_realtime.IStop} message Stop message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        Stop.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer).ldelim();
        };

        /**
         * Decodes a Stop message from the specified reader or buffer.
         * @function decode
         * @memberof transit_realtime.Stop
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {transit_realtime.Stop} Stop
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        Stop.decode = function decode(reader, length, error) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.transit_realtime.Stop();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.stop_id = reader.string();
                        break;
                    }
                case 2: {
                        message.stop_code = $root.transit_realtime.TranslatedString.decode(reader, reader.uint32());
                        break;
                    }
                case 3: {
                        message.stop_name = $root.transit_realtime.TranslatedString.decode(reader, reader.uint32());
                        break;
                    }
                case 4: {
                        message.tts_stop_name = $root.transit_realtime.TranslatedString.decode(reader, reader.uint32());
                        break;
                    }
                case 5: {
                        message.stop_desc = $root.transit_realtime.TranslatedString.decode(reader, reader.uint32());
                        break;
                    }
                case 6: {
                        message.stop_lat = reader.float();
                        break;
                    }
                case 7: {
                        message.stop_lon = reader.float();
                        break;
                    }
                case 8: {
                        message.zone_id = reader.string();
                        break;
                    }
                case 9: {
                        message.stop_url = $root.transit_realtime.TranslatedString.decode(reader, reader.uint32());
                        break;
                    }
                case 11: {
                        message.parent_station = reader.string();
                        break;
                    }
                case 12: {
                        message.stop_timezone = reader.string();
                        break;
                    }
                case 13: {
                        message.wheelchair_boarding = reader.int32();
                        break;
                    }
                case 14: {
                        message.level_id = reader.string();
                        break;
                    }
                case 15: {
                        message.platform_code = $root.transit_realtime.TranslatedString.decode(reader, reader.uint32());
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a Stop message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof transit_realtime.Stop
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {transit_realtime.Stop} Stop
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        Stop.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a Stop message.
         * @function verify
         * @memberof transit_realtime.Stop
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        Stop.verify = function verify(message) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.stop_id != null && message.hasOwnProperty("stop_id"))
                if (!$util.isString(message.stop_id))
                    return "stop_id: string expected";
            if (message.stop_code != null && message.hasOwnProperty("stop_code")) {
                var error = $root.transit_realtime.TranslatedString.verify(message.stop_code);
                if (error)
                    return "stop_code." + error;
            }
            if (message.stop_name != null && message.hasOwnProperty("stop_name")) {
                var error = $root.transit_realtime.TranslatedString.verify(message.stop_name);
                if (error)
                    return "stop_name." + error;
            }
            if (message.tts_stop_name != null && message.hasOwnProperty("tts_stop_name")) {
                var error = $root.transit_realtime.TranslatedString.verify(message.tts_stop_name);
                if (error)
                    return "tts_stop_name." + error;
            }
            if (message.stop_desc != null && message.hasOwnProperty("stop_desc")) {
                var error = $root.transit_realtime.TranslatedString.verify(message.stop_desc);
                if (error)
                    return "stop_desc." + error;
            }
            if (message.stop_lat != null && message.hasOwnProperty("stop_lat"))
                if (typeof message.stop_lat !== "number")
                    return "stop_lat: number expected";
            if (message.stop_lon != null && message.hasOwnProperty("stop_lon"))
                if (typeof message.stop_lon !== "number")
                    return "stop_lon: number expected";
            if (message.zone_id != null && message.hasOwnProperty("zone_id"))
                if (!$util.isString(message.zone_id))
                    return "zone_id: string expected";
            if (message.stop_url != null && message.hasOwnProperty("stop_url")) {
                var error = $root.transit_realtime.TranslatedString.verify(message.stop_url);
                if (error)
                    return "stop_url." + error;
            }
            if (message.parent_station != null && message.hasOwnProperty("parent_station"))
                if (!$util.isString(message.parent_station))
                    return "parent_station: string expected";
            if (message.stop_timezone != null && message.hasOwnProperty("stop_timezone"))
                if (!$util.isString(message.stop_timezone))
                    return "stop_timezone: string expected";
            if (message.wheelchair_boarding != null && message.hasOwnProperty("wheelchair_boarding"))
                switch (message.wheelchair_boarding) {
                default:
                    return "wheelchair_boarding: enum value expected";
                case 0:
                case 1:
                case 2:
                    break;
                }
            if (message.level_id != null && message.hasOwnProperty("level_id"))
                if (!$util.isString(message.level_id))
                    return "level_id: string expected";
            if (message.platform_code != null && message.hasOwnProperty("platform_code")) {
                var error = $root.transit_realtime.TranslatedString.verify(message.platform_code);
                if (error)
                    return "platform_code." + error;
            }
            return null;
        };

        /**
         * Creates a Stop message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof transit_realtime.Stop
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {transit_realtime.Stop} Stop
         */
        Stop.fromObject = function fromObject(object) {
            if (object instanceof $root.transit_realtime.Stop)
                return object;
            var message = new $root.transit_realtime.Stop();
            if (object.stop_id != null)
                message.stop_id = String(object.stop_id);
            if (object.stop_code != null) {
                if (typeof object.stop_code !== "object")
                    throw TypeError(".transit_realtime.Stop.stop_code: object expected");
                message.stop_code = $root.transit_realtime.TranslatedString.fromObject(object.stop_code);
            }
            if (object.stop_name != null) {
                if (typeof object.stop_name !== "object")
                    throw TypeError(".transit_realtime.Stop.stop_name: object expected");
                message.stop_name = $root.transit_realtime.TranslatedString.fromObject(object.stop_name);
            }
            if (object.tts_stop_name != null) {
                if (typeof object.tts_stop_name !== "object")
                    throw TypeError(".transit_realtime.Stop.tts_stop_name: object expected");
                message.tts_stop_name = $root.transit_realtime.TranslatedString.fromObject(object.tts_stop_name);
            }
            if (object.stop_desc != null) {
                if (typeof object.stop_desc !== "object")
                    throw TypeError(".transit_realtime.Stop.stop_desc: object expected");
                message.stop_desc = $root.transit_realtime.TranslatedString.fromObject(object.stop_desc);
            }
            if (object.stop_lat != null)
                message.stop_lat = Number(object.stop_lat);
            if (object.stop_lon != null)
                message.stop_lon = Number(object.stop_lon);
            if (object.zone_id != null)
                message.zone_id = String(object.zone_id);
            if (object.stop_url != null) {
                if (typeof object.stop_url !== "object")
                    throw TypeError(".transit_realtime.Stop.stop_url: object expected");
                message.stop_url = $root.transit_realtime.TranslatedString.fromObject(object.stop_url);
            }
            if (object.parent_station != null)
                message.parent_station = String(object.parent_station);
            if (object.stop_timezone != null)
                message.stop_timezone = String(object.stop_timezone);
            switch (object.wheelchair_boarding) {
            default:
                if (typeof object.wheelchair_boarding === "number") {
                    message.wheelchair_boarding = object.wheelchair_boarding;
                    break;
                }
                break;
            case "UNKNOWN":
            case 0:
                message.wheelchair_boarding = 0;
                break;
            case "AVAILABLE":
            case 1:
                message.wheelchair_boarding = 1;
                break;
            case "NOT_AVAILABLE":
            case 2:
                message.wheelchair_boarding = 2;
                break;
            }
            if (object.level_id != null)
                message.level_id = String(object.level_id);
            if (object.platform_code != null) {
                if (typeof object.platform_code !== "object")
                    throw TypeError(".transit_realtime.Stop.platform_code: object expected");
                message.platform_code = $root.transit_realtime.TranslatedString.fromObject(object.platform_code);
            }
            return message;
        };

        /**
         * Creates a plain object from a Stop message. Also converts values to other types if specified.
         * @function toObject
         * @memberof transit_realtime.Stop
         * @static
         * @param {transit_realtime.Stop} message Stop
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        Stop.toObject = function toObject(message, options) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults) {
                object.stop_id = "";
                object.stop_code = null;
                object.stop_name = null;
                object.tts_stop_name = null;
                object.stop_desc = null;
                object.stop_lat = 0;
                object.stop_lon = 0;
                object.zone_id = "";
                object.stop_url = null;
                object.parent_station = "";
                object.stop_timezone = "";
                object.wheelchair_boarding = options.enums === String ? "UNKNOWN" : 0;
                object.level_id = "";
                object.platform_code = null;
            }
            if (message.stop_id != null && message.hasOwnProperty("stop_id"))
                object.stop_id = message.stop_id;
            if (message.stop_code != null && message.hasOwnProperty("stop_code"))
                object.stop_code = $root.transit_realtime.TranslatedString.toObject(message.stop_code, options);
            if (message.stop_name != null && message.hasOwnProperty("stop_name"))
                object.stop_name = $root.transit_realtime.TranslatedString.toObject(message.stop_name, options);
            if (message.tts_stop_name != null && message.hasOwnProperty("tts_stop_name"))
                object.tts_stop_name = $root.transit_realtime.TranslatedString.toObject(message.tts_stop_name, options);
            if (message.stop_desc != null && message.hasOwnProperty("stop_desc"))
                object.stop_desc = $root.transit_realtime.TranslatedString.toObject(message.stop_desc, options);
            if (message.stop_lat != null && message.hasOwnProperty("stop_lat"))
                object.stop_lat = options.json && !isFinite(message.stop_lat) ? String(message.stop_lat) : message.stop_lat;
            if (message.stop_lon != null && message.hasOwnProperty("stop_lon"))
                object.stop_lon = options.json && !isFinite(message.stop_lon) ? String(message.stop_lon) : message.stop_lon;
            if (message.zone_id != null && message.hasOwnProperty("zone_id"))
                object.zone_id = message.zone_id;
            if (message.stop_url != null && message.hasOwnProperty("stop_url"))
                object.stop_url = $root.transit_realtime.TranslatedString.toObject(message.stop_url, options);
            if (message.parent_station != null && message.hasOwnProperty("parent_station"))
                object.parent_station = message.parent_station;
            if (message.stop_timezone != null && message.hasOwnProperty("stop_timezone"))
                object.stop_timezone = message.stop_timezone;
            if (message.wheelchair_boarding != null && message.hasOwnProperty("wheelchair_boarding"))
                object.wheelchair_boarding = options.enums === String ? $root.transit_realtime.Stop.WheelchairBoarding[message.wheelchair_boarding] === undefined ? message.wheelchair_boarding : $root.transit_realtime.Stop.WheelchairBoarding[message.wheelchair_boarding] : message.wheelchair_boarding;
            if (message.level_id != null && message.hasOwnProperty("level_id"))
                object.level_id = message.level_id;
            if (message.platform_code != null && message.hasOwnProperty("platform_code"))
                object.platform_code = $root.transit_realtime.TranslatedString.toObject(message.platform_code, options);
            return object;
        };

        /**
         * Converts this Stop to JSON.
         * @function toJSON
         * @memberof transit_realtime.Stop
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        Stop.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for Stop
         * @function getTypeUrl
         * @memberof transit_realtime.Stop
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        Stop.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/transit_realtime.Stop";
        };

        /**
         * WheelchairBoarding enum.
         * @name transit_realtime.Stop.WheelchairBoarding
         * @enum {number}
         * @property {number} UNKNOWN=0 UNKNOWN value
         * @property {number} AVAILABLE=1 AVAILABLE value
         * @property {number} NOT_AVAILABLE=2 NOT_AVAILABLE value
         */
        Stop.WheelchairBoarding = (function() {
            var valuesById = {}, values = Object.create(valuesById);
            values[valuesById[0] = "UNKNOWN"] = 0;
            values[valuesById[1] = "AVAILABLE"] = 1;
            values[valuesById[2] = "NOT_AVAILABLE"] = 2;
            return values;
        })();

        return Stop;
    })();

    transit_realtime.TripModifications = (function() {

        /**
         * Properties of a TripModifications.
         * @memberof transit_realtime
         * @interface ITripModifications
         * @property {Array.<transit_realtime.TripModifications.ISelectedTrips>|null} [selected_trips] TripModifications selected_trips
         * @property {Array.<string>|null} [start_times] TripModifications start_times
         * @property {Array.<string>|null} [service_dates] TripModifications service_dates
         * @property {Array.<transit_realtime.TripModifications.IModification>|null} [modifications] TripModifications modifications
         */

        /**
         * Constructs a new TripModifications.
         * @memberof transit_realtime
         * @classdesc Represents a TripModifications.
         * @implements ITripModifications
         * @constructor
         * @param {transit_realtime.ITripModifications=} [properties] Properties to set
         */
        function TripModifications(properties) {
            this.selected_trips = [];
            this.start_times = [];
            this.service_dates = [];
            this.modifications = [];
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null)
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * TripModifications selected_trips.
         * @member {Array.<transit_realtime.TripModifications.ISelectedTrips>} selected_trips
         * @memberof transit_realtime.TripModifications
         * @instance
         */
        TripModifications.prototype.selected_trips = $util.emptyArray;

        /**
         * TripModifications start_times.
         * @member {Array.<string>} start_times
         * @memberof transit_realtime.TripModifications
         * @instance
         */
        TripModifications.prototype.start_times = $util.emptyArray;

        /**
         * TripModifications service_dates.
         * @member {Array.<string>} service_dates
         * @memberof transit_realtime.TripModifications
         * @instance
         */
        TripModifications.prototype.service_dates = $util.emptyArray;

        /**
         * TripModifications modifications.
         * @member {Array.<transit_realtime.TripModifications.IModification>} modifications
         * @memberof transit_realtime.TripModifications
         * @instance
         */
        TripModifications.prototype.modifications = $util.emptyArray;

        /**
         * Creates a new TripModifications instance using the specified properties.
         * @function create
         * @memberof transit_realtime.TripModifications
         * @static
         * @param {transit_realtime.ITripModifications=} [properties] Properties to set
         * @returns {transit_realtime.TripModifications} TripModifications instance
         */
        TripModifications.create = function create(properties) {
            return new TripModifications(properties);
        };

        /**
         * Encodes the specified TripModifications message. Does not implicitly {@link transit_realtime.TripModifications.verify|verify} messages.
         * @function encode
         * @memberof transit_realtime.TripModifications
         * @static
         * @param {transit_realtime.ITripModifications} message TripModifications message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        TripModifications.encode = function encode(message, writer) {
            if (!writer)
                writer = $Writer.create();
            if (message.selected_trips != null && message.selected_trips.length)
                for (var i = 0; i < message.selected_trips.length; ++i)
                    $root.transit_realtime.TripModifications.SelectedTrips.encode(message.selected_trips[i], writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim();
            if (message.start_times != null && message.start_times.length)
                for (var i = 0; i < message.start_times.length; ++i)
                    writer.uint32(/* id 2, wireType 2 =*/18).string(message.start_times[i]);
            if (message.service_dates != null && message.service_dates.length)
                for (var i = 0; i < message.service_dates.length; ++i)
                    writer.uint32(/* id 3, wireType 2 =*/26).string(message.service_dates[i]);
            if (message.modifications != null && message.modifications.length)
                for (var i = 0; i < message.modifications.length; ++i)
                    $root.transit_realtime.TripModifications.Modification.encode(message.modifications[i], writer.uint32(/* id 4, wireType 2 =*/34).fork()).ldelim();
            return writer;
        };

        /**
         * Encodes the specified TripModifications message, length delimited. Does not implicitly {@link transit_realtime.TripModifications.verify|verify} messages.
         * @function encodeDelimited
         * @memberof transit_realtime.TripModifications
         * @static
         * @param {transit_realtime.ITripModifications} message TripModifications message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        TripModifications.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer).ldelim();
        };

        /**
         * Decodes a TripModifications message from the specified reader or buffer.
         * @function decode
         * @memberof transit_realtime.TripModifications
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {transit_realtime.TripModifications} TripModifications
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        TripModifications.decode = function decode(reader, length, error) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.transit_realtime.TripModifications();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        if (!(message.selected_trips && message.selected_trips.length))
                            message.selected_trips = [];
                        message.selected_trips.push($root.transit_realtime.TripModifications.SelectedTrips.decode(reader, reader.uint32()));
                        break;
                    }
                case 2: {
                        if (!(message.start_times && message.start_times.length))
                            message.start_times = [];
                        message.start_times.push(reader.string());
                        break;
                    }
                case 3: {
                        if (!(message.service_dates && message.service_dates.length))
                            message.service_dates = [];
                        message.service_dates.push(reader.string());
                        break;
                    }
                case 4: {
                        if (!(message.modifications && message.modifications.length))
                            message.modifications = [];
                        message.modifications.push($root.transit_realtime.TripModifications.Modification.decode(reader, reader.uint32()));
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a TripModifications message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof transit_realtime.TripModifications
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {transit_realtime.TripModifications} TripModifications
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        TripModifications.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a TripModifications message.
         * @function verify
         * @memberof transit_realtime.TripModifications
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        TripModifications.verify = function verify(message) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.selected_trips != null && message.hasOwnProperty("selected_trips")) {
                if (!Array.isArray(message.selected_trips))
                    return "selected_trips: array expected";
                for (var i = 0; i < message.selected_trips.length; ++i) {
                    var error = $root.transit_realtime.TripModifications.SelectedTrips.verify(message.selected_trips[i]);
                    if (error)
                        return "selected_trips." + error;
                }
            }
            if (message.start_times != null && message.hasOwnProperty("start_times")) {
                if (!Array.isArray(message.start_times))
                    return "start_times: array expected";
                for (var i = 0; i < message.start_times.length; ++i)
                    if (!$util.isString(message.start_times[i]))
                        return "start_times: string[] expected";
            }
            if (message.service_dates != null && message.hasOwnProperty("service_dates")) {
                if (!Array.isArray(message.service_dates))
                    return "service_dates: array expected";
                for (var i = 0; i < message.service_dates.length; ++i)
                    if (!$util.isString(message.service_dates[i]))
                        return "service_dates: string[] expected";
            }
            if (message.modifications != null && message.hasOwnProperty("modifications")) {
                if (!Array.isArray(message.modifications))
                    return "modifications: array expected";
                for (var i = 0; i < message.modifications.length; ++i) {
                    var error = $root.transit_realtime.TripModifications.Modification.verify(message.modifications[i]);
                    if (error)
                        return "modifications." + error;
                }
            }
            return null;
        };

        /**
         * Creates a TripModifications message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof transit_realtime.TripModifications
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {transit_realtime.TripModifications} TripModifications
         */
        TripModifications.fromObject = function fromObject(object) {
            if (object instanceof $root.transit_realtime.TripModifications)
                return object;
            var message = new $root.transit_realtime.TripModifications();
            if (object.selected_trips) {
                if (!Array.isArray(object.selected_trips))
                    throw TypeError(".transit_realtime.TripModifications.selected_trips: array expected");
                message.selected_trips = [];
                for (var i = 0; i < object.selected_trips.length; ++i) {
                    if (typeof object.selected_trips[i] !== "object")
                        throw TypeError(".transit_realtime.TripModifications.selected_trips: object expected");
                    message.selected_trips[i] = $root.transit_realtime.TripModifications.SelectedTrips.fromObject(object.selected_trips[i]);
                }
            }
            if (object.start_times) {
                if (!Array.isArray(object.start_times))
                    throw TypeError(".transit_realtime.TripModifications.start_times: array expected");
                message.start_times = [];
                for (var i = 0; i < object.start_times.length; ++i)
                    message.start_times[i] = String(object.start_times[i]);
            }
            if (object.service_dates) {
                if (!Array.isArray(object.service_dates))
                    throw TypeError(".transit_realtime.TripModifications.service_dates: array expected");
                message.service_dates = [];
                for (var i = 0; i < object.service_dates.length; ++i)
                    message.service_dates[i] = String(object.service_dates[i]);
            }
            if (object.modifications) {
                if (!Array.isArray(object.modifications))
                    throw TypeError(".transit_realtime.TripModifications.modifications: array expected");
                message.modifications = [];
                for (var i = 0; i < object.modifications.length; ++i) {
                    if (typeof object.modifications[i] !== "object")
                        throw TypeError(".transit_realtime.TripModifications.modifications: object expected");
                    message.modifications[i] = $root.transit_realtime.TripModifications.Modification.fromObject(object.modifications[i]);
                }
            }
            return message;
        };

        /**
         * Creates a plain object from a TripModifications message. Also converts values to other types if specified.
         * @function toObject
         * @memberof transit_realtime.TripModifications
         * @static
         * @param {transit_realtime.TripModifications} message TripModifications
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        TripModifications.toObject = function toObject(message, options) {
            if (!options)
                options = {};
            var object = {};
            if (options.arrays || options.defaults) {
                object.selected_trips = [];
                object.start_times = [];
                object.service_dates = [];
                object.modifications = [];
            }
            if (message.selected_trips && message.selected_trips.length) {
                object.selected_trips = [];
                for (var j = 0; j < message.selected_trips.length; ++j)
                    object.selected_trips[j] = $root.transit_realtime.TripModifications.SelectedTrips.toObject(message.selected_trips[j], options);
            }
            if (message.start_times && message.start_times.length) {
                object.start_times = [];
                for (var j = 0; j < message.start_times.length; ++j)
                    object.start_times[j] = message.start_times[j];
            }
            if (message.service_dates && message.service_dates.length) {
                object.service_dates = [];
                for (var j = 0; j < message.service_dates.length; ++j)
                    object.service_dates[j] = message.service_dates[j];
            }
            if (message.modifications && message.modifications.length) {
                object.modifications = [];
                for (var j = 0; j < message.modifications.length; ++j)
                    object.modifications[j] = $root.transit_realtime.TripModifications.Modification.toObject(message.modifications[j], options);
            }
            return object;
        };

        /**
         * Converts this TripModifications to JSON.
         * @function toJSON
         * @memberof transit_realtime.TripModifications
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        TripModifications.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for TripModifications
         * @function getTypeUrl
         * @memberof transit_realtime.TripModifications
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        TripModifications.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/transit_realtime.TripModifications";
        };

        TripModifications.Modification = (function() {

            /**
             * Properties of a Modification.
             * @memberof transit_realtime.TripModifications
             * @interface IModification
             * @property {transit_realtime.IStopSelector|null} [start_stop_selector] Modification start_stop_selector
             * @property {transit_realtime.IStopSelector|null} [end_stop_selector] Modification end_stop_selector
             * @property {number|null} [propagated_modification_delay] Modification propagated_modification_delay
             * @property {Array.<transit_realtime.IReplacementStop>|null} [replacement_stops] Modification replacement_stops
             * @property {string|null} [service_alert_id] Modification service_alert_id
             * @property {number|null} [last_modified_time] Modification last_modified_time
             */

            /**
             * Constructs a new Modification.
             * @memberof transit_realtime.TripModifications
             * @classdesc Represents a Modification.
             * @implements IModification
             * @constructor
             * @param {transit_realtime.TripModifications.IModification=} [properties] Properties to set
             */
            function Modification(properties) {
                this.replacement_stops = [];
                if (properties)
                    for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                        if (properties[keys[i]] != null)
                            this[keys[i]] = properties[keys[i]];
            }

            /**
             * Modification start_stop_selector.
             * @member {transit_realtime.IStopSelector|null|undefined} start_stop_selector
             * @memberof transit_realtime.TripModifications.Modification
             * @instance
             */
            Modification.prototype.start_stop_selector = null;

            /**
             * Modification end_stop_selector.
             * @member {transit_realtime.IStopSelector|null|undefined} end_stop_selector
             * @memberof transit_realtime.TripModifications.Modification
             * @instance
             */
            Modification.prototype.end_stop_selector = null;

            /**
             * Modification propagated_modification_delay.
             * @member {number} propagated_modification_delay
             * @memberof transit_realtime.TripModifications.Modification
             * @instance
             */
            Modification.prototype.propagated_modification_delay = 0;

            /**
             * Modification replacement_stops.
             * @member {Array.<transit_realtime.IReplacementStop>} replacement_stops
             * @memberof transit_realtime.TripModifications.Modification
             * @instance
             */
            Modification.prototype.replacement_stops = $util.emptyArray;

            /**
             * Modification service_alert_id.
             * @member {string} service_alert_id
             * @memberof transit_realtime.TripModifications.Modification
             * @instance
             */
            Modification.prototype.service_alert_id = "";

            /**
             * Modification last_modified_time.
             * @member {number} last_modified_time
             * @memberof transit_realtime.TripModifications.Modification
             * @instance
             */
            Modification.prototype.last_modified_time = $util.Long ? $util.Long.fromBits(0,0,true) : 0;

            /**
             * Creates a new Modification instance using the specified properties.
             * @function create
             * @memberof transit_realtime.TripModifications.Modification
             * @static
             * @param {transit_realtime.TripModifications.IModification=} [properties] Properties to set
             * @returns {transit_realtime.TripModifications.Modification} Modification instance
             */
            Modification.create = function create(properties) {
                return new Modification(properties);
            };

            /**
             * Encodes the specified Modification message. Does not implicitly {@link transit_realtime.TripModifications.Modification.verify|verify} messages.
             * @function encode
             * @memberof transit_realtime.TripModifications.Modification
             * @static
             * @param {transit_realtime.TripModifications.IModification} message Modification message or plain object to encode
             * @param {$protobuf.Writer} [writer] Writer to encode to
             * @returns {$protobuf.Writer} Writer
             */
            Modification.encode = function encode(message, writer) {
                if (!writer)
                    writer = $Writer.create();
                if (message.start_stop_selector != null && Object.hasOwnProperty.call(message, "start_stop_selector"))
                    $root.transit_realtime.StopSelector.encode(message.start_stop_selector, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim();
                if (message.end_stop_selector != null && Object.hasOwnProperty.call(message, "end_stop_selector"))
                    $root.transit_realtime.StopSelector.encode(message.end_stop_selector, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim();
                if (message.propagated_modification_delay != null && Object.hasOwnProperty.call(message, "propagated_modification_delay"))
                    writer.uint32(/* id 3, wireType 0 =*/24).int32(message.propagated_modification_delay);
                if (message.replacement_stops != null && message.replacement_stops.length)
                    for (var i = 0; i < message.replacement_stops.length; ++i)
                        $root.transit_realtime.ReplacementStop.encode(message.replacement_stops[i], writer.uint32(/* id 4, wireType 2 =*/34).fork()).ldelim();
                if (message.service_alert_id != null && Object.hasOwnProperty.call(message, "service_alert_id"))
                    writer.uint32(/* id 5, wireType 2 =*/42).string(message.service_alert_id);
                if (message.last_modified_time != null && Object.hasOwnProperty.call(message, "last_modified_time"))
                    writer.uint32(/* id 6, wireType 0 =*/48).uint64(message.last_modified_time);
                return writer;
            };

            /**
             * Encodes the specified Modification message, length delimited. Does not implicitly {@link transit_realtime.TripModifications.Modification.verify|verify} messages.
             * @function encodeDelimited
             * @memberof transit_realtime.TripModifications.Modification
             * @static
             * @param {transit_realtime.TripModifications.IModification} message Modification message or plain object to encode
             * @param {$protobuf.Writer} [writer] Writer to encode to
             * @returns {$protobuf.Writer} Writer
             */
            Modification.encodeDelimited = function encodeDelimited(message, writer) {
                return this.encode(message, writer).ldelim();
            };

            /**
             * Decodes a Modification message from the specified reader or buffer.
             * @function decode
             * @memberof transit_realtime.TripModifications.Modification
             * @static
             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
             * @param {number} [length] Message length if known beforehand
             * @returns {transit_realtime.TripModifications.Modification} Modification
             * @throws {Error} If the payload is not a reader or valid buffer
             * @throws {$protobuf.util.ProtocolError} If required fields are missing
             */
            Modification.decode = function decode(reader, length, error) {
                if (!(reader instanceof $Reader))
                    reader = $Reader.create(reader);
                var end = length === undefined ? reader.len : reader.pos + length, message = new $root.transit_realtime.TripModifications.Modification();
                while (reader.pos < end) {
                    var tag = reader.uint32();
                    if (tag === error)
                        break;
                    switch (tag >>> 3) {
                    case 1: {
                            message.start_stop_selector = $root.transit_realtime.StopSelector.decode(reader, reader.uint32());
                            break;
                        }
                    case 2: {
                            message.end_stop_selector = $root.transit_realtime.StopSelector.decode(reader, reader.uint32());
                            break;
                        }
                    case 3: {
                            message.propagated_modification_delay = reader.int32();
                            break;
                        }
                    case 4: {
                            if (!(message.replacement_stops && message.replacement_stops.length))
                                message.replacement_stops = [];
                            message.replacement_stops.push($root.transit_realtime.ReplacementStop.decode(reader, reader.uint32()));
                            break;
                        }
                    case 5: {
                            message.service_alert_id = reader.string();
                            break;
                        }
                    case 6: {
                            message.last_modified_time = reader.uint64();
                            break;
                        }
                    default:
                        reader.skipType(tag & 7);
                        break;
                    }
                }
                return message;
            };

            /**
             * Decodes a Modification message from the specified reader or buffer, length delimited.
             * @function decodeDelimited
             * @memberof transit_realtime.TripModifications.Modification
             * @static
             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
             * @returns {transit_realtime.TripModifications.Modification} Modification
             * @throws {Error} If the payload is not a reader or valid buffer
             * @throws {$protobuf.util.ProtocolError} If required fields are missing
             */
            Modification.decodeDelimited = function decodeDelimited(reader) {
                if (!(reader instanceof $Reader))
                    reader = new $Reader(reader);
                return this.decode(reader, reader.uint32());
            };

            /**
             * Verifies a Modification message.
             * @function verify
             * @memberof transit_realtime.TripModifications.Modification
             * @static
             * @param {Object.<string,*>} message Plain object to verify
             * @returns {string|null} `null` if valid, otherwise the reason why it is not
             */
            Modification.verify = function verify(message) {
                if (typeof message !== "object" || message === null)
                    return "object expected";
                if (message.start_stop_selector != null && message.hasOwnProperty("start_stop_selector")) {
                    var error = $root.transit_realtime.StopSelector.verify(message.start_stop_selector);
                    if (error)
                        return "start_stop_selector." + error;
                }
                if (message.end_stop_selector != null && message.hasOwnProperty("end_stop_selector")) {
                    var error = $root.transit_realtime.StopSelector.verify(message.end_stop_selector);
                    if (error)
                        return "end_stop_selector." + error;
                }
                if (message.propagated_modification_delay != null && message.hasOwnProperty("propagated_modification_delay"))
                    if (!$util.isInteger(message.propagated_modification_delay))
                        return "propagated_modification_delay: integer expected";
                if (message.replacement_stops != null && message.hasOwnProperty("replacement_stops")) {
                    if (!Array.isArray(message.replacement_stops))
                        return "replacement_stops: array expected";
                    for (var i = 0; i < message.replacement_stops.length; ++i) {
                        var error = $root.transit_realtime.ReplacementStop.verify(message.replacement_stops[i]);
                        if (error)
                            return "replacement_stops." + error;
                    }
                }
                if (message.service_alert_id != null && message.hasOwnProperty("service_alert_id"))
                    if (!$util.isString(message.service_alert_id))
                        return "service_alert_id: string expected";
                if (message.last_modified_time != null && message.hasOwnProperty("last_modified_time"))
                    if (!$util.isInteger(message.last_modified_time) && !(message.last_modified_time && $util.isInteger(message.last_modified_time.low) && $util.isInteger(message.last_modified_time.high)))
                        return "last_modified_time: integer|Long expected";
                return null;
            };

            /**
             * Creates a Modification message from a plain object. Also converts values to their respective internal types.
             * @function fromObject
             * @memberof transit_realtime.TripModifications.Modification
             * @static
             * @param {Object.<string,*>} object Plain object
             * @returns {transit_realtime.TripModifications.Modification} Modification
             */
            Modification.fromObject = function fromObject(object) {
                if (object instanceof $root.transit_realtime.TripModifications.Modification)
                    return object;
                var message = new $root.transit_realtime.TripModifications.Modification();
                if (object.start_stop_selector != null) {
                    if (typeof object.start_stop_selector !== "object")
                        throw TypeError(".transit_realtime.TripModifications.Modification.start_stop_selector: object expected");
                    message.start_stop_selector = $root.transit_realtime.StopSelector.fromObject(object.start_stop_selector);
                }
                if (object.end_stop_selector != null) {
                    if (typeof object.end_stop_selector !== "object")
                        throw TypeError(".transit_realtime.TripModifications.Modification.end_stop_selector: object expected");
                    message.end_stop_selector = $root.transit_realtime.StopSelector.fromObject(object.end_stop_selector);
                }
                if (object.propagated_modification_delay != null)
                    message.propagated_modification_delay = object.propagated_modification_delay | 0;
                if (object.replacement_stops) {
                    if (!Array.isArray(object.replacement_stops))
                        throw TypeError(".transit_realtime.TripModifications.Modification.replacement_stops: array expected");
                    message.replacement_stops = [];
                    for (var i = 0; i < object.replacement_stops.length; ++i) {
                        if (typeof object.replacement_stops[i] !== "object")
                            throw TypeError(".transit_realtime.TripModifications.Modification.replacement_stops: object expected");
                        message.replacement_stops[i] = $root.transit_realtime.ReplacementStop.fromObject(object.replacement_stops[i]);
                    }
                }
                if (object.service_alert_id != null)
                    message.service_alert_id = String(object.service_alert_id);
                if (object.last_modified_time != null)
                    if ($util.Long)
                        (message.last_modified_time = $util.Long.fromValue(object.last_modified_time)).unsigned = true;
                    else if (typeof object.last_modified_time === "string")
                        message.last_modified_time = parseInt(object.last_modified_time, 10);
                    else if (typeof object.last_modified_time === "number")
                        message.last_modified_time = object.last_modified_time;
                    else if (typeof object.last_modified_time === "object")
                        message.last_modified_time = new $util.LongBits(object.last_modified_time.low >>> 0, object.last_modified_time.high >>> 0).toNumber(true);
                return message;
            };

            /**
             * Creates a plain object from a Modification message. Also converts values to other types if specified.
             * @function toObject
             * @memberof transit_realtime.TripModifications.Modification
             * @static
             * @param {transit_realtime.TripModifications.Modification} message Modification
             * @param {$protobuf.IConversionOptions} [options] Conversion options
             * @returns {Object.<string,*>} Plain object
             */
            Modification.toObject = function toObject(message, options) {
                if (!options)
                    options = {};
                var object = {};
                if (options.arrays || options.defaults)
                    object.replacement_stops = [];
                if (options.defaults) {
                    object.start_stop_selector = null;
                    object.end_stop_selector = null;
                    object.propagated_modification_delay = 0;
                    object.service_alert_id = "";
                    if ($util.Long) {
                        var long = new $util.Long(0, 0, true);
                        object.last_modified_time = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : long;
                    } else
                        object.last_modified_time = options.longs === String ? "0" : 0;
                }
                if (message.start_stop_selector != null && message.hasOwnProperty("start_stop_selector"))
                    object.start_stop_selector = $root.transit_realtime.StopSelector.toObject(message.start_stop_selector, options);
                if (message.end_stop_selector != null && message.hasOwnProperty("end_stop_selector"))
                    object.end_stop_selector = $root.transit_realtime.StopSelector.toObject(message.end_stop_selector, options);
                if (message.propagated_modification_delay != null && message.hasOwnProperty("propagated_modification_delay"))
                    object.propagated_modification_delay = message.propagated_modification_delay;
                if (message.replacement_stops && message.replacement_stops.length) {
                    object.replacement_stops = [];
                    for (var j = 0; j < message.replacement_stops.length; ++j)
                        object.replacement_stops[j] = $root.transit_realtime.ReplacementStop.toObject(message.replacement_stops[j], options);
                }
                if (message.service_alert_id != null && message.hasOwnProperty("service_alert_id"))
                    object.service_alert_id = message.service_alert_id;
                if (message.last_modified_time != null && message.hasOwnProperty("last_modified_time"))
                    if (typeof message.last_modified_time === "number")
                        object.last_modified_time = options.longs === String ? String(message.last_modified_time) : message.last_modified_time;
                    else
                        object.last_modified_time = options.longs === String ? $util.Long.prototype.toString.call(message.last_modified_time) : options.longs === Number ? new $util.LongBits(message.last_modified_time.low >>> 0, message.last_modified_time.high >>> 0).toNumber(true) : message.last_modified_time;
                return object;
            };

            /**
             * Converts this Modification to JSON.
             * @function toJSON
             * @memberof transit_realtime.TripModifications.Modification
             * @instance
             * @returns {Object.<string,*>} JSON object
             */
            Modification.prototype.toJSON = function toJSON() {
                return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
            };

            /**
             * Gets the default type url for Modification
             * @function getTypeUrl
             * @memberof transit_realtime.TripModifications.Modification
             * @static
             * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
             * @returns {string} The default type url
             */
            Modification.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                if (typeUrlPrefix === undefined) {
                    typeUrlPrefix = "type.googleapis.com";
                }
                return typeUrlPrefix + "/transit_realtime.TripModifications.Modification";
            };

            return Modification;
        })();

        TripModifications.SelectedTrips = (function() {

            /**
             * Properties of a SelectedTrips.
             * @memberof transit_realtime.TripModifications
             * @interface ISelectedTrips
             * @property {Array.<string>|null} [trip_ids] SelectedTrips trip_ids
             * @property {string|null} [shape_id] SelectedTrips shape_id
             */

            /**
             * Constructs a new SelectedTrips.
             * @memberof transit_realtime.TripModifications
             * @classdesc Represents a SelectedTrips.
             * @implements ISelectedTrips
             * @constructor
             * @param {transit_realtime.TripModifications.ISelectedTrips=} [properties] Properties to set
             */
            function SelectedTrips(properties) {
                this.trip_ids = [];
                if (properties)
                    for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                        if (properties[keys[i]] != null)
                            this[keys[i]] = properties[keys[i]];
            }

            /**
             * SelectedTrips trip_ids.
             * @member {Array.<string>} trip_ids
             * @memberof transit_realtime.TripModifications.SelectedTrips
             * @instance
             */
            SelectedTrips.prototype.trip_ids = $util.emptyArray;

            /**
             * SelectedTrips shape_id.
             * @member {string} shape_id
             * @memberof transit_realtime.TripModifications.SelectedTrips
             * @instance
             */
            SelectedTrips.prototype.shape_id = "";

            /**
             * Creates a new SelectedTrips instance using the specified properties.
             * @function create
             * @memberof transit_realtime.TripModifications.SelectedTrips
             * @static
             * @param {transit_realtime.TripModifications.ISelectedTrips=} [properties] Properties to set
             * @returns {transit_realtime.TripModifications.SelectedTrips} SelectedTrips instance
             */
            SelectedTrips.create = function create(properties) {
                return new SelectedTrips(properties);
            };

            /**
             * Encodes the specified SelectedTrips message. Does not implicitly {@link transit_realtime.TripModifications.SelectedTrips.verify|verify} messages.
             * @function encode
             * @memberof transit_realtime.TripModifications.SelectedTrips
             * @static
             * @param {transit_realtime.TripModifications.ISelectedTrips} message SelectedTrips message or plain object to encode
             * @param {$protobuf.Writer} [writer] Writer to encode to
             * @returns {$protobuf.Writer} Writer
             */
            SelectedTrips.encode = function encode(message, writer) {
                if (!writer)
                    writer = $Writer.create();
                if (message.trip_ids != null && message.trip_ids.length)
                    for (var i = 0; i < message.trip_ids.length; ++i)
                        writer.uint32(/* id 1, wireType 2 =*/10).string(message.trip_ids[i]);
                if (message.shape_id != null && Object.hasOwnProperty.call(message, "shape_id"))
                    writer.uint32(/* id 2, wireType 2 =*/18).string(message.shape_id);
                return writer;
            };

            /**
             * Encodes the specified SelectedTrips message, length delimited. Does not implicitly {@link transit_realtime.TripModifications.SelectedTrips.verify|verify} messages.
             * @function encodeDelimited
             * @memberof transit_realtime.TripModifications.SelectedTrips
             * @static
             * @param {transit_realtime.TripModifications.ISelectedTrips} message SelectedTrips message or plain object to encode
             * @param {$protobuf.Writer} [writer] Writer to encode to
             * @returns {$protobuf.Writer} Writer
             */
            SelectedTrips.encodeDelimited = function encodeDelimited(message, writer) {
                return this.encode(message, writer).ldelim();
            };

            /**
             * Decodes a SelectedTrips message from the specified reader or buffer.
             * @function decode
             * @memberof transit_realtime.TripModifications.SelectedTrips
             * @static
             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
             * @param {number} [length] Message length if known beforehand
             * @returns {transit_realtime.TripModifications.SelectedTrips} SelectedTrips
             * @throws {Error} If the payload is not a reader or valid buffer
             * @throws {$protobuf.util.ProtocolError} If required fields are missing
             */
            SelectedTrips.decode = function decode(reader, length, error) {
                if (!(reader instanceof $Reader))
                    reader = $Reader.create(reader);
                var end = length === undefined ? reader.len : reader.pos + length, message = new $root.transit_realtime.TripModifications.SelectedTrips();
                while (reader.pos < end) {
                    var tag = reader.uint32();
                    if (tag === error)
                        break;
                    switch (tag >>> 3) {
                    case 1: {
                            if (!(message.trip_ids && message.trip_ids.length))
                                message.trip_ids = [];
                            message.trip_ids.push(reader.string());
                            break;
                        }
                    case 2: {
                            message.shape_id = reader.string();
                            break;
                        }
                    default:
                        reader.skipType(tag & 7);
                        break;
                    }
                }
                return message;
            };

            /**
             * Decodes a SelectedTrips message from the specified reader or buffer, length delimited.
             * @function decodeDelimited
             * @memberof transit_realtime.TripModifications.SelectedTrips
             * @static
             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
             * @returns {transit_realtime.TripModifications.SelectedTrips} SelectedTrips
             * @throws {Error} If the payload is not a reader or valid buffer
             * @throws {$protobuf.util.ProtocolError} If required fields are missing
             */
            SelectedTrips.decodeDelimited = function decodeDelimited(reader) {
                if (!(reader instanceof $Reader))
                    reader = new $Reader(reader);
                return this.decode(reader, reader.uint32());
            };

            /**
             * Verifies a SelectedTrips message.
             * @function verify
             * @memberof transit_realtime.TripModifications.SelectedTrips
             * @static
             * @param {Object.<string,*>} message Plain object to verify
             * @returns {string|null} `null` if valid, otherwise the reason why it is not
             */
            SelectedTrips.verify = function verify(message) {
                if (typeof message !== "object" || message === null)
                    return "object expected";
                if (message.trip_ids != null && message.hasOwnProperty("trip_ids")) {
                    if (!Array.isArray(message.trip_ids))
                        return "trip_ids: array expected";
                    for (var i = 0; i < message.trip_ids.length; ++i)
                        if (!$util.isString(message.trip_ids[i]))
                            return "trip_ids: string[] expected";
                }
                if (message.shape_id != null && message.hasOwnProperty("shape_id"))
                    if (!$util.isString(message.shape_id))
                        return "shape_id: string expected";
                return null;
            };

            /**
             * Creates a SelectedTrips message from a plain object. Also converts values to their respective internal types.
             * @function fromObject
             * @memberof transit_realtime.TripModifications.SelectedTrips
             * @static
             * @param {Object.<string,*>} object Plain object
             * @returns {transit_realtime.TripModifications.SelectedTrips} SelectedTrips
             */
            SelectedTrips.fromObject = function fromObject(object) {
                if (object instanceof $root.transit_realtime.TripModifications.SelectedTrips)
                    return object;
                var message = new $root.transit_realtime.TripModifications.SelectedTrips();
                if (object.trip_ids) {
                    if (!Array.isArray(object.trip_ids))
                        throw TypeError(".transit_realtime.TripModifications.SelectedTrips.trip_ids: array expected");
                    message.trip_ids = [];
                    for (var i = 0; i < object.trip_ids.length; ++i)
                        message.trip_ids[i] = String(object.trip_ids[i]);
                }
                if (object.shape_id != null)
                    message.shape_id = String(object.shape_id);
                return message;
            };

            /**
             * Creates a plain object from a SelectedTrips message. Also converts values to other types if specified.
             * @function toObject
             * @memberof transit_realtime.TripModifications.SelectedTrips
             * @static
             * @param {transit_realtime.TripModifications.SelectedTrips} message SelectedTrips
             * @param {$protobuf.IConversionOptions} [options] Conversion options
             * @returns {Object.<string,*>} Plain object
             */
            SelectedTrips.toObject = function toObject(message, options) {
                if (!options)
                    options = {};
                var object = {};
                if (options.arrays || options.defaults)
                    object.trip_ids = [];
                if (options.defaults)
                    object.shape_id = "";
                if (message.trip_ids && message.trip_ids.length) {
                    object.trip_ids = [];
                    for (var j = 0; j < message.trip_ids.length; ++j)
                        object.trip_ids[j] = message.trip_ids[j];
                }
                if (message.shape_id != null && message.hasOwnProperty("shape_id"))
                    object.shape_id = message.shape_id;
                return object;
            };

            /**
             * Converts this SelectedTrips to JSON.
             * @function toJSON
             * @memberof transit_realtime.TripModifications.SelectedTrips
             * @instance
             * @returns {Object.<string,*>} JSON object
             */
            SelectedTrips.prototype.toJSON = function toJSON() {
                return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
            };

            /**
             * Gets the default type url for SelectedTrips
             * @function getTypeUrl
             * @memberof transit_realtime.TripModifications.SelectedTrips
             * @static
             * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
             * @returns {string} The default type url
             */
            SelectedTrips.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                if (typeUrlPrefix === undefined) {
                    typeUrlPrefix = "type.googleapis.com";
                }
                return typeUrlPrefix + "/transit_realtime.TripModifications.SelectedTrips";
            };

            return SelectedTrips;
        })();

        return TripModifications;
    })();

    transit_realtime.StopSelector = (function() {

        /**
         * Properties of a StopSelector.
         * @memberof transit_realtime
         * @interface IStopSelector
         * @property {number|null} [stop_sequence] StopSelector stop_sequence
         * @property {string|null} [stop_id] StopSelector stop_id
         */

        /**
         * Constructs a new StopSelector.
         * @memberof transit_realtime
         * @classdesc Represents a StopSelector.
         * @implements IStopSelector
         * @constructor
         * @param {transit_realtime.IStopSelector=} [properties] Properties to set
         */
        function StopSelector(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null)
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * StopSelector stop_sequence.
         * @member {number} stop_sequence
         * @memberof transit_realtime.StopSelector
         * @instance
         */
        StopSelector.prototype.stop_sequence = 0;

        /**
         * StopSelector stop_id.
         * @member {string} stop_id
         * @memberof transit_realtime.StopSelector
         * @instance
         */
        StopSelector.prototype.stop_id = "";

        /**
         * Creates a new StopSelector instance using the specified properties.
         * @function create
         * @memberof transit_realtime.StopSelector
         * @static
         * @param {transit_realtime.IStopSelector=} [properties] Properties to set
         * @returns {transit_realtime.StopSelector} StopSelector instance
         */
        StopSelector.create = function create(properties) {
            return new StopSelector(properties);
        };

        /**
         * Encodes the specified StopSelector message. Does not implicitly {@link transit_realtime.StopSelector.verify|verify} messages.
         * @function encode
         * @memberof transit_realtime.StopSelector
         * @static
         * @param {transit_realtime.IStopSelector} message StopSelector message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        StopSelector.encode = function encode(message, writer) {
            if (!writer)
                writer = $Writer.create();
            if (message.stop_sequence != null && Object.hasOwnProperty.call(message, "stop_sequence"))
                writer.uint32(/* id 1, wireType 0 =*/8).uint32(message.stop_sequence);
            if (message.stop_id != null && Object.hasOwnProperty.call(message, "stop_id"))
                writer.uint32(/* id 2, wireType 2 =*/18).string(message.stop_id);
            return writer;
        };

        /**
         * Encodes the specified StopSelector message, length delimited. Does not implicitly {@link transit_realtime.StopSelector.verify|verify} messages.
         * @function encodeDelimited
         * @memberof transit_realtime.StopSelector
         * @static
         * @param {transit_realtime.IStopSelector} message StopSelector message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        StopSelector.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer).ldelim();
        };

        /**
         * Decodes a StopSelector message from the specified reader or buffer.
         * @function decode
         * @memberof transit_realtime.StopSelector
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {transit_realtime.StopSelector} StopSelector
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        StopSelector.decode = function decode(reader, length, error) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.transit_realtime.StopSelector();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.stop_sequence = reader.uint32();
                        break;
                    }
                case 2: {
                        message.stop_id = reader.string();
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a StopSelector message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof transit_realtime.StopSelector
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {transit_realtime.StopSelector} StopSelector
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        StopSelector.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a StopSelector message.
         * @function verify
         * @memberof transit_realtime.StopSelector
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        StopSelector.verify = function verify(message) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.stop_sequence != null && message.hasOwnProperty("stop_sequence"))
                if (!$util.isInteger(message.stop_sequence))
                    return "stop_sequence: integer expected";
            if (message.stop_id != null && message.hasOwnProperty("stop_id"))
                if (!$util.isString(message.stop_id))
                    return "stop_id: string expected";
            return null;
        };

        /**
         * Creates a StopSelector message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof transit_realtime.StopSelector
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {transit_realtime.StopSelector} StopSelector
         */
        StopSelector.fromObject = function fromObject(object) {
            if (object instanceof $root.transit_realtime.StopSelector)
                return object;
            var message = new $root.transit_realtime.StopSelector();
            if (object.stop_sequence != null)
                message.stop_sequence = object.stop_sequence >>> 0;
            if (object.stop_id != null)
                message.stop_id = String(object.stop_id);
            return message;
        };

        /**
         * Creates a plain object from a StopSelector message. Also converts values to other types if specified.
         * @function toObject
         * @memberof transit_realtime.StopSelector
         * @static
         * @param {transit_realtime.StopSelector} message StopSelector
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        StopSelector.toObject = function toObject(message, options) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults) {
                object.stop_sequence = 0;
                object.stop_id = "";
            }
            if (message.stop_sequence != null && message.hasOwnProperty("stop_sequence"))
                object.stop_sequence = message.stop_sequence;
            if (message.stop_id != null && message.hasOwnProperty("stop_id"))
                object.stop_id = message.stop_id;
            return object;
        };

        /**
         * Converts this StopSelector to JSON.
         * @function toJSON
         * @memberof transit_realtime.StopSelector
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        StopSelector.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for StopSelector
         * @function getTypeUrl
         * @memberof transit_realtime.StopSelector
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        StopSelector.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/transit_realtime.StopSelector";
        };

        return StopSelector;
    })();

    transit_realtime.ReplacementStop = (function() {

        /**
         * Properties of a ReplacementStop.
         * @memberof transit_realtime
         * @interface IReplacementStop
         * @property {number|null} [travel_time_to_stop] ReplacementStop travel_time_to_stop
         * @property {string|null} [stop_id] ReplacementStop stop_id
         */

        /**
         * Constructs a new ReplacementStop.
         * @memberof transit_realtime
         * @classdesc Represents a ReplacementStop.
         * @implements IReplacementStop
         * @constructor
         * @param {transit_realtime.IReplacementStop=} [properties] Properties to set
         */
        function ReplacementStop(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null)
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * ReplacementStop travel_time_to_stop.
         * @member {number} travel_time_to_stop
         * @memberof transit_realtime.ReplacementStop
         * @instance
         */
        ReplacementStop.prototype.travel_time_to_stop = 0;

        /**
         * ReplacementStop stop_id.
         * @member {string} stop_id
         * @memberof transit_realtime.ReplacementStop
         * @instance
         */
        ReplacementStop.prototype.stop_id = "";

        /**
         * Creates a new ReplacementStop instance using the specified properties.
         * @function create
         * @memberof transit_realtime.ReplacementStop
         * @static
         * @param {transit_realtime.IReplacementStop=} [properties] Properties to set
         * @returns {transit_realtime.ReplacementStop} ReplacementStop instance
         */
        ReplacementStop.create = function create(properties) {
            return new ReplacementStop(properties);
        };

        /**
         * Encodes the specified ReplacementStop message. Does not implicitly {@link transit_realtime.ReplacementStop.verify|verify} messages.
         * @function encode
         * @memberof transit_realtime.ReplacementStop
         * @static
         * @param {transit_realtime.IReplacementStop} message ReplacementStop message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        ReplacementStop.encode = function encode(message, writer) {
            if (!writer)
                writer = $Writer.create();
            if (message.travel_time_to_stop != null && Object.hasOwnProperty.call(message, "travel_time_to_stop"))
                writer.uint32(/* id 1, wireType 0 =*/8).int32(message.travel_time_to_stop);
            if (message.stop_id != null && Object.hasOwnProperty.call(message, "stop_id"))
                writer.uint32(/* id 2, wireType 2 =*/18).string(message.stop_id);
            return writer;
        };

        /**
         * Encodes the specified ReplacementStop message, length delimited. Does not implicitly {@link transit_realtime.ReplacementStop.verify|verify} messages.
         * @function encodeDelimited
         * @memberof transit_realtime.ReplacementStop
         * @static
         * @param {transit_realtime.IReplacementStop} message ReplacementStop message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        ReplacementStop.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer).ldelim();
        };

        /**
         * Decodes a ReplacementStop message from the specified reader or buffer.
         * @function decode
         * @memberof transit_realtime.ReplacementStop
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {transit_realtime.ReplacementStop} ReplacementStop
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        ReplacementStop.decode = function decode(reader, length, error) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.transit_realtime.ReplacementStop();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.travel_time_to_stop = reader.int32();
                        break;
                    }
                case 2: {
                        message.stop_id = reader.string();
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a ReplacementStop message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof transit_realtime.ReplacementStop
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {transit_realtime.ReplacementStop} ReplacementStop
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        ReplacementStop.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a ReplacementStop message.
         * @function verify
         * @memberof transit_realtime.ReplacementStop
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        ReplacementStop.verify = function verify(message) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.travel_time_to_stop != null && message.hasOwnProperty("travel_time_to_stop"))
                if (!$util.isInteger(message.travel_time_to_stop))
                    return "travel_time_to_stop: integer expected";
            if (message.stop_id != null && message.hasOwnProperty("stop_id"))
                if (!$util.isString(message.stop_id))
                    return "stop_id: string expected";
            return null;
        };

        /**
         * Creates a ReplacementStop message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof transit_realtime.ReplacementStop
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {transit_realtime.ReplacementStop} ReplacementStop
         */
        ReplacementStop.fromObject = function fromObject(object) {
            if (object instanceof $root.transit_realtime.ReplacementStop)
                return object;
            var message = new $root.transit_realtime.ReplacementStop();
            if (object.travel_time_to_stop != null)
                message.travel_time_to_stop = object.travel_time_to_stop | 0;
            if (object.stop_id != null)
                message.stop_id = String(object.stop_id);
            return message;
        };

        /**
         * Creates a plain object from a ReplacementStop message. Also converts values to other types if specified.
         * @function toObject
         * @memberof transit_realtime.ReplacementStop
         * @static
         * @param {transit_realtime.ReplacementStop} message ReplacementStop
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        ReplacementStop.toObject = function toObject(message, options) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults) {
                object.travel_time_to_stop = 0;
                object.stop_id = "";
            }
            if (message.travel_time_to_stop != null && message.hasOwnProperty("travel_time_to_stop"))
                object.travel_time_to_stop = message.travel_time_to_stop;
            if (message.stop_id != null && message.hasOwnProperty("stop_id"))
                object.stop_id = message.stop_id;
            return object;
        };

        /**
         * Converts this ReplacementStop to JSON.
         * @function toJSON
         * @memberof transit_realtime.ReplacementStop
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        ReplacementStop.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for ReplacementStop
         * @function getTypeUrl
         * @memberof transit_realtime.ReplacementStop
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        ReplacementStop.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/transit_realtime.ReplacementStop";
        };

        return ReplacementStop;
    })();

    return transit_realtime;
})();

module.exports = $root;