class X
{
}

class X1
{
  isA X;
}

class X2
{
  const Integer MAX = 100;
  const Integer MIN = -99;
  const HELLO = "Hello";
  immutable String str;
  lazy immutable String str2;
  lazy String someName;
  lazy Double lDoub;
  lazy Boolean lBool;
  lazy String name = "Johannes";
  Date d;
  internal Time t = new Time();
  Integer i;
  Integer derivedTwiceI = i*2;
  autounique x;
  defaulted p = "robot";
  q = "chicken";
  defaulted r = "";
  immutable String s = "123";
  Date tt = "1978-12-25";
  Time u = "12:13:14";
  defaulted Date v = "1978-12-26";
  defaulted Time w = "12:59:59";
  before setStr { if (!canSetStr) { return false; } }
  before setStr2 { if (!canSetStr2) { return false; } }
  before setS { if (!canSetS) { return false; } }
}


class X0
{
  Bulb {
  }
}

class X
{
  Status {
    A {    }
    B {    }
    C {    }
  }
}

class X2
{
  Status {
    On {
    e -> Off;
    }
    Off {    }
  }
}

class X4
{
  Status {
    On {
    press -> Off;
    }
    Off {
    exit / { if (doActivityStatusOffThread != null) { doActivityStatusOffThread.interrupt(); } }
    entry / { doActivityStatusOffThread = new DoActivityThread(this,"doActivityStatusOff"); }
    do { keepDoing };
    }
  }
}

class X5
{
  Bulb {
    On {
    push -> / { blabla } On;
    }
  }
}

class X7
{
  Bulb {
    On {
    entry / { doOn }
    exit / { "a"; }
    }
  }

  public void doOn() {
  }
}

class X8
{
  Integer dimmer = 0;
  Integer brightness = 0;
  Bulb {
    Off {
    turnDimmer(Integer lightval) -> / { setBrightness(lightval) } Off;
    flipSwitch -> Dimmed;
    }
    Dimmed {
    [getDimmer()>99] entry -> On;
    flipSwitch -> Off;
    turnDimmer(Integer lightval) -> / { setBrightness(lightval) } Dimmed;
    }
    On {
    flipSwitch -> Off;
    turnDimmer(Integer lightval) -> / { setBrightness(lightval) } Dimmed;
    }
  }
}

class X9
{
  Integer brightness = 0;
  Bulb {
    On {
    [getBrightness()<1] push -> Off;
    }
    Off {    }
  }
}

class X10
{
  Integer brightness = 0;
  Bulb {
    On {
    [getBrightness()<1] push -> Off;
    }
    Off {    }
  }
}

class X11
{
  Status {
    On {
    press -> Off;
    }
    Off {
    exit / { if (doActivityStatusOffThread != null) { doActivityStatusOffThread.interrupt(); } }
    entry / { doActivityStatusOffThread = new DoActivityThread(this,"doActivityStatusOff"); }
    do { keepDoing; } -> On;
    }
  }
}

class X12
{
  Bulb {
    On {
    entry / { blahblah }
    entry / { blahblah2 }
    exit / { blahblahexit }
    }
  }
}

class X14
{
  Bulb {
    On {
    flip -> Off;
    }
    Off {
    flip -> On;
    }
  }
  AnotherBulb {
    On {
    flip -> Off;
    }
    Off {
    flip -> On;
    }
  }
}

class X15
{
  Integer brightness = 0;
  Bulb {
    On {
    [getBrightness()<1] push -> / { blabla } Off;
    }
    Off {    }
  }
}

class X3
{
  Status {
    On {
    exit / { exitStatusOn(); }
    entry / { if (statusOn == StatusOn.Null) { setStatusOn(StatusOn.Play); } }
    off -> Off;
        Play {
        exit / { setStatusOn(StatusOn.Null); }
        p -> Pause;
        }
        Pause {
        exit / { setStatusOn(StatusOn.Null); }
        p -> Play;
        }
    }
    Off {    }
  }
}

class X16
{
  Fixture {
    On {
    push -> Off;
    }
    Off {
    push -> On;
    }
  }
}

class X17
{
  Status {
    S1 {
    exit / { exitStatusS1(); }
    entry / { if (statusS1 == StatusS1.Null) { setStatusS1(StatusS1.S1A); } }
    e1 -> S1A;
        S1A {
        exit / { setStatusS1(StatusS1.Null); }
        }
    }
  }
}

class X18
{
  Status {
    Off {
    turnOn -> On;
    }
    On {
    exit / { exitStatusOnMotorIdle(); }
    exit / { exitStatusOnFanIdle(); }
    entry / { if (statusOnMotorIdle == StatusOnMotorIdle.Null) { setStatusOnMotorIdle(StatusOnMotorIdle.MotorIdle); } }
    entry / { if (statusOnFanIdle == StatusOnFanIdle.Null) { setStatusOnFanIdle(StatusOnFanIdle.FanIdle); } }
        MotorIdle {
        exit / { setStatusOnMotorIdle(StatusOnMotorIdle.Null); }
        flip -> MotorRunning;
        }
        MotorRunning {
        exit / { setStatusOnMotorIdle(StatusOnMotorIdle.Null); }
        flip -> MotorIdle;
        }
    ||
        FanIdle {
        exit / { setStatusOnFanIdle(StatusOnFanIdle.Null); }
        flop -> FanRunning;
        }
        FanRunning {
        exit / { setStatusOnFanIdle(StatusOnFanIdle.Null); }
        flop -> FanIdle;
        }
    }
  }
}


class Student
{
  * b -- 1 Mentor n;
  1 c -- 3 Mentor o;
  3..5 d -- * Mentor p;
  before addO { if (o.contains(aO)) { return false; } }
  before addP { if (p.contains(aP)) { return false; } }
  before addM { if (m.contains(aM)) { return false; } }
}

class Mentor
{
  before addB { if (b.contains(aB)) { return false; } }
  before addD { if (d.contains(aD)) { return false; } }
}

association Supervisor
{
  0..1 a Student -- 0..4 Mentor m;
}