def do(access_token, fname, box_parent, hidden, depth):

	sname = local.short_name(fname)

	# if fname is a file, upload file (if necessary)
	if not os.path.isdir(fname):
		# Determine whether to upload and overwrite (> 0), just upload (0), 
		# or do nothing (< 0)
		up = box.to_upload_file(access_token, sname, fname, box_parent)
		if up > 0:
			print "upload and overwrite: {0}".format(fname)
			box.box_rm(access_token, str(up), "files")
			box.upload_file(access_token, box_parent["id"], fname)
		elif up == 0:
			print "just upload: {0}".format(fname)
			box.upload_file(access_token, box_parent["id"], fname)
		elif up < 0:
			print "don't upload: {0}".format(fname)

	# if fname is a dir, create dir if needed and re-call do
	elif os.path.isdir(fname):
		
		# Check if dir exists on box.
		box_num = box.dir_id(access_token, sname, box_parent["id"])
		# If the dir exists on box and we are in too deep, delete it
		if depth < 0:
			if box_num:
				box.box_rm(access_token, box_num, "folders")
				print "deleting file: {0}".format(fname)
			return(0)
		
		# Else we can create it/make sure it exists
		if not box_num:
			print "Creating dir: {0}".format(fname)
			box_num = box.box_mkdir(access_token, sname, box_parent["id"])["id"]
		else:
			print "no need to create dir: {0}".format(fname)
		dir_info = box.file_info(access_token, box_num, "folders")

		# locally, cd into fname and ls
		os.chdir(fname)
		files = local.listdir(hidden)

		# re-call do on all this stuff
		for i in files:
			do(access_token, i, dir_info, hidden, depth-1)

		# Now delete stuff out of this dir in box that no longer exists locally
		box.box_cleanup(access_token, dir_info, files)
		# And go back to the parent directory
		os.chdir('..')
	return(0)
	print "Updating token"
	access_token = token.refresh_token()
	
	# Read SETTINGS file and get list of things to upload
	f = open(SETTINGS, "r")
	# get and check box dir
	box_dir = f.readline().rstrip()
	if '/' in box_dir:
		sys.exit("Illegal box dir...")
	# get and check files for duplicates
	files = [i.rstrip().split(' ') for i in f.readlines()]
	files = local.remove_duplicates(files)
	
	# Find and get info about the sync location in the box root dir.
	sync_loc = box.dir_id(access_token, box_dir, "0")
	# Create if doesn't exist
	if not sync_loc: 
		print "Creating sync location on Box"
		sync_loc = box.box_mkdir(access_token, box_dir, "0")["id"]
	dir_info = box.file_info(access_token, sync_loc, "folders")
	
	# 'do' everything
	for data in files:
		hidden = local.dash_h(data)
		depth = local.depth(data)
		
		# Check for errors in this line of settings
		if depth == -1:
			print "{0} has a bad deptht. Ignoring...".format(data[0])
			continue