Program: 9016
Project: 9016
Buggy source:
/** 
 * Rechunks the strings based on a regex pattern and works on infinite stream. resplit(["boo:an", "d:foo"], ":") --> ["boo", "and", "foo"] resplit(["boo:an", "d:foo"], "o") --> ["b", "", ":and:f", "", ""] See   {@link Pattern}
 * @param src
 * @param regex
 * @return
 */
public static Observable<String> split(final Observable<String> src,String regex){
  final Pattern pattern=Pattern.compile(regex);
  return src.lift(new Operator<String,String>(){
    @Override public Subscriber<? super String> call(    final Subscriber<? super String> o){
      return new Subscriber<String>(o){
        private String leftOver=null;
        @Override public void onCompleted(){
          output(leftOver);
          if (!o.isUnsubscribed())           o.onCompleted();
        }
        @Override public void onError(        Throwable e){
          output(leftOver);
          if (!o.isUnsubscribed())           o.onError(e);
        }
        @Override public void onNext(        String segment){
          String[] parts=pattern.split(segment,-1);
          if (leftOver != null)           parts[0]=leftOver + parts[0];
          for (int i=0; i < parts.length - 1; i++) {
            String part=parts[i];
            output(part);
          }
          leftOver=parts[parts.length - 1];
        }
        private int emptyPartCount=0;
        /** 
 * when limit == 0 trailing empty parts are not emitted.
 * @param part
 */
        private void output(        String part){
          if (part.isEmpty()) {
            emptyPartCount++;
          }
 else {
            for (; emptyPartCount > 0; emptyPartCount--)             if (!o.isUnsubscribed())             o.onNext("String_Node_Str");
            if (!o.isUnsubscribed())             o.onNext(part);
          }
        }
      }
;
    }
  }
);
}

Fixed version (ground truth):
/** 
 * Rechunks the strings based on a regex pattern and works on infinite stream. <pre> split(["boo:an", "d:foo"], ":") --> ["boo", "and", "foo"] split(["boo:an", "d:foo"], "o") --> ["b", "", ":and:f", "", ""] </pre> See   {@link Pattern}
 * @param src
 * @param regex
 * @return
 */
public static Observable<String> split(final Observable<String> src,String regex){
  final Pattern pattern=Pattern.compile(regex);
  return src.lift(new Operator<String,String>(){
    @Override public Subscriber<? super String> call(    final Subscriber<? super String> o){
      return new Subscriber<String>(o){
        private String leftOver=null;
        @Override public void onCompleted(){
          output(leftOver);
          if (!o.isUnsubscribed())           o.onCompleted();
        }
        @Override public void onError(        Throwable e){
          output(leftOver);
          if (!o.isUnsubscribed())           o.onError(e);
        }
        @Override public void onNext(        String segment){
          String[] parts=pattern.split(segment,-1);
          if (leftOver != null)           parts[0]=leftOver + parts[0];
          for (int i=0; i < parts.length - 1; i++) {
            String part=parts[i];
            output(part);
          }
          leftOver=parts[parts.length - 1];
        }
        private int emptyPartCount=0;
        /** 
 * when limit == 0 trailing empty parts are not emitted.
 * @param part
 */
        private void output(        String part){
          if (part.isEmpty()) {
            emptyPartCount++;
          }
 else {
            for (; emptyPartCount > 0; emptyPartCount--)             if (!o.isUnsubscribed())             o.onNext("String_Node_Str");
            if (!o.isUnsubscribed())             o.onNext(part);
          }
        }
      }
;
    }
  }
);
}