_updateManagedOB (symbol, data, raw, rawMsg) {
    // parse raw string with lossless parse which takes
    // the exact strict values rather than converting to floats
    // [0.00001, [1, 2, 3]] -> ['0.00001', ['1', '2', '3']]
    const rawLossless = LosslessJSON.parse(rawMsg, (key, value) => {
      if (value && value.isLosslessNumber) {
        return value.toString()
      } else {
        return value
      }
    })
    const losslessUpdate = rawLossless[1]
    // Snapshot, new OB. Note that we don't protect against duplicates, as they
    // could come in on re-sub
    if (Array.isArray(data[0])) {
      this._orderBooks[symbol] = data
      this._losslessOrderBooks[symbol] = losslessUpdate
      return null
    }

    // entry, needs to be applied to OB
    if (!this._orderBooks[symbol]) {
      return new Error(`recv update for unknown OB: ${symbol}`)
    }

    OrderBook.updateArrayOBWith(this._orderBooks[symbol], data, raw)
    OrderBook.updateArrayOBWith(this._losslessOrderBooks[symbol], losslessUpdate, raw)
    return null
  }
@param {string} symbol - symbol for order book
@param {number[]|number[][]} data - incoming data
@param {boolean} raw - if true, the order book is considered R*
@param {string} rawMsg - source message JSON
@returns {Error} err - null on success
@private