protected boolean advance(boolean firstCall) {
	    while (firstCall || !single.hasNext()) {
	        currentWindow--;
	        if (currentWindow < 0)
	            return false;
	        if ((windows[currentWindow].maxLength < pos-prevPos) || (windows[currentWindow].minLength > pos-prevPos))
	            continue;
	        int rightB = windows[currentWindow].rightBoundary(prevPos+1,pos);
	        int leftB = windows[currentWindow].leftBoundary(prevPos+1,pos);
	 
	        if ((leftB < dataLen) && (rightB >= 0) && (leftB <= rightB)) {
	            single.startScanFeaturesAt(dataSeq,Math.max(leftB,0)-1, Math.min(rightB,dataLen-1));
	            firstCall = false;
	        }
	    }
	    return true;
	}