anchor.diff:        r"^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}"
         r"[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$");
   
  +  static final Parser _autolinkParser = char('<') >
  +      pred((String char) =>
  +              char.codeUnitAt(0) > 0x20 && char != "<" && char != ">")
  +          .manyUntil(char('>'));
     static final Parser<List<Inline>> autolink =
         new Parser<List<Inline>>((String s, Position pos) {
  -    ParseResult res = (char('<') >
  -        pred((String char) =>
  -                char.codeUnitAt(0) > 0x20 && char != "<" && char != ">")
  -            .manyUntil(char('>'))).run(s, pos);
  +    ParseResult res = _autolinkParser.run(s, pos);
       if (!res.isSuccess) {
         return res;
       }
  
positive.code:         blockquote,
          para
        ]);
  
    Parser<List<Block>> get lazyLineBlock => choice([
          blanklines ^ (_) => [],
          hrule,
          list,
  
negative.code:     return _inlineCache;
    }
  
    Parser<List<Inline>> _spaceEscapedInlineCache;
    Parser<List<Inline>> get spaceEscapedInline {
      if (_spaceEscapedInlineCache == null) {
        _spaceEscapedInlineCache =
            (string(r'\ ') ^ (_) => [new _EscapedSpace()]) | inline;
      }
      return _spaceEscapedInlineCache;
    }
  
    Parser<Inlines> _inlinesCache;
    Parser<Inlines> get inlines {
      if (_inlinesCache == null) {
        _inlinesCache =
            inline.manyUntil(eof) ^ (res) => processParsedInlines(res);
      }
      return _inlinesCache;
    }
  
    //
    // Blocks
    //
  
    Parser<List<Block>> _blockCached;
    Parser<List<Block>> get block {
      if (_blockCached == null) {
        _blockCached = choice([
          blanklines ^ (_) => [],
          hrule,
          list,
  