code: def sigPerms(s):
      
      codes = 'bilfdc'
      if not s:
          yield ''
      elif s[0] in codes:
          start = codes.index(s[0])
          for x in codes[start:]:
              for y in sigPerms(s[1:]):
                  yield x + y
      elif s[0] == 's':  # numbers shall not be cast to strings
          for y in sigPerms(s[1:]):
              yield 's' + y
      else:
          yield s
docs: Generate all possible signatures derived by upcasting the given
      signature.