abstract interface