docs: @Override
      public DataPoint[] getSeries(long timestampStartMs, long timestampEndMs, int steps,
              DataPoint.Type type) {
          DataPoint[] origin = getAllInRange(timestampStartMs, timestampEndMs);
  
          if (steps < 1) {
              steps = 1;
          }
          if (steps == 1) {
              return origin;
          }
  
          int n = origin.length / steps;
          if (n * steps < origin.length) {
              n++;
          }
          DataPoint[] result = new DataPoint[n];
  
          int orgIndex = 0;
          int blockSize = steps * RESOLUTION_MS;
          for (DataPoint org : origin) {
              int resultIndex = orgIndex / steps;
              DataPoint block = result[resultIndex];
              if (block == null) {
                  long t = org.timestamp();
                  /* as of 0.5.0, the two following lines are commented out! */
                  // long delta = t % blockSize;
                  // t -= delta;
                  block = new DataPoint(DataPoint.Type.NONE, t, 0, blockSize);
                  result[resultIndex] = block;
              }
              if (block.type() == DataPoint.Type.NONE && org.type() != DataPoint.Type.NONE) {
                  block.type(type);
              }
              block.add(org);
  
              orgIndex++;
          }
  
          return result;
      }