






import argparse
import os

# New Code #
import evaluate
import torch
from datasets import load_dataset
from torch.optim import AdamW
from torch.utils.data import DataLoader
from transformers import AutoModelForSequenceClassification, AutoTokenizer, get_linear_schedule_with_warmup, set_seed

from accelerate import Accelerator, DistributedType
from accelerate.utils import find_executable_batch_size


########################################################################
# This is a fully working simple example to use Accelerate,
# specifically showcasing how to ensure out-of-memory errors never
# interrupt training, and builds off the `nlp_example.py` script.
#
# This example trains a Bert base model on GLUE MRPC
# in any of the following settings (with the same script):
#   - single CPU or single GPU
#   - multi GPUS (using PyTorch distributed mode)
#   - (multi) TPUs
#   - fp16 (mixed-precision) or fp32 (normal precision)
#
# New additions from the base script can be found quickly by
# looking for the # New Code # tags
#
# To run it in each of these various modes, follow the instructions
# in the readme for examples:
# https://github.com/huggingface/accelerate/tree/main/examples
#
########################################################################


a						:			int     	=					16
a						:			Dict     	=					32






def 							lowerCamelCase__ (       __lowerCamelCase     :	Accelerator    ,						__lowerCamelCase     :	int = 16						):
  __UpperCAmelCase				:      List[str]	 =    AutoTokenizer.from_pretrained("""bert-base-cased"""						)
  __UpperCAmelCase				:      str	 =    load_dataset("""glue"""    ,						"""mrpc"""						)

  def tokenize_function(__lowerCamelCase     :	List[str]						):
    # max_length=None => use the model max length (it's actually the default)
    __UpperCAmelCase				:      Tuple	 =    tokenizer(examples["""sentence1"""]    ,						examples["""sentence2"""]    ,						truncation=__lowerCamelCase    ,						max_length=__lowerCamelCase						)
    return outputs

  # Apply the method we just defined to all the examples in all the splits of the dataset
  # starting with the main process first:
  with accelerator.main_process_first():
    __UpperCAmelCase				:      str	 =    datasets.map(
        __lowerCamelCase    ,						batched=__lowerCamelCase    ,						remove_columns=["""idx""", """sentence1""", """sentence2"""]    ,						)

  # We also rename the 'label' column to 'labels' which is the expected name for labels by the models of the
  # transformers library
  __UpperCAmelCase				:      Optional[Any]	 =    tokenized_datasets.rename_column("""label"""    ,						"""labels"""						)

  def collate_fn(__lowerCamelCase     :	str						):
    # On TPU it's best to pad everything to the same length or training will be very slow.
    __UpperCAmelCase				:      Optional[Any]	 =    128 if accelerator.distributed_type == DistributedType.TPU else None
    # When using mixed precision we want round multiples of 8/16
    if accelerator.mixed_precision == "fp8":
      __UpperCAmelCase				:      Dict	 =    16
    elif accelerator.mixed_precision != "no":
      __UpperCAmelCase				:      str	 =    8
    else:
      __UpperCAmelCase				:      Optional[Any]	 =    None

    return tokenizer.pad(
        __lowerCamelCase    ,						padding="""longest"""    ,						max_length=__lowerCamelCase    ,						pad_to_multiple_of=__lowerCamelCase    ,						return_tensors="""pt"""    ,						)

  # Instantiate dataloaders.
  __UpperCAmelCase				:      List[Any]	 =    DataLoader(
      tokenized_datasets["""train"""]    ,						shuffle=__lowerCamelCase    ,						collate_fn=__lowerCamelCase    ,						batch_size=__lowerCamelCase						)
  __UpperCAmelCase				:      Optional[int]	 =    DataLoader(
      tokenized_datasets["""validation"""]    ,						shuffle=__lowerCamelCase    ,						collate_fn=__lowerCamelCase    ,						batch_size=__lowerCamelCase						)

  return train_dataloader, eval_dataloader


# For testing only
if os.environ.get("TESTING_MOCKED_DATALOADERS", None) == "1":
       from accelerate.test_utils.training import mocked_dataloaders

       a						:			List[Any]     	=					mocked_dataloaders  # noqa: F811






def 							lowerCamelCase__ (       __lowerCamelCase     :	List[str]    ,						__lowerCamelCase     :	List[Any]						):
  # For testing only
  if os.environ.get("""TESTING_MOCKED_DATALOADERS"""    ,						__lowerCamelCase						) == "1":
    __UpperCAmelCase				:      Union[str, Any]	 =    2
  # Initialize accelerator
  __UpperCAmelCase				:      List[Any]	 =    Accelerator(cpu=args.cpu    ,						mixed_precision=args.mixed_precision						)
  # Sample hyper-parameters for learning rate, batch size, seed and a few other HPs
  __UpperCAmelCase				:      Union[str, Any]	 =    config["""lr"""]
  __UpperCAmelCase				:      Dict	 =    int(config["""num_epochs"""]						)
  __UpperCAmelCase				:      Tuple	 =    int(config["""seed"""]						)
  __UpperCAmelCase				:      Any	 =    int(config["""batch_size"""]						)

  __UpperCAmelCase				:      List[Any]	 =    evaluate.load("""glue"""    ,						"""mrpc"""						)

  # New Code #
  # We now can define an inner training loop function. It should take a batch size as the only parameter,
  # and build the dataloaders in there.
  # It also gets our decorator
  @find_executable_batch_size(starting_batch_size=__lowerCamelCase						)
  def inner_training_loop(__lowerCamelCase     :	str						):
    # And now just move everything below under this function
    # We need to bring in the Accelerator object from earlier
    nonlocal accelerator
    # And reset all of its attributes that could hold onto any memory:
    accelerator.free_memory()

    # Then we can declare the model, optimizer, and everything else:
    set_seed(__lowerCamelCase						)

    # Instantiate the model (we build the model here so that the seed also control new weights initialization)
    __UpperCAmelCase				:      Union[str, Any]	 =    AutoModelForSequenceClassification.from_pretrained("""bert-base-cased"""    ,						return_dict=__lowerCamelCase						)

    # We could avoid this line since the accelerator is set with `device_placement=True` (default value).
    # Note that if you are placing tensors on devices manually, this line absolutely needs to be before the optimizer
    # creation otherwise training will not work on TPU (`accelerate` will kindly throw an error to make us aware of that).
    __UpperCAmelCase				:      Optional[int]	 =    model.to(accelerator.device						)

    # Instantiate optimizer
    __UpperCAmelCase				:      Any	 =    AdamW(params=model.parameters()    ,						lr=__lowerCamelCase						)
    __UpperCAmelCase ,					__UpperCAmelCase				:      Optional[int]	 =    get_dataloaders(__lowerCamelCase    ,						__lowerCamelCase						)

    # Instantiate scheduler
    __UpperCAmelCase				:      str	 =    get_linear_schedule_with_warmup(
        optimizer=__lowerCamelCase    ,						num_warmup_steps=100    ,						num_training_steps=(len(__lowerCamelCase						) * num_epochs)    ,						)

    # Prepare everything
    # There is no specific order to remember, we just need to unpack the objects in the same order we gave them to the
    # prepare method.
    __UpperCAmelCase ,					__UpperCAmelCase ,					__UpperCAmelCase ,					__UpperCAmelCase ,					__UpperCAmelCase				:      Dict	 =    accelerator.prepare(
        __lowerCamelCase    ,						__lowerCamelCase    ,						__lowerCamelCase    ,						__lowerCamelCase    ,						__lowerCamelCase						)

    # Now we train the model
    for epoch in range(__lowerCamelCase						):
      model.train()
      for step, batch in enumerate(__lowerCamelCase						):
        # We could avoid this line since we set the accelerator with `device_placement=True`.
        batch.to(accelerator.device						)
        __UpperCAmelCase				:      Dict	 =    model(**__lowerCamelCase						)
        __UpperCAmelCase				:      int	 =    outputs.loss
        accelerator.backward(__lowerCamelCase						)
        optimizer.step()
        lr_scheduler.step()
        optimizer.zero_grad()

      model.eval()
      for step, batch in enumerate(__lowerCamelCase						):
        # We could avoid this line since we set the accelerator with `device_placement=True`.
        batch.to(accelerator.device						)
        with torch.no_grad():
          __UpperCAmelCase				:      List[Any]	 =    model(**__lowerCamelCase						)
        __UpperCAmelCase				:      Union[str, Any]	 =    outputs.logits.argmax(dim=-1						)
        __UpperCAmelCase ,					__UpperCAmelCase				:      Tuple	 =    accelerator.gather_for_metrics((predictions, batch["""labels"""])						)
        metric.add_batch(
            predictions=__lowerCamelCase    ,						references=__lowerCamelCase    ,						)

      __UpperCAmelCase				:      Any	 =    metric.compute()
      # Use accelerator.print to print only on the main process.
      accelerator.print(f"""epoch {epoch}:"""    ,						__lowerCamelCase						)

    # New Code #
    # And call it at the end with no arguments
    # Note: You could also refactor this outside of your training loop function
  inner_training_loop()






def 							lowerCamelCase__ (       ):
  __UpperCAmelCase				:      List[str]	 =    argparse.ArgumentParser(description="""Simple example of training script."""						)
  parser.add_argument(
      """--mixed_precision"""    ,						type=__lowerCamelCase    ,						default=__lowerCamelCase    ,						choices=["""no""", """fp16""", """bf16""", """fp8"""]    ,						help="""Whether to use mixed precision. Choose"""
      """between fp16 and bf16 (bfloat16). Bf16 requires PyTorch >= 1.10."""
      """and an Nvidia Ampere GPU."""    ,						)
  parser.add_argument("""--cpu"""    ,						action="""store_true"""    ,						help="""If passed, will train on the CPU."""						)
  __UpperCAmelCase				:      List[str]	 =    parser.parse_args()
  __UpperCAmelCase				:      Tuple	 =    {"""lr""": 2E-5, """num_epochs""": 3, """seed""": 42, """batch_size""": 16}
  training_function(__lowerCamelCase    ,						__lowerCamelCase						)


if __name__ == "__main__":
       main()









"""simple docstring"""


import json
import os
import re
import shutil
import tempfile
import unittest
from typing import Tuple

from transformers import AddedToken, BatchEncoding, PerceiverTokenizer
from transformers.utils import cached_property, is_tf_available, is_torch_available

from ...test_tokenization_common import TokenizerTesterMixin


if is_torch_available():
		__magic_name__       :					Any						=			"""pt"""
elif is_tf_available():
		__magic_name__       :					Optional[Any]						=			"""tf"""
else:
		__magic_name__       :					int						=			"""jax"""






class 							lowercase__			(   __SCREAMING_SNAKE_CASE					,     unittest.TestCase	):

			"""simple docstring"""
			__lowerCAmelCase     :				Any										=  PerceiverTokenizer
			__lowerCAmelCase     :				int										=  False







			def   _a      (      self    ):






									'''simple docstring'''







									super().setUp()
									UpperCamelCase				:		List[Any]				   =			PerceiverTokenizer()
									tokenizer.save_pretrained(self.tmpdirname    )







			@cached_property
			def   _a      (      self    ):






									'''simple docstring'''







									return PerceiverTokenizer.from_pretrained("""deepmind/language-perceiver"""    )







			def   _a      (      self						,   **_A    ):






									'''simple docstring'''







									return self.tokenizer_class.from_pretrained(self.tmpdirname						,   **_A    )







			def   _a      (      self						,   _A						,   _A=False						,   _A=2_0						,   _A=5    ):






									'''simple docstring'''







									UpperCamelCase				:		Tuple				   =			[]
									for i in range(len(_A    )    ):
															try:
																					UpperCamelCase				:		List[str]				   =			tokenizer.decode([i]						,   clean_up_tokenization_spaces=_A    )
															except UnicodeDecodeError:
																					pass
															toks.append((i, tok)    )

									UpperCamelCase				:		Dict				   =			list(filter(lambda _A    : re.match(r"""^[ a-zA-Z]+$"""						,   t[1]    )						,   _A    )    )
									UpperCamelCase				:		List[str]				   =			list(filter(lambda _A    : [t[0]] == tokenizer.encode(t[1]						,   add_special_tokens=_A    )						,   _A    )    )
									if max_length is not None and len(_A    ) > max_length:
															UpperCamelCase				:		int				   =			toks[:max_length]
									if min_length is not None and len(_A    ) < min_length and len(_A    ) > 0:
															while len(_A    ) < min_length:
																					UpperCamelCase				:		List[str]				   =			toks + toks
        # toks_str = [t[1] for t in toks]
									UpperCamelCase				:		Any				   =			[t[0] for t in toks]

									# Ensure consistency
									UpperCamelCase				:		List[str]				   =			tokenizer.decode(_A						,   clean_up_tokenization_spaces=_A    )
									if " " not in output_txt and len(_A    ) > 1:
															UpperCamelCase				:		Optional[Any]				   =			(
															    tokenizer.decode([toks_ids[0]]						,   clean_up_tokenization_spaces=_A    )
															    + """ """
															    + tokenizer.decode(toks_ids[1:]						,   clean_up_tokenization_spaces=_A    )
															)
									if with_prefix_space:
															UpperCamelCase				:		Dict				   =			""" """ + output_txt
									UpperCamelCase				:		List[Any]				   =			tokenizer.encode(_A						,   add_special_tokens=_A    )
									return output_txt, output_ids







			def   _a      (      self    ):






									'''simple docstring'''







									UpperCamelCase				:		Any				   =			self.perceiver_tokenizer
									UpperCamelCase				:		str				   =			"""Unicode €."""
									UpperCamelCase				:		Dict				   =			tokenizer(_A    )
									UpperCamelCase				:		Optional[Any]				   =			[4, 9_1, 1_1_6, 1_1_1, 1_0_5, 1_1_7, 1_0_6, 1_0_7, 3_8, 2_3_2, 1_3_6, 1_7_8, 5_2, 5]
									self.assertEqual(encoded["""input_ids"""]						,   _A    )

									# decoding
									UpperCamelCase				:		Optional[int]				   =			tokenizer.decode(_A    )
									self.assertEqual(_A						,   """[CLS]Unicode €.[SEP]"""    )

									UpperCamelCase				:		str				   =			tokenizer("""e è é ê ë"""    )
									UpperCamelCase				:		str				   =			[4, 1_0_7, 3_8, 2_0_1, 1_7_4, 3_8, 2_0_1, 1_7_5, 3_8, 2_0_1, 1_7_6, 3_8, 2_0_1, 1_7_7, 5]
									self.assertEqual(encoded["""input_ids"""]						,   _A    )
									# decoding
									UpperCamelCase				:		Any				   =			tokenizer.decode(_A    )
									self.assertEqual(_A						,   """[CLS]e è é ê ë[SEP]"""    )

									# encode/decode, but with `encode` instead of `__call__`
									self.assertEqual(tokenizer.decode(tokenizer.encode("""e è é ê ë"""    )    )						,   """[CLS]e è é ê ë[SEP]"""    )







			def   _a      (      self    ):






									'''simple docstring'''







									UpperCamelCase				:		Optional[int]				   =			self.perceiver_tokenizer
									UpperCamelCase				:		Optional[Any]				   =			["""A long paragraph for summarization.""", """Another paragraph for summarization."""]
									# fmt: off
									UpperCamelCase				:		List[Any]				   =			[4, 7_1, 3_8, 1_1_4, 1_1_7, 1_1_6, 1_0_9, 3_8, 1_1_8, 1_0_3, 1_2_0, 1_0_3, 1_0_9, 1_2_0, 1_0_3, 1_1_8, 1_1_0, 3_8, 1_0_8, 1_1_7, 1_2_0, 3_8, 1_2_1, 1_2_3, 1_1_5, 1_1_5, 1_0_3, 1_2_0, 1_1_1, 1_2_8, 1_0_3, 1_2_2, 1_1_1, 1_1_7, 1_1_6, 5_2, 5, 0]
									# fmt: on
									UpperCamelCase				:		Dict				   =			tokenizer(_A						,   padding=_A						,   return_tensors=_A    )
									self.assertIsInstance(_A						,   _A    )

									if FRAMEWORK != "jax":
															UpperCamelCase				:		Dict				   =			list(batch.input_ids.numpy()[0]    )
									else:
															UpperCamelCase				:		Optional[int]				   =			list(batch.input_ids.tolist()[0]    )

									self.assertListEqual(_A						,   _A    )

									self.assertEqual((2, 3_8)						,   batch.input_ids.shape    )
									self.assertEqual((2, 3_8)						,   batch.attention_mask.shape    )







			def   _a      (      self    ):






									'''simple docstring'''







									UpperCamelCase				:		Any				   =			self.perceiver_tokenizer
									UpperCamelCase				:		Optional[int]				   =			["""A long paragraph for summarization.""", """Another paragraph for summarization."""]
									UpperCamelCase				:		Any				   =			tokenizer(_A						,   padding=_A						,   return_tensors=_A    )
									# check if input_ids are returned and no decoder_input_ids
									self.assertIn("""input_ids"""						,   _A    )
									self.assertIn("""attention_mask"""						,   _A    )
									self.assertNotIn("""decoder_input_ids"""						,   _A    )
									self.assertNotIn("""decoder_attention_mask"""						,   _A    )







			def   _a      (      self    ):






									'''simple docstring'''







									UpperCamelCase				:		Optional[Any]				   =			self.perceiver_tokenizer
									UpperCamelCase				:		int				   =			[
									    """Summary of the text.""",
									    """Another summary.""",
									]
									UpperCamelCase				:		int				   =			tokenizer(
									    text_target=_A						,   max_length=3_2						,   padding="""max_length"""						,   truncation=_A						,   return_tensors=_A    )
									self.assertEqual(3_2						,   targets["""input_ids"""].shape[1]    )







			def   _a      (      self    ):






									'''simple docstring'''







									UpperCamelCase				:		Any				   =			self.get_tokenizers()
									for tokenizer in tokenizers:
															with self.subTest(f"""{tokenizer.__class__.__name__}"""    ):
																					self.assertNotEqual(tokenizer.model_max_length						,   4_2    )

        # Now let's start the test
									UpperCamelCase				:		Any				   =			self.get_tokenizers()
									for tokenizer in tokenizers:
															with self.subTest(f"""{tokenizer.__class__.__name__}"""    ):
																					# Isolate this from the other tests because we save additional tokens/etc
																					UpperCamelCase				:		int				   =			tempfile.mkdtemp()

																					UpperCamelCase				:		Tuple				   =			""" He is very happy, UNwant\u00E9d,running"""
																					UpperCamelCase				:		Dict				   =			tokenizer.encode(_A						,   add_special_tokens=_A    )
																					tokenizer.save_pretrained(_A    )

																					UpperCamelCase				:		Any				   =			tokenizer.__class__.from_pretrained(_A    )
																					UpperCamelCase				:		Tuple				   =			after_tokenizer.encode(_A						,   add_special_tokens=_A    )
																					self.assertListEqual(_A						,   _A    )

																					shutil.rmtree(_A    )

									UpperCamelCase				:		Union[str, Any]				   =			self.get_tokenizers(model_max_length=4_2    )
									for tokenizer in tokenizers:
															with self.subTest(f"""{tokenizer.__class__.__name__}"""    ):
																					# Isolate this from the other tests because we save additional tokens/etc
																					UpperCamelCase				:		List[Any]				   =			tempfile.mkdtemp()

																					UpperCamelCase				:		Union[str, Any]				   =			""" He is very happy, UNwant\u00E9d,running"""
																					tokenizer.add_tokens(["""bim""", """bambam"""]    )
																					UpperCamelCase				:		int				   =			tokenizer.additional_special_tokens
																					additional_special_tokens.append("""new_additional_special_token"""    )
																					tokenizer.add_special_tokens({"""additional_special_tokens""": additional_special_tokens}    )
																					UpperCamelCase				:		List[str]				   =			tokenizer.encode(_A						,   add_special_tokens=_A    )
																					tokenizer.save_pretrained(_A    )

																					UpperCamelCase				:		List[str]				   =			tokenizer.__class__.from_pretrained(_A    )
																					UpperCamelCase				:		Tuple				   =			after_tokenizer.encode(_A						,   add_special_tokens=_A    )
																					self.assertListEqual(_A						,   _A    )
																					self.assertIn("""new_additional_special_token"""						,   after_tokenizer.additional_special_tokens    )
																					self.assertEqual(after_tokenizer.model_max_length						,   4_2    )

																					UpperCamelCase				:		Any				   =			tokenizer.__class__.from_pretrained(_A						,   model_max_length=4_3    )
																					self.assertEqual(tokenizer.model_max_length						,   4_3    )

																					shutil.rmtree(_A    )







			def   _a      (      self    ):






									'''simple docstring'''







									UpperCamelCase				:		int				   =			[]
									if self.test_slow_tokenizer:
															tokenizer_list.append((self.tokenizer_class, self.get_tokenizer())    )

									if self.test_rust_tokenizer:
															tokenizer_list.append((self.rust_tokenizer_class, self.get_rust_tokenizer())    )

									for tokenizer_class, tokenizer_utils in tokenizer_list:
															with tempfile.TemporaryDirectory() as tmp_dir:
																					tokenizer_utils.save_pretrained(_A    )

																					with open(os.path.join(_A						,   """special_tokens_map.json"""    )						,   encoding="""utf-8"""    ) as json_file:
																											UpperCamelCase				:		Union[str, Any]				   =			json.load(_A    )

																					with open(os.path.join(_A						,   """tokenizer_config.json"""    )						,   encoding="""utf-8"""    ) as json_file:
																											UpperCamelCase				:		List[Any]				   =			json.load(_A    )

																					UpperCamelCase				:		Optional[int]				   =			[f"""<extra_id_{i}>""" for i in range(1_2_5    )]

																					UpperCamelCase				:		List[Any]				   =			added_tokens_extra_ids + [
																					    """an_additional_special_token"""
																					]
																					UpperCamelCase				:		int				   =			added_tokens_extra_ids + [
																					    """an_additional_special_token"""
																					]

																					with open(os.path.join(_A						,   """special_tokens_map.json"""    )						,   """w"""						,   encoding="""utf-8"""    ) as outfile:
																											json.dump(_A						,   _A    )
																					with open(os.path.join(_A						,   """tokenizer_config.json"""    )						,   """w"""						,   encoding="""utf-8"""    ) as outfile:
																											json.dump(_A						,   _A    )

																					# the following checks allow us to verify that our test works as expected, i.e. that the tokenizer takes
																					# into account the new value of additional_special_tokens given in the "tokenizer_config.json" and
																					# "special_tokens_map.json" files
																					UpperCamelCase				:		Tuple				   =			tokenizer_class.from_pretrained(
																					    _A						,   )
																					self.assertIn(
																					    """an_additional_special_token"""						,   tokenizer_without_change_in_init.additional_special_tokens    )
																					self.assertEqual(
																					    ["""an_additional_special_token"""]						,   tokenizer_without_change_in_init.convert_ids_to_tokens(
																					        tokenizer_without_change_in_init.convert_tokens_to_ids(["""an_additional_special_token"""]    )    )						,   )

																					# Now we test that we can change the value of additional_special_tokens in the from_pretrained
																					UpperCamelCase				:		List[str]				   =			added_tokens_extra_ids + [AddedToken("""a_new_additional_special_token"""						,   lstrip=_A    )]
																					UpperCamelCase				:		Optional[Any]				   =			tokenizer_class.from_pretrained(
																					    _A						,   additional_special_tokens=_A						,   )

																					self.assertIn("""a_new_additional_special_token"""						,   tokenizer.additional_special_tokens    )
																					self.assertEqual(
																					    ["""a_new_additional_special_token"""]						,   tokenizer.convert_ids_to_tokens(
																					        tokenizer.convert_tokens_to_ids(["""a_new_additional_special_token"""]    )    )						,   )







			def   _a      (      self    ):






									'''simple docstring'''







									UpperCamelCase				:		Dict				   =			self.perceiver_tokenizer
									self.assertEqual(tokenizer.decode([1_7_8]    )						,   """�"""    )







			def   _a      (      self    ):






									'''simple docstring'''







									pass







			def   _a      (      self    ):






									'''simple docstring'''







									pass







			def   _a      (      self    ):






									'''simple docstring'''







									pass







			def   _a      (      self    ):






									'''simple docstring'''







									pass







			def   _a      (      self    ):






									'''simple docstring'''







									UpperCamelCase				:		List[Any]				   =			self.get_tokenizers(fast=_A						,   do_lower_case=_A    )
									for tokenizer in tokenizers:
															with self.subTest(f"""{tokenizer.__class__.__name__}"""    ):
																					UpperCamelCase				:		Optional[Any]				   =			["""[CLS]""", """t""", """h""", """i""", """s""", """ """, """i""", """s""", """ """, """a""", """ """, """t""", """e""", """s""", """t""", """[SEP]"""]
																					UpperCamelCase				:		Dict				   =			tokenizer.convert_tokens_to_string(_A    )

																					self.assertIsInstance(_A						,   _A    )



