the longest code so far.... move on...