def revoc_info(briefs: Union[dict, Sequence[dict]], filt: dict = None) -> dict:
    """
    Given a cred-brief, cred-info or sequence of either, return a dict mapping pairs
    (revocation registry identifier, credential revocation identifier)
    to attribute name: (raw) value dicts.

    If the caller includes a filter of attribute:value pairs, retain only matching attributes.

    :param briefs: cred-brief/cred-info, or sequence thereof
    :param filt: dict mapping attributes to values of interest; e.g.,

    ::

        {
            'legalName': 'Flan Nebula',
            'effectiveDate': '2018-01-01',
            'endDate': None
        }

    :return: dict mapping (rev_reg_id, cred_rev_id) pairs to (raw) attributes; e.g.,

    ::

        {
            ('LjgpST2rjsoxYegQDRm7EL:4:LjgpST2rjsoxYegQDRm7EL:3:CL:17:tag:CL_ACCUM:1', '2'): {
                'busId': '11121398',
                'effectiveDate': '2010-10-10',
                'endDate': '',
                'id': '1',
                'jurisdictionId': '1',
                'legalName': 'The Original House of Pies',
                'orgTypeId': '2'},
            ('LjgpST2rjsoxYegQDRm7EL:4:LjgpST2rjsoxYegQDRm7EL:3:CL:17:tag:CL_ACCUM:1', '3'): {
                'busId': '11133333',
                'effectiveDate': '2011-10-01',
                'endDate': '',
                'id': '2',
                'jurisdictionId': '1',
                'legalName': 'Planet Cake',
                'orgTypeId': '1'}
        }

    """

    rv = {}
    for brief in iter_briefs(briefs):
        cred_info = brief.get('cred_info', {}) or brief  # briefs could be cred-infos or cred-briefs
        (rr_id, cr_id) = (cred_info['rev_reg_id'], cred_info['cred_rev_id'])
        if (rr_id, cr_id) in rv or rr_id is None or cr_id is None:
            continue
        if not filt:
            rv[(rr_id, cr_id)] = cred_info['attrs']
            continue
        if ({attr: str(filt[attr]) for attr in filt}.items() <= cred_info['attrs'].items()):
            rv[(rr_id, cr_id)] = cred_info['attrs']

    return rv
Given a cred-brief, cred-info or sequence of either, return a dict mapping pairs
    (revocation registry identifier, credential revocation identifier)
    to attribute name: (raw) value dicts.

    If the caller includes a filter of attribute:value pairs, retain only matching attributes.

    :param briefs: cred-brief/cred-info, or sequence thereof
    :param filt: dict mapping attributes to values of interest; e.g.,

    ::

        {
            'legalName': 'Flan Nebula',
            'effectiveDate': '2018-01-01',
            'endDate': None
        }

    :return: dict mapping (rev_reg_id, cred_rev_id) pairs to (raw) attributes; e.g.,

    ::

        {
            ('LjgpST2rjsoxYegQDRm7EL:4:LjgpST2rjsoxYegQDRm7EL:3:CL:17:tag:CL_ACCUM:1', '2'): {
                'busId': '11121398',
                'effectiveDate': '2010-10-10',
                'endDate': '',
                'id': '1',
                'jurisdictionId': '1',
                'legalName': 'The Original House of Pies',
                'orgTypeId': '2'},
            ('LjgpST2rjsoxYegQDRm7EL:4:LjgpST2rjsoxYegQDRm7EL:3:CL:17:tag:CL_ACCUM:1', '3'): {
                'busId': '11133333',
                'effectiveDate': '2011-10-01',
                'endDate': '',
                'id': '2',
                'jurisdictionId': '1',
                'legalName': 'Planet Cake',
                'orgTypeId': '1'}
        }