docs: def times(self, multiplier):
  		'''
  			Given an FSM and a multiplier, return the multiplied FSM.
  		'''
  		if multiplier < 0:
  			raise Exception("Can't multiply an FSM by " + repr(multiplier))
  
  		alphabet = self.alphabet
  
  		# metastate is a set of iterations+states
  		initial = {(self.initial, 0)}
  
  		def final(state):
  			'''If the initial state is final then multiplying doesn't alter that'''
  			for (substate, iteration) in state:
  				if substate == self.initial \
  				and (self.initial in self.finals or iteration == multiplier):
  					return True
  			return False
  
  		def follow(current, symbol):
  			next = []
  			for (substate, iteration) in current:
  				if iteration < multiplier \
  				and substate in self.map \
  				and symbol in self.map[substate]:
  					next.append((self.map[substate][symbol], iteration))
  					# final of self? merge with initial on next iteration
  					if self.map[substate][symbol] in self.finals:
  						next.append((self.initial, iteration + 1))
  			if len(next) == 0:
  				raise OblivionError
  			return frozenset(next)
  
  		return crawl(alphabet, initial, final, follow).reduce()