<SYSTEM_TASK:>
Solve the following problem using Python, implementing the functions described below, one line at a time
<END_TASK>
<USER_TASK:>
Description:
 def changes(self):
 """ Returns a mapping of items to their effective change objects which include the old values and the new. The mapping includes only items whose value or raw string value has changed in the context. """

        report = {}
        for k, k_changes in self._changes.items():
            if len(k_changes) == 1:
                report[k] = k_changes[0]
            else:
                first = k_changes[0]
                last = k_changes[-1]
                if first.old_value != last.new_value or first.old_raw_str_value != last.new_raw_str_value:
                    report[k] = _Change(
                        first.old_value,
                        last.new_value,
                        first.old_raw_str_value,
                        last.new_raw_str_value,
                    )
        return report