Extract and structure the job advertisement information as a JSON object with the following schema:

{
  "title": "Job title (string)",
  "company": "Company name (string)",
  "department": "Department name (string, optional)",
  "location": {
    "city": "City name (string)",
    "state": "State name (string)",
    "country": "Country name (string)"
  },
  "salary": {
    "range": "Salary range as text (string)",
    "currency": "Currency code (string)",
    "period": "Payment period (string)"
  },
  "employment_type": "Employment type (string)",
  "experience": {
    "years": "Years of experience required (string)",
    "level": "Experience level (string)"
  },
  "required_skills": ["Array of required skills (strings)"],
  "preferred_skills": ["Array of preferred skills (strings)"],
  "education": [
    {
      "degree": "Degree name (string)",
      "field": "Field of study (string)",
      "required": true/false (boolean)
    }
  ],
  "responsibilities": ["Array of job responsibilities (strings)"],
  "benefits": [
    {
      "name": "Benefit name (string)",
      "description": "Benefit description (string)"
    }
  ],
  "description": "Detailed job description (string)",
  "application_deadline": "YYYY-MM-DD (date string)",
  "contact_info": {
    "name": "Contact name (string)",
    "email": "Contact email (string)",
    "phone": "Contact phone (string)",
    "website": "Website URL (string)"
  },
  "remote": true/false (boolean),
  "travel_required": "Travel requirements (string)",
  "posting_date": "YYYY-MM-DD (date string)"
}

Make sure to include ALL fields in the schema, even if you need to use your best judgment to infer values not explicitly stated in the job ad. For date fields, use the YYYY-MM-DD format.

Respond only with the JSON object, no additional text.