code: def andrew(S):
      
      S.sort()
      top = []
      bot = []
      for p in S:
          while len(top) >= 2 and not left_turn(p, top[-1], top[-2]):
              top.pop()
          top.append(p)
          while len(bot) >= 2 and not left_turn(bot[-2], bot[-1], p):
              bot.pop()
          bot.append(p)
      return bot[:-1] + top[:0:-1]
docs: Convex hull by Andrew
  
      :param S: list of points as coordinate pairs
      :requires: S has at least 2 points
      :returns: list of points of the convex hull
      :complexity: `O(n log n)`