{-# LANGUAGE UndecidableInstances, AllowAmbiguousTypes, KindSignatures, TypeApplications, FlexibleInstances, ConstraintKinds #-}
 
    import Data.Kind (Constraint, Type)
 
 
    class A (m :: Type -> Type)
 
    class B (m :: Type -> Type)
 
    instance A m => B m
 
    data C (a :: Type)
 
    instance A C
 
    data D (a :: Type)
 
    instance {-# OVERLAPPING #-} B D
 
    data E (a :: Type)
 
    implicitly :: a => ()
    implicitly = ()
 
    test = implicitly @(A C)
    test1 = implicitly @(B C)
    --test2 = implicitly @(A D) -- doesn't compile
    test3 = implicitly @(B D)
    --test4 = implicitly @(A E) -- doesn't compile
    --test5 = implicitly @(B E) -- doesn't compile
				ICAgIHstIyBMQU5HVUFHRSBVbmRlY2lkYWJsZUluc3RhbmNlcywgQWxsb3dBbWJpZ3VvdXNUeXBlcywgS2luZFNpZ25hdHVyZXMsIFR5cGVBcHBsaWNhdGlvbnMsIEZsZXhpYmxlSW5zdGFuY2VzLCBDb25zdHJhaW50S2luZHMgIy19CiAgICAgCiAgICBpbXBvcnQgRGF0YS5LaW5kIChDb25zdHJhaW50LCBUeXBlKQogICAgIAogICAgbWFpbiA9IHByaW50ICJvayIKICAgICAKICAgIGNsYXNzIEEgKG0gOjogVHlwZSAtPiBUeXBlKQogICAgIAogICAgY2xhc3MgQiAobSA6OiBUeXBlIC0+IFR5cGUpCiAgICAgCiAgICBpbnN0YW5jZSBBIG0gPT4gQiBtCiAgICAgCiAgICBkYXRhIEMgKGEgOjogVHlwZSkKICAgICAKICAgIGluc3RhbmNlIEEgQwogICAgIAogICAgZGF0YSBEIChhIDo6IFR5cGUpCiAgICAgCiAgICBpbnN0YW5jZSB7LSMgT1ZFUkxBUFBJTkcgIy19IEIgRAogICAgIAogICAgZGF0YSBFIChhIDo6IFR5cGUpCiAgICAKICAgIGltcGxpY2l0bHkgOjogYSA9PiAoKQogICAgaW1wbGljaXRseSA9ICgpCiAgICAgCiAgICB0ZXN0ID0gaW1wbGljaXRseSBAKEEgQykKICAgIHRlc3QxID0gaW1wbGljaXRseSBAKEIgQykKICAgIC0tdGVzdDIgPSBpbXBsaWNpdGx5IEAoQSBEKSAtLSBkb2Vzbid0IGNvbXBpbGUKICAgIHRlc3QzID0gaW1wbGljaXRseSBAKEIgRCkKICAgIC0tdGVzdDQgPSBpbXBsaWNpdGx5IEAoQSBFKSAtLSBkb2Vzbid0IGNvbXBpbGUKICAgIC0tdGVzdDUgPSBpbXBsaWNpdGx5IEAoQiBFKSAtLSBkb2Vzbid0IGNvbXBpbGU=