anchor.diff:    toString() => "Reply: $reply, dialog: $dialogEvent";
   }
   
  +class _NoReplies implements Replies {
  +  final bool modal = false;
  +  final List<String> available = const [];
  +  String get _used => null;
  +  void set _used(_) {
  +    throw new UnsupportedError("");
  +  }
  +
  +  const _NoReplies();
  +
  +  toString() => "Replies: $available, Modal: $modal";
  +
  +  Map toJson() => {'modal': modal, 'replies': available};
  +}
  +
   bool _notNull(String reply) => reply != null;
  
positive.code: class Replies {
    final bool modal;
    final List<String> available;
  
    Replies(this.available, {this.modal: false});
  
    const Replies.none()
        : modal = false,
          available = const [];
  
    Replies.fromJson(Map json)
        : modal = json['modal'],
          available = json['replies'];
  
    toString() => "Replies: $available, Modal: $modal";
  
    Map toJson() => {'modal': modal, 'replies': available};
  }
  
  class NarrationEvent {
  
negative.code:           {String from,
            String to,
            Duration delay: Duration.ZERO,
            Replies replies: const _NoReplies()}) =>
        _run.emit(new DialogEvent(dialog, from: from, to: to, replies: replies),
            delay: delay);
  
    Future<ReplyEvent> reply(String reply, DialogEvent dialogEvent) {
      if (dialogEvent.replies._used != null) {
        throw new StateError("Cannot reply to a dialog more than once; previous "
            "reply was ${dialogEvent.replies._used}.");
      }
  
      dialogEvent.replies._used = reply;
  
      return _run.emit(new ReplyEvent(reply, dialogEvent));
    }
  
    Future<NarrationEvent> narrate(String narration,
            {Duration delay: Duration.ZERO}) =>
  