def run(canvas: list[list[bool]]) -> list[list[bool]]:
    current_canvas = np.array(canvas)
    next_gen_canvas = np.array(create_canvas(current_canvas.shape[0]))
    for r, row in enumerate(current_canvas):
        for c, pt in enumerate(row):
            next_gen_canvas[r][c] = __judge_point(
                pt, current_canvas[r - 1 : r + 2, c - 1 : c + 2]
            )

    current_canvas = next_gen_canvas
    del next_gen_canvas  # cleaning memory as we move on.
    return_canvas: list[list[bool]] = current_canvas.tolist()
    return return_canvas