public static void checkExtensions(int[] elements, int k) {
        if (k == 0) {
            return;
        }
        for (int i = 0; i <= elements.length; i++) {
            int[] newElements = Arrays.copyOf(elements, elements.length + 1);
            for (int j = 0; j < elements.length; j++) {
                if (newElements[j] >= i) {
                    newElements[j]++;
                }
            }
            newElements[newElements.length - 1] = i;
            if (!vexBounded(newElements)) {
                int[] deletedCopy = Arrays.copyOf(newElements, newElements.length - 1);
                boolean hasBadDeletion = false;
                for (int deletedElement = newElements.length - 1; deletedElement >= 0; deletedElement--) {
                    hasBadDeletion = !vexBounded(deletedCopy);
                    if (hasBadDeletion || deletedElement == 0) {
                        break;
                    }
                    deletedCopy[deletedElement - 1] = newElements[deletedElement];
                }
                if (!hasBadDeletion) {
//                     EUREKA!
                    report(Arrays.toString(newElements));
                }
            } else {
                checkExtensions(newElements, k - 1);
            }
        }
    }