input: Write a python function to find all paths in a directed graph from a source node to a target node.
  assert list(find_all_paths({0: [1, 2], 1: [2], 2: [0, 3], 3: [3]}, 2, 3)) == [[2, 3]]
  assert list(find_all_paths({0: [1, 2, 3], 1: [3], 2: [3], 3: []}, 0, 3)) == [[0, 1, 3], [0, 2, 3], [0, 3]]
  assert list(find_all_paths({0: [1, 2], 1: [2], 2: [], 3: [2, 1]}, 3, 2)) == [[3, 2], [3, 1, 2]]
output: def find_all_paths(graph, start, end, path=[]):
      path = path + [start]
      if start == end:
          return [path]
      if start not in graph:
          return []
      paths = []
      for node in graph[start]:
          if node not in path:
              newpaths = find_all_paths(graph, node, end, path)
              for newpath in newpaths:
                  paths.append(newpath)
      return paths