class SplitCallable implements Callable<List<Shard>> {

        private final TokenRange tokenRange;
        private final long splitPartitions;
        private final long splitSize;

        public SplitCallable(TokenRange tokenRange,
                             long splitPartitions, long splitSize) {
            if (splitSize <= 0 && splitPartitions <= 0) {
                throw new IllegalArgumentException(String.format(
                        "The split-partitions must be > 0, but got %s",
                        splitPartitions));
            }

            if (splitSize > 0 && splitSize < MIN_SHARD_SIZE) {
                // splitSize should be at least 1M if passed
                throw new IllegalArgumentException(String.format(
                        "The split-size must be >= %s bytes, but got %s",
                        MIN_SHARD_SIZE, splitSize));
            }

            this.tokenRange = tokenRange;
            this.splitPartitions = splitPartitions;
            this.splitSize = splitSize;
        }

        @Override
        public List<Shard> call() throws Exception {<FILL_FUNCTION_BODY>}
    }

            ArrayList<Shard> splits = new ArrayList<>();

            Map<TokenRange, Long> subSplits = getSubSplits(
                    this.tokenRange,
                    this.splitPartitions,
                    this.splitSize);
            for (Map.Entry<TokenRange, Long> entry : subSplits.entrySet()) {
                List<TokenRange> ranges = entry.getKey().unwrap();
                for (TokenRange subrange : ranges) {
                    String start = !isPartitionerOpp() ?
                                   subrange.getStart().toString() :
                                   subrange.getStart().toString().substring(2);
                    String end = !isPartitionerOpp() ?
                                 subrange.getEnd().toString() :
                                 subrange.getEnd().toString().substring(2);
                    long length = entry.getValue();
                    splits.add(new Shard(start, end, length));
                }
            }
            return splits;
        
<no_super_class>