code: public ISynchronizationPoint<Exception> searchElement(String elementName) {
  		ISynchronizationPoint<Exception> next = next();
  		do {
  			if (!next.isUnblocked()) break;
  			if (next.hasError()) return next;
  			if (Type.START_ELEMENT.equals(event.type) && event.text.equals(elementName)) return next;
  			next = next();
  		} while (true);
  		SynchronizationPoint<Exception> result = new SynchronizationPoint<>();
  		ISynchronizationPoint<Exception> n = next;
  		next.listenInline(() -> {
  			if (n.hasError()) result.error(n.getError());
  			else if (Type.START_ELEMENT.equals(event.type) && event.text.equals(elementName)) result.unblock();
  			else new ParsingTask(() -> { searchElement(elementName).listenInline(result); }).start();
  		}, result);
  		return result;
  	}
docs: Move forward until an element with the given name is found (whatever its depth).