docs: public static <T> List<T> sub(List<T> list, int start, int end, int step) {
  		if (list == null || list.isEmpty()) {
  			return null;
  		}
  
  		final int size = list.size();
  		if (start < 0) {
  			start += size;
  		}
  		if (end < 0) {
  			end += size;
  		}
  		if (start == size) {
  			return new ArrayList<>(0);
  		}
  		if (start > end) {
  			int tmp = start;
  			start = end;
  			end = tmp;
  		}
  		if (end > size) {
  			if (start >= size) {
  				return new ArrayList<>(0);
  			}
  			end = size;
  		}
  
  		if (step <= 1) {
  			return list.subList(start, end);
  		}
  
  		final List<T> result = new ArrayList<>();
  		for (int i = start; i < end; i += step) {
  			result.add(list.get(i));
  		}
  		return result;
  	}