anchor.diff:            }
           }
         }));
  -    def('processing', string('<?')
  +    def('processing', string(OPEN_PROCESSING)
         .seq(ref('nameToken'))
         .seq(ref('whitespace')
  -        .seq(string('?>').neg().star().flatten())
  +        .seq(any().starLazy(string(CLOSE_PROCESSING)).flatten())
           .pick(1).optional(''))
  -      .seq(string('?>'))
  +      .seq(string(CLOSE_PROCESSING))
         .permute([1, 2]));
       def('qualified', ref('nameToken'));
   
  -    def('characterData', char('<').neg().plus().flatten().map(_decodeXml));
  +    def('characterData', pattern('^<').plus().flatten().map(_decodeXml));
       def('misc', ref('whitespace')
         .or(ref('comment'))
         .or(ref('processing'))
  
positive.code:     def('attributeValue', ref('attributeValueDouble')
        .or(ref('attributeValueSingle'))
        .pick(1));
      def('attributeValueDouble', char('"')
        .seq(char('"').neg().star().flatten().map(_decodeXml))
        .seq(char('"')));
      def('attributeValueSingle', char("'")
        .seq(char("'").neg().star().flatten().map(_decodeXml))
        .seq(char("'")));
      def('attributes', ref('whitespace')
        .seq(ref('attribute'))
        .pick(1)
        .star());
      def('comment', string('<!--')
        .seq(string('-->').neg().star().flatten())
        .seq(string('-->'))
        .pick(1));
      def('cdata', string('<![CDATA[')
        .seq(string(']]>').neg().star().flatten())
        .seq(string(']]>'))
        .pick(1));
      def('content', ref('characterData')
        .or(ref('element'))
  
negative.code:       .or(ref('comment'))
        .or(ref('cdata'))
        .star());
      def('doctype', string(OPEN_DOCTYPE)
        .seq(ref('whitespace'))
        .seq(ref('nameToken')
          .or(ref('attributeValue'))
  