void rotate(Node n, Side s, boolean first) {
    final Side o = (s == Side.L) ? Side.R : Side.L ;
    final Side nS = n.side ;
    final Node
      p = n.parent,
      x = kidFor(n, o),
      y = n,
      a = kidFor(x, o),
      b = kidFor(x, s),
      c = kidFor(y, s) ;
    if (first && heightFor(b) > heightFor(a)) {
      rotate(x, o, false) ;
      rotate(n, s, false) ;
      return ;
    }
    setParent(p, x, nS) ;
    setParent(x, y, s) ;
    setParent(y, c, s) ;
    setParent(y, b, o) ;
    setParent(x, a, o) ;
    flagForUpdate(x) ;
    flagForUpdate(y) ;
    if (verbose) {
      I.say("\n\n...AFTER ROTATION:") ;
      I.say(this.toString()) ;
    }
  }