def evaluate(c):
    required_identity=['asset_id','asset_version','content_digest','creator_ids','provenance_ref','evidence_ref']
    identity_complete=all(str(c.get(k,'')).strip() for k in required_identity)
    rights_required=['copyright_owner','rights_usage_terms','license_ref','release_refs','territory','channel_scope','usage_window','evidence_ref']
    rights_complete=all(str(c.get(k,'')).strip() for k in rights_required)
    changed=bool(c.get('changed_context'))
    identity_preserved=bool(c.get('identity_preserved', True))
    rights_recomputed=bool(c.get('rights_recomputed', not changed))
    scope_match=bool(c.get('territory_match',True) and c.get('channel_match',True))
    if c.get('identity_conflict') or c.get('rights_disputed') or not identity_complete:
        state='DISPUTED'
    elif not c.get('rights_evaluated', True):
        state='INVENTORIED'
    elif not rights_complete:
        state='RIGHTS_UNKNOWN'
    elif not c.get('window_valid', True):
        state='EXPIRED'
    elif not scope_match:
        state='RIGHTS_RESTRICTED'
    elif changed and not rights_recomputed:
        state='RIGHTS_RESTRICTED'
    else:
        state='CLEARED_BOUNDED'
    return {
      'state':state,
      'reusable':state=='CLEARED_BOUNDED',
      'identity_preserved':identity_preserved,
      'rights_recomputed':rights_recomputed,
      'evidence_complete':identity_complete and rights_complete,
      'scope_match':scope_match
    }
