revised for more generality