docs: async def _handle_bad_notification(self, message):
          """
          Adjusts the current state to be correct based on the
          received bad message notification whenever possible:
  
              bad_msg_notification#a7eff811 bad_msg_id:long bad_msg_seqno:int
              error_code:int = BadMsgNotification;
          """
          bad_msg = message.obj
          states = self._pop_states(bad_msg.bad_msg_id)
  
          self._log.debug('Handling bad msg %s', bad_msg)
          if bad_msg.error_code in (16, 17):
              # Sent msg_id too low or too high (respectively).
              # Use the current msg_id to determine the right time offset.
              to = self._state.update_time_offset(
                  correct_msg_id=message.msg_id)
              self._log.info('System clock is wrong, set time offset to %ds', to)
          elif bad_msg.error_code == 32:
              # msg_seqno too low, so just pump it up by some "large" amount
              # TODO A better fix would be to start with a new fresh session ID
              self._state._sequence += 64
          elif bad_msg.error_code == 33:
              # msg_seqno too high never seems to happen but just in case
              self._state._sequence -= 16
          else:
              for state in states:
                  state.future.set_exception(
                      BadMessageError(state.request, bad_msg.error_code))
              return
  
          # Messages are to be re-sent once we've corrected the issue
          self._send_queue.extend(states)
          self._log.debug('%d messages will be resent due to bad msg',
                          len(states))