


import os
from shutil import copyfile
from typing import List, Optional, Tuple

from tokenizers import processors

from ...tokenization_utils import AddedToken, BatchEncoding
from ...tokenization_utils_fast import PreTrainedTokenizerFast
from ...utils import is_sentencepiece_available, logging


if is_sentencepiece_available():
			from .tokenization_mbart import MBartTokenizer
else:
			__snake_case            =   None


__snake_case            =   logging.get_logger(__name__)


__snake_case            =   {"vocab_file": "sentencepiece.bpe.model", "tokenizer_file": "tokenizer.json"}

__snake_case            =   {
    "vocab_file": {
        "facebook/mbart-large-en-ro": (
            "https://huggingface.co/facebook/mbart-large-en-ro/resolve/main/sentencepiece.bpe.model"
        ),
        "facebook/mbart-large-cc25": (
            "https://huggingface.co/facebook/mbart-large-cc25/resolve/main/sentencepiece.bpe.model"
        ),
    },
    "tokenizer_file": {
        "facebook/mbart-large-en-ro": "https://huggingface.co/facebook/mbart-large-en-ro/resolve/main/tokenizer.json",
        "facebook/mbart-large-cc25": "https://huggingface.co/facebook/mbart-large-cc25/resolve/main/tokenizer.json",
    },
}

__snake_case            =   {
    "facebook/mbart-large-en-ro": 1_024,
    "facebook/mbart-large-cc25": 1_024,
}

# fmt: off
__snake_case            =   ["ar_AR", "cs_CZ", "de_DE", "en_XX", "es_XX", "et_EE", "fi_FI", "fr_XX", "gu_IN", "hi_IN", "it_IT", "ja_XX", "kk_KZ", "ko_KR", "lt_LT", "lv_LV", "my_MM", "ne_NP", "nl_XX", "ro_RO", "ru_RU", "si_LK", "tr_TR", "vi_VN", "zh_CN"]




class    UpperCAmelCase					(       __snake_case    ):
			lowercase						= VOCAB_FILES_NAMES
			lowercase						= PRETRAINED_POSITIONAL_EMBEDDINGS_SIZES
			lowercase						= PRETRAINED_VOCAB_FILES_MAP
			lowercase						= ["""input_ids""", """attention_mask"""]
			lowercase						= MBartTokenizer

			lowercase						= []
			lowercase						= []




			def __init__(						self							:		Optional[int]       ,       __magic_name__							:		str=None       ,       __magic_name__							:		Optional[int]=None       ,       __magic_name__							:		Dict="<s>"       ,       __magic_name__							:		Union[str, Any]="</s>"       ,       __magic_name__							:		List[str]="</s>"       ,       __magic_name__							:		Optional[int]="<s>"       ,       __magic_name__							:		int="<unk>"       ,       __magic_name__							:		str="<pad>"       ,       __magic_name__							:		List[str]="<mask>"       ,       __magic_name__							:		Tuple=None       ,       __magic_name__							:		Dict=None       ,       __magic_name__							:		Dict=None       ,       **__magic_name__							:		Tuple       ,       ):







						"""simple docstring"""







						UpperCamelCase         =					AddedToken(__magic_name__       ,       lstrip=__magic_name__       ,       rstrip=__magic_name__						) if isinstance(__magic_name__       ,       __magic_name__						) else mask_token

						super().__init__(
						    vocab_file=__magic_name__       ,       tokenizer_file=__magic_name__       ,       bos_token=__magic_name__       ,       eos_token=__magic_name__       ,       sep_token=__magic_name__       ,       cls_token=__magic_name__       ,       unk_token=__magic_name__       ,       pad_token=__magic_name__       ,       mask_token=__magic_name__       ,       src_lang=__magic_name__       ,       tgt_lang=__magic_name__       ,       additional_special_tokens=__magic_name__       ,       **__magic_name__       ,       )

						UpperCamelCase         =					vocab_file
						UpperCamelCase         =					False if not self.vocab_file else True

						UpperCamelCase         =					FAIRSEQ_LANGUAGE_CODES.copy()

						if additional_special_tokens is not None:
									# Only add those special tokens if they are not already there.
									_additional_special_tokens.extend(
									    [t for t in additional_special_tokens if t not in _additional_special_tokens]						)

						self.add_special_tokens({"""additional_special_tokens""": _additional_special_tokens}						)
						UpperCamelCase         =					{
						    lang_code: self.convert_tokens_to_ids(__magic_name__						) for lang_code in FAIRSEQ_LANGUAGE_CODES
						}

						UpperCamelCase         =					src_lang if src_lang is not None else """en_XX"""
						UpperCamelCase         =					self.convert_tokens_to_ids(self._src_lang						)
						UpperCamelCase         =					tgt_lang
						self.set_src_lang_special_tokens(self._src_lang						)




			@property
			def   lowerCamelCase_					(						self							:		int						):







						"""simple docstring"""







						return self._src_lang




			@src_lang.setter
			def   lowerCamelCase_					(						self							:		List[str]       ,       __magic_name__							:		str						):







						"""simple docstring"""







						UpperCamelCase         =					new_src_lang
						self.set_src_lang_special_tokens(self._src_lang						)




			def   lowerCamelCase_					(						self							:		Optional[Any]       ,       __magic_name__							:		List[int]       ,       __magic_name__							:		Optional[List[int]] = None						):







						"""simple docstring"""







						if token_ids_a is None:
									return self.prefix_tokens + token_ids_a + self.suffix_tokens
						# We don't expect to process pairs, but leave the pair logic for API consistency
						return self.prefix_tokens + token_ids_a + token_ids_a + self.suffix_tokens




			def   lowerCamelCase_					(						self							:		int       ,       __magic_name__							:		List[int]       ,       __magic_name__							:		Optional[List[int]] = None						):







						"""simple docstring"""







						UpperCamelCase         =					[self.sep_token_id]
						UpperCamelCase         =					[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 + sep + token_ids_a + sep						) * [0]




			def   lowerCamelCase_					(						self							:		int       ,       __magic_name__							:		List[Any]       ,       __magic_name__							:		str       ,       __magic_name__							:		Optional[str]       ,       __magic_name__							:		Optional[str]       ,       **__magic_name__							:		Tuple						):







						"""simple docstring"""







						if src_lang is None or tgt_lang is None:
									raise ValueError("""Translation requires a `src_lang` and a `tgt_lang` for this model"""						)
						UpperCamelCase         =					src_lang
						UpperCamelCase         =					self(__magic_name__       ,       add_special_tokens=__magic_name__       ,       return_tensors=__magic_name__       ,       **__magic_name__						)
						UpperCamelCase         =					self.convert_tokens_to_ids(__magic_name__						)
						UpperCamelCase         =					tgt_lang_id
						return inputs




			def   lowerCamelCase_					(						self							:		Dict       ,       __magic_name__							:		List[str]       ,       __magic_name__							:		str = "en_XX"       ,       __magic_name__							:		Optional[List[str]] = None       ,       __magic_name__							:		str = "ro_RO"       ,       **__magic_name__							:		int       ,       ):







						"""simple docstring"""







						UpperCamelCase         =					src_lang
						UpperCamelCase         =					tgt_lang
						return super().prepare_seqaseq_batch(__magic_name__       ,       __magic_name__       ,       **__magic_name__						)




			def   lowerCamelCase_					(						self							:		Dict						):







						"""simple docstring"""







						return self.set_src_lang_special_tokens(self.src_lang						)




			def   lowerCamelCase_					(						self							:		Any						):







						"""simple docstring"""







						return self.set_tgt_lang_special_tokens(self.tgt_lang						)




			def   lowerCamelCase_					(						self							:		int       ,       __magic_name__							:		Union[str, Any]						):







						"""simple docstring"""







						UpperCamelCase         =					self.convert_tokens_to_ids(__magic_name__						)
						UpperCamelCase         =					[]
						UpperCamelCase         =					[self.eos_token_id, self.cur_lang_code]

						UpperCamelCase         =					self.convert_ids_to_tokens(self.prefix_tokens						)
						UpperCamelCase         =					self.convert_ids_to_tokens(self.suffix_tokens						)

						UpperCamelCase         =					processors.TemplateProcessing(
						    single=prefix_tokens_str + ["""$A"""] + suffix_tokens_str       ,       pair=prefix_tokens_str + ["""$A""", """$B"""] + suffix_tokens_str       ,       special_tokens=list(zip(prefix_tokens_str + suffix_tokens_str       ,       self.prefix_tokens + self.suffix_tokens						)						)       ,       )




			def   lowerCamelCase_					(						self							:		Tuple       ,       __magic_name__							:		str						):







						"""simple docstring"""







						UpperCamelCase         =					self.convert_tokens_to_ids(__magic_name__						)
						UpperCamelCase         =					[]
						UpperCamelCase         =					[self.eos_token_id, self.cur_lang_code]

						UpperCamelCase         =					self.convert_ids_to_tokens(self.prefix_tokens						)
						UpperCamelCase         =					self.convert_ids_to_tokens(self.suffix_tokens						)

						UpperCamelCase         =					processors.TemplateProcessing(
						    single=prefix_tokens_str + ["""$A"""] + suffix_tokens_str       ,       pair=prefix_tokens_str + ["""$A""", """$B"""] + suffix_tokens_str       ,       special_tokens=list(zip(prefix_tokens_str + suffix_tokens_str       ,       self.prefix_tokens + self.suffix_tokens						)						)       ,       )





			def   lowerCamelCase_					(						self							:		Any       ,       __magic_name__							:		str       ,       __magic_name__							:		Optional[str] = None						):







						"""simple docstring"""







						if not self.can_save_slow_tokenizer:
									raise ValueError(
									    """Your fast tokenizer does not have the necessary information to save the vocabulary for a slow """
									    """tokenizer."""						)

						if not os.path.isdir(__magic_name__						):
									logger.error(F'Vocabulary path ({save_directory}) should be a directory.'						)
									return
						UpperCamelCase         =					os.path.join(
						    __magic_name__       ,       (filename_prefix + """-""" if filename_prefix else """""") + VOCAB_FILES_NAMES["""vocab_file"""]						)

						if os.path.abspath(self.vocab_file						) != os.path.abspath(__magic_name__						):
									copyfile(self.vocab_file       ,       __magic_name__						)

						return (out_vocab_file,)








import warnings
from typing import List, Optional, Union

from ...image_utils import ImageInput
from ...processing_utils import ProcessorMixin
from ...tokenization_utils_base import BatchEncoding, PaddingStrategy, PreTokenizedInput, TextInput, TruncationStrategy
from ...utils import TensorType




class    UpperCAmelCase					(       __snake_case    ):
			lowercase						= ["""image_processor""", """tokenizer"""]
			lowercase						= """FlavaImageProcessor"""
			lowercase						= ("""BertTokenizer""", """BertTokenizerFast""")




			def __init__(						self							:		Optional[int]       ,       __magic_name__							:		Optional[int]=None       ,       __magic_name__							:		str=None       ,       **__magic_name__							:		Any						):







						"""simple docstring"""







						UpperCamelCase         =					None
						if "feature_extractor" in kwargs:
									warnings.warn(
									    """The `feature_extractor` argument is deprecated and will be removed in v5, use `image_processor`"""
									    """ instead."""       ,       __magic_name__       ,       )
									UpperCamelCase         =					kwargs.pop("""feature_extractor"""						)

						UpperCamelCase         =					image_processor if image_processor is not None else feature_extractor
						if image_processor is None:
									raise ValueError("""You need to specify an `image_processor`."""						)
						if tokenizer is None:
									raise ValueError("""You need to specify a `tokenizer`."""						)

						super().__init__(__magic_name__       ,       __magic_name__						)
						UpperCamelCase         =					self.image_processor




			def __call__(						self							:		int       ,       __magic_name__							:		Optional[ImageInput] = None       ,       __magic_name__							:		Optional[Union[TextInput, PreTokenizedInput, List[TextInput], List[PreTokenizedInput]]] = None       ,       __magic_name__							:		bool = True       ,       __magic_name__							:		Union[bool, str, PaddingStrategy] = False       ,       __magic_name__							:		Union[bool, str, TruncationStrategy] = False       ,       __magic_name__							:		Optional[int] = None       ,       __magic_name__							:		int = 0       ,       __magic_name__							:		Optional[int] = None       ,       __magic_name__							:		Optional[bool] = None       ,       __magic_name__							:		Optional[bool] = None       ,       __magic_name__							:		Optional[bool] = None       ,       __magic_name__							:		Optional[bool] = None       ,       __magic_name__							:		bool = False       ,       __magic_name__							:		bool = False       ,       __magic_name__							:		bool = False       ,       __magic_name__							:		bool = False       ,       __magic_name__							:		bool = True       ,       __magic_name__							:		Optional[Union[str, TensorType]] = None       ,       **__magic_name__							:		str       ,       ):







						"""simple docstring"""







						if text is None and images is None:
									raise ValueError("""You have to specify either text or images. Both cannot be none."""						)

						if text is not None:
									UpperCamelCase         =					self.tokenizer(
									    text=__magic_name__       ,       add_special_tokens=__magic_name__       ,       padding=__magic_name__       ,       truncation=__magic_name__       ,       max_length=__magic_name__       ,       stride=__magic_name__       ,       pad_to_multiple_of=__magic_name__       ,       return_token_type_ids=__magic_name__       ,       return_attention_mask=__magic_name__       ,       return_overflowing_tokens=__magic_name__       ,       return_special_tokens_mask=__magic_name__       ,       return_offsets_mapping=__magic_name__       ,       return_length=__magic_name__       ,       verbose=__magic_name__       ,       return_tensors=__magic_name__       ,       **__magic_name__       ,       )
						if images is not None:
									UpperCamelCase         =					self.image_processor(
									    __magic_name__       ,       return_image_mask=__magic_name__       ,       return_codebook_pixels=__magic_name__       ,       return_tensors=__magic_name__       ,       **__magic_name__       ,       )

						if text is not None and images is not None:
									encoding.update(__magic_name__						)
									return encoding
						elif text is not None:
									return encoding
						else:
									return BatchEncoding(data=dict(**__magic_name__						)       ,       tensor_type=__magic_name__						)




			def   lowerCamelCase_					(						self							:		Tuple       ,       *__magic_name__							:		Dict       ,       **__magic_name__							:		List[Any]						):







						"""simple docstring"""







						return self.tokenizer.batch_decode(*__magic_name__       ,       **__magic_name__						)




			def   lowerCamelCase_					(						self							:		int       ,       *__magic_name__							:		Tuple       ,       **__magic_name__							:		Optional[Any]						):







						"""simple docstring"""







						return self.tokenizer.decode(*__magic_name__       ,       **__magic_name__						)




			@property
			def   lowerCamelCase_					(						self							:		Tuple						):







						"""simple docstring"""







						UpperCamelCase         =					self.tokenizer.model_input_names
						UpperCamelCase         =					self.image_processor.model_input_names
						return list(dict.fromkeys(tokenizer_input_names + image_processor_input_names						)						)




			@property
			def   lowerCamelCase_					(						self							:		int						):







						"""simple docstring"""







						warnings.warn(
						    """`feature_extractor_class` is deprecated and will be removed in v5. Use `image_processor_class` instead."""       ,       __magic_name__       ,       )
						return self.image_processor_class





			@property
			def   lowerCamelCase_					(						self							:		Tuple						):







						"""simple docstring"""







						warnings.warn(
						    """`feature_extractor` is deprecated and will be removed in v5. Use `image_processor` instead."""       ,       __magic_name__       ,       )
						return self.image_processor




