





from google.protobuf import descriptor as _descriptor
from google.protobuf import descriptor_pool as _descriptor_pool
from google.protobuf import symbol_database as _symbol_database
from google.protobuf.internal import builder as _builder


# @@protoc_insertion_point(imports)

_UpperCAmelCase        =				_symbol_database.Default()


_UpperCAmelCase        =				_descriptor_pool.Default().AddSerializedFile(
    b'\n\x19sentencepiece_model.proto\x12\rsentencepiece"\x80\x0c\n\x0bTrainerSpec\x12\r\n\x05input\x18\x01 \x03(\t\x12\x14\n\x0cinput_format\x18\x07 \x01(\t\x12\x14\n\x0cmodel_prefix\x18\x02 \x01(\t\x12\x41\n\nmodel_type\x18\x03 \x01(\x0e\x32$.sentencepiece.TrainerSpec.ModelType:\x07UNIGRAM\x12\x18\n\nvocab_size\x18\x04 \x01(\x05:\x04\x38\x30\x30\x30\x12\x17\n\x0f\x61\x63\x63\x65pt_language\x18\x05 \x03(\t\x12 \n\x15self_test_sample_size\x18\x06 \x01(\x05:\x01\x30\x12*\n\x1b\x65nable_differential_privacy\x18\x32 \x01(\x08:\x05\x66\x61lse\x12+\n differential_privacy_noise_level\x18\x33 \x01(\x02:\x01\x30\x12\x32\n\'differential_privacy_clipping_threshold\x18\x34 \x01(\x04:\x01\x30\x12"\n\x12\x63haracter_coverage\x18\n \x01(\x02:\x06\x30.9995\x12\x1e\n\x13input_sentence_size\x18\x0b \x01(\x04:\x01\x30\x12$\n\x16shuffle_input_sentence\x18\x13 \x01(\x08:\x04true\x12 \n\x14mining_sentence_size\x18\x0c \x01(\x05\x42\x02\x18\x01\x12"\n\x16training_sentence_size\x18\r \x01(\x05\x42\x02\x18\x01\x12(\n\x17seed_sentencepiece_size\x18\x0e \x01(\x05:\x07\x31\x30\x30\x30\x30\x30\x30\x12\x1e\n\x10shrinking_factor\x18\x0f \x01(\x02:\x04\x30.75\x12!\n\x13max_sentence_length\x18\x12 \x01(\x05:\x04\x34\x31\x39\x32\x12\x17\n\x0bnum_threads\x18\x10 \x01(\x05:\x02\x31\x36\x12\x1d\n\x12num_sub_iterations\x18\x11 \x01(\x05:\x01\x32\x12$\n\x18max_sentencepiece_length\x18\x14 \x01(\x05:\x02\x31\x36\x12%\n\x17split_by_unicode_script\x18\x15 \x01(\x08:\x04true\x12\x1d\n\x0fsplit_by_number\x18\x17 \x01(\x08:\x04true\x12!\n\x13split_by_whitespace\x18\x16 \x01(\x08:\x04true\x12)\n\x1atreat_whitespace_as_suffix\x18\x18 \x01(\x08:\x05\x66\x61lse\x12+\n\x1c\x61llow_whitespace_only_pieces\x18\x1a \x01(\x08:\x05\x66\x61lse\x12\x1b\n\x0csplit_digits\x18\x19 \x01(\x08:\x05\x66\x61lse\x12#\n\x19pretokenization_delimiter\x18\x35 \x01(\t:\x00\x12\x17\n\x0f\x63ontrol_symbols\x18\x1e \x03(\t\x12\x1c\n\x14user_defined_symbols\x18\x1f \x03(\t\x12\x16\n\x0erequired_chars\x18$ \x01(\t\x12\x1c\n\rbyte_fallback\x18# \x01(\x08:\x05\x66\x61lse\x12+\n\x1dvocabulary_output_piece_score\x18  \x01(\x08:\x04true\x12\x1e\n\x10hard_vocab_limit\x18! \x01(\x08:\x04true\x12\x1c\n\ruse_all_vocab\x18" \x01(\x08:\x05\x66\x61lse\x12\x11\n\x06unk_id\x18( \x01(\x05:\x01\x30\x12\x11\n\x06\x62os_id\x18) \x01(\x05:\x01\x31\x12\x11\n\x06\x65os_id\x18* \x01(\x05:\x01\x32\x12\x12\n\x06pad_id\x18+ \x01(\x05:\x02-1\x12\x18\n\tunk_piece\x18- \x01(\t:\x05<unk>\x12\x16\n\tbos_piece\x18. \x01(\t:\x03<s>\x12\x17\n\teos_piece\x18/ \x01(\t:\x04</s>\x12\x18\n\tpad_piece\x18\x30 \x01(\t:\x05<pad>\x12\x1a\n\x0bunk_surface\x18, \x01(\t:\x05 \xe2\x81\x87 \x12+\n\x1ctrain_extremely_large_corpus\x18\x31 \x01(\x08:\x05\x66\x61lse"5\n\tModelType\x12\x0b\n\x07UNIGRAM\x10\x01\x12\x07\n\x03\x42PE\x10\x02\x12\x08\n\x04WORD\x10\x03\x12\x08\n\x04\x43HAR\x10\x04*\t\x08\xc8\x01\x10\x80\x80\x80\x80\x02"\xd1\x01\n\x0eNormalizerSpec\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x1c\n\x14precompiled_charsmap\x18\x02 \x01(\x0c\x12\x1e\n\x10\x61\x64\x64_dummy_prefix\x18\x03 \x01(\x08:\x04true\x12&\n\x18remove_extra_whitespaces\x18\x04 \x01(\x08:\x04true\x12 \n\x12\x65scape_whitespaces\x18\x05 \x01(\x08:\x04true\x12\x1e\n\x16normalization_rule_tsv\x18\x06 \x01(\t*\t\x08\xc8\x01\x10\x80\x80\x80\x80\x02"y\n\x0cSelfTestData\x12\x33\n\x07samples\x18\x01 \x03(\x0b\x32".sentencepiece.SelfTestData.Sample\x1a)\n\x06Sample\x12\r\n\x05input\x18\x01 \x01(\t\x12\x10\n\x08\x65xpected\x18\x02 \x01(\t*\t\x08\xc8\x01\x10\x80\x80\x80\x80\x02"\xfe\x03\n\nModelProto\x12\x37\n\x06pieces\x18\x01 \x03(\x0b\x32\'.sentencepiece.ModelProto.SentencePiece\x12\x30\n\x0ctrainer_spec\x18\x02 \x01(\x0b\x32\x1a.sentencepiece.TrainerSpec\x12\x36\n\x0fnormalizer_spec\x18\x03 \x01(\x0b\x32\x1d.sentencepiece.NormalizerSpec\x12\x33\n\x0eself_test_data\x18\x04 \x01(\x0b\x32\x1b.sentencepiece.SelfTestData\x12\x38\n\x11\x64\x65normalizer_spec\x18\x05 \x01(\x0b\x32\x1d.sentencepiece.NormalizerSpec\x1a\xd2\x01\n\rSentencePiece\x12\r\n\x05piece\x18\x01 \x01(\t\x12\r\n\x05score\x18\x02 \x01(\x02\x12\x42\n\x04type\x18\x03 \x01(\x0e\x32,.sentencepiece.ModelProto.SentencePiece.Type:\x06NORMAL"T\n\x04Type\x12\n\n\x06NORMAL\x10\x01\x12\x0b\n\x07UNKNOWN\x10\x02\x12\x0b\n\x07\x43ONTROL\x10\x03\x12\x10\n\x0cUSER_DEFINED\x10\x04\x12\x08\n\x04\x42YTE\x10\x06\x12\n\n\x06UNUSED\x10\x05*\t\x08\xc8\x01\x10\x80\x80\x80\x80\x02*\t\x08\xc8\x01\x10\x80\x80\x80\x80\x02\x42\x02H\x03'
)

_UpperCAmelCase        =				globals()
_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals)
_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'sentencepiece_model_pb2', _globals)
if _descriptor._USE_C_DESCRIPTORS is False:
     _UpperCAmelCase        =				None
     _UpperCAmelCase        =				b'H\003'
     # (generated by protobuf compiler, but `_TRAINERSPEC` is not defined)
     # _TRAINERSPEC.fields_by_name["mining_sentence_size"]._options = None
     # _TRAINERSPEC.fields_by_name["mining_sentence_size"]._serialized_options = b"\030\001"
     # _TRAINERSPEC.fields_by_name["training_sentence_size"]._options = None
     # _TRAINERSPEC.fields_by_name["training_sentence_size"]._serialized_options = b"\030\001"
     _UpperCAmelCase        =				4_5
     _UpperCAmelCase        =				1_5_8_1
     _UpperCAmelCase        =				1_5_1_7
     _UpperCAmelCase        =				1_5_7_0
     _UpperCAmelCase        =				1_5_8_4
     _UpperCAmelCase        =				1_7_9_3
     _UpperCAmelCase        =				1_7_9_5
     _UpperCAmelCase        =				1_9_1_6
     _UpperCAmelCase        =				1_8_6_4
     _UpperCAmelCase        =				1_9_0_5
     _UpperCAmelCase        =				1_9_1_9
     _UpperCAmelCase        =				2_4_2_9
     _UpperCAmelCase        =				2_2_0_8
     _UpperCAmelCase        =				2_4_1_8
     _UpperCAmelCase        =				2_3_2_3
     _UpperCAmelCase        =				2_4_0_7
# @@protoc_insertion_point(module_scope)








import os
import unicodedata
from shutil import copyfile
from typing import Any, Dict, List, Optional, Tuple

import sentencepiece as spm

from ...tokenization_utils import AddedToken, PreTrainedTokenizer
from ...utils import SPIECE_UNDERLINE, logging


_UpperCAmelCase        =				logging.get_logger(__name__)

_UpperCAmelCase        =				{'vocab_file': 'spiece.model'}

_UpperCAmelCase        =				{
    'vocab_file': {
        'xlnet-base-cased': 'https://huggingface.co/xlnet-base-cased/resolve/main/spiece.model',
        'xlnet-large-cased': 'https://huggingface.co/xlnet-large-cased/resolve/main/spiece.model',
    }
}

_UpperCAmelCase        =				{
    'xlnet-base-cased': None,
    'xlnet-large-cased': None,
}

# Segments (not really needed)
_UpperCAmelCase        =				0
_UpperCAmelCase        =				1
_UpperCAmelCase        =				2
_UpperCAmelCase        =				3
_UpperCAmelCase        =				4



class 							_UpperCamelCase					(	lowerCAmelCase_     ):
       _UpperCamelCase				:					List[str]         =   VOCAB_FILES_NAMES
       _UpperCamelCase				:					int         =   PRETRAINED_VOCAB_FILES_MAP
       _UpperCamelCase				:					Any         =   PRETRAINED_POSITIONAL_EMBEDDINGS_SIZES
       _UpperCamelCase				:					Dict         =   '''left'''

       def __init__(		self: Optional[int]					,   _SCREAMING_SNAKE_CASE: Dict					,   _SCREAMING_SNAKE_CASE: Optional[int]=False					,   _SCREAMING_SNAKE_CASE: List[Any]=True					,   _SCREAMING_SNAKE_CASE: List[str]=False					,   _SCREAMING_SNAKE_CASE: Any="<s>"					,   _SCREAMING_SNAKE_CASE: Dict="</s>"					,   _SCREAMING_SNAKE_CASE: List[str]="<unk>"					,   _SCREAMING_SNAKE_CASE: Tuple="<sep>"					,   _SCREAMING_SNAKE_CASE: Optional[int]="<pad>"					,   _SCREAMING_SNAKE_CASE: int="<cls>"					,   _SCREAMING_SNAKE_CASE: Optional[Any]="<mask>"					,   _SCREAMING_SNAKE_CASE: List[str]=["<eop>", "<eod>"]					,   _SCREAMING_SNAKE_CASE: Optional[Dict[str, Any]] = None					,   **_SCREAMING_SNAKE_CASE: Optional[Any]					,   )       -> None:




              """simple docstring"""


              UpperCamelCase_          =  AddedToken(_SCREAMING_SNAKE_CASE					,   lstrip=_SCREAMING_SNAKE_CASE					,   rstrip=_SCREAMING_SNAKE_CASE		) if isinstance(_SCREAMING_SNAKE_CASE					,   _SCREAMING_SNAKE_CASE		) else mask_token

              UpperCamelCase_          =  {} if sp_model_kwargs is None else sp_model_kwargs

              super().__init__(
                  do_lower_case=_SCREAMING_SNAKE_CASE					,   remove_space=_SCREAMING_SNAKE_CASE					,   keep_accents=_SCREAMING_SNAKE_CASE					,   bos_token=_SCREAMING_SNAKE_CASE					,   eos_token=_SCREAMING_SNAKE_CASE					,   unk_token=_SCREAMING_SNAKE_CASE					,   sep_token=_SCREAMING_SNAKE_CASE					,   pad_token=_SCREAMING_SNAKE_CASE					,   cls_token=_SCREAMING_SNAKE_CASE					,   mask_token=_SCREAMING_SNAKE_CASE					,   additional_special_tokens=_SCREAMING_SNAKE_CASE					,   sp_model_kwargs=self.sp_model_kwargs					,   **_SCREAMING_SNAKE_CASE					,   )

              UpperCamelCase_          =  3

              UpperCamelCase_          =  do_lower_case
              UpperCamelCase_          =  remove_space
              UpperCamelCase_          =  keep_accents
              UpperCamelCase_          =  vocab_file

              UpperCamelCase_          =  spm.SentencePieceProcessor(**self.sp_model_kwargs		)
              self.sp_model.Load(_SCREAMING_SNAKE_CASE		)

       @property
       def lowercase (		self: List[Any]		)       -> Dict:




              """simple docstring"""


              return len(self.sp_model		)

       def lowercase (		self: List[Any]		)       -> int:




              """simple docstring"""


              UpperCamelCase_          =  {self.convert_ids_to_tokens(_SCREAMING_SNAKE_CASE		): i for i in range(self.vocab_size		)}
              vocab.update(self.added_tokens_encoder		)
              return vocab

       def __getstate__(		self: int		)       -> Optional[int]:




              """simple docstring"""


              UpperCamelCase_          =  self.__dict__.copy()
              UpperCamelCase_          =  None
              return state

       def __setstate__(		self: Union[str, Any]					,   _SCREAMING_SNAKE_CASE: Optional[int]		)       -> Optional[int]:




              """simple docstring"""


              UpperCamelCase_          =  d

              # for backward compatibility
              if not hasattr(self					,   "sp_model_kwargs"		):
                     UpperCamelCase_          =  {}

              UpperCamelCase_          =  spm.SentencePieceProcessor(**self.sp_model_kwargs		)
              self.sp_model.Load(self.vocab_file		)

       def lowercase (		self: Any					,   _SCREAMING_SNAKE_CASE: List[str]		)       -> int:




              """simple docstring"""


              if self.remove_space:
                     UpperCamelCase_          =  " ".join(inputs.strip().split()		)
              else:
                     UpperCamelCase_          =  inputs
              UpperCamelCase_          =  outputs.replace("``"					,   "\""		).replace("''"					,   "\""		)

              if not self.keep_accents:
                     UpperCamelCase_          =  unicodedata.normalize("NFKD"					,   _SCREAMING_SNAKE_CASE		)
                     UpperCamelCase_          =  "".join([c for c in outputs if not unicodedata.combining(_SCREAMING_SNAKE_CASE		)]		)
              if self.do_lower_case:
                     UpperCamelCase_          =  outputs.lower()

              return outputs

       def lowercase (		self: Optional[Any]					,   _SCREAMING_SNAKE_CASE: str		)       -> List[str]:




              """simple docstring"""


              UpperCamelCase_          =  self.preprocess_text(_SCREAMING_SNAKE_CASE		)
              UpperCamelCase_          =  self.sp_model.encode(_SCREAMING_SNAKE_CASE					,   out_type=_SCREAMING_SNAKE_CASE		)
              UpperCamelCase_          =  []
              for piece in pieces:
                     if len(_SCREAMING_SNAKE_CASE		) > 1 and piece[-1] == str(","		) and piece[-2].isdigit():
                            UpperCamelCase_          =  self.sp_model.EncodeAsPieces(piece[:-1].replace(_SCREAMING_SNAKE_CASE					,   ""		)		)
                            if piece[0] != SPIECE_UNDERLINE and cur_pieces[0][0] == SPIECE_UNDERLINE:
                                   if len(cur_pieces[0]		) == 1:
                                          UpperCamelCase_          =  cur_pieces[1:]
                                   else:
                                          UpperCamelCase_          =  cur_pieces[0][1:]
                            cur_pieces.append(piece[-1]		)
                            new_pieces.extend(_SCREAMING_SNAKE_CASE		)
                     else:
                            new_pieces.append(_SCREAMING_SNAKE_CASE		)

              return new_pieces

       def lowercase (		self: Optional[int]					,   _SCREAMING_SNAKE_CASE: str		)       -> Any:




              """simple docstring"""


              return self.sp_model.PieceToId(_SCREAMING_SNAKE_CASE		)

       def lowercase (		self: List[Any]					,   _SCREAMING_SNAKE_CASE: Optional[Any]		)       -> str:




              """simple docstring"""


              return self.sp_model.IdToPiece(_SCREAMING_SNAKE_CASE		)

       def lowercase (		self: List[Any]					,   _SCREAMING_SNAKE_CASE: Tuple		)       -> Any:




              """simple docstring"""


              UpperCamelCase_          =  "".join(_SCREAMING_SNAKE_CASE		).replace(_SCREAMING_SNAKE_CASE					,   " "		).strip()
              return out_string

       def lowercase (		self: int					,   _SCREAMING_SNAKE_CASE: List[int]					,   _SCREAMING_SNAKE_CASE: bool = False					,   _SCREAMING_SNAKE_CASE: bool = None					,   _SCREAMING_SNAKE_CASE: bool = True					,   **_SCREAMING_SNAKE_CASE: Dict					,   )       -> str:




              """simple docstring"""


              UpperCamelCase_          =  kwargs.pop("use_source_tokenizer"					,   _SCREAMING_SNAKE_CASE		)

              UpperCamelCase_          =  self.convert_ids_to_tokens(_SCREAMING_SNAKE_CASE					,   skip_special_tokens=_SCREAMING_SNAKE_CASE		)

              # To avoid mixing byte-level and unicode for byte-level BPT
              # we need to build string separately for added tokens and byte-level tokens
              # cf. https://github.com/huggingface/transformers/issues/1133
              UpperCamelCase_          =  []
              UpperCamelCase_          =  []
              for token in filtered_tokens:
                     if skip_special_tokens and token in self.all_special_ids:
                            continue
                     if token in self.added_tokens_encoder:
                            if current_sub_text:
                                   sub_texts.append(self.convert_tokens_to_string(_SCREAMING_SNAKE_CASE		)		)
                                   UpperCamelCase_          =  []
                            sub_texts.append(_SCREAMING_SNAKE_CASE		)
                     else:
                            current_sub_text.append(_SCREAMING_SNAKE_CASE		)
              if current_sub_text:
                     sub_texts.append(self.convert_tokens_to_string(_SCREAMING_SNAKE_CASE		)		)

              # Mimic the behavior of the Rust tokenizer:
              # By default, there are no spaces between special tokens
              UpperCamelCase_          =  "".join(_SCREAMING_SNAKE_CASE		)

              UpperCamelCase_          =  (
                  clean_up_tokenization_spaces
                  if clean_up_tokenization_spaces is not None
                  else self.clean_up_tokenization_spaces
              )
              if clean_up_tokenization_spaces:
                     UpperCamelCase_          =  self.clean_up_tokenization(_SCREAMING_SNAKE_CASE		)
                     return clean_text
              else:
                     return text

       def lowercase (		self: List[Any]					,   _SCREAMING_SNAKE_CASE: List[int]					,   _SCREAMING_SNAKE_CASE: Optional[List[int]] = None		)       -> List[int]:




              """simple docstring"""


              UpperCamelCase_          =  [self.sep_token_id]
              UpperCamelCase_          =  [self.cls_token_id]
              if token_ids_a is None:
                     return token_ids_a + sep + cls
              return token_ids_a + sep + token_ids_a + sep + cls

       def lowercase (		self: Dict					,   _SCREAMING_SNAKE_CASE: List[int]					,   _SCREAMING_SNAKE_CASE: Optional[List[int]] = None					,   _SCREAMING_SNAKE_CASE: bool = False		)       -> List[int]:




              """simple docstring"""


              if already_has_special_tokens:
                     return super().get_special_tokens_mask(
                         token_ids_a=_SCREAMING_SNAKE_CASE					,   token_ids_a=_SCREAMING_SNAKE_CASE					,   already_has_special_tokens=_SCREAMING_SNAKE_CASE		)

              if token_ids_a is not None:
                     return ([0] * len(_SCREAMING_SNAKE_CASE		)) + [1] + ([0] * len(_SCREAMING_SNAKE_CASE		)) + [1, 1]
              return ([0] * len(_SCREAMING_SNAKE_CASE		)) + [1, 1]

       def lowercase (		self: Optional[int]					,   _SCREAMING_SNAKE_CASE: List[int]					,   _SCREAMING_SNAKE_CASE: Optional[List[int]] = None		)       -> List[int]:




              """simple docstring"""


              UpperCamelCase_          =  [self.sep_token_id]
              UpperCamelCase_          =  [2]

              if token_ids_a is None:
                     return len(token_ids_a + sep		) * [0] + cls_segment_id
              return len(token_ids_a + sep		) * [0] + len(token_ids_a + sep		) * [1] + cls_segment_id



       def lowercase (		self: Optional[int]					,   _SCREAMING_SNAKE_CASE: str					,   _SCREAMING_SNAKE_CASE: Optional[str] = None		)       -> Tuple[str]:




              """simple docstring"""


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

              if os.path.abspath(self.vocab_file		) != os.path.abspath(_SCREAMING_SNAKE_CASE		) and os.path.isfile(self.vocab_file		):
                     copyfile(self.vocab_file					,   _SCREAMING_SNAKE_CASE		)
              elif not os.path.isfile(self.vocab_file		):
                     with open(_SCREAMING_SNAKE_CASE					,   "wb"		) as fi:
                            UpperCamelCase_          =  self.sp_model.serialized_model_proto()
                            fi.write(_SCREAMING_SNAKE_CASE		)

              return (out_vocab_file,)

