



import json
from typing import List, Optional, Tuple

from tokenizers import normalizers

from ...tokenization_utils_fast import PreTrainedTokenizerFast
from ...utils import logging
from .tokenization_bert import BertTokenizer


a_								=       logging.get_logger(__name__)

a_								=       {'vocab_file': 'vocab.txt', 'tokenizer_file': 'tokenizer.json'}

a_								=       {
    'vocab_file': {
        'bert-base-uncased': 'https://huggingface.co/bert-base-uncased/resolve/main/vocab.txt',
        'bert-large-uncased': 'https://huggingface.co/bert-large-uncased/resolve/main/vocab.txt',
        'bert-base-cased': 'https://huggingface.co/bert-base-cased/resolve/main/vocab.txt',
        'bert-large-cased': 'https://huggingface.co/bert-large-cased/resolve/main/vocab.txt',
        'bert-base-multilingual-uncased': (
            'https://huggingface.co/bert-base-multilingual-uncased/resolve/main/vocab.txt'
        ),
        'bert-base-multilingual-cased': 'https://huggingface.co/bert-base-multilingual-cased/resolve/main/vocab.txt',
        'bert-base-chinese': 'https://huggingface.co/bert-base-chinese/resolve/main/vocab.txt',
        'bert-base-german-cased': 'https://huggingface.co/bert-base-german-cased/resolve/main/vocab.txt',
        'bert-large-uncased-whole-word-masking': (
            'https://huggingface.co/bert-large-uncased-whole-word-masking/resolve/main/vocab.txt'
        ),
        'bert-large-cased-whole-word-masking': (
            'https://huggingface.co/bert-large-cased-whole-word-masking/resolve/main/vocab.txt'
        ),
        'bert-large-uncased-whole-word-masking-finetuned-squad': (
            'https://huggingface.co/bert-large-uncased-whole-word-masking-finetuned-squad/resolve/main/vocab.txt'
        ),
        'bert-large-cased-whole-word-masking-finetuned-squad': (
            'https://huggingface.co/bert-large-cased-whole-word-masking-finetuned-squad/resolve/main/vocab.txt'
        ),
        'bert-base-cased-finetuned-mrpc': (
            'https://huggingface.co/bert-base-cased-finetuned-mrpc/resolve/main/vocab.txt'
        ),
        'bert-base-german-dbmdz-cased': 'https://huggingface.co/bert-base-german-dbmdz-cased/resolve/main/vocab.txt',
        'bert-base-german-dbmdz-uncased': (
            'https://huggingface.co/bert-base-german-dbmdz-uncased/resolve/main/vocab.txt'
        ),
        'TurkuNLP/bert-base-finnish-cased-v1': (
            'https://huggingface.co/TurkuNLP/bert-base-finnish-cased-v1/resolve/main/vocab.txt'
        ),
        'TurkuNLP/bert-base-finnish-uncased-v1': (
            'https://huggingface.co/TurkuNLP/bert-base-finnish-uncased-v1/resolve/main/vocab.txt'
        ),
        'wietsedv/bert-base-dutch-cased': (
            'https://huggingface.co/wietsedv/bert-base-dutch-cased/resolve/main/vocab.txt'
        ),
    },
    'tokenizer_file': {
        'bert-base-uncased': 'https://huggingface.co/bert-base-uncased/resolve/main/tokenizer.json',
        'bert-large-uncased': 'https://huggingface.co/bert-large-uncased/resolve/main/tokenizer.json',
        'bert-base-cased': 'https://huggingface.co/bert-base-cased/resolve/main/tokenizer.json',
        'bert-large-cased': 'https://huggingface.co/bert-large-cased/resolve/main/tokenizer.json',
        'bert-base-multilingual-uncased': (
            'https://huggingface.co/bert-base-multilingual-uncased/resolve/main/tokenizer.json'
        ),
        'bert-base-multilingual-cased': (
            'https://huggingface.co/bert-base-multilingual-cased/resolve/main/tokenizer.json'
        ),
        'bert-base-chinese': 'https://huggingface.co/bert-base-chinese/resolve/main/tokenizer.json',
        'bert-base-german-cased': 'https://huggingface.co/bert-base-german-cased/resolve/main/tokenizer.json',
        'bert-large-uncased-whole-word-masking': (
            'https://huggingface.co/bert-large-uncased-whole-word-masking/resolve/main/tokenizer.json'
        ),
        'bert-large-cased-whole-word-masking': (
            'https://huggingface.co/bert-large-cased-whole-word-masking/resolve/main/tokenizer.json'
        ),
        'bert-large-uncased-whole-word-masking-finetuned-squad': (
            'https://huggingface.co/bert-large-uncased-whole-word-masking-finetuned-squad/resolve/main/tokenizer.json'
        ),
        'bert-large-cased-whole-word-masking-finetuned-squad': (
            'https://huggingface.co/bert-large-cased-whole-word-masking-finetuned-squad/resolve/main/tokenizer.json'
        ),
        'bert-base-cased-finetuned-mrpc': (
            'https://huggingface.co/bert-base-cased-finetuned-mrpc/resolve/main/tokenizer.json'
        ),
        'bert-base-german-dbmdz-cased': (
            'https://huggingface.co/bert-base-german-dbmdz-cased/resolve/main/tokenizer.json'
        ),
        'bert-base-german-dbmdz-uncased': (
            'https://huggingface.co/bert-base-german-dbmdz-uncased/resolve/main/tokenizer.json'
        ),
        'TurkuNLP/bert-base-finnish-cased-v1': (
            'https://huggingface.co/TurkuNLP/bert-base-finnish-cased-v1/resolve/main/tokenizer.json'
        ),
        'TurkuNLP/bert-base-finnish-uncased-v1': (
            'https://huggingface.co/TurkuNLP/bert-base-finnish-uncased-v1/resolve/main/tokenizer.json'
        ),
        'wietsedv/bert-base-dutch-cased': (
            'https://huggingface.co/wietsedv/bert-base-dutch-cased/resolve/main/tokenizer.json'
        ),
    },
}

a_								=       {
    'bert-base-uncased': 512,
    'bert-large-uncased': 512,
    'bert-base-cased': 512,
    'bert-large-cased': 512,
    'bert-base-multilingual-uncased': 512,
    'bert-base-multilingual-cased': 512,
    'bert-base-chinese': 512,
    'bert-base-german-cased': 512,
    'bert-large-uncased-whole-word-masking': 512,
    'bert-large-cased-whole-word-masking': 512,
    'bert-large-uncased-whole-word-masking-finetuned-squad': 512,
    'bert-large-cased-whole-word-masking-finetuned-squad': 512,
    'bert-base-cased-finetuned-mrpc': 512,
    'bert-base-german-dbmdz-cased': 512,
    'bert-base-german-dbmdz-uncased': 512,
    'TurkuNLP/bert-base-finnish-cased-v1': 512,
    'TurkuNLP/bert-base-finnish-uncased-v1': 512,
    'wietsedv/bert-base-dutch-cased': 512,
}

a_								=       {
    'bert-base-uncased': {'do_lower_case': True},
    'bert-large-uncased': {'do_lower_case': True},
    'bert-base-cased': {'do_lower_case': False},
    'bert-large-cased': {'do_lower_case': False},
    'bert-base-multilingual-uncased': {'do_lower_case': True},
    'bert-base-multilingual-cased': {'do_lower_case': False},
    'bert-base-chinese': {'do_lower_case': False},
    'bert-base-german-cased': {'do_lower_case': False},
    'bert-large-uncased-whole-word-masking': {'do_lower_case': True},
    'bert-large-cased-whole-word-masking': {'do_lower_case': False},
    'bert-large-uncased-whole-word-masking-finetuned-squad': {'do_lower_case': True},
    'bert-large-cased-whole-word-masking-finetuned-squad': {'do_lower_case': False},
    'bert-base-cased-finetuned-mrpc': {'do_lower_case': False},
    'bert-base-german-dbmdz-cased': {'do_lower_case': False},
    'bert-base-german-dbmdz-uncased': {'do_lower_case': True},
    'TurkuNLP/bert-base-finnish-cased-v1': {'do_lower_case': False},
    'TurkuNLP/bert-base-finnish-uncased-v1': {'do_lower_case': True},
    'wietsedv/bert-base-dutch-cased': {'do_lower_case': False},
}



class 			__lowerCAmelCase  (						__snake_case ):
 lowerCAmelCase__							       =	VOCAB_FILES_NAMES
 lowerCAmelCase__							       =	PRETRAINED_VOCAB_FILES_MAP
 lowerCAmelCase__							       =	PRETRAINED_INIT_CONFIGURATION
 lowerCAmelCase__							       =	PRETRAINED_POSITIONAL_EMBEDDINGS_SIZES
 lowerCAmelCase__							       =	BertTokenizer




 def __init__(    self						,					__UpperCAmelCase=None						,					__UpperCAmelCase=None						,					__UpperCAmelCase=True						,					__UpperCAmelCase="[UNK]"						,					__UpperCAmelCase="[SEP]"						,					__UpperCAmelCase="[PAD]"						,					__UpperCAmelCase="[CLS]"						,					__UpperCAmelCase="[MASK]"						,					__UpperCAmelCase=True						,					__UpperCAmelCase=None						,					**__UpperCAmelCase						,					):



    '''simple docstring'''
    super().__init__(
        __lowerCamelCase						,					tokenizer_file=__lowerCamelCase						,					do_lower_case=__lowerCamelCase						,					unk_token=__lowerCamelCase						,					sep_token=__lowerCamelCase						,					pad_token=__lowerCamelCase						,					cls_token=__lowerCamelCase						,					mask_token=__lowerCamelCase						,					tokenize_chinese_chars=__lowerCamelCase						,					strip_accents=__lowerCamelCase						,					**__lowerCamelCase						,					)

    __lowerCamelCase    				=     json.loads(self.backend_tokenizer.normalizer.__getstate__()					)
    if (
        normalizer_state.get('''lowercase'''						,					__lowerCamelCase					) != do_lower_case
        or normalizer_state.get('''strip_accents'''						,					__lowerCamelCase					) != strip_accents
        or normalizer_state.get('''handle_chinese_chars'''						,					__lowerCamelCase					) != tokenize_chinese_chars
    ):
       __lowerCamelCase    				=     getattr(__lowerCamelCase						,					normalizer_state.pop('''type'''					)					)
       __lowerCamelCase    				=     do_lower_case
       __lowerCamelCase    				=     strip_accents
       __lowerCamelCase    				=     tokenize_chinese_chars
       __lowerCamelCase    				=     normalizer_class(**__lowerCamelCase					)

    __lowerCamelCase    				=     do_lower_case




 def 							lowerCamelCase   (    self						,					__UpperCAmelCase						,					__UpperCAmelCase=None					):



    '''simple docstring'''
    __lowerCamelCase    				=     [self.cls_token_id] + token_ids_a + [self.sep_token_id]

    if token_ids_a:
       output += token_ids_a + [self.sep_token_id]

    return output




 def 							lowerCamelCase   (    self						,					__UpperCAmelCase						,					__UpperCAmelCase = None					):



    '''simple docstring'''
    __lowerCamelCase    				=     [self.sep_token_id]
    __lowerCamelCase    				=     [self.cls_token_id]
    if token_ids_a is None:
       return len(cls + token_ids_a + sep					) * [0]
    return len(cls + token_ids_a + sep					) * [0] + len(token_ids_a + sep					) * [1]




 def 							lowerCamelCase   (    self						,					__UpperCAmelCase						,					__UpperCAmelCase = None					):



    '''simple docstring'''
    __lowerCamelCase    				=     self._tokenizer.model.save(__lowerCamelCase						,					name=__lowerCamelCase					)
    return tuple(__lowerCamelCase					)









import argparse
import json
import math
import os
import time
import traceback
import zipfile
from collections import Counter

import requests





def 	__a     (      A__			:  str			,  A__			:  List[Any]=None       ):
    SCREAMING_SNAKE_CASE										=   None
    if token is not None:
        SCREAMING_SNAKE_CASE										=   {"Accept": "application/vnd.github+json", "Authorization": F"Bearer {token}"}

    SCREAMING_SNAKE_CASE										=   F"https://api.github.com/repos/huggingface/transformers/actions/runs/{workflow_run_id}/jobs?per_page=100"
    SCREAMING_SNAKE_CASE										=   requests.get(A__			,  headers=A__       ).json()
    SCREAMING_SNAKE_CASE										=   {}

    try:
        job_links.update({job["name"]: job["html_url"] for job in result["jobs"]}       )
        SCREAMING_SNAKE_CASE										=   math.ceil((result["total_count"] - 100) / 100       )

        for i in range(A__       ):
            SCREAMING_SNAKE_CASE										=   requests.get(url + F"&page={i + 2}"			,  headers=A__       ).json()
            job_links.update({job["name"]: job["html_url"] for job in result["jobs"]}       )

        return job_links
    except Exception:
        print(F"Unknown error, could not fetch links:\n{traceback.format_exc()}"       )

    return {}





def 	__a     (      A__			:  List[Any]			,  A__			:  Optional[int]=None       ):
    SCREAMING_SNAKE_CASE										=   None
    if token is not None:
        SCREAMING_SNAKE_CASE										=   {"Accept": "application/vnd.github+json", "Authorization": F"Bearer {token}"}

    SCREAMING_SNAKE_CASE										=   F"https://api.github.com/repos/huggingface/transformers/actions/runs/{worflow_run_id}/artifacts?per_page=100"
    SCREAMING_SNAKE_CASE										=   requests.get(A__			,  headers=A__       ).json()
    SCREAMING_SNAKE_CASE										=   {}

    try:
        artifacts.update({artifact["name"]: artifact["archive_download_url"] for artifact in result["artifacts"]}       )
        SCREAMING_SNAKE_CASE										=   math.ceil((result["total_count"] - 100) / 100       )

        for i in range(A__       ):
            SCREAMING_SNAKE_CASE										=   requests.get(url + F"&page={i + 2}"			,  headers=A__       ).json()
            artifacts.update({artifact["name"]: artifact["archive_download_url"] for artifact in result["artifacts"]}       )

        return artifacts
    except Exception:
        print(F"Unknown error, could not fetch links:\n{traceback.format_exc()}"       )

    return {}





def 	__a     (      A__			:  Any			,  A__			:  str			,  A__			:  List[str]			,  A__			:  Union[str, Any]       ):
    SCREAMING_SNAKE_CASE										=   None
    if token is not None:
        SCREAMING_SNAKE_CASE										=   {"Accept": "application/vnd.github+json", "Authorization": F"Bearer {token}"}

    SCREAMING_SNAKE_CASE										=   requests.get(A__			,  headers=A__			,  allow_redirects=A__       )
    SCREAMING_SNAKE_CASE										=   result.headers["Location"]
    SCREAMING_SNAKE_CASE										=   requests.get(A__			,  allow_redirects=A__       )
    SCREAMING_SNAKE_CASE										=   os.path.join(A__			,  F"{artifact_name}.zip"       )
    with open(A__			,  "wb"       ) as fp:
        fp.write(response.content       )





def 	__a     (      A__			:  List[Any]			,  A__			:  List[Any]=None       ):
    SCREAMING_SNAKE_CASE										=   []
    SCREAMING_SNAKE_CASE										=   []
    SCREAMING_SNAKE_CASE										=   None

    with zipfile.ZipFile(A__       ) as z:
        for filename in z.namelist():
            if not os.path.isdir(A__       ):
                # read the file
                if filename in ["failures_line.txt", "summary_short.txt", "job_name.txt"]:
                    with z.open(A__       ) as f:
                        for line in f:
                            SCREAMING_SNAKE_CASE										=   line.decode("UTF-8"       ).strip()
                            if filename == "failures_line.txt":
                                try:
                                    # `error_line` is the place where `error` occurs
                                    SCREAMING_SNAKE_CASE										=   line[: line.index(": "       )]
                                    SCREAMING_SNAKE_CASE										=   line[line.index(": "       ) + len(": "       ) :]
                                    errors.append([error_line, error]       )
                                except Exception:
                                    # skip un-related lines
                                    pass
                            elif filename == "summary_short.txt" and line.startswith("FAILED "       ):
                                # `test` is the test method that failed
                                SCREAMING_SNAKE_CASE										=   line[len("FAILED "       ) :]
                                failed_tests.append(A__       )
                            elif filename == "job_name.txt":
                                SCREAMING_SNAKE_CASE										=   line

    if len(A__       ) != len(A__       ):
        raise ValueError(
            F"`errors` and `failed_tests` should have the same number of elements. Got {len(A__       )} for `errors` "
            F"and {len(A__       )} for `failed_tests` instead. The test reports in {artifact_zip_path} have some"
            " problem."       )

    SCREAMING_SNAKE_CASE										=   None
    if job_name and job_links:
        SCREAMING_SNAKE_CASE										=   job_links.get(A__			,  A__       )

    # A list with elements of the form (line of error, error, failed test)
    SCREAMING_SNAKE_CASE										=   [x + [y] + [job_link] for x, y in zip(A__			,  A__       )]

    return result





def 	__a     (      A__			:  Union[str, Any]			,  A__			:  Union[str, Any]=None       ):
    SCREAMING_SNAKE_CASE										=   []

    SCREAMING_SNAKE_CASE										=   [os.path.join(A__			,  A__       ) for p in os.listdir(A__       ) if p.endswith(".zip"       )]
    for p in paths:
        errors.extend(get_errors_from_single_artifact(A__			,  job_links=A__       )       )

    return errors





def 	__a     (      A__			:  List[str]			,  A__			:  Tuple=None       ):
    SCREAMING_SNAKE_CASE										=   Counter()
    counter.update([x[1] for x in logs]       )
    SCREAMING_SNAKE_CASE										=   counter.most_common()
    SCREAMING_SNAKE_CASE										=   {}
    for error, count in counts:
        if error_filter is None or error not in error_filter:
            SCREAMING_SNAKE_CASE										=   {"count": count, "failed_tests": [(x[2], x[0]) for x in logs if x[1] == error]}

    SCREAMING_SNAKE_CASE										=   dict(sorted(r.items()			,  key=lambda A__       : item[1]["count"]			,  reverse=A__       )       )
    return r





def 	__a     (      A__			:  str       ):
    SCREAMING_SNAKE_CASE										=   test.split("::"       )[0]
    if test.startswith("tests/models/"       ):
        SCREAMING_SNAKE_CASE										=   test.split("/"       )[2]
    else:
        SCREAMING_SNAKE_CASE										=   None

    return test





def 	__a     (      A__			:  List[str]			,  A__			:  Dict=None       ):
    SCREAMING_SNAKE_CASE										=   [(x[0], x[1], get_model(x[2]       )) for x in logs]
    SCREAMING_SNAKE_CASE										=   [x for x in logs if x[2] is not None]
    SCREAMING_SNAKE_CASE										=   {x[2] for x in logs}

    SCREAMING_SNAKE_CASE										=   {}
    for test in tests:
        SCREAMING_SNAKE_CASE										=   Counter()
        # count by errors in `test`
        counter.update([x[1] for x in logs if x[2] == test]       )
        SCREAMING_SNAKE_CASE										=   counter.most_common()
        SCREAMING_SNAKE_CASE										=   {error: count for error, count in counts if (error_filter is None or error not in error_filter)}
        SCREAMING_SNAKE_CASE										=   sum(error_counts.values()       )
        if n_errors > 0:
            SCREAMING_SNAKE_CASE										=   {"count": n_errors, "errors": error_counts}

    SCREAMING_SNAKE_CASE										=   dict(sorted(r.items()			,  key=lambda A__       : item[1]["count"]			,  reverse=A__       )       )
    return r





def 	__a     (      A__			:  Dict       ):
    SCREAMING_SNAKE_CASE										=   "| no. | error | status |"
    SCREAMING_SNAKE_CASE										=   "|-:|:-|:-|"
    SCREAMING_SNAKE_CASE										=   [header, sep]
    for error in reduced_by_error:
        SCREAMING_SNAKE_CASE										=   reduced_by_error[error]["count"]
        SCREAMING_SNAKE_CASE										=   F"| {count} | {error[:100]} |  |"
        lines.append(A__       )

    return "\n".join(A__       )





def 	__a     (      A__			:  Optional[Any]       ):
    SCREAMING_SNAKE_CASE										=   "| model | no. of errors | major error | count |"
    SCREAMING_SNAKE_CASE										=   "|-:|-:|-:|-:|"
    SCREAMING_SNAKE_CASE										=   [header, sep]
    for model in reduced_by_model:
        SCREAMING_SNAKE_CASE										=   reduced_by_model[model]["count"]
        SCREAMING_SNAKE_CASE							,	SCREAMING_SNAKE_CASE										=   list(reduced_by_model[model]["errors"].items()       )[0]
        SCREAMING_SNAKE_CASE										=   F"| {model} | {count} | {error[:60]} | {_count} |"
        lines.append(A__       )

    return "\n".join(A__       )


if __name__ == "__main__":
    __A			:					List[str]						=			argparse.ArgumentParser()
    # Required parameters
    parser.add_argument('--workflow_run_id', type=str, required=True, help='A GitHub Actions workflow run id.')
    parser.add_argument(
        '--output_dir',
        type=str,
        required=True,
        help='Where to store the downloaded artifacts and other result files.',
    )
    parser.add_argument('--token', default=None, type=str, help='A token that has actions:read permission.')
    __A			:					Union[str, Any]						=			parser.parse_args()

    os.makedirs(args.output_dir, exist_ok=True)

    __A			:					int						=			get_job_links(args.workflow_run_id, token=args.token)
    __A			:					Dict						=			{}
    # To deal with `workflow_call` event, where a job name is the combination of the job names in the caller and callee.
    # For example, `PyTorch 1.11 / Model tests (models/albert, single-gpu)`.
    if _job_links:
        for k, v in _job_links.items():
            # This is how GitHub actions combine job names.
            if " / " in k:
                __A			:					Union[str, Any]						=			k.find(' / ')
                __A			:					Optional[int]						=			k[index + len(' / ') :]
            __A			:					Optional[int]						=			v
    with open(os.path.join(args.output_dir, 'job_links.json'), 'w', encoding='UTF-8') as fp:
        json.dump(job_links, fp, ensure_ascii=False, indent=4)

    __A			:					int						=			get_artifacts_links(args.workflow_run_id, token=args.token)
    with open(os.path.join(args.output_dir, 'artifacts.json'), 'w', encoding='UTF-8') as fp:
        json.dump(artifacts, fp, ensure_ascii=False, indent=4)

    for idx, (name, url) in enumerate(artifacts.items()):
        download_artifact(name, url, args.output_dir, args.token)
        # Be gentle to GitHub
        time.sleep(1)

    __A			:					Optional[int]						=			get_all_errors(args.output_dir, job_links=job_links)

    # `e[1]` is the error
    __A			:					Dict						=			Counter()
    counter.update([e[1] for e in errors])

    # print the top 30 most common test errors
    __A			:					Optional[Any]						=			counter.most_common(3_0)
    for item in most_common:
        print(item)

    with open(os.path.join(args.output_dir, 'errors.json'), 'w', encoding='UTF-8') as fp:
        json.dump(errors, fp, ensure_ascii=False, indent=4)

    __A			:					str						=			reduce_by_error(errors)
    __A			:					int						=			reduce_by_model(errors)

    __A			:					Any						=			make_github_table(reduced_by_error)
    __A			:					List[str]						=			make_github_table_per_model(reduced_by_model)

    with open(os.path.join(args.output_dir, 'reduced_by_error.txt'), 'w', encoding='UTF-8') as fp:
        fp.write(sa)
    with open(os.path.join(args.output_dir, 'reduced_by_model.txt'), 'w', encoding='UTF-8') as fp:
        fp.write(sa)