<SYSTEM_TASK:>
Solve the following problem using Python, implementing the functions described below, one line at a time
<END_TASK>
<USER_TASK:>
Description:
 def job_add(self, callback, parameters=None, hours=0, minutes=0, seconds=0, tolerate_exceptions=True, expiration=None):
 		""" 		Add a job to the job manager. 		:param function callback: The function to run asynchronously. 		:param parameters: The parameters to be provided to the callback. 		:type parameters: list, tuple 		:param int hours: Number of hours to sleep between running the callback. 		:param int minutes: Number of minutes to sleep between running the callback. 		:param int seconds: Number of seconds to sleep between running the callback. 		:param bool tolerate_execptions: Whether to continue running a job after it has thrown an exception. 		:param expiration: When to expire and remove the job. If an integer 			is provided, the job will be executed that many times. If a 			datetime or timedelta instance is provided, then the job will 			be removed after the specified time. 		:type expiration: int, :py:class:`datetime.timedelta`, :py:class:`datetime.datetime` 		:return: The job id. 		:rtype: :py:class:`uuid.UUID` 		"""

		if not self._thread_running.is_set():
			raise RuntimeError('the JobManager is not running')
		parameters = (parameters or ())
		if not isinstance(parameters, (list, tuple)):
			parameters = (parameters,)
		job_desc = {}
		job_desc['job'] = JobRun(callback, parameters)
		job_desc['last_run'] = None
		job_desc['run_every'] = datetime.timedelta(0, ((hours * 60 * 60) + (minutes * 60) + seconds))
		job_desc['callback'] = callback
		job_desc['parameters'] = parameters
		job_desc['enabled'] = True
		job_desc['tolerate_exceptions'] = tolerate_exceptions
		job_desc['run_count'] = 0
		if isinstance(expiration, int):
			job_desc['expiration'] = expiration
		elif isinstance(expiration, datetime.timedelta):
			job_desc['expiration'] = self.now() + expiration
		elif isinstance(expiration, datetime.datetime):
			job_desc['expiration'] = expiration
		else:
			job_desc['expiration'] = None
		job_id = uuid.uuid4()
		self.logger.info('adding new job with id: ' + str(job_id) + ' and callback function: ' + callback.__name__)
		with self._job_lock:
			self._jobs[job_id] = job_desc
		return job_id