Implement a basic search query parser that matches candidate skills against job description keywords, handling synonyms and spelling variations for Manpower Belgium.
Use def match_candidates(query_keywords, candidates, synonyms):. Return candidate names in their original order when at least one requested keyword matches a skill. Matching is case-insensitive, ignores surrounding or repeated whitespace, treats listed synonyms as equivalent, and allows a Levenshtein distance of at most one. Each candidate has a name and a skills list; synonyms maps canonical terms to equivalent variations.
def match_candidates(query_keywords, candidates, synonyms):