



'''simple docstring'''




import itertools
from dataclasses import dataclass
from typing import List, Optional

import pyarrow as pa
import pyarrow.parquet as pq

import datasets
from datasets.table import table_cast


lowerCamelCase							:Optional[int]       = datasets.utils.logging.get_logger(__name__)







@dataclass
class      _lowerCAmelCase							(      datasets.BuilderConfig			):
	__SCREAMING_SNAKE_CASE       :		int		      = 10_000
	__SCREAMING_SNAKE_CASE       :		Optional[List[str]]		      = None
	__SCREAMING_SNAKE_CASE       :		Optional[datasets.Features]		      = None







class      _lowerCAmelCase							(      datasets.ArrowBasedBuilder			):
	__SCREAMING_SNAKE_CASE       :		Optional[int]		      = ParquetConfig


	def    _a     (self							):
				return datasets.DatasetInfo(features=self.config.features							)


	def    _a     (self	,				lowercase							):
				if not self.config.data_files:
							raise ValueError(F'At least one data file must be specified, but got data_files={self.config.data_files}'							)
				A_     :						Optional[int]     =					dl_manager.download_and_extract(self.config.data_files							)
				if isinstance(lowercase	,				(str, list, tuple)							):
							A_     :						str     =					data_files
							if isinstance(lowercase	,				lowercase							):
										A_     :						Optional[Any]     =					[files]
							# Use `dl_manager.iter_files` to skip hidden files in an extracted archive
							A_     :						Tuple     =					[dl_manager.iter_files(lowercase							) for file in files]
							return [datasets.SplitGenerator(name=datasets.Split.TRAIN	,				gen_kwargs={"""files""": files}							)]
				A_     :						Tuple     =					[]
				for split_name, files in data_files.items():
							if isinstance(lowercase	,				lowercase							):
										A_     :						Tuple     =					[files]
							# Use `dl_manager.iter_files` to skip hidden files in an extracted archive
							A_     :						List[Any]     =					[dl_manager.iter_files(lowercase							) for file in files]
							# Infer features is they are stoed in the arrow schema
							if self.info.features is None:
										for file in itertools.chain.from_iterable(lowercase							):
													with open(lowercase	,				"""rb"""							) as f:
																A_     :						int     =					datasets.Features.from_arrow_schema(pq.read_schema(lowercase							)							)
													break
							splits.append(datasets.SplitGenerator(name=lowercase	,				gen_kwargs={"""files""": files}							)							)
				return splits


	def    _a     (self	,				lowercase							):
				if self.info.features is not None:
							# more expensive cast to support nested features with keys in a different order
							# allows str <-> int/float or str to Audio for example
							A_     :						int     =					table_cast(lowercase	,				self.info.features.arrow_schema							)
				return pa_table


	def    _a     (self	,				lowercase							):
				A_     :						List[Any]     =					self.info.features.arrow_schema if self.info.features is not None else None
				if self.info.features is not None and self.config.columns is not None:
							if sorted(field.name for field in schema							) != sorted(self.config.columns							):
										raise ValueError(
										    F'Tried to load parquet data with columns \'{self.config.columns}\' with mismatching features \'{self.info.features}\''							)
				for file_idx, file in enumerate(itertools.chain.from_iterable(lowercase							)							):
							with open(lowercase	,				"""rb"""							) as f:
										A_     :						Any     =					pq.ParquetFile(lowercase							)
										try:
													for batch_idx, record_batch in enumerate(
													    parquet_file.iter_batches(batch_size=self.config.batch_size	,				columns=self.config.columns							)							):
																A_     :						List[Any]     =					pa.Table.from_batches([record_batch]							)
																# Uncomment for debugging (will print the Arrow table size and elements)
																# logger.warning(f"pa_table: {pa_table} num rows: {pa_table.num_rows}")
																# logger.warning('\n'.join(str(pa_table.slice(i, 1).to_pydict()) for i in range(pa_table.num_rows)))
																yield F'{file_idx}_{batch_idx}', self._cast_table(lowercase							)
										except ValueError as e:
													logger.error(F'Failed to read file \'{file}\' with error {type(lowercase							)}: {e}'							)
													raise




'''simple docstring'''




def      a      (			):
			'''simple docstring'''





			A_     :						Optional[int]     =					[31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]

			A_     :						Dict     =					6
			A_     :						List[Any]     =					1
			A_     :						Optional[Any]     =					19_01

			A_     :						Tuple     =					0

			while year < 20_01:
						day += 7

						if (year % 4 == 0 and year % 1_00 != 0) or (year % 4_00 == 0):
									if day > days_per_month[month - 1] and month != 2:
												month += 1
												A_     :						Optional[Any]     =					day - days_per_month[month - 2]
									elif day > 29 and month == 2:
												month += 1
												A_     :						str     =					day - 29
						else:
									if day > days_per_month[month - 1]:
												month += 1
												A_     :						List[str]     =					day - days_per_month[month - 2]

						if month > 12:
									year += 1
									A_     :						Tuple     =					1

						if year < 20_01 and day == 1:
									sundays += 1
			return sundays


if __name__ == "__main__":
						print(solution())