def palindrome_partitions(text):
    n = len(text)
    pal = [[False] * n for _ in range(n)]
    for i in range(n - 1, -1, -1):
        for j in range(i, n):
            pal[i][j] = text[i] == text[j] and (j - i < 2 or pal[i + 1][j - 1])
    output, path = [], []
    def visit(start):
        if start == n:
            output.append(path.copy())
            return
        for end in range(start, n):
            if pal[start][end]:
                path.append(text[start:end + 1])
                visit(end + 1)
                path.pop()
    visit(0)
    return output
