



'''simple docstring'''





from __future__ import annotations

from pprint import pformat
from typing import Generic, TypeVar

_lowerCAmelCase										=     TypeVar('''T''')






class 	lowerCAmelCase_(    Generic[T]					):
		'''simple docstring'''




		def __init__(   self  ,__UpperCAmelCase = True				)   ->		None:
						lowerCAmelCase__			:  dict[T, list[T]]											= {}  # dictionary of lists
						lowerCAmelCase__			:  Optional[int]											= directed




		def 							UpperCAmelCase_     (   self  ,__UpperCAmelCase  ,__UpperCAmelCase				)   ->		GraphAdjacencyList[T]:

						if not self.directed:  # For undirected graphs
										# if both source vertex and destination vertex are both present in the
										# adjacency list, add destination vertex to source vertex list of adjacent
										# vertices and add source vertex to destination vertex list of adjacent
										# vertices.
										if source_vertex in self.adj_list and destination_vertex in self.adj_list:
														self.adj_list[source_vertex].append(__UpperCAmelCase				)
														self.adj_list[destination_vertex].append(__UpperCAmelCase				)
										# if only source vertex is present in adjacency list, add destination vertex
										# to source vertex list of adjacent vertices, then create a new vertex with
										# destination vertex as key and assign a list containing the source vertex
										# as it's first adjacent vertex.
										elif source_vertex in self.adj_list:
														self.adj_list[source_vertex].append(__UpperCAmelCase				)
														lowerCAmelCase__			:  Optional[int]											= [source_vertex]
										# if only destination vertex is present in adjacency list, add source vertex
										# to destination vertex list of adjacent vertices, then create a new vertex
										# with source vertex as key and assign a list containing the source vertex
										# as it's first adjacent vertex.
										elif destination_vertex in self.adj_list:
														self.adj_list[destination_vertex].append(__UpperCAmelCase				)
														lowerCAmelCase__			:  Union[str, Any]											= [destination_vertex]
										# if both source vertex and destination vertex are not present in adjacency
										# list, create a new vertex with source vertex as key and assign a list
										# containing the destination vertex as it's first adjacent vertex also
										# create a new vertex with destination vertex as key and assign a list
										# containing the source vertex as it's first adjacent vertex.
										else:
														lowerCAmelCase__			:  Dict											= [destination_vertex]
														lowerCAmelCase__			:  Optional[Any]											= [source_vertex]
						else:  # For directed graphs
										# if both source vertex and destination vertex are present in adjacency
										# list, add destination vertex to source vertex list of adjacent vertices.
										if source_vertex in self.adj_list and destination_vertex in self.adj_list:
														self.adj_list[source_vertex].append(__UpperCAmelCase				)
										# if only source vertex is present in adjacency list, add destination
										# vertex to source vertex list of adjacent vertices and create a new vertex
										# with destination vertex as key, which has no adjacent vertex
										elif source_vertex in self.adj_list:
														self.adj_list[source_vertex].append(__UpperCAmelCase				)
														lowerCAmelCase__			:  Optional[int]											= []
										# if only destination vertex is present in adjacency list, create a new
										# vertex with source vertex as key and assign a list containing destination
										# vertex as first adjacent vertex
										elif destination_vertex in self.adj_list:
														lowerCAmelCase__			:  str											= [destination_vertex]
										# if both source vertex and destination vertex are not present in adjacency
										# list, create a new vertex with source vertex as key and a list containing
										# destination vertex as it's first adjacent vertex. Then create a new vertex
										# with destination vertex as key, which has no adjacent vertex
										else:
														lowerCAmelCase__			:  Tuple											= [destination_vertex]
														lowerCAmelCase__			:  Optional[int]											= []

						return self






		def __repr__(   self				)   ->		str:
						return pformat(self.adj_list				)







'''simple docstring'''





_lowerCAmelCase										=     '''Input must be a string of 8 numbers plus letter'''
_lowerCAmelCase										=     '''TRWAGMYFPDXBNJZSQVHLCKE'''
def        _SCREAMING_SNAKE_CASE  (	UpperCamelCase      ):



    """simple docstring"""





    if not isinstance(UpperCamelCase							,   UpperCamelCase      ):
        lowerCAmelCase__			:  List[Any]											= f"""Expected string as input, found {type(UpperCamelCase      ).__name__}"""
        raise TypeError(UpperCamelCase      )

    lowerCAmelCase__			:  Union[str, Any]											= spanish_id.replace("""-"""							,   """"""      ).upper()
    if len(UpperCamelCase      ) != 9:
        raise ValueError(UpperCamelCase      )

    try:
        lowerCAmelCase__			:  Optional[int]											= int(spanish_id_clean[0:8]      )
        lowerCAmelCase__			:  int											= spanish_id_clean[8]
    except ValueError as ex:
        raise ValueError(UpperCamelCase      ) from ex

    if letter.isdigit():
        raise ValueError(UpperCamelCase      )

    return letter == LOOKUP_LETTERS[number % 23]


if __name__ == "__main__":
 import doctest

 doctest.testmod()


