code: def _c3_mro(cls, abcs=None):
      for i, base in enumerate(reversed(cls.__bases__)):
          if hasattr(base, '__abstractmethods__'):
              boundary = len(cls.__bases__) - i
              break
      else:
          boundary = 0
      abcs = list(abcs) if abcs else []
      explicit_bases = list(cls.__bases__[:boundary])
      abstract_bases = []
      other_bases = list(cls.__bases__[boundary:])
      for base in abcs:
          if issubclass(cls, base) and not any(issubclass(b, base) for b in cls.__bases__):
              abstract_bases.append(base)
      for base in abstract_bases:
          abcs.remove(base)
      explicit_c3_mros = [_c3_mro(base, abcs=abcs) for base in explicit_bases]
      abstract_c3_mros = [_c3_mro(base, abcs=abcs) for base in abstract_bases]
      other_c3_mros = [_c3_mro(base, abcs=abcs) for base in other_bases]
      return _c3_merge(
          [[cls]] + explicit_c3_mros + abstract_c3_mros + other_c3_mros + [explicit_bases] + [abstract_bases] + [
              other_bases])