From 4d9d5a38474d3347556f5d1541c44957e65d5a6a Mon Sep 17 00:00:00 2001 From: Andrew Date: Tue, 25 Nov 2025 10:09:47 -0600 Subject: [PATCH 01/17] Implement basic structure of new PTAB datasets. --- src/pyUSPTO/__init__.py | 21 + src/pyUSPTO/clients/__init__.py | 6 + src/pyUSPTO/clients/ptab_appeals.py | 243 ++++ src/pyUSPTO/clients/ptab_interferences.py | 252 ++++ src/pyUSPTO/clients/ptab_trials.py | 508 ++++++++ src/pyUSPTO/config.py | 6 + src/pyUSPTO/models/__init__.py | 15 + src/pyUSPTO/models/ptab.py | 1110 +++++++++++++++++ tests/clients/test_ptab_appeals_client.py | 420 +++++++ .../clients/test_ptab_interferences_client.py | 445 +++++++ tests/clients/test_ptab_trials_client.py | 630 ++++++++++ 11 files changed, 3656 insertions(+) create mode 100644 src/pyUSPTO/clients/ptab_appeals.py create mode 100644 src/pyUSPTO/clients/ptab_interferences.py create mode 100644 src/pyUSPTO/clients/ptab_trials.py create mode 100644 src/pyUSPTO/models/ptab.py create mode 100644 tests/clients/test_ptab_appeals_client.py create mode 100644 tests/clients/test_ptab_interferences_client.py create mode 100644 tests/clients/test_ptab_trials_client.py diff --git a/src/pyUSPTO/__init__.py b/src/pyUSPTO/__init__.py index 0bf8ed6..8275698 100644 --- a/src/pyUSPTO/__init__.py +++ b/src/pyUSPTO/__init__.py @@ -15,6 +15,9 @@ from pyUSPTO.clients.bulk_data import BulkDataClient from pyUSPTO.clients.patent_data import PatentDataClient from pyUSPTO.clients.petition_decisions import FinalPetitionDecisionsClient +from pyUSPTO.clients.ptab_appeals import PTABAppealsClient +from pyUSPTO.clients.ptab_interferences import PTABInterferencesClient +from pyUSPTO.clients.ptab_trials import PTABTrialsClient from pyUSPTO.config import USPTOConfig from pyUSPTO.exceptions import ( USPTOApiAuthError, @@ -37,6 +40,14 @@ PetitionDecisionDocument, PetitionDecisionResponse, ) +from pyUSPTO.models.ptab import ( + PTABAppealDecision, + PTABAppealResponse, + PTABInterferenceDecision, + PTABInterferenceResponse, + PTABTrialProceeding, + PTABTrialProceedingResponse, +) from pyUSPTO.warnings import ( USPTOBooleanParseWarning, USPTODataMismatchWarning, @@ -76,4 +87,14 @@ "PetitionDecisionResponse", "PetitionDecision", "PetitionDecisionDocument", + # PTAB API + "PTABTrialsClient", + "PTABAppealsClient", + "PTABInterferencesClient", + "PTABTrialProceeding", + "PTABTrialProceedingResponse", + "PTABAppealDecision", + "PTABAppealResponse", + "PTABInterferenceDecision", + "PTABInterferenceResponse", ] diff --git a/src/pyUSPTO/clients/__init__.py b/src/pyUSPTO/clients/__init__.py index 03e37f2..7227ee8 100644 --- a/src/pyUSPTO/clients/__init__.py +++ b/src/pyUSPTO/clients/__init__.py @@ -7,9 +7,15 @@ from pyUSPTO.clients.bulk_data import BulkDataClient from pyUSPTO.clients.patent_data import PatentDataClient from pyUSPTO.clients.petition_decisions import FinalPetitionDecisionsClient +from pyUSPTO.clients.ptab_appeals import PTABAppealsClient +from pyUSPTO.clients.ptab_interferences import PTABInterferencesClient +from pyUSPTO.clients.ptab_trials import PTABTrialsClient __all__ = [ "BulkDataClient", "PatentDataClient", "FinalPetitionDecisionsClient", + "PTABTrialsClient", + "PTABAppealsClient", + "PTABInterferencesClient", ] diff --git a/src/pyUSPTO/clients/ptab_appeals.py b/src/pyUSPTO/clients/ptab_appeals.py new file mode 100644 index 0000000..dc21976 --- /dev/null +++ b/src/pyUSPTO/clients/ptab_appeals.py @@ -0,0 +1,243 @@ +""" +clients.ptab_appeals - Client for USPTO PTAB Appeals API + +This module provides a client for interacting with the USPTO PTAB (Patent Trial +and Appeal Board) Appeals API. It allows you to search for ex parte appeal decisions. +""" + +from typing import Any, Dict, Iterator, Optional + +from pyUSPTO.clients.base import BaseUSPTOClient +from pyUSPTO.config import USPTOConfig +from pyUSPTO.models.ptab import PTABAppealDecision, PTABAppealResponse + + +class PTABAppealsClient(BaseUSPTOClient[PTABAppealResponse]): + """Client for interacting with the USPTO PTAB Appeals API. + + This client provides methods to search for ex parte appeal decisions from the + Patent Trial and Appeal Board. + + Appeals data includes decisions on patent application appeals from the examiner + to the PTAB. + """ + + ENDPOINTS = { + "search_decisions": "api/v1/ptab/appeals/decisions/search", + } + + def __init__( + self, + api_key: Optional[str] = None, + base_url: Optional[str] = None, + config: Optional[USPTOConfig] = None, + ): + """Initialize the PTABAppealsClient. + + Args: + api_key: Optional API key for authentication. + base_url: Optional base URL override for the API. + config: Optional USPTOConfig instance for configuration. + """ + self.config = config or USPTOConfig(api_key=api_key) + api_key_to_use = api_key or self.config.api_key + effective_base_url = ( + base_url or self.config.ptab_base_url or "https://api.uspto.gov" + ) + super().__init__( + api_key=api_key_to_use, base_url=effective_base_url, config=self.config + ) + + def search_decisions( + self, + query: Optional[str] = None, + sort: Optional[str] = None, + offset: Optional[int] = 0, + limit: Optional[int] = 25, + facets: Optional[str] = None, + fields: Optional[str] = None, + filters: Optional[str] = None, + range_filters: Optional[str] = None, + post_body: Optional[Dict[str, Any]] = None, + # Convenience query parameters + appeal_number_q: Optional[str] = None, + application_number_text_q: Optional[str] = None, + appellant_name_q: Optional[str] = None, + requestor_name_q: Optional[str] = None, + decision_type_category_q: Optional[str] = None, + decision_date_from_q: Optional[str] = None, + decision_date_to_q: Optional[str] = None, + technology_center_number_q: Optional[str] = None, + additional_query_params: Optional[Dict[str, Any]] = None, + ) -> PTABAppealResponse: + """Searches for PTAB appeal decisions. + + This method can perform either a GET request using query parameters or a POST + request if post_body is specified. When using GET, you can provide either a + direct query string or use convenience parameters that will be automatically + combined into a query. + + Args: + query: Direct query string in USPTO search syntax. + sort: Sort order for results. + offset: Number of records to skip (pagination). + limit: Maximum number of records to return. + facets: Facet configuration string. + fields: Specific fields to return. + filters: Filter configuration string. + range_filters: Range filter configuration string. + post_body: Optional POST body for complex queries. + appeal_number_q: Filter by appeal number. + application_number_text_q: Filter by application number. + appellant_name_q: Filter by appellant name. + requestor_name_q: Filter by requestor name. + decision_type_category_q: Filter by decision type category. + decision_date_from_q: Filter decisions from this date (YYYY-MM-DD). + decision_date_to_q: Filter decisions to this date (YYYY-MM-DD). + technology_center_number_q: Filter by technology center number. + additional_query_params: Additional custom query parameters. + + Returns: + PTABAppealResponse: Response containing matching appeal decisions. + + Examples: + # Search with direct query + >>> response = client.search_decisions(query="appealNumber:2023-001234") + + # Search with convenience parameters + >>> response = client.search_decisions( + ... technology_center_number_q="3600", + ... decision_date_from_q="2023-01-01", + ... limit=50 + ... ) + + # Search with POST body + >>> response = client.search_decisions( + ... post_body={"q": "decisionTypeCategory:Affirmed", "limit": 100} + ... ) + """ + endpoint = self.ENDPOINTS["search_decisions"] + + if post_body is not None: + # POST request path + result = self._make_request( + method="POST", + endpoint=endpoint, + json_data=post_body, + params=additional_query_params, + response_class=PTABAppealResponse, + ) + else: + # GET request path + params: Dict[str, Any] = {} + final_q = query + + # Build query from convenience parameters + if final_q is None: + q_parts = [] + if appeal_number_q: + q_parts.append(f"appealNumber:{appeal_number_q}") + if application_number_text_q: + q_parts.append(f"applicationNumberText:{application_number_text_q}") + if appellant_name_q: + q_parts.append(f"appellantName:{appellant_name_q}") + if requestor_name_q: + q_parts.append(f"requestorName:{requestor_name_q}") + if decision_type_category_q: + q_parts.append(f"decisionTypeCategory:{decision_type_category_q}") + if technology_center_number_q: + q_parts.append( + f"technologyCenterNumber:{technology_center_number_q}" + ) + + # Handle decision date range + if decision_date_from_q and decision_date_to_q: + q_parts.append( + f"decisionDate:[{decision_date_from_q} TO {decision_date_to_q}]" + ) + elif decision_date_from_q: + q_parts.append(f"decisionDate:>={decision_date_from_q}") + elif decision_date_to_q: + q_parts.append(f"decisionDate:<={decision_date_to_q}") + + if q_parts: + final_q = " AND ".join(q_parts) + + # Add parameters + if final_q is not None: + params["q"] = final_q + if sort is not None: + params["sort"] = sort + if offset is not None: + params["offset"] = offset + if limit is not None: + params["limit"] = limit + if facets is not None: + params["facets"] = facets + if fields is not None: + params["fields"] = fields + if filters is not None: + params["filters"] = filters + if range_filters is not None: + params["rangeFilters"] = range_filters + + if additional_query_params: + params.update(additional_query_params) + + result = self._make_request( + method="GET", + endpoint=endpoint, + params=params, + response_class=PTABAppealResponse, + ) + + assert isinstance(result, PTABAppealResponse) + return result + + def paginate_decisions(self, **kwargs: Any) -> Iterator[PTABAppealDecision]: + """Provides an iterator to paginate through appeal decision search results. + + This method simplifies fetching all appeal decisions matching a search query + by automatically handling pagination. It internally calls the search_decisions + method for GET requests, batching results and yielding them one by one. + + All keyword arguments are passed directly to search_decisions to define the + search criteria. The offset and limit parameters are managed by the pagination + logic; setting them directly in kwargs might lead to unexpected behavior. + + Args: + **kwargs: Keyword arguments passed to search_decisions for constructing + the search query. Do not include post_body. + + Returns: + Iterator[PTABAppealDecision]: An iterator yielding PTABAppealDecision objects, + allowing iteration over all matching decisions across multiple pages of results. + + Raises: + ValueError: If post_body is included in kwargs, as this method only + supports GET request parameters for pagination. + + Examples: + # Paginate through all decisions for a technology center + >>> for decision in client.paginate_decisions(technology_center_number_q="3600"): + ... print(f"{decision.appeal_meta_data.appeal_number}: " + ... f"{decision.decision_data.decision_type_category}") + + # Paginate with date range + >>> for decision in client.paginate_decisions( + ... decision_date_from_q="2023-01-01", + ... decision_date_to_q="2023-12-31" + ... ): + ... process_decision(decision) + """ + if "post_body" in kwargs: + raise ValueError( + "paginate_decisions uses GET requests and does not support 'post_body'. " + "Use keyword arguments for search criteria." + ) + + return self.paginate_results( + method_name="search_decisions", + response_container_attr="patent_appeal_data_bag", + **kwargs, + ) diff --git a/src/pyUSPTO/clients/ptab_interferences.py b/src/pyUSPTO/clients/ptab_interferences.py new file mode 100644 index 0000000..a93bd91 --- /dev/null +++ b/src/pyUSPTO/clients/ptab_interferences.py @@ -0,0 +1,252 @@ +""" +clients.ptab_interferences - Client for USPTO PTAB Interferences API + +This module provides a client for interacting with the USPTO PTAB (Patent Trial +and Appeal Board) Interferences API. It allows you to search for patent interference decisions. +""" + +from typing import Any, Dict, Iterator, Optional + +from pyUSPTO.clients.base import BaseUSPTOClient +from pyUSPTO.config import USPTOConfig +from pyUSPTO.models.ptab import PTABInterferenceDecision, PTABInterferenceResponse + + +class PTABInterferencesClient(BaseUSPTOClient[PTABInterferenceResponse]): + """Client for interacting with the USPTO PTAB Interferences API. + + This client provides methods to search for patent interference decisions from the + Patent Trial and Appeal Board. + + Interference proceedings are used to determine priority of invention when two or + more parties claim the same patentable invention. + """ + + ENDPOINTS = { + "search_decisions": "api/v1/ptab/interferences/decisions/search", + } + + def __init__( + self, + api_key: Optional[str] = None, + base_url: Optional[str] = None, + config: Optional[USPTOConfig] = None, + ): + """Initialize the PTABInterferencesClient. + + Args: + api_key: Optional API key for authentication. + base_url: Optional base URL override for the API. + config: Optional USPTOConfig instance for configuration. + """ + self.config = config or USPTOConfig(api_key=api_key) + api_key_to_use = api_key or self.config.api_key + effective_base_url = ( + base_url or self.config.ptab_base_url or "https://api.uspto.gov" + ) + super().__init__( + api_key=api_key_to_use, base_url=effective_base_url, config=self.config + ) + + def search_decisions( + self, + query: Optional[str] = None, + sort: Optional[str] = None, + offset: Optional[int] = 0, + limit: Optional[int] = 25, + facets: Optional[str] = None, + fields: Optional[str] = None, + filters: Optional[str] = None, + range_filters: Optional[str] = None, + post_body: Optional[Dict[str, Any]] = None, + # Convenience query parameters + interference_number_q: Optional[str] = None, + senior_party_application_number_q: Optional[str] = None, + junior_party_application_number_q: Optional[str] = None, + senior_party_name_q: Optional[str] = None, + junior_party_name_q: Optional[str] = None, + interference_outcome_category_q: Optional[str] = None, + decision_type_category_q: Optional[str] = None, + decision_date_from_q: Optional[str] = None, + decision_date_to_q: Optional[str] = None, + additional_query_params: Optional[Dict[str, Any]] = None, + ) -> PTABInterferenceResponse: + """Searches for PTAB interference decisions. + + This method can perform either a GET request using query parameters or a POST + request if post_body is specified. When using GET, you can provide either a + direct query string or use convenience parameters that will be automatically + combined into a query. + + Args: + query: Direct query string in USPTO search syntax. + sort: Sort order for results. + offset: Number of records to skip (pagination). + limit: Maximum number of records to return. + facets: Facet configuration string. + fields: Specific fields to return. + filters: Filter configuration string. + range_filters: Range filter configuration string. + post_body: Optional POST body for complex queries. + interference_number_q: Filter by interference number. + senior_party_application_number_q: Filter by senior party application number. + junior_party_application_number_q: Filter by junior party application number. + senior_party_name_q: Filter by senior party name. + junior_party_name_q: Filter by junior party name. + interference_outcome_category_q: Filter by interference outcome category. + decision_type_category_q: Filter by decision type category. + decision_date_from_q: Filter decisions from this date (YYYY-MM-DD). + decision_date_to_q: Filter decisions to this date (YYYY-MM-DD). + additional_query_params: Additional custom query parameters. + + Returns: + PTABInterferenceResponse: Response containing matching interference decisions. + + Examples: + # Search with direct query + >>> response = client.search_decisions(query="interferenceNumber:106123") + + # Search with convenience parameters + >>> response = client.search_decisions( + ... interference_outcome_category_q="Priority to Senior Party", + ... decision_date_from_q="2020-01-01", + ... limit=50 + ... ) + + # Search with POST body + >>> response = client.search_decisions( + ... post_body={"q": "decisionTypeCategory:Final Decision", "limit": 100} + ... ) + """ + endpoint = self.ENDPOINTS["search_decisions"] + + if post_body is not None: + # POST request path + result = self._make_request( + method="POST", + endpoint=endpoint, + json_data=post_body, + params=additional_query_params, + response_class=PTABInterferenceResponse, + ) + else: + # GET request path + params: Dict[str, Any] = {} + final_q = query + + # Build query from convenience parameters + if final_q is None: + q_parts = [] + if interference_number_q: + q_parts.append(f"interferenceNumber:{interference_number_q}") + if senior_party_application_number_q: + q_parts.append( + f"seniorPartyApplicationNumber:{senior_party_application_number_q}" + ) + if junior_party_application_number_q: + q_parts.append( + f"juniorPartyApplicationNumber:{junior_party_application_number_q}" + ) + if senior_party_name_q: + q_parts.append(f"seniorPartyName:{senior_party_name_q}") + if junior_party_name_q: + q_parts.append(f"juniorPartyName:{junior_party_name_q}") + if interference_outcome_category_q: + q_parts.append( + f"interferenceOutcomeCategory:{interference_outcome_category_q}" + ) + if decision_type_category_q: + q_parts.append(f"decisionTypeCategory:{decision_type_category_q}") + + # Handle decision date range + if decision_date_from_q and decision_date_to_q: + q_parts.append( + f"decisionDate:[{decision_date_from_q} TO {decision_date_to_q}]" + ) + elif decision_date_from_q: + q_parts.append(f"decisionDate:>={decision_date_from_q}") + elif decision_date_to_q: + q_parts.append(f"decisionDate:<={decision_date_to_q}") + + if q_parts: + final_q = " AND ".join(q_parts) + + # Add parameters + if final_q is not None: + params["q"] = final_q + if sort is not None: + params["sort"] = sort + if offset is not None: + params["offset"] = offset + if limit is not None: + params["limit"] = limit + if facets is not None: + params["facets"] = facets + if fields is not None: + params["fields"] = fields + if filters is not None: + params["filters"] = filters + if range_filters is not None: + params["rangeFilters"] = range_filters + + if additional_query_params: + params.update(additional_query_params) + + result = self._make_request( + method="GET", + endpoint=endpoint, + params=params, + response_class=PTABInterferenceResponse, + ) + + assert isinstance(result, PTABInterferenceResponse) + return result + + def paginate_decisions(self, **kwargs: Any) -> Iterator[PTABInterferenceDecision]: + """Provides an iterator to paginate through interference decision search results. + + This method simplifies fetching all interference decisions matching a search query + by automatically handling pagination. It internally calls the search_decisions + method for GET requests, batching results and yielding them one by one. + + All keyword arguments are passed directly to search_decisions to define the + search criteria. The offset and limit parameters are managed by the pagination + logic; setting them directly in kwargs might lead to unexpected behavior. + + Args: + **kwargs: Keyword arguments passed to search_decisions for constructing + the search query. Do not include post_body. + + Returns: + Iterator[PTABInterferenceDecision]: An iterator yielding PTABInterferenceDecision + objects, allowing iteration over all matching decisions across multiple pages + of results. + + Raises: + ValueError: If post_body is included in kwargs, as this method only + supports GET request parameters for pagination. + + Examples: + # Paginate through all interference decisions + >>> for decision in client.paginate_decisions(): + ... print(f"{decision.interference_meta_data.interference_number}: " + ... f"{decision.document_data.interference_outcome_category}") + + # Paginate with date range + >>> for decision in client.paginate_decisions( + ... decision_date_from_q="2020-01-01", + ... decision_date_to_q="2023-12-31" + ... ): + ... process_decision(decision) + """ + if "post_body" in kwargs: + raise ValueError( + "paginate_decisions uses GET requests and does not support 'post_body'. " + "Use keyword arguments for search criteria." + ) + + return self.paginate_results( + method_name="search_decisions", + response_container_attr="patent_interference_data_bag", + **kwargs, + ) diff --git a/src/pyUSPTO/clients/ptab_trials.py b/src/pyUSPTO/clients/ptab_trials.py new file mode 100644 index 0000000..d2b00a2 --- /dev/null +++ b/src/pyUSPTO/clients/ptab_trials.py @@ -0,0 +1,508 @@ +""" +clients.ptab_trials - Client for USPTO PTAB Trials API + +This module provides a client for interacting with the USPTO PTAB (Patent Trial +and Appeal Board) Trials API. It allows you to search for trial proceedings, +documents, and decisions. +""" + +from typing import Any, Dict, Iterator, Optional + +from pyUSPTO.clients.base import BaseUSPTOClient +from pyUSPTO.config import USPTOConfig +from pyUSPTO.models.ptab import PTABTrialProceeding, PTABTrialProceedingResponse + + +class PTABTrialsClient(BaseUSPTOClient[PTABTrialProceedingResponse]): + """Client for interacting with the USPTO PTAB Trials API. + + This client provides methods to search for trial proceedings, trial documents, + and trial decisions from the Patent Trial and Appeal Board. + + Trial proceedings data includes IPR (Inter Partes Review), PGR (Post-Grant Review), + CBM (Covered Business Method), and DER (Derivation) proceedings. + """ + + ENDPOINTS = { + "search_proceedings": "api/v1/ptab/trials/proceedings/search", + "search_documents": "api/v1/ptab/trials/documents/search", + "search_decisions": "api/v1/ptab/trials/decisions/search", + } + + def __init__( + self, + api_key: Optional[str] = None, + base_url: Optional[str] = None, + config: Optional[USPTOConfig] = None, + ): + """Initialize the PTABTrialsClient. + + Args: + api_key: Optional API key for authentication. + base_url: Optional base URL override for the API. + config: Optional USPTOConfig instance for configuration. + """ + self.config = config or USPTOConfig(api_key=api_key) + api_key_to_use = api_key or self.config.api_key + effective_base_url = ( + base_url or self.config.ptab_base_url or "https://api.uspto.gov" + ) + super().__init__( + api_key=api_key_to_use, base_url=effective_base_url, config=self.config + ) + + def search_proceedings( + self, + query: Optional[str] = None, + sort: Optional[str] = None, + offset: Optional[int] = 0, + limit: Optional[int] = 25, + facets: Optional[str] = None, + fields: Optional[str] = None, + filters: Optional[str] = None, + range_filters: Optional[str] = None, + post_body: Optional[Dict[str, Any]] = None, + # Convenience query parameters + trial_number_q: Optional[str] = None, + patent_owner_name_q: Optional[str] = None, + petitioner_party_name_q: Optional[str] = None, + respondent_name_q: Optional[str] = None, + trial_type_code_q: Optional[str] = None, + trial_status_category_q: Optional[str] = None, + petition_filing_date_from_q: Optional[str] = None, + petition_filing_date_to_q: Optional[str] = None, + additional_query_params: Optional[Dict[str, Any]] = None, + ) -> PTABTrialProceedingResponse: + """Searches for PTAB trial proceedings. + + This method can perform either a GET request using query parameters or a POST + request if post_body is specified. When using GET, you can provide either a + direct query string or use convenience parameters that will be automatically + combined into a query. + + Args: + query: Direct query string in USPTO search syntax. + sort: Sort order for results. + offset: Number of records to skip (pagination). + limit: Maximum number of records to return. + facets: Facet configuration string. + fields: Specific fields to return. + filters: Filter configuration string. + range_filters: Range filter configuration string. + post_body: Optional POST body for complex queries. + trial_number_q: Filter by trial number (e.g., "IPR2023-00001"). + patent_owner_name_q: Filter by patent owner name. + petitioner_party_name_q: Filter by petitioner party name. + respondent_name_q: Filter by respondent name. + trial_type_code_q: Filter by trial type code (e.g., "IPR", "PGR", "CBM", "DER"). + trial_status_category_q: Filter by trial status category. + petition_filing_date_from_q: Filter proceedings from this date (YYYY-MM-DD). + petition_filing_date_to_q: Filter proceedings to this date (YYYY-MM-DD). + additional_query_params: Additional custom query parameters. + + Returns: + PTABTrialProceedingResponse: Response containing matching trial proceedings. + + Examples: + # Search with direct query + >>> response = client.search_proceedings(query="trialNumber:IPR2023-00001") + + # Search with convenience parameters + >>> response = client.search_proceedings( + ... trial_type_code_q="IPR", + ... petition_filing_date_from_q="2023-01-01", + ... limit=50 + ... ) + + # Search with POST body + >>> response = client.search_proceedings( + ... post_body={"q": "trialStatusCategory:Terminated", "limit": 100} + ... ) + """ + endpoint = self.ENDPOINTS["search_proceedings"] + + if post_body is not None: + # POST request path + result = self._make_request( + method="POST", + endpoint=endpoint, + json_data=post_body, + params=additional_query_params, + response_class=PTABTrialProceedingResponse, + ) + else: + # GET request path + params: Dict[str, Any] = {} + final_q = query + + # Build query from convenience parameters + if final_q is None: + q_parts = [] + if trial_number_q: + q_parts.append(f"trialNumber:{trial_number_q}") + if patent_owner_name_q: + q_parts.append(f"patentOwnerName:{patent_owner_name_q}") + if petitioner_party_name_q: + q_parts.append(f"petitionerPartyName:{petitioner_party_name_q}") + if respondent_name_q: + q_parts.append(f"respondentName:{respondent_name_q}") + if trial_type_code_q: + q_parts.append(f"trialTypeCode:{trial_type_code_q}") + if trial_status_category_q: + q_parts.append(f"trialStatusCategory:{trial_status_category_q}") + + # Handle petition filing date range + if petition_filing_date_from_q and petition_filing_date_to_q: + q_parts.append( + f"petitionFilingDate:[{petition_filing_date_from_q} TO {petition_filing_date_to_q}]" + ) + elif petition_filing_date_from_q: + q_parts.append( + f"petitionFilingDate:>={petition_filing_date_from_q}" + ) + elif petition_filing_date_to_q: + q_parts.append(f"petitionFilingDate:<={petition_filing_date_to_q}") + + if q_parts: + final_q = " AND ".join(q_parts) + + # Add parameters + if final_q is not None: + params["q"] = final_q + if sort is not None: + params["sort"] = sort + if offset is not None: + params["offset"] = offset + if limit is not None: + params["limit"] = limit + if facets is not None: + params["facets"] = facets + if fields is not None: + params["fields"] = fields + if filters is not None: + params["filters"] = filters + if range_filters is not None: + params["rangeFilters"] = range_filters + + if additional_query_params: + params.update(additional_query_params) + + result = self._make_request( + method="GET", + endpoint=endpoint, + params=params, + response_class=PTABTrialProceedingResponse, + ) + + assert isinstance(result, PTABTrialProceedingResponse) + return result + + def search_documents( + self, + query: Optional[str] = None, + sort: Optional[str] = None, + offset: Optional[int] = 0, + limit: Optional[int] = 25, + facets: Optional[str] = None, + fields: Optional[str] = None, + filters: Optional[str] = None, + range_filters: Optional[str] = None, + post_body: Optional[Dict[str, Any]] = None, + # Convenience query parameters + trial_number_q: Optional[str] = None, + document_category_q: Optional[str] = None, + document_type_name_q: Optional[str] = None, + filing_date_from_q: Optional[str] = None, + filing_date_to_q: Optional[str] = None, + additional_query_params: Optional[Dict[str, Any]] = None, + ) -> PTABTrialProceedingResponse: + """Searches for PTAB trial documents. + + This method can perform either a GET request using query parameters or a POST + request if post_body is specified. When using GET, you can provide either a + direct query string or use convenience parameters that will be automatically + combined into a query. + + Args: + query: Direct query string in USPTO search syntax. + sort: Sort order for results. + offset: Number of records to skip (pagination). + limit: Maximum number of records to return. + facets: Facet configuration string. + fields: Specific fields to return. + filters: Filter configuration string. + range_filters: Range filter configuration string. + post_body: Optional POST body for complex queries. + trial_number_q: Filter by trial number. + document_category_q: Filter by document category. + document_type_name_q: Filter by document type name. + filing_date_from_q: Filter documents from this date (YYYY-MM-DD). + filing_date_to_q: Filter documents to this date (YYYY-MM-DD). + additional_query_params: Additional custom query parameters. + + Returns: + PTABTrialProceedingResponse: Response containing matching trial documents. + + Examples: + # Search with direct query + >>> response = client.search_documents(query="trialNumber:IPR2023-00001") + + # Search with convenience parameters + >>> response = client.search_documents( + ... document_category_q="Paper", + ... filing_date_from_q="2023-01-01", + ... limit=50 + ... ) + + # Search with POST body + >>> response = client.search_documents( + ... post_body={"q": "documentTypeName:Decision", "limit": 100} + ... ) + """ + endpoint = self.ENDPOINTS["search_documents"] + + if post_body is not None: + # POST request path + result = self._make_request( + method="POST", + endpoint=endpoint, + json_data=post_body, + params=additional_query_params, + response_class=PTABTrialProceedingResponse, + ) + else: + # GET request path + params: Dict[str, Any] = {} + final_q = query + + # TODO: Add convenience parameters for Petitioner, inventor, real party in interest, patent number, patent owner, + # Build query from convenience parameters + if final_q is None: + q_parts = [] + if trial_number_q: + q_parts.append(f"trialNumber:{trial_number_q}") + if document_category_q: + q_parts.append(f"documentCategory:{document_category_q}") + if document_type_name_q: + q_parts.append(f"documentTypeName:{document_type_name_q}") + + # Handle filing date range + if filing_date_from_q and filing_date_to_q: + q_parts.append( + f"filingDate:[{filing_date_from_q} TO {filing_date_to_q}]" + ) + elif filing_date_from_q: + q_parts.append(f"filingDate:>={filing_date_from_q}") + elif filing_date_to_q: + q_parts.append(f"filingDate:<={filing_date_to_q}") + + if q_parts: + final_q = " AND ".join(q_parts) + + # Add parameters + if final_q is not None: + params["q"] = final_q + if sort is not None: + params["sort"] = sort + if offset is not None: + params["offset"] = offset + if limit is not None: + params["limit"] = limit + if facets is not None: + params["facets"] = facets + if fields is not None: + params["fields"] = fields + if filters is not None: + params["filters"] = filters + if range_filters is not None: + params["rangeFilters"] = range_filters + + if additional_query_params: + params.update(additional_query_params) + + result = self._make_request( + method="GET", + endpoint=endpoint, + params=params, + response_class=PTABTrialProceedingResponse, + ) + + assert isinstance(result, PTABTrialProceedingResponse) + return result + + def search_decisions( + self, + query: Optional[str] = None, + sort: Optional[str] = None, + offset: Optional[int] = 0, + limit: Optional[int] = 25, + facets: Optional[str] = None, + fields: Optional[str] = None, + filters: Optional[str] = None, + range_filters: Optional[str] = None, + post_body: Optional[Dict[str, Any]] = None, + # Convenience query parameters + # TODO: parameter for trialTypeCode, patent number, application number, patent owner, trial status, real party in interest, document categroy. + trial_number_q: Optional[str] = None, + decision_type_category_q: Optional[str] = None, + decision_date_from_q: Optional[str] = None, + decision_date_to_q: Optional[str] = None, + additional_query_params: Optional[Dict[str, Any]] = None, + ) -> PTABTrialProceedingResponse: + """Searches for PTAB trial decisions. + + This method can perform either a GET request using query parameters or a POST + request if post_body is specified. When using GET, you can provide either a + direct query string or use convenience parameters that will be automatically + combined into a query. + + Args: + query: Direct query string in USPTO search syntax. + sort: Sort order for results. + offset: Number of records to skip (pagination). + limit: Maximum number of records to return. + facets: Facet configuration string. + fields: Specific fields to return. + filters: Filter configuration string. + range_filters: Range filter configuration string. + post_body: Optional POST body for complex queries. + trial_number_q: Filter by trial number. + decision_type_category_q: Filter by decision type category. + decision_date_from_q: Filter decisions from this date (YYYY-MM-DD). + decision_date_to_q: Filter decisions to this date (YYYY-MM-DD). + additional_query_params: Additional custom query parameters. + + Returns: + PTABTrialProceedingResponse: Response containing matching trial decisions. + + Examples: + # Search with direct query + >>> response = client.search_decisions(query="trialNumber:IPR2023-00001") + + # Search with convenience parameters + >>> response = client.search_decisions( + ... decision_type_category_q="Final Written Decision", + ... decision_date_from_q="2023-01-01", + ... limit=50 + ... ) + + # Search with POST body + >>> response = client.search_decisions( + ... post_body={"q": "decisionTypeCategory:Institution Decision", "limit": 100} + ... ) + """ + endpoint = self.ENDPOINTS["search_decisions"] + + if post_body is not None: + # POST request path + result = self._make_request( + method="POST", + endpoint=endpoint, + json_data=post_body, + params=additional_query_params, + response_class=PTABTrialProceedingResponse, + ) + else: + # GET request path + params: Dict[str, Any] = {} + final_q = query + + # Build query from convenience parameters + if final_q is None: + q_parts = [] + if trial_number_q: + q_parts.append(f"trialNumber:{trial_number_q}") + if decision_type_category_q: + q_parts.append(f"decisionTypeCategory:{decision_type_category_q}") + + # Handle decision date range + if decision_date_from_q and decision_date_to_q: + q_parts.append( + f"decisionDate:[{decision_date_from_q} TO {decision_date_to_q}]" + ) + elif decision_date_from_q: + q_parts.append(f"decisionDate:>={decision_date_from_q}") + elif decision_date_to_q: + q_parts.append(f"decisionDate:<={decision_date_to_q}") + + if q_parts: + final_q = " AND ".join(q_parts) + + # Add parameters + if final_q is not None: + params["q"] = final_q + if sort is not None: + params["sort"] = sort + if offset is not None: + params["offset"] = offset + if limit is not None: + params["limit"] = limit + if facets is not None: + params["facets"] = facets + if fields is not None: + params["fields"] = fields + if filters is not None: + params["filters"] = filters + if range_filters is not None: + params["rangeFilters"] = range_filters + + if additional_query_params: + params.update(additional_query_params) + + result = self._make_request( + method="GET", + endpoint=endpoint, + params=params, + response_class=PTABTrialProceedingResponse, + ) + + assert isinstance(result, PTABTrialProceedingResponse) + return result + + def paginate_proceedings(self, **kwargs: Any) -> Iterator[PTABTrialProceeding]: + """Provides an iterator to paginate through trial proceeding search results. + + This method simplifies fetching all trial proceedings matching a search query + by automatically handling pagination. It internally calls the search_proceedings + method for GET requests, batching results and yielding them one by one. + + All keyword arguments are passed directly to search_proceedings to define the + search criteria. The offset and limit parameters are managed by the pagination + logic; setting them directly in kwargs might lead to unexpected behavior. + + Args: + **kwargs: Keyword arguments passed to search_proceedings for constructing + the search query. Do not include post_body. + + Returns: + Iterator[PTABTrialProceeding]: An iterator yielding PTABTrialProceeding objects, + allowing iteration over all matching proceedings across multiple pages of results. + + Raises: + ValueError: If post_body is included in kwargs, as this method only + supports GET request parameters for pagination. + + Examples: + # Paginate through all IPR proceedings + >>> for proceeding in client.paginate_proceedings(trial_type_code_q="IPR"): + ... print(f"{proceeding.trial_meta_data.trial_number}: " + ... f"{proceeding.trial_meta_data.trial_status_category}") + + # Paginate with date range + >>> for proceeding in client.paginate_proceedings( + ... petition_filing_date_from_q="2023-01-01", + ... petition_filing_date_to_q="2023-12-31" + ... ): + ... process_proceeding(proceeding) + """ + if "post_body" in kwargs: + raise ValueError( + "paginate_proceedings uses GET requests and does not support 'post_body'. " + "Use keyword arguments for search criteria." + ) + + return self.paginate_results( + method_name="search_proceedings", + response_container_attr="patent_trial_proceeding_data_bag", + **kwargs, + ) diff --git a/src/pyUSPTO/config.py b/src/pyUSPTO/config.py index 32819d9..d71cfe1 100644 --- a/src/pyUSPTO/config.py +++ b/src/pyUSPTO/config.py @@ -24,6 +24,7 @@ def __init__( bulk_data_base_url: str = "https://api.uspto.gov", patent_data_base_url: str = "https://api.uspto.gov", petition_decisions_base_url: str = "https://api.uspto.gov", + ptab_base_url: str = "https://api.uspto.gov", http_config: Optional[HTTPConfig] = None, include_raw_data: bool = False, ): @@ -34,6 +35,7 @@ def __init__( bulk_data_base_url: Base URL for the Bulk Data API patent_data_base_url: Base URL for the Patent Data API petition_decisions_base_url: Base URL for the Final Petition Decisions API + ptab_base_url: Base URL for the PTAB (Patent Trial and Appeal Board) API http_config: Optional HTTPConfig for request handling (uses defaults if None) include_raw_data: If True, store raw JSON in response objects for debugging (default: False) """ @@ -44,6 +46,7 @@ def __init__( self.bulk_data_base_url = bulk_data_base_url self.patent_data_base_url = patent_data_base_url self.petition_decisions_base_url = petition_decisions_base_url + self.ptab_base_url = ptab_base_url # Use provided HTTPConfig or create default self.http_config = http_config if http_config is not None else HTTPConfig() @@ -69,6 +72,9 @@ def from_env(cls) -> "USPTOConfig": petition_decisions_base_url=os.environ.get( "USPTO_PETITION_DECISIONS_BASE_URL", "https://api.uspto.gov" ), + ptab_base_url=os.environ.get( + "USPTO_PTAB_BASE_URL", "https://api.uspto.gov" + ), # Also read HTTP config from environment http_config=HTTPConfig.from_env(), ) diff --git a/src/pyUSPTO/models/__init__.py b/src/pyUSPTO/models/__init__.py index 7bd2599..fc43683 100644 --- a/src/pyUSPTO/models/__init__.py +++ b/src/pyUSPTO/models/__init__.py @@ -18,6 +18,14 @@ PetitionDecisionDownloadResponse, PetitionDecisionResponse, ) +from pyUSPTO.models.ptab import ( + PTABAppealDecision, + PTABAppealResponse, + PTABInterferenceDecision, + PTABInterferenceResponse, + PTABTrialProceeding, + PTABTrialProceedingResponse, +) __all__ = [ "FromDictProtocol", @@ -30,4 +38,11 @@ "PetitionDecisionResponse", "PetitionDecisionDownloadResponse", "DocumentDownloadOption", + # PTAB Models + "PTABTrialProceeding", + "PTABTrialProceedingResponse", + "PTABAppealDecision", + "PTABAppealResponse", + "PTABInterferenceDecision", + "PTABInterferenceResponse", ] diff --git a/src/pyUSPTO/models/ptab.py b/src/pyUSPTO/models/ptab.py new file mode 100644 index 0000000..7ed77db --- /dev/null +++ b/src/pyUSPTO/models/ptab.py @@ -0,0 +1,1110 @@ +""" +models.ptab - Data models for USPTO PTAB (Patent Trial and Appeal Board) APIs + +This module provides data models, primarily using frozen dataclasses, for +representing responses from the USPTO PTAB APIs. These models cover: +- Patent trial proceedings (IPR, PGR, CBM, DER) +- Appeal decisions +- Interference decisions +""" + +import json +from dataclasses import dataclass, field +from datetime import date, datetime +from typing import Any, Dict, List, Optional + +# Import parsing utilities from models utils module +from pyUSPTO.models.utils import ( + parse_to_date, + parse_to_datetime_utc, + serialize_date, + serialize_datetime_as_iso, +) + +# ============================================================================ +# TRIAL PROCEEDINGS MODELS +# ============================================================================ + + +@dataclass(frozen=True) +class TrialMetaData: + """Trial metadata including status, dates, and download URI. + + Attributes: + petition_filing_date: Date the petition was filed. + trial_last_modified_date_time: Last modification timestamp. + trial_last_modified_date: Last modification date. + trial_status_category: Status of the trial (e.g., "Institution Denied", "Instituted"). + trial_type_code: Type of trial (IPR, PGR, CBM, DER). + file_download_uri: URI to download ZIP of all trial documents. + termination_date: Date the trial was terminated. + latest_decision_date: Date of the most recent decision. + institution_decision_date: Date of the institution decision. + """ + + petition_filing_date: Optional[date] = None + trial_last_modified_date_time: Optional[datetime] = None + trial_last_modified_date: Optional[date] = None + trial_status_category: Optional[str] = None + trial_type_code: Optional[str] = None + file_download_uri: Optional[str] = None + termination_date: Optional[date] = None + latest_decision_date: Optional[date] = None + institution_decision_date: Optional[date] = None + + @classmethod + def from_dict( + cls, data: Dict[str, Any], include_raw_data: bool = False + ) -> "TrialMetaData": + """Creates a TrialMetaData instance from a dictionary. + + Args: + data: Dictionary containing trial metadata from API response. + include_raw_data: Ignored for this model (no raw_data field). + + Returns: + TrialMetaData: An instance of TrialMetaData. + """ + return cls( + petition_filing_date=parse_to_date(data.get("petitionFilingDate")), + trial_last_modified_date_time=parse_to_datetime_utc( + data.get("trialLastModifiedDateTime") + ), + trial_last_modified_date=parse_to_date(data.get("trialLastModifiedDate")), + trial_status_category=data.get("trialStatusCategory"), + trial_type_code=data.get("trialTypeCode"), + file_download_uri=data.get("fileDownloadURI"), + termination_date=parse_to_date(data.get("terminationDate")), + latest_decision_date=parse_to_date(data.get("latestDecisionDate")), + institution_decision_date=parse_to_date( + data.get("institutionDecisionDate") + ), + ) + + +@dataclass(frozen=True) +class PatentOwnerData: + """Patent owner/respondent information. + + Attributes: + application_number_text: Application number. + counsel_name: Name of counsel. + grant_date: Patent grant date. + group_art_unit_number: Art unit number. + inventor_name: Name of inventor. + patent_number: Patent number. + technology_center_number: Technology center number. + real_party_in_interest_name: Real party in interest name. + patent_owner_name: Patent owner name. + """ + + application_number_text: Optional[str] = None + counsel_name: Optional[str] = None + grant_date: Optional[date] = None + group_art_unit_number: Optional[str] = None + inventor_name: Optional[str] = None + patent_number: Optional[str] = None + technology_center_number: Optional[str] = None + real_party_in_interest_name: Optional[str] = None + patent_owner_name: Optional[str] = None + + @classmethod + def from_dict( + cls, data: Dict[str, Any], include_raw_data: bool = False + ) -> "PatentOwnerData": + """Creates a PatentOwnerData instance from a dictionary. + + Args: + data: Dictionary containing patent owner data from API response. + include_raw_data: Ignored for this model. + + Returns: + PatentOwnerData: An instance of PatentOwnerData. + """ + return cls( + application_number_text=data.get("applicationNumberText"), + counsel_name=data.get("counselName"), + grant_date=parse_to_date(data.get("grantDate")), + group_art_unit_number=data.get("groupArtUnitNumber"), + inventor_name=data.get("inventorName"), + patent_number=data.get("patentNumber"), + technology_center_number=data.get("technologyCenterNumber"), + real_party_in_interest_name=data.get("realPartyInInterestName"), + patent_owner_name=data.get("patentOwnerName"), + ) + + +@dataclass(frozen=True) +class RegularPetitionerData: + """Regular petitioner information. + + Attributes: + counsel_name: Name of counsel. + real_party_in_interest_name: Real party in interest name. + """ + + counsel_name: Optional[str] = None + real_party_in_interest_name: Optional[str] = None + + @classmethod + def from_dict( + cls, data: Dict[str, Any], include_raw_data: bool = False + ) -> "RegularPetitionerData": + """Creates a RegularPetitionerData instance from a dictionary. + + Args: + data: Dictionary containing petitioner data from API response. + include_raw_data: Ignored for this model. + + Returns: + RegularPetitionerData: An instance of RegularPetitionerData. + """ + return cls( + counsel_name=data.get("counselName"), + real_party_in_interest_name=data.get("realPartyInInterestName"), + ) + + +@dataclass(frozen=True) +class RespondentData: + """Respondent information (same structure as PatentOwnerData). + + Attributes: + application_number_text: Application number. + counsel_name: Name of counsel. + grant_date: Patent grant date. + group_art_unit_number: Art unit number. + inventor_name: Name of inventor. + patent_number: Patent number. + technology_center_number: Technology center number. + real_party_in_interest_name: Real party in interest name. + patent_owner_name: Patent owner name. + """ + + application_number_text: Optional[str] = None + counsel_name: Optional[str] = None + grant_date: Optional[date] = None + group_art_unit_number: Optional[str] = None + inventor_name: Optional[str] = None + patent_number: Optional[str] = None + technology_center_number: Optional[str] = None + real_party_in_interest_name: Optional[str] = None + patent_owner_name: Optional[str] = None + + @classmethod + def from_dict( + cls, data: Dict[str, Any], include_raw_data: bool = False + ) -> "RespondentData": + """Creates a RespondentData instance from a dictionary. + + Args: + data: Dictionary containing respondent data from API response. + include_raw_data: Ignored for this model. + + Returns: + RespondentData: An instance of RespondentData. + """ + return cls( + application_number_text=data.get("applicationNumberText"), + counsel_name=data.get("counselName"), + grant_date=parse_to_date(data.get("grantDate")), + group_art_unit_number=data.get("groupArtUnitNumber"), + inventor_name=data.get("inventorName"), + patent_number=data.get("patentNumber"), + technology_center_number=data.get("technologyCenterNumber"), + real_party_in_interest_name=data.get("realPartyInInterestName"), + patent_owner_name=data.get("patentOwnerName"), + ) + + +@dataclass(frozen=True) +class DerivationPetitionerData: + """Derivation petitioner information. + + Attributes: + counsel_name: Name of counsel. + grant_date: Patent grant date. + group_art_unit_number: Art unit number. + inventor_name: Name of inventor. + patent_number: Patent number. + technology_center_number: Technology center number. + real_party_in_interest_name: Real party in interest name. + patent_owner_name: Patent owner name. + """ + + counsel_name: Optional[str] = None + grant_date: Optional[date] = None + group_art_unit_number: Optional[str] = None + inventor_name: Optional[str] = None + patent_number: Optional[str] = None + technology_center_number: Optional[str] = None + real_party_in_interest_name: Optional[str] = None + patent_owner_name: Optional[str] = None + + @classmethod + def from_dict( + cls, data: Dict[str, Any], include_raw_data: bool = False + ) -> "DerivationPetitionerData": + """Creates a DerivationPetitionerData instance from a dictionary. + + Args: + data: Dictionary containing derivation petitioner data from API response. + include_raw_data: Ignored for this model. + + Returns: + DerivationPetitionerData: An instance of DerivationPetitionerData. + """ + return cls( + counsel_name=data.get("counselName"), + grant_date=parse_to_date(data.get("grantDate")), + group_art_unit_number=data.get("groupArtUnitNumber"), + inventor_name=data.get("inventorName"), + patent_number=data.get("patentNumber"), + technology_center_number=data.get("technologyCenterNumber"), + real_party_in_interest_name=data.get("realPartyInInterestName"), + patent_owner_name=data.get("patentOwnerName"), + ) + + +@dataclass(frozen=True) +class PTABTrialProceeding: + """Individual PTAB trial proceeding record. + + Attributes: + trial_number: Trial number (e.g., "IPR2023-00123"). + trial_record_identifier: UUID identifier for the trial record. + last_modified_date_time: Last modification timestamp. + trial_meta_data: Trial metadata. + patent_owner_data: Patent owner information. + regular_petitioner_data: Regular petitioner information. + respondent_data: Respondent information. + derivation_petitioner_data: Derivation petitioner information. + raw_data: Raw JSON response data (if include_raw_data=True). + """ + + trial_number: Optional[str] = None + trial_record_identifier: Optional[str] = None + last_modified_date_time: Optional[datetime] = None + trial_meta_data: Optional[TrialMetaData] = None + patent_owner_data: Optional[PatentOwnerData] = None + regular_petitioner_data: Optional[RegularPetitionerData] = None + respondent_data: Optional[RespondentData] = None + derivation_petitioner_data: Optional[DerivationPetitionerData] = None + raw_data: Optional[Dict[str, Any]] = None + + @classmethod + def from_dict( + cls, data: Dict[str, Any], include_raw_data: bool = False + ) -> "PTABTrialProceeding": + """Creates a PTABTrialProceeding instance from a dictionary. + + Args: + data: Dictionary containing trial proceeding data from API response. + include_raw_data: Whether to include raw JSON data in the instance. + + Returns: + PTABTrialProceeding: An instance of PTABTrialProceeding. + """ + # Parse nested objects + trial_meta = data.get("trialMetaData") + trial_meta_data = TrialMetaData.from_dict(trial_meta) if trial_meta else None + + patent_owner = data.get("patentOwnerData") + patent_owner_data = ( + PatentOwnerData.from_dict(patent_owner) if patent_owner else None + ) + + reg_petitioner = data.get("regularPetitionerData") + regular_petitioner_data = ( + RegularPetitionerData.from_dict(reg_petitioner) if reg_petitioner else None + ) + + respondent = data.get("respondentData") + respondent_data = RespondentData.from_dict(respondent) if respondent else None + + deriv_petitioner = data.get("derivationPetitionerData") + derivation_petitioner_data = ( + DerivationPetitionerData.from_dict(deriv_petitioner) + if deriv_petitioner + else None + ) + + return cls( + trial_number=data.get("trialNumber"), + trial_record_identifier=data.get("trialRecordIdentifier"), + last_modified_date_time=parse_to_datetime_utc( + data.get("lastModifiedDateTime") + ), + trial_meta_data=trial_meta_data, + patent_owner_data=patent_owner_data, + regular_petitioner_data=regular_petitioner_data, + respondent_data=respondent_data, + derivation_petitioner_data=derivation_petitioner_data, + raw_data=data if include_raw_data else None, + ) + + +@dataclass(frozen=True) +class PTABTrialProceedingResponse: + """Response container for PTAB trial proceedings search. + + Attributes: + count: Total number of matching results. + request_identifier: UUID for the API request. + patent_trial_proceeding_data_bag: List of trial proceedings. + raw_data: Raw JSON response data (if include_raw_data=True). + """ + + count: Optional[int] = None + request_identifier: Optional[str] = None + patent_trial_proceeding_data_bag: List[PTABTrialProceeding] = field( + default_factory=list + ) + raw_data: Optional[Dict[str, Any]] = None + + @classmethod + def from_dict( + cls, data: Dict[str, Any], include_raw_data: bool = False + ) -> "PTABTrialProceedingResponse": + """Creates a PTABTrialProceedingResponse instance from a dictionary. + + Args: + data: Dictionary containing response data from API. + include_raw_data: Whether to include raw JSON data in the instance. + + Returns: + PTABTrialProceedingResponse: An instance of PTABTrialProceedingResponse. + """ + proceedings_data = data.get("patentTrialProceedingDataBag", []) + proceedings = [ + PTABTrialProceeding.from_dict(item, include_raw_data=include_raw_data) + for item in proceedings_data + ] + + return cls( + count=data.get("count"), + request_identifier=data.get("requestIdentifier"), + patent_trial_proceeding_data_bag=proceedings, + raw_data=data if include_raw_data else None, + ) + + +# ============================================================================ +# APPEAL DECISIONS MODELS +# ============================================================================ + + +@dataclass(frozen=True) +class AppealMetaData: + """Appeal metadata. + + Attributes: + appeal_filing_date: Date the appeal was filed. + appeal_last_modified_date: Last modification date. + application_type_category: Type of application. + docket_notice_mailed_date: Date the docket notice was mailed. + file_download_uri: URI to download ZIP of appeal documents. + """ + + appeal_filing_date: Optional[date] = None + appeal_last_modified_date: Optional[date] = None + application_type_category: Optional[str] = None + docket_notice_mailed_date: Optional[date] = None + file_download_uri: Optional[str] = None + + @classmethod + def from_dict( + cls, data: Dict[str, Any], include_raw_data: bool = False + ) -> "AppealMetaData": + """Creates an AppealMetaData instance from a dictionary. + + Args: + data: Dictionary containing appeal metadata from API response. + include_raw_data: Ignored for this model. + + Returns: + AppealMetaData: An instance of AppealMetaData. + """ + return cls( + appeal_filing_date=parse_to_date(data.get("appealFilingDate")), + appeal_last_modified_date=parse_to_date(data.get("appealLastModifiedDate")), + application_type_category=data.get("applicationTypeCategory"), + docket_notice_mailed_date=parse_to_date(data.get("docketNoticeMailedDate")), + file_download_uri=data.get("fileDownloadURI"), + ) + + +@dataclass(frozen=True) +class AppellantData: + """Appellant information. + + Attributes: + application_number_text: Application number. + counsel_name: Name of counsel. + group_art_unit_number: Art unit number. + inventor_name: Name of inventor. + real_party_in_interest_name: Real party in interest name. + patent_owner_name: Patent owner name. + publication_date: Publication date. + publication_number: Publication number. + technology_center_number: Technology center number. + """ + + application_number_text: Optional[str] = None + counsel_name: Optional[str] = None + group_art_unit_number: Optional[str] = None + inventor_name: Optional[str] = None + real_party_in_interest_name: Optional[str] = None + patent_owner_name: Optional[str] = None + publication_date: Optional[date] = None + publication_number: Optional[str] = None + technology_center_number: Optional[str] = None + + @classmethod + def from_dict( + cls, data: Dict[str, Any], include_raw_data: bool = False + ) -> "AppellantData": + """Creates an AppellantData instance from a dictionary. + + Args: + data: Dictionary containing appellant data from API response. + include_raw_data: Ignored for this model. + + Returns: + AppellantData: An instance of AppellantData. + """ + return cls( + application_number_text=data.get("applicationNumberText"), + counsel_name=data.get("counselName"), + group_art_unit_number=data.get("groupArtUnitNumber"), + inventor_name=data.get("inventorName"), + real_party_in_interest_name=data.get("realPartyInInterestName"), + patent_owner_name=data.get("patentOwnerName"), + publication_date=parse_to_date(data.get("publicationDate")), + publication_number=data.get("publicationNumber"), + technology_center_number=data.get("technologyCenterNumber"), + ) + + +@dataclass(frozen=True) +class RequestorData: + """Third party requestor information. + + Attributes: + third_party_name: Name of the third party. + """ + + third_party_name: Optional[str] = None + + @classmethod + def from_dict( + cls, data: Dict[str, Any], include_raw_data: bool = False + ) -> "RequestorData": + """Creates a RequestorData instance from a dictionary. + + Args: + data: Dictionary containing requestor data from API response. + include_raw_data: Ignored for this model. + + Returns: + RequestorData: An instance of RequestorData. + """ + return cls( + third_party_name=data.get("thirdPartyName"), + ) + + +@dataclass(frozen=True) +class AppealDocumentData: + """Appeal document metadata. + + Attributes: + document_filing_date: Date the document was filed. + document_identifier: Unique identifier for the document. + document_name: Name of the document. + document_size_quantity: Size of the document in bytes. + document_ocr_text: Full OCR text of the document. + document_type_description_text: Description of the document type. + file_download_uri: URI to download the document. + """ + + document_filing_date: Optional[date] = None + document_identifier: Optional[str] = None + document_name: Optional[str] = None + document_size_quantity: Optional[int] = None + document_ocr_text: Optional[str] = None + document_type_description_text: Optional[str] = None + file_download_uri: Optional[str] = None + + @classmethod + def from_dict( + cls, data: Dict[str, Any], include_raw_data: bool = False + ) -> "AppealDocumentData": + """Creates an AppealDocumentData instance from a dictionary. + + Args: + data: Dictionary containing document data from API response. + include_raw_data: Ignored for this model. + + Returns: + AppealDocumentData: An instance of AppealDocumentData. + """ + return cls( + document_filing_date=parse_to_date(data.get("documentFilingDate")), + document_identifier=data.get("documentIdentifier"), + document_name=data.get("documentName"), + document_size_quantity=data.get("documentSizeQuantity"), + document_ocr_text=data.get("documentOCRText"), + document_type_description_text=data.get("documentTypeDescriptionText"), + file_download_uri=data.get("fileDownloadURI"), + ) + + +@dataclass(frozen=True) +class DecisionData: + """Appeal decision information. + + Attributes: + appeal_outcome_category: Outcome of the appeal. + statute_and_rule_bag: List of applicable statutes and rules. + decision_issue_date: Date the decision was issued. + decision_type_category: Type of decision. + issue_type_bag: List of issue types. + """ + + appeal_outcome_category: Optional[str] = None + statute_and_rule_bag: List[str] = field(default_factory=list) + decision_issue_date: Optional[date] = None + decision_type_category: Optional[str] = None + issue_type_bag: List[str] = field(default_factory=list) + + @classmethod + def from_dict( + cls, data: Dict[str, Any], include_raw_data: bool = False + ) -> "DecisionData": + """Creates a DecisionData instance from a dictionary. + + Args: + data: Dictionary containing decision data from API response. + include_raw_data: Ignored for this model. + + Returns: + DecisionData: An instance of DecisionData. + """ + return cls( + appeal_outcome_category=data.get("appealOutcomeCategory"), + statute_and_rule_bag=data.get("statuteAndRuleBag", []), + decision_issue_date=parse_to_date(data.get("decisionIssueDate")), + decision_type_category=data.get("decisionTypeCategory"), + issue_type_bag=data.get("issueTypeBag", []), + ) + + +@dataclass(frozen=True) +class PTABAppealDecision: + """Individual PTAB appeal decision record. + + Attributes: + appeal_number: Appeal number. + last_modified_date_time: Last modification timestamp. + appeal_document_category: Document category. + appeal_meta_data: Appeal metadata. + appellant_data: Appellant information. + requestor_data: Third party requestor information. + document_data: Document metadata. + decision_data: Decision information. + raw_data: Raw JSON response data (if include_raw_data=True). + """ + + appeal_number: Optional[str] = None + last_modified_date_time: Optional[datetime] = None + appeal_document_category: Optional[str] = None + appeal_meta_data: Optional[AppealMetaData] = None + appellant_data: Optional[AppellantData] = None + requestor_data: Optional[RequestorData] = None + document_data: Optional[AppealDocumentData] = None + decision_data: Optional[DecisionData] = None + raw_data: Optional[Dict[str, Any]] = None + + @classmethod + def from_dict( + cls, data: Dict[str, Any], include_raw_data: bool = False + ) -> "PTABAppealDecision": + """Creates a PTABAppealDecision instance from a dictionary. + + Args: + data: Dictionary containing appeal decision data from API response. + include_raw_data: Whether to include raw JSON data in the instance. + + Returns: + PTABAppealDecision: An instance of PTABAppealDecision. + """ + # Parse nested objects + appeal_meta = data.get("appealMetaData") + appeal_meta_data = ( + AppealMetaData.from_dict(appeal_meta) if appeal_meta else None + ) + + appellant = data.get("appellantData") + appellant_data = AppellantData.from_dict(appellant) if appellant else None + + requestor = data.get("requestorData") + requestor_data = RequestorData.from_dict(requestor) if requestor else None + + document = data.get("documentData") + document_data = AppealDocumentData.from_dict(document) if document else None + + decision = data.get("decisionData") + decision_data = DecisionData.from_dict(decision) if decision else None + + return cls( + appeal_number=data.get("appealNumber"), + last_modified_date_time=parse_to_datetime_utc( + data.get("lastModifiedDateTime") + ), + appeal_document_category=data.get("appealDocumentCategory"), + appeal_meta_data=appeal_meta_data, + appellant_data=appellant_data, + requestor_data=requestor_data, + document_data=document_data, + decision_data=decision_data, + raw_data=data if include_raw_data else None, + ) + + +@dataclass(frozen=True) +class PTABAppealResponse: + """Response container for PTAB appeals search. + + Attributes: + count: Total number of matching results. + request_identifier: UUID for the API request. + patent_appeal_data_bag: List of appeal decisions. + raw_data: Raw JSON response data (if include_raw_data=True). + """ + + count: Optional[int] = None + request_identifier: Optional[str] = None + patent_appeal_data_bag: List[PTABAppealDecision] = field(default_factory=list) + raw_data: Optional[Dict[str, Any]] = None + + @classmethod + def from_dict( + cls, data: Dict[str, Any], include_raw_data: bool = False + ) -> "PTABAppealResponse": + """Creates a PTABAppealResponse instance from a dictionary. + + Args: + data: Dictionary containing response data from API. + include_raw_data: Whether to include raw JSON data in the instance. + + Returns: + PTABAppealResponse: An instance of PTABAppealResponse. + """ + appeals_data = data.get("patentAppealDataBag", []) + appeals = [ + PTABAppealDecision.from_dict(item, include_raw_data=include_raw_data) + for item in appeals_data + ] + + return cls( + count=data.get("count"), + request_identifier=data.get("requestIdentifier"), + patent_appeal_data_bag=appeals, + raw_data=data if include_raw_data else None, + ) + + +# ============================================================================ +# INTERFERENCE DECISIONS MODELS +# ============================================================================ + + +@dataclass(frozen=True) +class InterferenceMetaData: + """Interference metadata. + + Attributes: + interference_style_name: Style name of the interference. + interference_last_modified_date: Last modification date. + file_download_uri: URI to download ZIP of interference documents. + """ + + interference_style_name: Optional[str] = None + interference_last_modified_date: Optional[date] = None + file_download_uri: Optional[str] = None + + @classmethod + def from_dict( + cls, data: Dict[str, Any], include_raw_data: bool = False + ) -> "InterferenceMetaData": + """Creates an InterferenceMetaData instance from a dictionary. + + Args: + data: Dictionary containing interference metadata from API response. + include_raw_data: Ignored for this model. + + Returns: + InterferenceMetaData: An instance of InterferenceMetaData. + """ + return cls( + interference_style_name=data.get("interferenceStyleName"), + interference_last_modified_date=parse_to_date( + data.get("interferenceLastModifiedDate") + ), + file_download_uri=data.get("fileDownloadURI"), + ) + + +@dataclass(frozen=True) +class SeniorPartyData: + """Senior party information in an interference. + + Attributes: + application_number_text: Application number. + counsel_name: Name of counsel. + grant_date: Patent grant date. + group_art_unit_number: Art unit number. + real_party_in_interest_name: Real party in interest name. + patent_number: Patent number. + patent_owner_name: Patent owner name. + publication_date: Publication date. + publication_number: Publication number. + technology_center_number: Technology center number. + """ + + application_number_text: Optional[str] = None + counsel_name: Optional[str] = None + grant_date: Optional[date] = None + group_art_unit_number: Optional[str] = None + real_party_in_interest_name: Optional[str] = None + patent_number: Optional[str] = None + patent_owner_name: Optional[str] = None + publication_date: Optional[date] = None + publication_number: Optional[str] = None + technology_center_number: Optional[str] = None + + @classmethod + def from_dict( + cls, data: Dict[str, Any], include_raw_data: bool = False + ) -> "SeniorPartyData": + """Creates a SeniorPartyData instance from a dictionary. + + Args: + data: Dictionary containing senior party data from API response. + include_raw_data: Ignored for this model. + + Returns: + SeniorPartyData: An instance of SeniorPartyData. + """ + return cls( + application_number_text=data.get("applicationNumberText"), + counsel_name=data.get("counselName"), + grant_date=parse_to_date(data.get("grantDate")), + group_art_unit_number=data.get("groupArtUnitNumber"), + real_party_in_interest_name=data.get("realPartyInInterestName"), + patent_number=data.get("patentNumber"), + patent_owner_name=data.get("patentOwnerName"), + publication_date=parse_to_date(data.get("publicationDate")), + publication_number=data.get("publicationNumber"), + technology_center_number=data.get("technologyCenterNumber"), + ) + + +@dataclass(frozen=True) +class JuniorPartyData: + """Junior party information in an interference. + + Attributes: + publication_number: Publication number. + counsel_name: Name of counsel. + group_art_unit_number: Art unit number. + inventor_name: Name of inventor. + patent_owner_name: Patent owner name. + publication_date: Publication date. + real_party_in_interest_name: Real party in interest name. + technology_center_number: Technology center number. + """ + + publication_number: Optional[str] = None + counsel_name: Optional[str] = None + group_art_unit_number: Optional[str] = None + inventor_name: Optional[str] = None + patent_owner_name: Optional[str] = None + publication_date: Optional[date] = None + real_party_in_interest_name: Optional[str] = None + technology_center_number: Optional[str] = None + + @classmethod + def from_dict( + cls, data: Dict[str, Any], include_raw_data: bool = False + ) -> "JuniorPartyData": + """Creates a JuniorPartyData instance from a dictionary. + + Args: + data: Dictionary containing junior party data from API response. + include_raw_data: Ignored for this model. + + Returns: + JuniorPartyData: An instance of JuniorPartyData. + """ + return cls( + publication_number=data.get("publicationNumber"), + counsel_name=data.get("counselName"), + group_art_unit_number=data.get("groupArtUnitNumber"), + inventor_name=data.get("inventorName"), + patent_owner_name=data.get("patentOwnerName"), + publication_date=parse_to_date(data.get("publicationDate")), + real_party_in_interest_name=data.get("realPartyInInterestName"), + technology_center_number=data.get("technologyCenterNumber"), + ) + + +@dataclass(frozen=True) +class AdditionalPartyData: + """Additional party information in an interference. + + Attributes: + application_number_text: Application number. + inventor_name: Name of inventor. + patent_number: Patent number. + additional_party_name: Name of additional party. + """ + + application_number_text: Optional[str] = None + inventor_name: Optional[str] = None + patent_number: Optional[str] = None + additional_party_name: Optional[str] = None + + @classmethod + def from_dict( + cls, data: Dict[str, Any], include_raw_data: bool = False + ) -> "AdditionalPartyData": + """Creates an AdditionalPartyData instance from a dictionary. + + Args: + data: Dictionary containing additional party data from API response. + include_raw_data: Ignored for this model. + + Returns: + AdditionalPartyData: An instance of AdditionalPartyData. + """ + return cls( + application_number_text=data.get("applicationNumberText"), + inventor_name=data.get("inventorName"), + patent_number=data.get("patentNumber"), + additional_party_name=data.get("additionalPartyName"), + ) + + +@dataclass(frozen=True) +class InterferenceDocumentData: + """Interference document metadata. + + Attributes: + document_identifier: Unique identifier for the document. + document_name: Name of the document. + document_size_quantity: Size of the document in bytes. + document_ocr_text: Full OCR text of the document. + document_title_text: Title of the document. + interference_outcome_category: Outcome of the interference. + decision_issue_date: Date the decision was issued. + decision_type_category: Type of decision. + file_download_uri: URI to download the document. + """ + + document_identifier: Optional[str] = None + document_name: Optional[str] = None + document_size_quantity: Optional[int] = None + document_ocr_text: Optional[str] = None + document_title_text: Optional[str] = None + interference_outcome_category: Optional[str] = None + decision_issue_date: Optional[date] = None + decision_type_category: Optional[str] = None + file_download_uri: Optional[str] = None + + @classmethod + def from_dict( + cls, data: Dict[str, Any], include_raw_data: bool = False + ) -> "InterferenceDocumentData": + """Creates an InterferenceDocumentData instance from a dictionary. + + Args: + data: Dictionary containing document data from API response. + include_raw_data: Ignored for this model. + + Returns: + InterferenceDocumentData: An instance of InterferenceDocumentData. + """ + return cls( + document_identifier=data.get("documentIdentifier"), + document_name=data.get("documentName"), + document_size_quantity=data.get("documentSizeQuantity"), + document_ocr_text=data.get("documentOCRText"), + document_title_text=data.get("documentTitleText"), + interference_outcome_category=data.get("interferenceOutcomeCategory"), + decision_issue_date=parse_to_date(data.get("decisionIssueDate")), + decision_type_category=data.get("decisionTypeCategory"), + file_download_uri=data.get("fileDownloadURI"), + ) + + +@dataclass(frozen=True) +class PTABInterferenceDecision: + """Individual PTAB interference decision record. + + Attributes: + interference_number: Interference number. + last_modified_date_time: Last modification timestamp. + last_ingestion_date_time: Last ingestion timestamp (alternative field). + interference_meta_data: Interference metadata. + senior_party_data: Senior party information. + junior_party_data: Junior party information. + additional_party_data_bag: List of additional parties. + document_data: Document metadata. + raw_data: Raw JSON response data (if include_raw_data=True). + """ + + interference_number: Optional[str] = None + last_modified_date_time: Optional[datetime] = None + last_ingestion_date_time: Optional[datetime] = None + interference_meta_data: Optional[InterferenceMetaData] = None + senior_party_data: Optional[SeniorPartyData] = None + junior_party_data: Optional[JuniorPartyData] = None + additional_party_data_bag: List[AdditionalPartyData] = field(default_factory=list) + document_data: Optional[InterferenceDocumentData] = None + raw_data: Optional[Dict[str, Any]] = None + + @classmethod + def from_dict( + cls, data: Dict[str, Any], include_raw_data: bool = False + ) -> "PTABInterferenceDecision": + """Creates a PTABInterferenceDecision instance from a dictionary. + + Args: + data: Dictionary containing interference decision data from API response. + include_raw_data: Whether to include raw JSON data in the instance. + + Returns: + PTABInterferenceDecision: An instance of PTABInterferenceDecision. + """ + # Parse nested objects + interference_meta = data.get("interferenceMetaData") + interference_meta_data = ( + InterferenceMetaData.from_dict(interference_meta) + if interference_meta + else None + ) + + senior_party = data.get("seniorPartyData") + senior_party_data = ( + SeniorPartyData.from_dict(senior_party) if senior_party else None + ) + + junior_party = data.get("juniorPartyData") + junior_party_data = ( + JuniorPartyData.from_dict(junior_party) if junior_party else None + ) + + additional_parties_data = data.get("additionalPartyDataBag", []) + additional_party_data_bag = [ + AdditionalPartyData.from_dict(item) for item in additional_parties_data + ] + + document = data.get("documentData") + document_data = ( + InterferenceDocumentData.from_dict(document) if document else None + ) + + return cls( + interference_number=data.get("interferenceNumber"), + last_modified_date_time=parse_to_datetime_utc( + data.get("lastModifiedDateTime") + ), + last_ingestion_date_time=parse_to_datetime_utc( + data.get("lastIngestionDateTime") + ), + interference_meta_data=interference_meta_data, + senior_party_data=senior_party_data, + junior_party_data=junior_party_data, + additional_party_data_bag=additional_party_data_bag, + document_data=document_data, + raw_data=data if include_raw_data else None, + ) + + +@dataclass(frozen=True) +class PTABInterferenceResponse: + """Response container for PTAB interferences search. + + Attributes: + count: Total number of matching results. + request_identifier: UUID for the API request. + patent_interference_data_bag: List of interference decisions. + raw_data: Raw JSON response data (if include_raw_data=True). + """ + + count: Optional[int] = None + request_identifier: Optional[str] = None + patent_interference_data_bag: List[PTABInterferenceDecision] = field( + default_factory=list + ) + raw_data: Optional[Dict[str, Any]] = None + + @classmethod + def from_dict( + cls, data: Dict[str, Any], include_raw_data: bool = False + ) -> "PTABInterferenceResponse": + """Creates a PTABInterferenceResponse instance from a dictionary. + + Args: + data: Dictionary containing response data from API. + include_raw_data: Whether to include raw JSON data in the instance. + + Returns: + PTABInterferenceResponse: An instance of PTABInterferenceResponse. + """ + interferences_data = data.get("patentInterferenceDataBag", []) + interferences = [ + PTABInterferenceDecision.from_dict(item, include_raw_data=include_raw_data) + for item in interferences_data + ] + + return cls( + count=data.get("count"), + request_identifier=data.get("requestIdentifier"), + patent_interference_data_bag=interferences, + raw_data=data if include_raw_data else None, + ) + + +# ============================================================================ +# EXPORTS +# ============================================================================ + +__all__ = [ + # Trial Proceedings Models + "TrialMetaData", + "PatentOwnerData", + "RegularPetitionerData", + "RespondentData", + "DerivationPetitionerData", + "PTABTrialProceeding", + "PTABTrialProceedingResponse", + # Appeal Decisions Models + "AppealMetaData", + "AppellantData", + "RequestorData", + "AppealDocumentData", + "DecisionData", + "PTABAppealDecision", + "PTABAppealResponse", + # Interference Decisions Models + "InterferenceMetaData", + "SeniorPartyData", + "JuniorPartyData", + "AdditionalPartyData", + "InterferenceDocumentData", + "PTABInterferenceDecision", + "PTABInterferenceResponse", +] diff --git a/tests/clients/test_ptab_appeals_client.py b/tests/clients/test_ptab_appeals_client.py new file mode 100644 index 0000000..71bc7f7 --- /dev/null +++ b/tests/clients/test_ptab_appeals_client.py @@ -0,0 +1,420 @@ +""" +Tests for PTABAppealsClient. + +This module contains unit tests for the PTABAppealsClient class. +""" + +from typing import Any, Dict +from unittest.mock import MagicMock, patch + +import pytest + +from pyUSPTO import PTABAppealsClient, USPTOConfig +from pyUSPTO.models.ptab import PTABAppealDecision, PTABAppealResponse + + +@pytest.fixture +def api_key_fixture() -> str: + """Fixture for test API key.""" + return "test_key" + + +@pytest.fixture +def appeal_decision_sample() -> Dict[str, Any]: + """Sample appeal decision data for testing.""" + return { + "count": 2, + "requestIdentifier": "req-123", + "patentAppealDataBag": [ + { + "appealNumber": "2023-001234", + "appealRecordIdentifier": "appeal-uuid-1", + "lastModifiedDateTime": "2023-06-15T10:30:00Z", + "appealMetaData": { + "applicationNumberText": "15/123456", + "technologyCenterNumber": "3600", + }, + "decisionData": { + "decisionTypeCategory": "Affirmed", + "decisionDate": "2023-06-01", + }, + }, + { + "appealNumber": "2023-001235", + "appealRecordIdentifier": "appeal-uuid-2", + "lastModifiedDateTime": "2023-06-20T14:00:00Z", + "appealMetaData": { + "applicationNumberText": "16/789012", + "technologyCenterNumber": "2100", + }, + "decisionData": { + "decisionTypeCategory": "Reversed", + "decisionDate": "2023-06-10", + }, + }, + ], + } + + +@pytest.fixture +def mock_ptab_appeals_client(api_key_fixture: str) -> PTABAppealsClient: + """Fixture for mock PTABAppealsClient.""" + return PTABAppealsClient(api_key=api_key_fixture) + + +class TestPTABAppealsClientInit: + """Tests for initialization of PTABAppealsClient.""" + + def test_init_with_api_key(self, api_key_fixture: str) -> None: + """Test initialization with API key.""" + client = PTABAppealsClient(api_key=api_key_fixture) + assert client._api_key == api_key_fixture + assert client.base_url == "https://api.uspto.gov" + + def test_init_with_custom_base_url(self, api_key_fixture: str) -> None: + """Test initialization with custom base URL.""" + custom_url = "https://custom.api.test.com" + client = PTABAppealsClient(api_key=api_key_fixture, base_url=custom_url) + assert client._api_key == api_key_fixture + assert client.base_url == custom_url + + def test_init_with_config(self) -> None: + """Test initialization with config object.""" + config_key = "config_key" + config_url = "https://config.api.test.com" + config = USPTOConfig(api_key=config_key, ptab_base_url=config_url) + client = PTABAppealsClient(config=config) + assert client._api_key == config_key + assert client.base_url == config_url + assert client.config is config + + def test_init_with_api_key_and_config(self, api_key_fixture: str) -> None: + """Test initialization with both API key and config.""" + config = USPTOConfig( + api_key="config_key", + ptab_base_url="https://config.api.test.com", + ) + client = PTABAppealsClient(api_key=api_key_fixture, config=config) + # API key parameter takes precedence + assert client._api_key == api_key_fixture + # But base_url comes from config + assert client.base_url == "https://config.api.test.com" + + +class TestPTABAppealsClientSearchDecisions: + """Tests for search_decisions method.""" + + def test_search_decisions_get_with_query( + self, + mock_ptab_appeals_client: PTABAppealsClient, + appeal_decision_sample: Dict[str, Any], + ) -> None: + """Test search_decisions with GET and direct query.""" + # Setup + mock_session = MagicMock() + mock_response = MagicMock() + mock_response.json.return_value = appeal_decision_sample + mock_session.get.return_value = mock_response + mock_ptab_appeals_client.session = mock_session + + # Test + result = mock_ptab_appeals_client.search_decisions( + query="appealNumber:2024518758", limit=10 + ) + + # Verify + assert isinstance(result, PTABAppealResponse) + assert result.count == 2 + assert len(result.patent_appeal_data_bag) == 2 + mock_session.get.assert_called_once() + call_args = mock_session.get.call_args + assert "q" in call_args[1]["params"] + assert call_args[1]["params"]["q"] == "appealNumber:2024518758" + + def test_search_decisions_get_with_convenience_params( + self, + mock_ptab_appeals_client: PTABAppealsClient, + appeal_decision_sample: Dict[str, Any], + ) -> None: + """Test search_decisions with convenience parameters.""" + # Setup + mock_session = MagicMock() + mock_response = MagicMock() + mock_response.json.return_value = appeal_decision_sample + mock_session.get.return_value = mock_response + mock_ptab_appeals_client.session = mock_session + + # Test + result = mock_ptab_appeals_client.search_decisions( + additional_query_params={"appealNumber": "2015000194"}, + technology_center_number_q="3600", + decision_type_category_q="Affirmed", + decision_date_from_q="2023-01-01", + decision_date_to_q="2023-12-31", + limit=25, + ) + + # Verify + assert isinstance(result, PTABAppealResponse) + mock_session.get.assert_called_once() + call_args = mock_session.get.call_args + params = call_args[1]["params"] + assert "q" in params + assert "2015000194" in params["appealNumber"] + assert "technologyCenterNumber:3600" in params["q"] + assert "decisionTypeCategory:Affirmed" in params["q"] + assert "decisionDate:[2023-01-01 TO 2023-12-31]" in params["q"] + assert params["limit"] == 25 + + def test_search_decisions_get_with_date_from_only( + self, + mock_ptab_appeals_client: PTABAppealsClient, + appeal_decision_sample: Dict[str, Any], + ) -> None: + """Test search_decisions with only date_from parameter.""" + # Setup + mock_session = MagicMock() + mock_response = MagicMock() + mock_response.json.return_value = appeal_decision_sample + mock_session.get.return_value = mock_response + mock_ptab_appeals_client.session = mock_session + + # Test + result = mock_ptab_appeals_client.search_decisions( + decision_date_from_q="2023-01-01" + ) + + # Verify + assert isinstance(result, PTABAppealResponse) + call_args = mock_session.get.call_args + params = call_args[1]["params"] + assert "decisionDate:>=2023-01-01" in params["q"] + + def test_search_decisions_get_with_date_to_only( + self, + mock_ptab_appeals_client: PTABAppealsClient, + appeal_decision_sample: Dict[str, Any], + ) -> None: + """Test search_decisions with only date_to parameter.""" + # Setup + mock_session = MagicMock() + mock_response = MagicMock() + mock_response.json.return_value = appeal_decision_sample + mock_session.get.return_value = mock_response + mock_ptab_appeals_client.session = mock_session + + # Test + result = mock_ptab_appeals_client.search_decisions( + decision_date_to_q="2023-12-31" + ) + + # Verify + assert isinstance(result, PTABAppealResponse) + call_args = mock_session.get.call_args + params = call_args[1]["params"] + assert "decisionDate:<=2023-12-31" in params["q"] + + def test_search_decisions_get_with_all_convenience_params( + self, + mock_ptab_appeals_client: PTABAppealsClient, + appeal_decision_sample: Dict[str, Any], + ) -> None: + """Test search_decisions with all convenience parameters.""" + # Setup + mock_session = MagicMock() + mock_response = MagicMock() + mock_response.json.return_value = appeal_decision_sample + mock_session.get.return_value = mock_response + mock_ptab_appeals_client.session = mock_session + + # Test + result = mock_ptab_appeals_client.search_decisions( + appeal_number_q="2023-001234", + application_number_text_q="15/123456", + appellant_name_q="Test Appellant", + requestor_name_q="Test Requestor", + decision_type_category_q="Affirmed", + technology_center_number_q="3600", + decision_date_from_q="2023-01-01", + decision_date_to_q="2023-12-31", + ) + + # Verify + assert isinstance(result, PTABAppealResponse) + call_args = mock_session.get.call_args + params = call_args[1]["params"] + assert "appealNumber:2023-001234" in params["q"] + assert "applicationNumberText:15/123456" in params["q"] + assert "appellantName:Test Appellant" in params["q"] + assert "requestorName:Test Requestor" in params["q"] + assert "decisionTypeCategory:Affirmed" in params["q"] + assert "technologyCenterNumber:3600" in params["q"] + + def test_search_decisions_post_with_body( + self, + mock_ptab_appeals_client: PTABAppealsClient, + appeal_decision_sample: Dict[str, Any], + ) -> None: + """Test search_decisions with POST body.""" + # Setup + mock_session = MagicMock() + mock_response = MagicMock() + mock_response.json.return_value = appeal_decision_sample + mock_session.post.return_value = mock_response + mock_ptab_appeals_client.session = mock_session + + post_body = {"q": "technologyCenterNumber:3600", "limit": 100} + + # Test + result = mock_ptab_appeals_client.search_decisions(post_body=post_body) + + # Verify + assert isinstance(result, PTABAppealResponse) + mock_session.post.assert_called_once() + call_args = mock_session.post.call_args + assert call_args[1]["json"] == post_body + + def test_search_decisions_with_optional_params( + self, + mock_ptab_appeals_client: PTABAppealsClient, + appeal_decision_sample: Dict[str, Any], + ) -> None: + """Test search_decisions with optional parameters like sort, facets, etc.""" + # Setup + mock_session = MagicMock() + mock_response = MagicMock() + mock_response.json.return_value = appeal_decision_sample + mock_session.get.return_value = mock_response + mock_ptab_appeals_client.session = mock_session + + # Test + result = mock_ptab_appeals_client.search_decisions( + query="appealNumber:2023-001234", + sort="decisionDate desc", + offset=10, + limit=50, + facets="technologyCenterNumber", + fields="appealNumber,decisionDate", + filters="decisionTypeCategory:Affirmed", + range_filters="decisionDate:[2023-01-01 TO 2023-12-31]", + ) + + # Verify + assert isinstance(result, PTABAppealResponse) + call_args = mock_session.get.call_args + params = call_args[1]["params"] + assert params["sort"] == "decisionDate desc" + assert params["offset"] == 10 + assert params["limit"] == 50 + assert params["facets"] == "technologyCenterNumber" + assert params["fields"] == "appealNumber,decisionDate" + assert params["filters"] == "decisionTypeCategory:Affirmed" + assert params["rangeFilters"] == "decisionDate:[2023-01-01 TO 2023-12-31]" + + +class TestPTABAppealsClientPaginate: + """Tests for paginate_decisions method.""" + + def test_paginate_decisions( + self, mock_ptab_appeals_client: PTABAppealsClient + ) -> None: + """Test paginate_decisions method.""" + # Setup mock responses + first_response = PTABAppealResponse.from_dict( + { + "count": 2, + "requestIdentifier": "req-1", + "patentAppealDataBag": [ + {"appealNumber": "2023-001234"}, + {"appealNumber": "2023-001235"}, + ], + } + ) + + second_response = PTABAppealResponse.from_dict( + { + "count": 1, + "requestIdentifier": "req-2", + "patentAppealDataBag": [ + {"appealNumber": "2023-001236"}, + ], + } + ) + + third_response = PTABAppealResponse.from_dict( + { + "count": 0, + "requestIdentifier": "req-3", + "patentAppealDataBag": [], + } + ) + + # Mock search_decisions to return different responses + with patch.object(mock_ptab_appeals_client, "search_decisions") as mock_search: + mock_search.side_effect = [first_response, second_response, third_response] + + # Test + results = list( + mock_ptab_appeals_client.paginate_decisions( + technology_center_number_q="3600", limit=2 + ) + ) + + # Verify + assert len(results) == 3 + assert results[0].appeal_number == "2023-001234" + assert results[1].appeal_number == "2023-001235" + assert results[2].appeal_number == "2023-001236" + assert mock_search.call_count == 2 # Stops when count < limit + + def test_paginate_decisions_raises_on_post_body( + self, mock_ptab_appeals_client: PTABAppealsClient + ) -> None: + """Test that paginate_decisions raises ValueError with post_body.""" + with pytest.raises(ValueError, match="does not support 'post_body'"): + list(mock_ptab_appeals_client.paginate_decisions(post_body={"q": "test"})) + + def test_paginate_decisions_with_multiple_params( + self, mock_ptab_appeals_client: PTABAppealsClient + ) -> None: + """Test paginate_decisions with multiple search parameters.""" + # Setup mock responses + first_response = PTABAppealResponse.from_dict( + { + "count": 2, + "requestIdentifier": "req-1", + "patentAppealDataBag": [ + {"appealNumber": "2023-001234"}, + {"appealNumber": "2023-001235"}, + ], + } + ) + + second_response = PTABAppealResponse.from_dict( + { + "count": 0, + "requestIdentifier": "req-2", + "patentAppealDataBag": [], + } + ) + + with patch.object(mock_ptab_appeals_client, "search_decisions") as mock_search: + mock_search.side_effect = [first_response, second_response] + + # Test + results = list( + mock_ptab_appeals_client.paginate_decisions( + technology_center_number_q="3600", + decision_type_category_q="Affirmed", + decision_date_from_q="2023-01-01", + limit=2, + ) + ) + + # Verify + assert len(results) == 2 + # Verify that search_decisions was called with correct params + call_args = mock_search.call_args_list[0] + assert call_args[1]["technology_center_number_q"] == "3600" + assert call_args[1]["decision_type_category_q"] == "Affirmed" + assert call_args[1]["decision_date_from_q"] == "2023-01-01" diff --git a/tests/clients/test_ptab_interferences_client.py b/tests/clients/test_ptab_interferences_client.py new file mode 100644 index 0000000..8d3147f --- /dev/null +++ b/tests/clients/test_ptab_interferences_client.py @@ -0,0 +1,445 @@ +""" +Tests for PTABInterferencesClient. + +This module contains unit tests for the PTABInterferencesClient class. +""" + +from typing import Any, Dict +from unittest.mock import MagicMock, patch + +import pytest + +from pyUSPTO import PTABInterferencesClient, USPTOConfig +from pyUSPTO.models.ptab import PTABInterferenceDecision, PTABInterferenceResponse + + +@pytest.fixture +def api_key_fixture() -> str: + """Fixture for test API key.""" + return "test_key" + + +@pytest.fixture +def interference_decision_sample() -> Dict[str, Any]: + """Sample interference decision data for testing.""" + return { + "count": 2, + "requestIdentifier": "req-123", + "patentInterferenceDataBag": [ + { + "interferenceNumber": "106123", + "interferenceRecordIdentifier": "interference-uuid-1", + "lastModifiedDateTime": "2023-03-15T10:30:00Z", + "interferenceMetaData": { + "seniorPartyApplicationNumber": "12/345678", + "juniorPartyApplicationNumber": "13/987654", + "seniorPartyName": "Senior Party Inc.", + "juniorPartyName": "Junior Party LLC", + }, + "documentData": { + "interferenceOutcomeCategory": "Priority to Senior Party", + "decisionTypeCategory": "Final Decision", + "decisionDate": "2023-03-01", + }, + }, + { + "interferenceNumber": "106124", + "interferenceRecordIdentifier": "interference-uuid-2", + "lastModifiedDateTime": "2023-03-20T14:00:00Z", + "interferenceMetaData": { + "seniorPartyApplicationNumber": "14/111222", + "juniorPartyApplicationNumber": "14/333444", + }, + "documentData": { + "interferenceOutcomeCategory": "Priority to Junior Party", + "decisionTypeCategory": "Judgment", + "decisionDate": "2023-03-10", + }, + }, + ], + } + + +@pytest.fixture +def mock_ptab_interferences_client(api_key_fixture: str) -> PTABInterferencesClient: + """Fixture for mock PTABInterferencesClient.""" + return PTABInterferencesClient(api_key=api_key_fixture) + + +class TestPTABInterferencesClientInit: + """Tests for initialization of PTABInterferencesClient.""" + + def test_init_with_api_key(self, api_key_fixture: str) -> None: + """Test initialization with API key.""" + client = PTABInterferencesClient(api_key=api_key_fixture) + assert client._api_key == api_key_fixture + assert client.base_url == "https://api.uspto.gov" + + def test_init_with_custom_base_url(self, api_key_fixture: str) -> None: + """Test initialization with custom base URL.""" + custom_url = "https://custom.api.test.com" + client = PTABInterferencesClient(api_key=api_key_fixture, base_url=custom_url) + assert client._api_key == api_key_fixture + assert client.base_url == custom_url + + def test_init_with_config(self) -> None: + """Test initialization with config object.""" + config_key = "config_key" + config_url = "https://config.api.test.com" + config = USPTOConfig(api_key=config_key, ptab_base_url=config_url) + client = PTABInterferencesClient(config=config) + assert client._api_key == config_key + assert client.base_url == config_url + assert client.config is config + + def test_init_with_api_key_and_config(self, api_key_fixture: str) -> None: + """Test initialization with both API key and config.""" + config = USPTOConfig( + api_key="config_key", + ptab_base_url="https://config.api.test.com", + ) + client = PTABInterferencesClient(api_key=api_key_fixture, config=config) + # API key parameter takes precedence + assert client._api_key == api_key_fixture + # But base_url comes from config + assert client.base_url == "https://config.api.test.com" + + +class TestPTABInterferencesClientSearchDecisions: + """Tests for search_decisions method.""" + + def test_search_decisions_get_with_query( + self, + mock_ptab_interferences_client: PTABInterferencesClient, + interference_decision_sample: Dict[str, Any], + ) -> None: + """Test search_decisions with GET and direct query.""" + # Setup + mock_session = MagicMock() + mock_response = MagicMock() + mock_response.json.return_value = interference_decision_sample + mock_session.get.return_value = mock_response + mock_ptab_interferences_client.session = mock_session + + # Test + result = mock_ptab_interferences_client.search_decisions( + query="interferenceNumber:106123", limit=10 + ) + + # Verify + assert isinstance(result, PTABInterferenceResponse) + assert result.count == 2 + assert len(result.patent_interference_data_bag) == 2 + mock_session.get.assert_called_once() + call_args = mock_session.get.call_args + assert "q" in call_args[1]["params"] + assert call_args[1]["params"]["q"] == "interferenceNumber:106123" + + def test_search_decisions_get_with_convenience_params( + self, + mock_ptab_interferences_client: PTABInterferencesClient, + interference_decision_sample: Dict[str, Any], + ) -> None: + """Test search_decisions with convenience parameters.""" + # Setup + mock_session = MagicMock() + mock_response = MagicMock() + mock_response.json.return_value = interference_decision_sample + mock_session.get.return_value = mock_response + mock_ptab_interferences_client.session = mock_session + + # Test + result = mock_ptab_interferences_client.search_decisions( + interference_number_q="106123", + senior_party_name_q="Senior Party Inc.", + junior_party_name_q="Junior Party LLC", + interference_outcome_category_q="Priority to Senior Party", + decision_type_category_q="Final Decision", + decision_date_from_q="2023-01-01", + decision_date_to_q="2023-12-31", + limit=25, + additional_query_params={"interferenceNumber": "106123"}, + ) + + # Verify + assert isinstance(result, PTABInterferenceResponse) + mock_session.get.assert_called_once() + call_args = mock_session.get.call_args + params = call_args[1]["params"] + assert "q" in params + assert "106123" in params["interferenceNumber"] + assert "seniorPartyName:Senior Party Inc." in params["q"] + assert "juniorPartyName:Junior Party LLC" in params["q"] + assert "interferenceOutcomeCategory:Priority to Senior Party" in params["q"] + assert "decisionTypeCategory:Final Decision" in params["q"] + assert "decisionDate:[2023-01-01 TO 2023-12-31]" in params["q"] + assert params["limit"] == 25 + + def test_search_decisions_get_with_date_from_only( + self, + mock_ptab_interferences_client: PTABInterferencesClient, + interference_decision_sample: Dict[str, Any], + ) -> None: + """Test search_decisions with only date_from parameter.""" + # Setup + mock_session = MagicMock() + mock_response = MagicMock() + mock_response.json.return_value = interference_decision_sample + mock_session.get.return_value = mock_response + mock_ptab_interferences_client.session = mock_session + + # Test + result = mock_ptab_interferences_client.search_decisions( + decision_date_from_q="2023-01-01" + ) + + # Verify + assert isinstance(result, PTABInterferenceResponse) + call_args = mock_session.get.call_args + params = call_args[1]["params"] + assert "decisionDate:>=2023-01-01" in params["q"] + + def test_search_decisions_get_with_date_to_only( + self, + mock_ptab_interferences_client: PTABInterferencesClient, + interference_decision_sample: Dict[str, Any], + ) -> None: + """Test search_decisions with only date_to parameter.""" + # Setup + mock_session = MagicMock() + mock_response = MagicMock() + mock_response.json.return_value = interference_decision_sample + mock_session.get.return_value = mock_response + mock_ptab_interferences_client.session = mock_session + + # Test + result = mock_ptab_interferences_client.search_decisions( + decision_date_to_q="2023-12-31" + ) + + # Verify + assert isinstance(result, PTABInterferenceResponse) + call_args = mock_session.get.call_args + params = call_args[1]["params"] + assert "decisionDate:<=2023-12-31" in params["q"] + + def test_search_decisions_get_with_all_convenience_params( + self, + mock_ptab_interferences_client: PTABInterferencesClient, + interference_decision_sample: Dict[str, Any], + ) -> None: + """Test search_decisions with all convenience parameters.""" + # Setup + mock_session = MagicMock() + mock_response = MagicMock() + mock_response.json.return_value = interference_decision_sample + mock_session.get.return_value = mock_response + mock_ptab_interferences_client.session = mock_session + + # Test + result = mock_ptab_interferences_client.search_decisions( + interference_number_q="106123", + senior_party_application_number_q="12/345678", + junior_party_application_number_q="13/987654", + senior_party_name_q="Senior Party Inc.", + junior_party_name_q="Junior Party LLC", + interference_outcome_category_q="Priority to Senior Party", + decision_type_category_q="Final Decision", + decision_date_from_q="2023-01-01", + decision_date_to_q="2023-12-31", + ) + + # Verify + assert isinstance(result, PTABInterferenceResponse) + call_args = mock_session.get.call_args + params = call_args[1]["params"] + assert "interferenceNumber:106123" in params["q"] + assert "seniorPartyApplicationNumber:12/345678" in params["q"] + assert "juniorPartyApplicationNumber:13/987654" in params["q"] + assert "seniorPartyName:Senior Party Inc." in params["q"] + assert "juniorPartyName:Junior Party LLC" in params["q"] + assert "interferenceOutcomeCategory:Priority to Senior Party" in params["q"] + assert "decisionTypeCategory:Final Decision" in params["q"] + + def test_search_decisions_post_with_body( + self, + mock_ptab_interferences_client: PTABInterferencesClient, + interference_decision_sample: Dict[str, Any], + ) -> None: + """Test search_decisions with POST body.""" + # Setup + mock_session = MagicMock() + mock_response = MagicMock() + mock_response.json.return_value = interference_decision_sample + mock_session.post.return_value = mock_response + mock_ptab_interferences_client.session = mock_session + + post_body = { + "q": "interferenceOutcomeCategory:Priority to Senior Party", + "limit": 100, + } + + # Test + result = mock_ptab_interferences_client.search_decisions(post_body=post_body) + + # Verify + assert isinstance(result, PTABInterferenceResponse) + mock_session.post.assert_called_once() + call_args = mock_session.post.call_args + assert call_args[1]["json"] == post_body + + def test_search_decisions_with_optional_params( + self, + mock_ptab_interferences_client: PTABInterferencesClient, + interference_decision_sample: Dict[str, Any], + ) -> None: + """Test search_decisions with optional parameters like sort, facets, etc.""" + # Setup + mock_session = MagicMock() + mock_response = MagicMock() + mock_response.json.return_value = interference_decision_sample + mock_session.get.return_value = mock_response + mock_ptab_interferences_client.session = mock_session + + # Test + result = mock_ptab_interferences_client.search_decisions( + query="interferenceNumber:106123", + sort="decisionDate desc", + offset=10, + limit=50, + facets="interferenceOutcomeCategory", + fields="interferenceNumber,decisionDate", + filters="decisionTypeCategory:Final Decision", + range_filters="decisionDate:[2023-01-01 TO 2023-12-31]", + ) + + # Verify + assert isinstance(result, PTABInterferenceResponse) + call_args = mock_session.get.call_args + params = call_args[1]["params"] + assert params["sort"] == "decisionDate desc" + assert params["offset"] == 10 + assert params["limit"] == 50 + assert params["facets"] == "interferenceOutcomeCategory" + assert params["fields"] == "interferenceNumber,decisionDate" + assert params["filters"] == "decisionTypeCategory:Final Decision" + assert params["rangeFilters"] == "decisionDate:[2023-01-01 TO 2023-12-31]" + + +class TestPTABInterferencesClientPaginate: + """Tests for paginate_decisions method.""" + + def test_paginate_decisions( + self, mock_ptab_interferences_client: PTABInterferencesClient + ) -> None: + """Test paginate_decisions method.""" + # Setup mock responses + first_response = PTABInterferenceResponse.from_dict( + { + "count": 2, + "requestIdentifier": "req-1", + "patentInterferenceDataBag": [ + {"interferenceNumber": "106123"}, + {"interferenceNumber": "106124"}, + ], + } + ) + + second_response = PTABInterferenceResponse.from_dict( + { + "count": 1, + "requestIdentifier": "req-2", + "patentInterferenceDataBag": [ + {"interferenceNumber": "106125"}, + ], + } + ) + + third_response = PTABInterferenceResponse.from_dict( + { + "count": 0, + "requestIdentifier": "req-3", + "patentInterferenceDataBag": [], + } + ) + + # Mock search_decisions to return different responses + with patch.object( + mock_ptab_interferences_client, "search_decisions" + ) as mock_search: + mock_search.side_effect = [first_response, second_response, third_response] + + # Test + results = list( + mock_ptab_interferences_client.paginate_decisions( + interference_outcome_category_q="Priority to Senior Party", limit=2 + ) + ) + + # Verify + assert len(results) == 3 + assert results[0].interference_number == "106123" + assert results[1].interference_number == "106124" + assert results[2].interference_number == "106125" + assert mock_search.call_count == 2 # Stops when count < limit + + def test_paginate_decisions_raises_on_post_body( + self, mock_ptab_interferences_client: PTABInterferencesClient + ) -> None: + """Test that paginate_decisions raises ValueError with post_body.""" + with pytest.raises(ValueError, match="does not support 'post_body'"): + list( + mock_ptab_interferences_client.paginate_decisions( + post_body={"q": "test"} + ) + ) + + def test_paginate_decisions_with_multiple_params( + self, mock_ptab_interferences_client: PTABInterferencesClient + ) -> None: + """Test paginate_decisions with multiple search parameters.""" + # Setup mock responses + first_response = PTABInterferenceResponse.from_dict( + { + "count": 2, + "requestIdentifier": "req-1", + "patentInterferenceDataBag": [ + {"interferenceNumber": "106123"}, + {"interferenceNumber": "106124"}, + ], + } + ) + + second_response = PTABInterferenceResponse.from_dict( + { + "count": 0, + "requestIdentifier": "req-2", + "patentInterferenceDataBag": [], + } + ) + + with patch.object( + mock_ptab_interferences_client, "search_decisions" + ) as mock_search: + mock_search.side_effect = [first_response, second_response] + + # Test + results = list( + mock_ptab_interferences_client.paginate_decisions( + interference_outcome_category_q="Priority to Senior Party", + decision_type_category_q="Final Decision", + decision_date_from_q="2023-01-01", + limit=2, + ) + ) + + # Verify + assert len(results) == 2 + # Verify that search_decisions was called with correct params + call_args = mock_search.call_args_list[0] + assert ( + call_args[1]["interference_outcome_category_q"] + == "Priority to Senior Party" + ) + assert call_args[1]["decision_type_category_q"] == "Final Decision" + assert call_args[1]["decision_date_from_q"] == "2023-01-01" diff --git a/tests/clients/test_ptab_trials_client.py b/tests/clients/test_ptab_trials_client.py new file mode 100644 index 0000000..26336ec --- /dev/null +++ b/tests/clients/test_ptab_trials_client.py @@ -0,0 +1,630 @@ +""" +Tests for PTABTrialsClient. + +This module contains unit tests for the PTABTrialsClient class. +""" + +from typing import Any, Dict +from unittest.mock import MagicMock, patch + +import pytest + +from pyUSPTO import PTABTrialsClient, USPTOConfig +from pyUSPTO.models.ptab import PTABTrialProceeding, PTABTrialProceedingResponse + + +@pytest.fixture +def api_key_fixture() -> str: + """Fixture for test API key.""" + return "test_key" + + +@pytest.fixture +def trial_proceeding_sample() -> Dict[str, Any]: + """Sample trial proceeding data for testing.""" + return { + "count": 2, + "requestIdentifier": "req-123", + "patentTrialProceedingDataBag": [ + { + "trialNumber": "IPR2023-00001", + "trialRecordIdentifier": "trial-uuid-1", + "lastModifiedDateTime": "2023-01-15T10:30:00Z", + "trialMetaData": { + "petitionFilingDate": "2023-01-01", + "trialStatusCategory": "Active", + "trialTypeCode": "IPR", + }, + "patentOwnerData": { + "patentOwnerName": "Test Company", + "patentNumber": "US1234567", + }, + }, + { + "trialNumber": "IPR2023-00002", + "trialRecordIdentifier": "trial-uuid-2", + "lastModifiedDateTime": "2023-01-20T14:00:00Z", + "trialMetaData": { + "petitionFilingDate": "2023-01-10", + "trialStatusCategory": "Terminated", + "trialTypeCode": "PGR", + }, + }, + ], + } + + +@pytest.fixture +def mock_ptab_trials_client(api_key_fixture: str) -> PTABTrialsClient: + """Fixture for mock PTABTrialsClient.""" + return PTABTrialsClient(api_key=api_key_fixture) + + +class TestPTABTrialsClientInit: + """Tests for initialization of PTABTrialsClient.""" + + def test_init_with_api_key(self, api_key_fixture: str) -> None: + """Test initialization with API key.""" + client = PTABTrialsClient(api_key=api_key_fixture) + assert client._api_key == api_key_fixture + assert client.base_url == "https://api.uspto.gov" + + def test_init_with_custom_base_url(self, api_key_fixture: str) -> None: + """Test initialization with custom base URL.""" + custom_url = "https://custom.api.test.com" + client = PTABTrialsClient(api_key=api_key_fixture, base_url=custom_url) + assert client._api_key == api_key_fixture + assert client.base_url == custom_url + + def test_init_with_config(self) -> None: + """Test initialization with config object.""" + config_key = "config_key" + config_url = "https://config.api.test.com" + config = USPTOConfig(api_key=config_key, ptab_base_url=config_url) + client = PTABTrialsClient(config=config) + assert client._api_key == config_key + assert client.base_url == config_url + assert client.config is config + + def test_init_with_api_key_and_config(self, api_key_fixture: str) -> None: + """Test initialization with both API key and config.""" + config = USPTOConfig( + api_key="config_key", + ptab_base_url="https://config.api.test.com", + ) + client = PTABTrialsClient(api_key=api_key_fixture, config=config) + # API key parameter takes precedence + assert client._api_key == api_key_fixture + # But base_url comes from config + assert client.base_url == "https://config.api.test.com" + + +class TestPTABTrialsClientSearchProceedings: + """Tests for search_proceedings method.""" + + def test_search_proceedings_get_with_query( + self, + mock_ptab_trials_client: PTABTrialsClient, + trial_proceeding_sample: Dict[str, Any], + ) -> None: + """Test search_proceedings with GET and direct query.""" + # Setup + mock_session = MagicMock() + mock_response = MagicMock() + mock_response.json.return_value = trial_proceeding_sample + mock_session.get.return_value = mock_response + mock_ptab_trials_client.session = mock_session + + # Test + result = mock_ptab_trials_client.search_proceedings( + query="trialNumber:IPR2023-00001", limit=10 + ) + + # Verify + assert isinstance(result, PTABTrialProceedingResponse) + assert result.count == 2 + assert len(result.patent_trial_proceeding_data_bag) == 2 + mock_session.get.assert_called_once() + call_args = mock_session.get.call_args + assert "q" in call_args[1]["params"] + assert call_args[1]["params"]["q"] == "trialNumber:IPR2023-00001" + + def test_search_proceedings_get_with_convenience_params( + self, + mock_ptab_trials_client: PTABTrialsClient, + trial_proceeding_sample: Dict[str, Any], + ) -> None: + """Test search_proceedings with convenience parameters.""" + # Setup + mock_session = MagicMock() + mock_response = MagicMock() + mock_response.json.return_value = trial_proceeding_sample + mock_session.get.return_value = mock_response + mock_ptab_trials_client.session = mock_session + + # Test + result = mock_ptab_trials_client.search_proceedings( + trial_number_q="IPR2023-00001", + trial_type_code_q="IPR", + petition_filing_date_from_q="2023-01-01", + petition_filing_date_to_q="2023-12-31", + limit=25, + ) + + # Verify + assert isinstance(result, PTABTrialProceedingResponse) + mock_session.get.assert_called_once() + call_args = mock_session.get.call_args + params = call_args[1]["params"] + assert "q" in params + assert "trialNumber:IPR2023-00001" in params["q"] + assert "trialTypeCode:IPR" in params["q"] + assert "petitionFilingDate:[2023-01-01 TO 2023-12-31]" in params["q"] + assert params["limit"] == 25 + + def test_search_proceedings_post_with_body( + self, + mock_ptab_trials_client: PTABTrialsClient, + trial_proceeding_sample: Dict[str, Any], + ) -> None: + """Test search_proceedings with POST body.""" + # Setup + mock_session = MagicMock() + mock_response = MagicMock() + mock_response.json.return_value = trial_proceeding_sample + mock_session.post.return_value = mock_response + mock_ptab_trials_client.session = mock_session + + post_body = {"q": "trialTypeCode:IPR", "limit": 100} + + # Test + result = mock_ptab_trials_client.search_proceedings(post_body=post_body) + + # Verify + assert isinstance(result, PTABTrialProceedingResponse) + mock_session.post.assert_called_once() + call_args = mock_session.post.call_args + assert call_args[1]["json"] == post_body + + +class TestPTABTrialsClientSearchDocuments: + """Tests for search_documents method.""" + + def test_search_documents_get_with_query( + self, + mock_ptab_trials_client: PTABTrialsClient, + trial_proceeding_sample: Dict[str, Any], + ) -> None: + """Test search_documents with GET and direct query.""" + # Setup + mock_session = MagicMock() + mock_response = MagicMock() + mock_response.json.return_value = trial_proceeding_sample + mock_session.get.return_value = mock_response + mock_ptab_trials_client.session = mock_session + + # Test + result = mock_ptab_trials_client.search_documents( + query="trialNumber:IPR2023-00001", limit=10 + ) + + # Verify + assert isinstance(result, PTABTrialProceedingResponse) + mock_session.get.assert_called_once() + + def test_search_documents_with_convenience_params( + self, + mock_ptab_trials_client: PTABTrialsClient, + trial_proceeding_sample: Dict[str, Any], + ) -> None: + """Test search_documents with convenience parameters.""" + # Setup + mock_session = MagicMock() + mock_response = MagicMock() + mock_response.json.return_value = trial_proceeding_sample + mock_session.get.return_value = mock_response + mock_ptab_trials_client.session = mock_session + + # Test + result = mock_ptab_trials_client.search_documents( + trial_number_q="IPR2023-00001", + document_category_q="Paper", + filing_date_from_q="2023-01-01", + filing_date_to_q="2023-12-31", + ) + + # Verify + assert isinstance(result, PTABTrialProceedingResponse) + call_args = mock_session.get.call_args + params = call_args[1]["params"] + assert "q" in params + assert "filingDate:[2023-01-01 TO 2023-12-31]" in params["q"] + + def test_search_documents_with_all_convenience_params( + self, + mock_ptab_trials_client: PTABTrialsClient, + trial_proceeding_sample: Dict[str, Any], + ) -> None: + """Test search_documents with all convenience parameters.""" + # Setup + mock_session = MagicMock() + mock_response = MagicMock() + mock_response.json.return_value = trial_proceeding_sample + mock_session.get.return_value = mock_response + mock_ptab_trials_client.session = mock_session + + # Test + result = mock_ptab_trials_client.search_documents( + trial_number_q="IPR2023-00001", + document_category_q="Paper", + document_type_name_q="Patent Owner Response", + filing_date_from_q="2023-01-01", + filing_date_to_q="2023-12-31", + limit=50, + ) + + # Verify + assert isinstance(result, PTABTrialProceedingResponse) + call_args = mock_session.get.call_args + params = call_args[1]["params"] + assert "trialNumber:IPR2023-00001" in params["q"] + assert "documentCategory:Paper" in params["q"] + assert "documentTypeName:Patent Owner Response" in params["q"] + assert params["limit"] == 50 + + def test_search_documents_with_date_from_only( + self, + mock_ptab_trials_client: PTABTrialsClient, + trial_proceeding_sample: Dict[str, Any], + ) -> None: + """Test search_documents with only filing_date_from.""" + # Setup + mock_session = MagicMock() + mock_response = MagicMock() + mock_response.json.return_value = trial_proceeding_sample + mock_session.get.return_value = mock_response + mock_ptab_trials_client.session = mock_session + + # Test + result = mock_ptab_trials_client.search_documents( + filing_date_from_q="2023-01-01" + ) + + # Verify + assert isinstance(result, PTABTrialProceedingResponse) + call_args = mock_session.get.call_args + params = call_args[1]["params"] + assert "filingDate:>=2023-01-01" in params["q"] + + def test_search_documents_with_date_to_only( + self, + mock_ptab_trials_client: PTABTrialsClient, + trial_proceeding_sample: Dict[str, Any], + ) -> None: + """Test search_documents with only filing_date_to.""" + # Setup + mock_session = MagicMock() + mock_response = MagicMock() + mock_response.json.return_value = trial_proceeding_sample + mock_session.get.return_value = mock_response + mock_ptab_trials_client.session = mock_session + + # Test + result = mock_ptab_trials_client.search_documents(filing_date_to_q="2023-12-31") + + # Verify + assert isinstance(result, PTABTrialProceedingResponse) + call_args = mock_session.get.call_args + params = call_args[1]["params"] + assert "filingDate:<=2023-12-31" in params["q"] + + def test_search_documents_post_with_body( + self, + mock_ptab_trials_client: PTABTrialsClient, + trial_proceeding_sample: Dict[str, Any], + ) -> None: + """Test search_documents with POST body.""" + # Setup + mock_session = MagicMock() + mock_response = MagicMock() + mock_response.json.return_value = trial_proceeding_sample + mock_session.post.return_value = mock_response + mock_ptab_trials_client.session = mock_session + + post_body = {"q": "documentCategory:Paper", "limit": 100} + + # Test + result = mock_ptab_trials_client.search_documents(post_body=post_body) + + # Verify + assert isinstance(result, PTABTrialProceedingResponse) + mock_session.post.assert_called_once() + call_args = mock_session.post.call_args + assert call_args[1]["json"] == post_body + + def test_search_documents_with_optional_params( + self, + mock_ptab_trials_client: PTABTrialsClient, + trial_proceeding_sample: Dict[str, Any], + ) -> None: + """Test search_documents with optional parameters.""" + # Setup + mock_session = MagicMock() + mock_response = MagicMock() + mock_response.json.return_value = trial_proceeding_sample + mock_session.get.return_value = mock_response + mock_ptab_trials_client.session = mock_session + + # Test + result = mock_ptab_trials_client.search_documents( + query="trialNumber:IPR2023-00001", + sort="filingDate desc", + offset=10, + limit=50, + facets="documentCategory", + fields="trialNumber,filingDate", + ) + + # Verify + assert isinstance(result, PTABTrialProceedingResponse) + call_args = mock_session.get.call_args + params = call_args[1]["params"] + assert params["sort"] == "filingDate desc" + assert params["offset"] == 10 + assert params["limit"] == 50 + assert params["facets"] == "documentCategory" + assert params["fields"] == "trialNumber,filingDate" + + +class TestPTABTrialsClientSearchDecisions: + """Tests for search_decisions method.""" + + def test_search_decisions_get_with_query( + self, + mock_ptab_trials_client: PTABTrialsClient, + trial_proceeding_sample: Dict[str, Any], + ) -> None: + """Test search_decisions with GET and direct query.""" + # Setup + mock_session = MagicMock() + mock_response = MagicMock() + mock_response.json.return_value = trial_proceeding_sample + mock_session.get.return_value = mock_response + mock_ptab_trials_client.session = mock_session + + # Test + result = mock_ptab_trials_client.search_decisions( + query="trialNumber:IPR2023-00001", limit=10 + ) + + # Verify + assert isinstance(result, PTABTrialProceedingResponse) + mock_session.get.assert_called_once() + + def test_search_decisions_with_convenience_params( + self, + mock_ptab_trials_client: PTABTrialsClient, + trial_proceeding_sample: Dict[str, Any], + ) -> None: + """Test search_decisions with convenience parameters.""" + # Setup + mock_session = MagicMock() + mock_response = MagicMock() + mock_response.json.return_value = trial_proceeding_sample + mock_session.get.return_value = mock_response + mock_ptab_trials_client.session = mock_session + + # Test + result = mock_ptab_trials_client.search_decisions( + trial_number_q="IPR2023-00001", + decision_type_category_q="Final Written Decision", + decision_date_from_q="2023-01-01", + ) + + # Verify + assert isinstance(result, PTABTrialProceedingResponse) + call_args = mock_session.get.call_args + params = call_args[1]["params"] + assert "q" in params + assert "decisionDate:>=2023-01-01" in params["q"] + + def test_search_decisions_with_all_convenience_params( + self, + mock_ptab_trials_client: PTABTrialsClient, + trial_proceeding_sample: Dict[str, Any], + ) -> None: + """Test search_decisions with all convenience parameters.""" + # Setup + mock_session = MagicMock() + mock_response = MagicMock() + mock_response.json.return_value = trial_proceeding_sample + mock_session.get.return_value = mock_response + mock_ptab_trials_client.session = mock_session + + # Test + result = mock_ptab_trials_client.search_decisions( + trial_number_q="IPR2023-00001", + decision_type_category_q="Final Written Decision", + # document_category_q="Decision", + decision_date_from_q="2023-01-01", + decision_date_to_q="2023-12-31", + limit=50, + ) + + # Verify + assert isinstance(result, PTABTrialProceedingResponse) + call_args = mock_session.get.call_args + params = call_args[1]["params"] + assert "trialNumber:IPR2023-00001" in params["q"] + assert "decisionTypeCategory:Final Written Decision" in params["q"] + # assert "documentCategory:Decision" in params["q"] + assert "decisionDate:[2023-01-01 TO 2023-12-31]" in params["q"] + assert params["limit"] == 50 + + def test_search_decisions_with_date_from_only( + self, + mock_ptab_trials_client: PTABTrialsClient, + trial_proceeding_sample: Dict[str, Any], + ) -> None: + """Test search_decisions with only decision_date_from.""" + # Setup + mock_session = MagicMock() + mock_response = MagicMock() + mock_response.json.return_value = trial_proceeding_sample + mock_session.get.return_value = mock_response + mock_ptab_trials_client.session = mock_session + + # Test + result = mock_ptab_trials_client.search_decisions( + decision_date_from_q="2023-01-01" + ) + + # Verify + assert isinstance(result, PTABTrialProceedingResponse) + call_args = mock_session.get.call_args + params = call_args[1]["params"] + assert "decisionDate:>=2023-01-01" in params["q"] + + def test_search_decisions_with_date_to_only( + self, + mock_ptab_trials_client: PTABTrialsClient, + trial_proceeding_sample: Dict[str, Any], + ) -> None: + """Test search_decisions with only decision_date_to.""" + # Setup + mock_session = MagicMock() + mock_response = MagicMock() + mock_response.json.return_value = trial_proceeding_sample + mock_session.get.return_value = mock_response + mock_ptab_trials_client.session = mock_session + + # Test + result = mock_ptab_trials_client.search_decisions( + decision_date_to_q="2023-12-31" + ) + + # Verify + assert isinstance(result, PTABTrialProceedingResponse) + call_args = mock_session.get.call_args + params = call_args[1]["params"] + assert "decisionDate:<=2023-12-31" in params["q"] + + def test_search_decisions_post_with_body( + self, + mock_ptab_trials_client: PTABTrialsClient, + trial_proceeding_sample: Dict[str, Any], + ) -> None: + """Test search_decisions with POST body.""" + # Setup + mock_session = MagicMock() + mock_response = MagicMock() + mock_response.json.return_value = trial_proceeding_sample + mock_session.post.return_value = mock_response + mock_ptab_trials_client.session = mock_session + + post_body = {"q": "decisionTypeCategory:Final Written Decision", "limit": 100} + + # Test + result = mock_ptab_trials_client.search_decisions(post_body=post_body) + + # Verify + assert isinstance(result, PTABTrialProceedingResponse) + mock_session.post.assert_called_once() + call_args = mock_session.post.call_args + assert call_args[1]["json"] == post_body + + def test_search_decisions_with_optional_params( + self, + mock_ptab_trials_client: PTABTrialsClient, + trial_proceeding_sample: Dict[str, Any], + ) -> None: + """Test search_decisions with optional parameters.""" + # Setup + mock_session = MagicMock() + mock_response = MagicMock() + mock_response.json.return_value = trial_proceeding_sample + mock_session.get.return_value = mock_response + mock_ptab_trials_client.session = mock_session + + # Test + result = mock_ptab_trials_client.search_decisions( + query="trialNumber:IPR2023-00001", + sort="decisionDate desc", + offset=10, + limit=50, + facets="decisionTypeCategory", + fields="trialNumber,decisionDate", + ) + + # Verify + assert isinstance(result, PTABTrialProceedingResponse) + call_args = mock_session.get.call_args + params = call_args[1]["params"] + assert params["sort"] == "decisionDate desc" + assert params["offset"] == 10 + assert params["limit"] == 50 + assert params["facets"] == "decisionTypeCategory" + assert params["fields"] == "trialNumber,decisionDate" + + +class TestPTABTrialsClientPaginate: + """Tests for paginate_proceedings method.""" + + def test_paginate_proceedings( + self, mock_ptab_trials_client: PTABTrialsClient + ) -> None: + """Test paginate_proceedings method.""" + # Setup mock responses + first_response = PTABTrialProceedingResponse.from_dict( + { + "count": 2, + "requestIdentifier": "req-1", + "patentTrialProceedingDataBag": [ + {"trialNumber": "IPR2023-00001"}, + {"trialNumber": "IPR2023-00002"}, + ], + } + ) + + second_response = PTABTrialProceedingResponse.from_dict( + { + "count": 1, + "requestIdentifier": "req-2", + "patentTrialProceedingDataBag": [ + {"trialNumber": "IPR2023-00003"}, + ], + } + ) + + third_response = PTABTrialProceedingResponse.from_dict( + { + "count": 0, + "requestIdentifier": "req-3", + "patentTrialProceedingDataBag": [], + } + ) + + # Mock search_proceedings to return different responses + with patch.object(mock_ptab_trials_client, "search_proceedings") as mock_search: + mock_search.side_effect = [first_response, second_response, third_response] + + # Test + results = list( + mock_ptab_trials_client.paginate_proceedings( + trial_type_code_q="IPR", limit=2 + ) + ) + + # Verify + assert len(results) == 3 + assert results[0].trial_number == "IPR2023-00001" + assert results[1].trial_number == "IPR2023-00002" + assert results[2].trial_number == "IPR2023-00003" + assert mock_search.call_count == 2 # Stops when count < limit + + def test_paginate_proceedings_raises_on_post_body( + self, mock_ptab_trials_client: PTABTrialsClient + ) -> None: + """Test that paginate_proceedings raises ValueError with post_body.""" + with pytest.raises(ValueError, match="does not support 'post_body'"): + list(mock_ptab_trials_client.paginate_proceedings(post_body={"q": "test"})) From 0a4484f8d14265d3d0b8bc3d2df48fd5b2c7265a Mon Sep 17 00:00:00 2001 From: Andrew Date: Wed, 26 Nov 2025 09:52:03 -0600 Subject: [PATCH 02/17] Full test coverage --- tests/clients/test_ptab_trials_client.py | 133 +++++++++++ tests/models/test_ptab_models.py | 281 +++++++++++++++++++++++ 2 files changed, 414 insertions(+) create mode 100644 tests/models/test_ptab_models.py diff --git a/tests/clients/test_ptab_trials_client.py b/tests/clients/test_ptab_trials_client.py index 26336ec..f879052 100644 --- a/tests/clients/test_ptab_trials_client.py +++ b/tests/clients/test_ptab_trials_client.py @@ -162,6 +162,127 @@ def test_search_proceedings_get_with_convenience_params( assert "petitionFilingDate:[2023-01-01 TO 2023-12-31]" in params["q"] assert params["limit"] == 25 + def test_search_proceedings_with_all_convenience_params( + self, + mock_ptab_trials_client: PTABTrialsClient, + trial_proceeding_sample: Dict[str, Any], + ) -> None: + """Test search_proceedings with all convenience parameters.""" + # Setup + mock_session = MagicMock() + mock_response = MagicMock() + mock_response.json.return_value = trial_proceeding_sample + mock_session.get.return_value = mock_response + mock_ptab_trials_client.session = mock_session + + # Test + result = mock_ptab_trials_client.search_proceedings( + trial_number_q="IPR2023-00001", + patent_owner_name_q="Test Owner", + petitioner_party_name_q="Test Petitioner", + respondent_name_q="Test Respondent", + trial_type_code_q="IPR", + trial_status_category_q="Instituted", + petition_filing_date_from_q="2023-01-01", + petition_filing_date_to_q="2023-12-31", + ) + + # Verify + assert isinstance(result, PTABTrialProceedingResponse) + call_args = mock_session.get.call_args + params = call_args[1]["params"] + assert "patentOwnerName:Test Owner" in params["q"] + assert "petitionerPartyName:Test Petitioner" in params["q"] + assert "respondentName:Test Respondent" in params["q"] + assert "trialStatusCategory:Instituted" in params["q"] + + def test_search_proceedings_with_date_from_only( + self, + mock_ptab_trials_client: PTABTrialsClient, + trial_proceeding_sample: Dict[str, Any], + ) -> None: + """Test search_proceedings with only petition_filing_date_from.""" + # Setup + mock_session = MagicMock() + mock_response = MagicMock() + mock_response.json.return_value = trial_proceeding_sample + mock_session.get.return_value = mock_response + mock_ptab_trials_client.session = mock_session + + # Test + result = mock_ptab_trials_client.search_proceedings( + petition_filing_date_from_q="2023-01-01" + ) + + # Verify + assert isinstance(result, PTABTrialProceedingResponse) + call_args = mock_session.get.call_args + params = call_args[1]["params"] + assert "petitionFilingDate:>=2023-01-01" in params["q"] + + def test_search_proceedings_with_date_to_only( + self, + mock_ptab_trials_client: PTABTrialsClient, + trial_proceeding_sample: Dict[str, Any], + ) -> None: + """Test search_proceedings with only petition_filing_date_to.""" + # Setup + mock_session = MagicMock() + mock_response = MagicMock() + mock_response.json.return_value = trial_proceeding_sample + mock_session.get.return_value = mock_response + mock_ptab_trials_client.session = mock_session + + # Test + result = mock_ptab_trials_client.search_proceedings( + petition_filing_date_to_q="2023-12-31" + ) + + # Verify + assert isinstance(result, PTABTrialProceedingResponse) + call_args = mock_session.get.call_args + params = call_args[1]["params"] + assert "petitionFilingDate:<=2023-12-31" in params["q"] + + def test_search_proceedings_with_optional_params( + self, + mock_ptab_trials_client: PTABTrialsClient, + trial_proceeding_sample: Dict[str, Any], + ) -> None: + """Test search_proceedings with optional parameters.""" + # Setup + mock_session = MagicMock() + mock_response = MagicMock() + mock_response.json.return_value = trial_proceeding_sample + mock_session.get.return_value = mock_response + mock_ptab_trials_client.session = mock_session + + # Test + result = mock_ptab_trials_client.search_proceedings( + query="trialNumber:IPR2023-00001", + sort="petitionFilingDate desc", + offset=10, + limit=50, + facets="trialTypeCode", + fields="trialNumber,petitionFilingDate", + filters="trialStatusCategory:Instituted", + range_filters="petitionFilingDate:[2023-01-01 TO 2023-12-31]", + additional_query_params={"customParam": "value"}, + ) + + # Verify + assert isinstance(result, PTABTrialProceedingResponse) + call_args = mock_session.get.call_args + params = call_args[1]["params"] + assert params["sort"] == "petitionFilingDate desc" + assert params["offset"] == 10 + assert params["limit"] == 50 + assert params["facets"] == "trialTypeCode" + assert params["fields"] == "trialNumber,petitionFilingDate" + assert params["filters"] == "trialStatusCategory:Instituted" + assert params["rangeFilters"] == "petitionFilingDate:[2023-01-01 TO 2023-12-31]" + assert params["customParam"] == "value" + def test_search_proceedings_post_with_body( self, mock_ptab_trials_client: PTABTrialsClient, @@ -363,6 +484,9 @@ def test_search_documents_with_optional_params( limit=50, facets="documentCategory", fields="trialNumber,filingDate", + filters="documentCategory:Paper", + range_filters="filingDate:[2023-01-01 TO 2023-12-31]", + additional_query_params={"customParam": "value"}, ) # Verify @@ -374,6 +498,9 @@ def test_search_documents_with_optional_params( assert params["limit"] == 50 assert params["facets"] == "documentCategory" assert params["fields"] == "trialNumber,filingDate" + assert params["filters"] == "documentCategory:Paper" + assert params["rangeFilters"] == "filingDate:[2023-01-01 TO 2023-12-31]" + assert params["customParam"] == "value" class TestPTABTrialsClientSearchDecisions: @@ -554,6 +681,9 @@ def test_search_decisions_with_optional_params( limit=50, facets="decisionTypeCategory", fields="trialNumber,decisionDate", + filters="decisionTypeCategory:Final Written Decision", + range_filters="decisionDate:[2023-01-01 TO 2023-12-31]", + additional_query_params={"customParam": "value"}, ) # Verify @@ -565,6 +695,9 @@ def test_search_decisions_with_optional_params( assert params["limit"] == 50 assert params["facets"] == "decisionTypeCategory" assert params["fields"] == "trialNumber,decisionDate" + assert params["filters"] == "decisionTypeCategory:Final Written Decision" + assert params["rangeFilters"] == "decisionDate:[2023-01-01 TO 2023-12-31]" + assert params["customParam"] == "value" class TestPTABTrialsClientPaginate: diff --git a/tests/models/test_ptab_models.py b/tests/models/test_ptab_models.py new file mode 100644 index 0000000..01c9324 --- /dev/null +++ b/tests/models/test_ptab_models.py @@ -0,0 +1,281 @@ +""" +Tests for PTAB models. + +This module contains unit tests for the PTAB model classes. +""" + +from typing import Any, Dict + +import pytest + +from pyUSPTO.models.ptab import ( + PTABAppealDecision, + PTABAppealResponse, + PTABInterferenceDecision, + PTABInterferenceResponse, + PTABTrialProceeding, + PTABTrialProceedingResponse, + RegularPetitionerData, + RespondentData, + DerivationPetitionerData, + AppellantData, + RequestorData, + AppealDocumentData, + SeniorPartyData, + JuniorPartyData, + AdditionalPartyData, +) + + +class TestPTABTrialModels: + """Tests for PTAB trial proceeding models.""" + + def test_regular_petitioner_data_from_dict(self) -> None: + """Test RegularPetitionerData.from_dict().""" + data = { + "counselName": "Test Counsel", + "realPartyInInterestName": "Real Party", + } + result = RegularPetitionerData.from_dict(data) + assert result.counsel_name == "Test Counsel" + assert result.real_party_in_interest_name == "Real Party" + + def test_respondent_data_from_dict(self) -> None: + """Test RespondentData.from_dict().""" + data = { + "counselName": "Respondent Counsel", + "realPartyInInterestName": "Respondent Party", + } + result = RespondentData.from_dict(data) + assert result.counsel_name == "Respondent Counsel" + assert result.real_party_in_interest_name == "Respondent Party" + + def test_derivation_petitioner_data_from_dict(self) -> None: + """Test DerivationPetitionerData.from_dict().""" + data = { + "counselName": "Derivation Counsel", + "grantDate": "2023-01-15", + "groupArtUnitNumber": "3600", + "inventorName": "John Inventor", + "patentNumber": "US1234567", + "technologyCenterNumber": "3600", + "realPartyInInterestName": "Derivation Party", + "patentOwnerName": "Derivation Owner", + } + result = DerivationPetitionerData.from_dict(data) + assert result.counsel_name == "Derivation Counsel" + assert result.patent_number == "US1234567" + assert result.patent_owner_name == "Derivation Owner" + + def test_trial_proceeding_with_all_nested_objects(self) -> None: + """Test PTABTrialProceeding with all nested objects.""" + data = { + "trialNumber": "IPR2023-00001", + "trialRecordIdentifier": "uuid-1", + "lastModifiedDateTime": "2023-01-15T10:30:00Z", + "trialMetaData": { + "petitionFilingDate": "2023-01-01", + "trialStatusCategory": "Instituted", + "trialTypeCode": "IPR", + }, + "patentOwnerData": { + "patentOwnerName": "Owner Inc", + "patentNumber": "US1234567", + }, + "regularPetitionerData": { + "counselName": "Petitioner Counsel", + "realPartyInInterestName": "Petitioner Party", + }, + "respondentData": { + "counselName": "Respondent Counsel", + "realPartyInInterestName": "Respondent Party", + }, + "derivationPetitionerData": { + "counselName": "Derivation Counsel", + "patentNumber": "US7654321", + }, + } + result = PTABTrialProceeding.from_dict(data) + assert result.trial_number == "IPR2023-00001" + assert result.regular_petitioner_data is not None + assert result.regular_petitioner_data.counsel_name == "Petitioner Counsel" + assert result.respondent_data is not None + assert result.respondent_data.counsel_name == "Respondent Counsel" + assert result.derivation_petitioner_data is not None + assert result.derivation_petitioner_data.patent_number == "US7654321" + + +class TestPTABAppealModels: + """Tests for PTAB appeal decision models.""" + + def test_appellant_data_from_dict(self) -> None: + """Test AppellantData.from_dict().""" + data = { + "applicationNumberText": "15/123456", + "counselName": "Appellant Counsel", + "groupArtUnitNumber": "3600", + "inventorName": "Jane Inventor", + "realPartyInInterestName": "Appellant Party", + "patentOwnerName": "Appellant Owner", + "publicationDate": "2023-01-15", + "publicationNumber": "US20230012345", + "technologyCenterNumber": "3600", + } + result = AppellantData.from_dict(data) + assert result.application_number_text == "15/123456" + assert result.counsel_name == "Appellant Counsel" + assert result.inventor_name == "Jane Inventor" + assert result.technology_center_number == "3600" + + def test_requestor_data_from_dict(self) -> None: + """Test RequestorData.from_dict().""" + data = {"thirdPartyName": "Third Party Inc"} + result = RequestorData.from_dict(data) + assert result.third_party_name == "Third Party Inc" + + def test_appeal_document_data_from_dict(self) -> None: + """Test AppealDocumentData.from_dict().""" + data = { + "documentFilingDate": "2023-01-15", + "documentIdentifier": "doc-uuid-1", + "documentName": "Appeal Brief", + "documentSizeQuantity": 12345, + "documentOCRText": "Full OCR text content", + "documentTypeDescriptionText": "Brief", + "fileDownloadURI": "https://example.com/download", + } + result = AppealDocumentData.from_dict(data) + assert result.document_name == "Appeal Brief" + assert result.document_size_quantity == 12345 + assert result.document_ocr_text == "Full OCR text content" + + def test_appeal_decision_with_all_nested_objects(self) -> None: + """Test PTABAppealDecision with all nested objects.""" + data = { + "appealNumber": "2023-001234", + "lastModifiedDateTime": "2023-06-15T10:30:00Z", + "appealDocumentCategory": "Decision", + "appealMetaData": { + "appealFilingDate": "2023-01-15", + "applicationTypeCategory": "Utility", + }, + "appellantData": { + "applicationNumberText": "15/123456", + "counselName": "Test Counsel", + "technologyCenterNumber": "3600", + }, + "requestorData": {"thirdPartyName": "Third Party Inc"}, + "documentData": { + "documentName": "Final Decision", + "documentIdentifier": "doc-123", + }, + "decisionData": { + "decisionTypeCategory": "Affirmed", + "decisionDate": "2023-06-01", + }, + } + result = PTABAppealDecision.from_dict(data) + assert result.appeal_number == "2023-001234" + assert result.appellant_data is not None + assert result.appellant_data.counsel_name == "Test Counsel" + assert result.requestor_data is not None + assert result.requestor_data.third_party_name == "Third Party Inc" + assert result.document_data is not None + assert result.document_data.document_name == "Final Decision" + + +class TestPTABInterferenceModels: + """Tests for PTAB interference decision models.""" + + def test_senior_party_data_from_dict(self) -> None: + """Test SeniorPartyData.from_dict().""" + data = { + "applicationNumberText": "12/345678", + "counselName": "Senior Counsel", + "grantDate": "2023-01-15", + "groupArtUnitNumber": "1600", + "realPartyInInterestName": "Senior Party Inc", + "patentNumber": "US1234567", + "patentOwnerName": "Senior Owner", + "technologyCenterNumber": "1600", + } + result = SeniorPartyData.from_dict(data) + assert result.application_number_text == "12/345678" + assert result.counsel_name == "Senior Counsel" + assert result.patent_owner_name == "Senior Owner" + assert result.patent_number == "US1234567" + + def test_junior_party_data_from_dict(self) -> None: + """Test JuniorPartyData.from_dict().""" + data = { + "publicationNumber": "US20230012345", + "counselName": "Junior Counsel", + "groupArtUnitNumber": "1600", + "inventorName": "Jane Inventor", + "patentOwnerName": "Junior Owner", + "publicationDate": "2023-02-20", + "realPartyInInterestName": "Junior Party LLC", + "technologyCenterNumber": "1600", + } + result = JuniorPartyData.from_dict(data) + assert result.publication_number == "US20230012345" + assert result.counsel_name == "Junior Counsel" + assert result.inventor_name == "Jane Inventor" + assert result.patent_owner_name == "Junior Owner" + + def test_additional_party_data_from_dict(self) -> None: + """Test AdditionalPartyData.from_dict().""" + data = { + "applicationNumberText": "14/111222", + "inventorName": "John Inventor", + "additionalPartyName": "Additional Entity", + "patentNumber": "US1112223", + } + result = AdditionalPartyData.from_dict(data) + assert result.application_number_text == "14/111222" + assert result.inventor_name == "John Inventor" + assert result.additional_party_name == "Additional Entity" + assert result.patent_number == "US1112223" + + def test_interference_decision_with_all_nested_objects(self) -> None: + """Test PTABInterferenceDecision with all nested objects.""" + data = { + "interferenceNumber": "106123", + "lastModifiedDateTime": "2023-03-15T10:30:00Z", + "interferenceMetaData": { + "interferenceStyleName": "Senior v. Junior", + "interferenceLastModifiedDate": "2023-03-15", + }, + "seniorPartyData": { + "patentOwnerName": "Senior Inc", + "applicationNumberText": "12/345678", + "patentNumber": "US1234567", + }, + "juniorPartyData": { + "patentOwnerName": "Junior LLC", + "publicationNumber": "US20230012345", + }, + "additionalPartyDataBag": [ + { + "additionalPartyName": "Additional Party 1", + "applicationNumberText": "14/111222", + }, + { + "additionalPartyName": "Additional Party 2", + "applicationNumberText": "14/333444", + }, + ], + "documentData": { + "interferenceOutcomeCategory": "Priority to Senior Party", + "decisionTypeCategory": "Final Decision", + }, + } + result = PTABInterferenceDecision.from_dict(data) + assert result.interference_number == "106123" + assert result.senior_party_data is not None + assert result.senior_party_data.patent_owner_name == "Senior Inc" + assert result.junior_party_data is not None + assert result.junior_party_data.patent_owner_name == "Junior LLC" + assert len(result.additional_party_data_bag) == 2 + assert result.additional_party_data_bag[0].additional_party_name == "Additional Party 1" + assert result.additional_party_data_bag[1].additional_party_name == "Additional Party 2" From 51bb1ecfff3fd3546c061b76867f7dc9bb2612f9 Mon Sep 17 00:00:00 2001 From: Andrew Date: Wed, 26 Nov 2025 10:26:50 -0600 Subject: [PATCH 03/17] Full test coverage --- tests/clients/test_ptab_trials_client.py | 133 +++++++++++ tests/models/test_ptab_models.py | 281 +++++++++++++++++++++++ 2 files changed, 414 insertions(+) create mode 100644 tests/models/test_ptab_models.py diff --git a/tests/clients/test_ptab_trials_client.py b/tests/clients/test_ptab_trials_client.py index 26336ec..f879052 100644 --- a/tests/clients/test_ptab_trials_client.py +++ b/tests/clients/test_ptab_trials_client.py @@ -162,6 +162,127 @@ def test_search_proceedings_get_with_convenience_params( assert "petitionFilingDate:[2023-01-01 TO 2023-12-31]" in params["q"] assert params["limit"] == 25 + def test_search_proceedings_with_all_convenience_params( + self, + mock_ptab_trials_client: PTABTrialsClient, + trial_proceeding_sample: Dict[str, Any], + ) -> None: + """Test search_proceedings with all convenience parameters.""" + # Setup + mock_session = MagicMock() + mock_response = MagicMock() + mock_response.json.return_value = trial_proceeding_sample + mock_session.get.return_value = mock_response + mock_ptab_trials_client.session = mock_session + + # Test + result = mock_ptab_trials_client.search_proceedings( + trial_number_q="IPR2023-00001", + patent_owner_name_q="Test Owner", + petitioner_party_name_q="Test Petitioner", + respondent_name_q="Test Respondent", + trial_type_code_q="IPR", + trial_status_category_q="Instituted", + petition_filing_date_from_q="2023-01-01", + petition_filing_date_to_q="2023-12-31", + ) + + # Verify + assert isinstance(result, PTABTrialProceedingResponse) + call_args = mock_session.get.call_args + params = call_args[1]["params"] + assert "patentOwnerName:Test Owner" in params["q"] + assert "petitionerPartyName:Test Petitioner" in params["q"] + assert "respondentName:Test Respondent" in params["q"] + assert "trialStatusCategory:Instituted" in params["q"] + + def test_search_proceedings_with_date_from_only( + self, + mock_ptab_trials_client: PTABTrialsClient, + trial_proceeding_sample: Dict[str, Any], + ) -> None: + """Test search_proceedings with only petition_filing_date_from.""" + # Setup + mock_session = MagicMock() + mock_response = MagicMock() + mock_response.json.return_value = trial_proceeding_sample + mock_session.get.return_value = mock_response + mock_ptab_trials_client.session = mock_session + + # Test + result = mock_ptab_trials_client.search_proceedings( + petition_filing_date_from_q="2023-01-01" + ) + + # Verify + assert isinstance(result, PTABTrialProceedingResponse) + call_args = mock_session.get.call_args + params = call_args[1]["params"] + assert "petitionFilingDate:>=2023-01-01" in params["q"] + + def test_search_proceedings_with_date_to_only( + self, + mock_ptab_trials_client: PTABTrialsClient, + trial_proceeding_sample: Dict[str, Any], + ) -> None: + """Test search_proceedings with only petition_filing_date_to.""" + # Setup + mock_session = MagicMock() + mock_response = MagicMock() + mock_response.json.return_value = trial_proceeding_sample + mock_session.get.return_value = mock_response + mock_ptab_trials_client.session = mock_session + + # Test + result = mock_ptab_trials_client.search_proceedings( + petition_filing_date_to_q="2023-12-31" + ) + + # Verify + assert isinstance(result, PTABTrialProceedingResponse) + call_args = mock_session.get.call_args + params = call_args[1]["params"] + assert "petitionFilingDate:<=2023-12-31" in params["q"] + + def test_search_proceedings_with_optional_params( + self, + mock_ptab_trials_client: PTABTrialsClient, + trial_proceeding_sample: Dict[str, Any], + ) -> None: + """Test search_proceedings with optional parameters.""" + # Setup + mock_session = MagicMock() + mock_response = MagicMock() + mock_response.json.return_value = trial_proceeding_sample + mock_session.get.return_value = mock_response + mock_ptab_trials_client.session = mock_session + + # Test + result = mock_ptab_trials_client.search_proceedings( + query="trialNumber:IPR2023-00001", + sort="petitionFilingDate desc", + offset=10, + limit=50, + facets="trialTypeCode", + fields="trialNumber,petitionFilingDate", + filters="trialStatusCategory:Instituted", + range_filters="petitionFilingDate:[2023-01-01 TO 2023-12-31]", + additional_query_params={"customParam": "value"}, + ) + + # Verify + assert isinstance(result, PTABTrialProceedingResponse) + call_args = mock_session.get.call_args + params = call_args[1]["params"] + assert params["sort"] == "petitionFilingDate desc" + assert params["offset"] == 10 + assert params["limit"] == 50 + assert params["facets"] == "trialTypeCode" + assert params["fields"] == "trialNumber,petitionFilingDate" + assert params["filters"] == "trialStatusCategory:Instituted" + assert params["rangeFilters"] == "petitionFilingDate:[2023-01-01 TO 2023-12-31]" + assert params["customParam"] == "value" + def test_search_proceedings_post_with_body( self, mock_ptab_trials_client: PTABTrialsClient, @@ -363,6 +484,9 @@ def test_search_documents_with_optional_params( limit=50, facets="documentCategory", fields="trialNumber,filingDate", + filters="documentCategory:Paper", + range_filters="filingDate:[2023-01-01 TO 2023-12-31]", + additional_query_params={"customParam": "value"}, ) # Verify @@ -374,6 +498,9 @@ def test_search_documents_with_optional_params( assert params["limit"] == 50 assert params["facets"] == "documentCategory" assert params["fields"] == "trialNumber,filingDate" + assert params["filters"] == "documentCategory:Paper" + assert params["rangeFilters"] == "filingDate:[2023-01-01 TO 2023-12-31]" + assert params["customParam"] == "value" class TestPTABTrialsClientSearchDecisions: @@ -554,6 +681,9 @@ def test_search_decisions_with_optional_params( limit=50, facets="decisionTypeCategory", fields="trialNumber,decisionDate", + filters="decisionTypeCategory:Final Written Decision", + range_filters="decisionDate:[2023-01-01 TO 2023-12-31]", + additional_query_params={"customParam": "value"}, ) # Verify @@ -565,6 +695,9 @@ def test_search_decisions_with_optional_params( assert params["limit"] == 50 assert params["facets"] == "decisionTypeCategory" assert params["fields"] == "trialNumber,decisionDate" + assert params["filters"] == "decisionTypeCategory:Final Written Decision" + assert params["rangeFilters"] == "decisionDate:[2023-01-01 TO 2023-12-31]" + assert params["customParam"] == "value" class TestPTABTrialsClientPaginate: diff --git a/tests/models/test_ptab_models.py b/tests/models/test_ptab_models.py new file mode 100644 index 0000000..01c9324 --- /dev/null +++ b/tests/models/test_ptab_models.py @@ -0,0 +1,281 @@ +""" +Tests for PTAB models. + +This module contains unit tests for the PTAB model classes. +""" + +from typing import Any, Dict + +import pytest + +from pyUSPTO.models.ptab import ( + PTABAppealDecision, + PTABAppealResponse, + PTABInterferenceDecision, + PTABInterferenceResponse, + PTABTrialProceeding, + PTABTrialProceedingResponse, + RegularPetitionerData, + RespondentData, + DerivationPetitionerData, + AppellantData, + RequestorData, + AppealDocumentData, + SeniorPartyData, + JuniorPartyData, + AdditionalPartyData, +) + + +class TestPTABTrialModels: + """Tests for PTAB trial proceeding models.""" + + def test_regular_petitioner_data_from_dict(self) -> None: + """Test RegularPetitionerData.from_dict().""" + data = { + "counselName": "Test Counsel", + "realPartyInInterestName": "Real Party", + } + result = RegularPetitionerData.from_dict(data) + assert result.counsel_name == "Test Counsel" + assert result.real_party_in_interest_name == "Real Party" + + def test_respondent_data_from_dict(self) -> None: + """Test RespondentData.from_dict().""" + data = { + "counselName": "Respondent Counsel", + "realPartyInInterestName": "Respondent Party", + } + result = RespondentData.from_dict(data) + assert result.counsel_name == "Respondent Counsel" + assert result.real_party_in_interest_name == "Respondent Party" + + def test_derivation_petitioner_data_from_dict(self) -> None: + """Test DerivationPetitionerData.from_dict().""" + data = { + "counselName": "Derivation Counsel", + "grantDate": "2023-01-15", + "groupArtUnitNumber": "3600", + "inventorName": "John Inventor", + "patentNumber": "US1234567", + "technologyCenterNumber": "3600", + "realPartyInInterestName": "Derivation Party", + "patentOwnerName": "Derivation Owner", + } + result = DerivationPetitionerData.from_dict(data) + assert result.counsel_name == "Derivation Counsel" + assert result.patent_number == "US1234567" + assert result.patent_owner_name == "Derivation Owner" + + def test_trial_proceeding_with_all_nested_objects(self) -> None: + """Test PTABTrialProceeding with all nested objects.""" + data = { + "trialNumber": "IPR2023-00001", + "trialRecordIdentifier": "uuid-1", + "lastModifiedDateTime": "2023-01-15T10:30:00Z", + "trialMetaData": { + "petitionFilingDate": "2023-01-01", + "trialStatusCategory": "Instituted", + "trialTypeCode": "IPR", + }, + "patentOwnerData": { + "patentOwnerName": "Owner Inc", + "patentNumber": "US1234567", + }, + "regularPetitionerData": { + "counselName": "Petitioner Counsel", + "realPartyInInterestName": "Petitioner Party", + }, + "respondentData": { + "counselName": "Respondent Counsel", + "realPartyInInterestName": "Respondent Party", + }, + "derivationPetitionerData": { + "counselName": "Derivation Counsel", + "patentNumber": "US7654321", + }, + } + result = PTABTrialProceeding.from_dict(data) + assert result.trial_number == "IPR2023-00001" + assert result.regular_petitioner_data is not None + assert result.regular_petitioner_data.counsel_name == "Petitioner Counsel" + assert result.respondent_data is not None + assert result.respondent_data.counsel_name == "Respondent Counsel" + assert result.derivation_petitioner_data is not None + assert result.derivation_petitioner_data.patent_number == "US7654321" + + +class TestPTABAppealModels: + """Tests for PTAB appeal decision models.""" + + def test_appellant_data_from_dict(self) -> None: + """Test AppellantData.from_dict().""" + data = { + "applicationNumberText": "15/123456", + "counselName": "Appellant Counsel", + "groupArtUnitNumber": "3600", + "inventorName": "Jane Inventor", + "realPartyInInterestName": "Appellant Party", + "patentOwnerName": "Appellant Owner", + "publicationDate": "2023-01-15", + "publicationNumber": "US20230012345", + "technologyCenterNumber": "3600", + } + result = AppellantData.from_dict(data) + assert result.application_number_text == "15/123456" + assert result.counsel_name == "Appellant Counsel" + assert result.inventor_name == "Jane Inventor" + assert result.technology_center_number == "3600" + + def test_requestor_data_from_dict(self) -> None: + """Test RequestorData.from_dict().""" + data = {"thirdPartyName": "Third Party Inc"} + result = RequestorData.from_dict(data) + assert result.third_party_name == "Third Party Inc" + + def test_appeal_document_data_from_dict(self) -> None: + """Test AppealDocumentData.from_dict().""" + data = { + "documentFilingDate": "2023-01-15", + "documentIdentifier": "doc-uuid-1", + "documentName": "Appeal Brief", + "documentSizeQuantity": 12345, + "documentOCRText": "Full OCR text content", + "documentTypeDescriptionText": "Brief", + "fileDownloadURI": "https://example.com/download", + } + result = AppealDocumentData.from_dict(data) + assert result.document_name == "Appeal Brief" + assert result.document_size_quantity == 12345 + assert result.document_ocr_text == "Full OCR text content" + + def test_appeal_decision_with_all_nested_objects(self) -> None: + """Test PTABAppealDecision with all nested objects.""" + data = { + "appealNumber": "2023-001234", + "lastModifiedDateTime": "2023-06-15T10:30:00Z", + "appealDocumentCategory": "Decision", + "appealMetaData": { + "appealFilingDate": "2023-01-15", + "applicationTypeCategory": "Utility", + }, + "appellantData": { + "applicationNumberText": "15/123456", + "counselName": "Test Counsel", + "technologyCenterNumber": "3600", + }, + "requestorData": {"thirdPartyName": "Third Party Inc"}, + "documentData": { + "documentName": "Final Decision", + "documentIdentifier": "doc-123", + }, + "decisionData": { + "decisionTypeCategory": "Affirmed", + "decisionDate": "2023-06-01", + }, + } + result = PTABAppealDecision.from_dict(data) + assert result.appeal_number == "2023-001234" + assert result.appellant_data is not None + assert result.appellant_data.counsel_name == "Test Counsel" + assert result.requestor_data is not None + assert result.requestor_data.third_party_name == "Third Party Inc" + assert result.document_data is not None + assert result.document_data.document_name == "Final Decision" + + +class TestPTABInterferenceModels: + """Tests for PTAB interference decision models.""" + + def test_senior_party_data_from_dict(self) -> None: + """Test SeniorPartyData.from_dict().""" + data = { + "applicationNumberText": "12/345678", + "counselName": "Senior Counsel", + "grantDate": "2023-01-15", + "groupArtUnitNumber": "1600", + "realPartyInInterestName": "Senior Party Inc", + "patentNumber": "US1234567", + "patentOwnerName": "Senior Owner", + "technologyCenterNumber": "1600", + } + result = SeniorPartyData.from_dict(data) + assert result.application_number_text == "12/345678" + assert result.counsel_name == "Senior Counsel" + assert result.patent_owner_name == "Senior Owner" + assert result.patent_number == "US1234567" + + def test_junior_party_data_from_dict(self) -> None: + """Test JuniorPartyData.from_dict().""" + data = { + "publicationNumber": "US20230012345", + "counselName": "Junior Counsel", + "groupArtUnitNumber": "1600", + "inventorName": "Jane Inventor", + "patentOwnerName": "Junior Owner", + "publicationDate": "2023-02-20", + "realPartyInInterestName": "Junior Party LLC", + "technologyCenterNumber": "1600", + } + result = JuniorPartyData.from_dict(data) + assert result.publication_number == "US20230012345" + assert result.counsel_name == "Junior Counsel" + assert result.inventor_name == "Jane Inventor" + assert result.patent_owner_name == "Junior Owner" + + def test_additional_party_data_from_dict(self) -> None: + """Test AdditionalPartyData.from_dict().""" + data = { + "applicationNumberText": "14/111222", + "inventorName": "John Inventor", + "additionalPartyName": "Additional Entity", + "patentNumber": "US1112223", + } + result = AdditionalPartyData.from_dict(data) + assert result.application_number_text == "14/111222" + assert result.inventor_name == "John Inventor" + assert result.additional_party_name == "Additional Entity" + assert result.patent_number == "US1112223" + + def test_interference_decision_with_all_nested_objects(self) -> None: + """Test PTABInterferenceDecision with all nested objects.""" + data = { + "interferenceNumber": "106123", + "lastModifiedDateTime": "2023-03-15T10:30:00Z", + "interferenceMetaData": { + "interferenceStyleName": "Senior v. Junior", + "interferenceLastModifiedDate": "2023-03-15", + }, + "seniorPartyData": { + "patentOwnerName": "Senior Inc", + "applicationNumberText": "12/345678", + "patentNumber": "US1234567", + }, + "juniorPartyData": { + "patentOwnerName": "Junior LLC", + "publicationNumber": "US20230012345", + }, + "additionalPartyDataBag": [ + { + "additionalPartyName": "Additional Party 1", + "applicationNumberText": "14/111222", + }, + { + "additionalPartyName": "Additional Party 2", + "applicationNumberText": "14/333444", + }, + ], + "documentData": { + "interferenceOutcomeCategory": "Priority to Senior Party", + "decisionTypeCategory": "Final Decision", + }, + } + result = PTABInterferenceDecision.from_dict(data) + assert result.interference_number == "106123" + assert result.senior_party_data is not None + assert result.senior_party_data.patent_owner_name == "Senior Inc" + assert result.junior_party_data is not None + assert result.junior_party_data.patent_owner_name == "Junior LLC" + assert len(result.additional_party_data_bag) == 2 + assert result.additional_party_data_bag[0].additional_party_name == "Additional Party 1" + assert result.additional_party_data_bag[1].additional_party_name == "Additional Party 2" From 324c363442361deab1843697f27d83151fc1a6d9 Mon Sep 17 00:00:00 2001 From: Andrew Date: Wed, 26 Nov 2025 13:03:49 -0600 Subject: [PATCH 04/17] Update models to be consistent with Schema. --- CHANGELOG.md | 22 + README.md | 317 +++++++++++--- examples/ptab_appeals_example.py | 281 ++++++++++++ examples/ptab_interferences_example.py | 335 +++++++++++++++ examples/ptab_trials_example.py | 248 +++++++++++ src/pyUSPTO/clients/ptab_trials.py | 518 +++++++++++------------ src/pyUSPTO/models/ptab.py | 217 +++++++++- tests/clients/test_ptab_trials_client.py | 26 +- 8 files changed, 1615 insertions(+), 349 deletions(-) create mode 100644 examples/ptab_appeals_example.py create mode 100644 examples/ptab_interferences_example.py create mode 100644 examples/ptab_trials_example.py diff --git a/CHANGELOG.md b/CHANGELOG.md index ef6dad3..cab588a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,28 @@ All notable changes to the pyUSPTO package will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## [0.3.0] - TBD + +### Added + +- **PTAB API 3.0 Support**: New clients for PTAB trials, appeals, and interferences + - `PTABTrialsClient` - Search trial proceedings, documents, and decisions + - `PTABAppealsClient` - Search ex parte appeal decisions + - `PTABInterferencesClient` - Search interference decisions +- New data models in `pyUSPTO.models.ptab` for PTAB responses: + - `PTABTrialProceeding`, `PTABAppealDecision`, `PTABInterferenceDecision` + - Supporting models for party data, metadata, and decision information +- Configuration support for PTAB base URL in `USPTOConfig` +- Comprehensive examples for all three PTAB clients (`examples/ptab_*.py`) +- Additional convenience parameters for `PTABTrialsClient` search methods: + - `search_documents()`: petitioner name, inventor, patent details, real party in interest + - `search_decisions()`: trial type, patent/application numbers, status, party information, document category + +### Changed + +- Enhanced `PTABTrialsClient.search_documents()` with convenience parameters for petitioner, inventor, patent details +- Enhanced `PTABTrialsClient.search_decisions()` with convenience parameters for trial type, status, and party information + ## [0.2.2] ### Added diff --git a/README.md b/README.md index 867ebfb..1c93681 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,5 @@ # pyUSPTO + [![PyPI version](https://badge.fury.io/py/pyUSPTO.svg)](https://badge.fury.io/py/pyUSPTO) [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT) [![Python 3.10+](https://img.shields.io/badge/python-3.10+-blue.svg)](https://www.python.org/downloads/) @@ -6,64 +7,253 @@ A Python client library for interacting with the United Stated Patent and Trademark Office (USPTO) [Open Data Portal](https://data.uspto.gov/home) APIs. -This package provides clients for interacting with the USPTO Bulk Data API, the USPTO Patent Data API, and the USPTO Final Petition Decisions API. +This package provides clients for interacting with the USPTO Bulk Data API, Patent Data API, Final Petition Decisions API, and PTAB (Patent Trial and Appeal Board) APIs. > [!IMPORTANT] > The USPTO is in the process of moving their API. This package is only concerned with the new API. The [old API](https://developer.uspto.gov/) will be retired at the end of 2025. ## Quick Start -### Installation - **Requirements**: Python ≥3.10 ```bash pip install pyUSPTO ``` -Or install from source: +> [!IMPORTANT] +> You must have an API key for the [USPTO Open Data Portal API](https://data.uspto.gov/myodp/landing). -```bash -git clone https://github.com/DunlapCoddingPC/pyUSPTO.git -cd pyUSPTO -pip install -e . -``` +```python +from pyUSPTO import PatentDataClient +# Initialize with your API key +client = PatentDataClient(api_key="your_api_key_here") -### Configuration Options +# Search for patent applications +results = client.search_applications(inventor_name_q="Smith", limit=10) +print(f"Found {results.count} applications") +``` -> [!IMPORTANT] -> You must have an API key for the [USPTO Open Data Portal API](https://data.uspto.gov/myodp/landing). +## Configuration + +All clients can be configured using one of three methods: -There are multiple ways to configure the USPTO API clients: +### Method 1: Direct API Key Initialization +> [!NOTE] +> This method is convenient for quick scripts but not recommended for production use. Consider using environment variables instead. ```python -from pyUSPTO import PatentDataClient, FinalPetitionDecisionsClient +from pyUSPTO import ( + BulkDataClient, + PatentDataClient, + FinalPetitionDecisionsClient, + PTABTrialsClient, + PTABAppealsClient, + PTABInterferencesClient +) -# Method 1: Direct API key initialization patent_client = PatentDataClient(api_key="your_api_key_here") +bulk_client = BulkDataClient(api_key="your_api_key_here") petition_client = FinalPetitionDecisionsClient(api_key="your_api_key_here") +trials_client = PTABTrialsClient(api_key="your_api_key_here") +appeals_client = PTABAppealsClient(api_key="your_api_key_here") +interferences_client = PTABInterferencesClient(api_key="your_api_key_here") +``` + +### Method 2: Using USPTOConfig + +```python +from pyUSPTO import ( + BulkDataClient, + PatentDataClient, + FinalPetitionDecisionsClient, + PTABTrialsClient, + PTABAppealsClient, + PTABInterferencesClient +) -# Method 2: Using USPTOConfig with explicit parameters from pyUSPTO.config import USPTOConfig -config = USPTOConfig( - api_key="your_api_key_here", - bulk_data_base_url="https://api.uspto.gov", - patent_data_base_url="https://api.uspto.gov", - petition_decisions_base_url="https://api.uspto.gov" + +config = USPTOConfig(api_key="your_api_key_here") + +patent_client = PatentDataClient(config=config) +bulk_client = BulkDataClient(config=config) +petition_client = FinalPetitionDecisionsClient(config=config) +trials_client = PTABTrialsClient(config=config) +appeals_client = PTABAppealsClient(config=config) +interferences_client = PTABInterferencesClient(config=config) +``` + +### Method 3: Environment Variables (Recommended) + +Set the environment variable in your shell: + +```bash +export USPTO_API_KEY="your_api_key_here" +``` + +Then use it in your Python code: + +```python +from pyUSPTO import ( + BulkDataClient, + PatentDataClient, + FinalPetitionDecisionsClient, + PTABTrialsClient, + PTABAppealsClient, + PTABInterferencesClient ) +from pyUSPTO.config import USPTOConfig + +# Load configuration from environment +config = USPTOConfig.from_env() + patent_client = PatentDataClient(config=config) +bulk_client = BulkDataClient(config=config) petition_client = FinalPetitionDecisionsClient(config=config) +trials_client = PTABTrialsClient(config=config) +appeals_client = PTABAppealsClient(config=config) +interferences_client = PTABInterferencesClient(config=config) +``` + +## API Usage Examples + +### Patent Data API + +```python +# Search for applications by inventor name +inventor_search = patent_client.search_applications(inventor_name_q="Smith") +print(f"Found {inventor_search.count} applications with 'Smith' as inventor") +# > Found 104926 applications with 'Smith' as inventor. +``` + +### Final Petition Decisions API + +```python +# Search for petition decisions by date range +decisions = petition_client.search_decisions( + decision_date_from_q="2023-01-01", + limit=10 +) +print(f"Found {decisions.count} petition decisions since 2023") + +# Get a specific decision by ID +decision = petition_client.get_decision_by_id("decision_id_here") +print(f"Decision Type: {decision.decision_type_code}") +print(f"Application: {decision.application_number_text}") +``` + +### PTAB (Patent Trial and Appeal Board) APIs + +The package provides three clients for accessing PTAB data: + +#### PTAB Trials API + +```python +from pyUSPTO import PTABTrialsClient + +# Initialize client +trials_client = PTABTrialsClient(api_key="your_api_key_here") + +# Search for IPR trial proceedings +proceedings = trials_client.search_proceedings( + trial_type_code_q="IPR", + trial_status_category_q="Instituted", + petition_filing_date_from_q="2023-01-01", + limit=10 +) +print(f"Found {proceedings.count} instituted IPR proceedings") + +# Search for trial documents with new convenience parameters +documents = trials_client.search_documents( + trial_number_q="IPR2023-00001", + petitioner_party_name_q="Acme Corp", + patent_owner_name_q="XYZ Inc", + limit=5 +) + +# Search for trial decisions +decisions = trials_client.search_decisions( + trial_type_code_q="IPR", + decision_type_category_q="Final Written Decision", + patent_number_q="US1234567", + decision_date_from_q="2023-01-01" +) + +# Paginate through proceedings +for proceeding in trials_client.paginate_proceedings(trial_type_code_q="IPR", limit=25): + print(f"Trial: {proceeding.trial_number}") +``` + +#### PTAB Appeals API + +```python +from pyUSPTO import PTABAppealsClient -# Method 3: Using environment variables (recommended for production) -import os -os.environ["USPTO_API_KEY"] = "your_api_key_here" -config_from_env = USPTOConfig.from_env() -patent_client = PatentDataClient(config=config_from_env) -petition_client = FinalPetitionDecisionsClient(config=config_from_env) +# Initialize client +appeals_client = PTABAppealsClient(api_key="your_api_key_here") + +# Search for appeal decisions by technology center +decisions = appeals_client.search_decisions( + technology_center_number_q="3600", + decision_type_category_q="Affirmed", + decision_date_from_q="2023-01-01", + limit=10 +) +print(f"Found {decisions.count} affirmed decisions from TC 3600") + +# Search by application number +decisions = appeals_client.search_decisions( + application_number_text_q="15/123456", + limit=5 +) + +# Paginate through decisions +for decision in appeals_client.paginate_decisions( + technology_center_number_q="2100", + limit=25 +): + print(f"Appeal: {decision.appeal_number}") ``` +#### PTAB Interferences API + +```python +from pyUSPTO import PTABInterferencesClient + +# Initialize client +interferences_client = PTABInterferencesClient(api_key="your_api_key_here") + +# Search for interference decisions by outcome +decisions = interferences_client.search_decisions( + interference_outcome_category_q="Priority to Senior Party", + decision_date_from_q="2022-01-01", + limit=10 +) +print(f"Found {decisions.count} decisions awarding priority to senior party") + +# Search by party name +decisions = interferences_client.search_decisions( + senior_party_name_q="Example Corp", + junior_party_name_q="Test Inc", + limit=5 +) + +# Paginate through decisions +for decision in interferences_client.paginate_decisions( + decision_type_category_q="Final Decision", + limit=25 +): + print(f"Interference: {decision.interference_number}") +``` + +## Documentation + +Full documentation may be found on [Read the Docs](https://pyuspto.readthedocs.io/). + +## Advanced Topics + ### Advanced HTTP Configuration Control timeout behavior, retry logic, and connection pooling using `HTTPConfig`: @@ -126,36 +316,11 @@ patent_client = PatentDataClient(config=patent_config) petition_client = FinalPetitionDecisionsClient(config=petition_config) ``` -### Patent Data API - -```python -# Search for applications by inventor name -inventor_search = patent_client.search_applications(inventor_name_q="Smith") -print(f"Found {inventor_search.count} applications with 'Smith' as inventor") -# > Found 104926 applications with 'Smith' as inventor. -``` - -### Final Petition Decisions API - -```python -# Search for petition decisions by date range -decisions = petition_client.search_decisions( - decision_date_from_q="2023-01-01", - limit=10 -) -print(f"Found {decisions.count} petition decisions since 2023") - -# Get a specific decision by ID -decision = petition_client.get_decision_by_id("decision_id_here") -print(f"Decision Type: {decision.decision_type_code}") -print(f"Application: {decision.application_number_text}") -``` - -## Warning Control +### Warning Control The library uses Python's standard `warnings` module to report data parsing issues. This allows you to control how warnings are handled based on your needs. -### Warning Categories +**Warning Categories** All warnings inherit from `USPTODataWarning`: @@ -164,7 +329,7 @@ All warnings inherit from `USPTODataWarning`: - `USPTOTimezoneWarning`: Timezone-related issues - `USPTOEnumParseWarning`: Enum value parsing failures -### Controlling Warnings +**Controlling Warnings** ```python import warnings @@ -194,22 +359,9 @@ warnings.filterwarnings('always', category=USPTODataWarning) The library's permissive parsing philosophy returns `None` for fields that cannot be parsed, allowing you to retrieve partial data even when some fields have issues. Warnings inform you when this happens without stopping execution. -## Features +## Data Models -- Access to USPTO Bulk Data API, Patent Data API, and Final Petition Decisions API -- Search for patent applications using various filters -- Search and retrieve petition decisions with detailed information -- Download files, documents, and petition decision documents from the APIs -- Pagination support for large result sets -- Full type annotations and comprehensive test coverage - -## Documentation - -Full documentation may be found on [Read the Docs](https://pyuspto.readthedocs.io/). - -### Data Models - -The library uses Python dataclasses to represent API responses. All data models include type annotations for attributes and methods, making them fully compatible with static type checkers. +The library uses Python dataclasses to represent API responses. All data models include type annotations for attributes and methods, making them fully compatible with static type checkers. #### Bulk Data API @@ -239,6 +391,31 @@ The library uses Python dataclasses to represent API responses. All data models - `DecisionTypeCode`: Enum for petition decision types - `DocumentDirectionCategory`: Enum for document direction categories +#### PTAB Trials API + +- `PTABTrialProceedingResponse`: Top-level response from the API +- `PTABTrialProceeding`: Information about a PTAB trial proceeding (IPR, PGR, CBM, DER) +- `PTABTrialDocument`: Document associated with a trial proceeding +- `PTABTrialDecision`: Decision information for a trial proceeding +- `RegularPetitionerData`, `RespondentData`, `DerivationPetitionerData`: Party data for different trial types +- `PTABTrialMetaData`: Trial metadata and status information + +#### PTAB Appeals API + +- `PTABAppealResponse`: Top-level response from the API +- `PTABAppealDecision`: Ex parte appeal decision information +- `AppellantData`: Appellant information and application details +- `PTABAppealMetaData`: Appeal metadata and filing information +- `PTABAppealDocumentData`: Document and decision details + +#### PTAB Interferences API + +- `PTABInterferenceResponse`: Top-level response from the API +- `PTABInterferenceDecision`: Interference proceeding decision information +- `SeniorPartyData`, `JuniorPartyData`, `AdditionalPartyData`: Party data classes +- `PTABInterferenceMetaData`: Interference metadata and status information +- `PTABInterferenceDocumentData`: Document and outcome details + ## License This project is licensed under the MIT License - see the [LICENSE](LICENSE) file for details. diff --git a/examples/ptab_appeals_example.py b/examples/ptab_appeals_example.py new file mode 100644 index 0000000..9cd2e1c --- /dev/null +++ b/examples/ptab_appeals_example.py @@ -0,0 +1,281 @@ +""" +Example usage of the pyUSPTO module for PTAB Appeals API + +This example demonstrates how to use the PTABAppealsClient to interact with the USPTO PTAB +(Patent Trial and Appeal Board) Appeals API. It shows how to search for ex parte appeal +decisions using various search criteria. + +PTAB Appeals include ex parte appeals from patent application examinations to the Board. +""" + +import os + +from pyUSPTO import PTABAppealsClient, USPTOConfig + +# --- Initialization --- +# Choose one method to initialize the client. +# For this example, Method 1 is active. Replace "YOUR_API_KEY_HERE" with your actual key. + +# Method 1: Initialize the client with direct API key +print("Method 1: Initialize with direct API key") +api_key = os.environ.get("USPTO_API_KEY", "YOUR_API_KEY_HERE") +if api_key == "YOUR_API_KEY_HERE": + raise ValueError( + "WARNING: API key is not set. Please replace 'YOUR_API_KEY_HERE' or set USPTO_API_KEY environment variable." + ) +client = PTABAppealsClient(api_key=api_key) + +# Method 2: Initialize the client with USPTOConfig (alternative) +# print("\nMethod 2: Initialize with USPTOConfig") +# config_obj = USPTOConfig( +# api_key="YOUR_API_KEY_HERE", # Replace with your actual API key +# ptab_base_url="https://api.uspto.gov", # Optional, uses default if not set +# ) +# client = PTABAppealsClient(config=config_obj) + +# Method 3: Initialize the client with environment variables (recommended for production) +# print("\nMethod 3: Initialize with environment variables") +# # Ensure USPTO_API_KEY is set in your environment +# try: +# config_from_env = USPTOConfig.from_env() +# client = PTABAppealsClient(config=config_from_env) +# except ValueError as e: +# print(f"Error initializing from environment: {e}") +# print("Please ensure USPTO_API_KEY environment variable is set.") + +print("\nBeginning PTAB Appeals API requests with configured client:") + +# ============================================================================= +# 1. Search Appeal Decisions by Technology Center +# ============================================================================= + +print("\n" + "=" * 80) +print("1. Searching for appeal decisions by technology center") +print("=" * 80) + +try: + # Search for decisions from Technology Center 3600 (Business Methods/Software) + response = client.search_decisions( + technology_center_number_q="3600", + decision_date_from_q="2023-01-01", + decision_date_to_q="2023-12-31", + limit=5, + ) + + print(f"\nFound {response.count} appeal decisions from TC 3600 in 2023") + print(f"Displaying first {len(response.patent_appeal_data_bag)} results:") + + for decision in response.patent_appeal_data_bag: + print(f"\n Appeal Number: {decision.appeal_number}") + + if decision.appeal_meta_data: + meta = decision.appeal_meta_data + print(f" Application Type: {meta.application_type_category}") + print(f" Filing Date: {meta.appeal_filing_date}") + + if decision.appellant_data: + appellant = decision.appellant_data + print(f" Application Number: {appellant.application_number_text}") + print(f" Technology Center: {appellant.technology_center_number}") + + if appellant.inventor_name: + print(f" Inventor: {appellant.inventor_name}") + + if decision.decision_data: + dec = decision.decision_data + print(f" Decision Type: {dec.decision_type_category}") + print(f" Decision Date: {dec.decision_issue_date}") + +except Exception as e: + print(f"Error searching appeal decisions: {e}") + +# ============================================================================= +# 2. Search by Decision Type +# ============================================================================= + +print("\n" + "=" * 80) +print("2. Searching for 'Affirmed' decisions") +print("=" * 80) + +try: + # Search for decisions where the examiner was affirmed + response = client.search_decisions( + decision_type_category_q="Affirmed", + decision_date_from_q="2024-01-01", + limit=5, + ) + + print(f"\nFound {response.count} 'Affirmed' decisions since 2024") + print(f"Displaying first {len(response.patent_appeal_data_bag)} results:") + + for decision in response.patent_appeal_data_bag: + print(f"\n Appeal Number: {decision.appeal_number}") + + if decision.appellant_data: + print(f" Application: {decision.appellant_data.application_number_text}") + print(f" Inventor: {decision.appellant_data.inventor_name or 'N/A'}") + + if decision.decision_data: + print(f" Decision: {decision.decision_data.decision_type_category}") + print(f" Date: {decision.decision_data.decision_issue_date}") + +except Exception as e: + print(f"Error searching by decision type: {e}") + +# ============================================================================= +# 3. Search by Application Number +# ============================================================================= + +print("\n" + "=" * 80) +print("3. Searching for decisions by application number pattern") +print("=" * 80) + +try: + # Search for decisions related to applications starting with "15/" + response = client.search_decisions( + application_number_text_q="15/*", + decision_date_from_q="2023-01-01", + limit=3, + ) + + print(f"\nFound {response.count} decisions for applications starting with '15/'") + print(f"Displaying first {len(response.patent_appeal_data_bag)} results:") + + for decision in response.patent_appeal_data_bag: + print(f"\n Appeal Number: {decision.appeal_number}") + + if decision.appellant_data: + print(f" Application: {decision.appellant_data.application_number_text}") + print(f" TC Number: {decision.appellant_data.technology_center_number}") + + if decision.document_data: + doc = decision.document_data + print(f" Document Name: {doc.document_name}") + if doc.file_download_uri: + print(f" Download URL: {doc.file_download_uri}") + +except Exception as e: + print(f"Error searching by application number: {e}") + +# ============================================================================= +# 4. Pagination Example +# ============================================================================= + +print("\n" + "=" * 80) +print("4. Paginating through appeal decisions") +print("=" * 80) + +try: + print("\nIterating through first 10 appeal decisions from 2024...") + count = 0 + for decision in client.paginate_decisions( + decision_date_from_q="2024-01-01", + limit=5, # Fetch 5 per page + ): + count += 1 + decision_type = ( + decision.decision_data.decision_type_category + if decision.decision_data + else "N/A" + ) + print(f"{count}. {decision.appeal_number} - {decision_type}") + + if count >= 10: # Stop after 10 results for this example + break + + print(f"\nDisplayed {count} decisions using pagination") + +except Exception as e: + print(f"Error paginating decisions: {e}") + +# ============================================================================= +# 5. Advanced Search with Multiple Criteria +# ============================================================================= + +print("\n" + "=" * 80) +print("5. Advanced search with multiple criteria") +print("=" * 80) + +try: + # Search with multiple convenience parameters + response = client.search_decisions( + technology_center_number_q="2100", # Electronics + decision_type_category_q="Reversed", + decision_date_from_q="2023-01-01", + decision_date_to_q="2023-12-31", + sort="decisionDate desc", + limit=3, + ) + + print( + f"\nFound {response.count} 'Reversed' decisions from TC 2100 (Electronics) in 2023" + ) + print(f"Displaying first {len(response.patent_appeal_data_bag)} results:") + + for decision in response.patent_appeal_data_bag: + print(f"\n Appeal Number: {decision.appeal_number}") + + if decision.appellant_data: + print(f" Application: {decision.appellant_data.application_number_text}") + + if decision.decision_data: + print(f" Decision: {decision.decision_data.decision_type_category}") + print(f" Date: {decision.decision_data.decision_issue_date}") + +except Exception as e: + print(f"Error with advanced search: {e}") + +# ============================================================================= +# 6. Direct Query String Example +# ============================================================================= + +print("\n" + "=" * 80) +print("6. Using direct query string for complex searches") +print("=" * 80) + +try: + # Use a direct query string for more complex searches + response = client.search_decisions( + query="technologyCenterNumber:3600 AND decisionTypeCategory:(Affirmed OR Reversed)", + limit=3, + ) + + print(f"\nFound {response.count} Affirmed/Reversed decisions from TC 3600") + print(f"Displaying first {len(response.patent_appeal_data_bag)} results:") + + for decision in response.patent_appeal_data_bag: + print(f"\n Appeal Number: {decision.appeal_number}") + + if decision.decision_data: + print(f" Decision: {decision.decision_data.decision_type_category}") + +except Exception as e: + print(f"Error with direct query: {e}") + +# ============================================================================= +# 7. Error Handling Example +# ============================================================================= + +print("\n" + "=" * 80) +print("7. Error handling demonstration") +print("=" * 80) + +try: + # Attempt a search that might return no results + print("\nAttempting search with unlikely parameters...") + response = client.search_decisions( + appeal_number_q="INVALID-APPEAL-NUMBER", + limit=1, + ) + + if response.count == 0: + print("No results found for the given search criteria") + else: + print(f"Found {response.count} results") + +except Exception as e: + print(f"Expected error occurred: {type(e).__name__}: {e}") + +print("\n" + "=" * 80) +print("PTAB Appeals API example completed successfully!") +print("=" * 80) diff --git a/examples/ptab_interferences_example.py b/examples/ptab_interferences_example.py new file mode 100644 index 0000000..9a78858 --- /dev/null +++ b/examples/ptab_interferences_example.py @@ -0,0 +1,335 @@ +""" +Example usage of the pyUSPTO module for PTAB Interferences API + +This example demonstrates how to use the PTABInterferencesClient to interact with the USPTO PTAB +(Patent Trial and Appeal Board) Interferences API. It shows how to search for interference +decisions using various search criteria. + +PTAB Interferences are proceedings to determine priority of invention when two or more parties +claim the same patentable invention. +""" + +import os + +from pyUSPTO import PTABInterferencesClient, USPTOConfig + +# --- Initialization --- +# Choose one method to initialize the client. +# For this example, Method 1 is active. Replace "YOUR_API_KEY_HERE" with your actual key. + +# Method 1: Initialize the client with direct API key +print("Method 1: Initialize with direct API key") +api_key = os.environ.get("USPTO_API_KEY", "YOUR_API_KEY_HERE") +if api_key == "YOUR_API_KEY_HERE": + raise ValueError( + "WARNING: API key is not set. Please replace 'YOUR_API_KEY_HERE' or set USPTO_API_KEY environment variable." + ) +client = PTABInterferencesClient(api_key=api_key) + +# Method 2: Initialize the client with USPTOConfig (alternative) +# print("\nMethod 2: Initialize with USPTOConfig") +# config_obj = USPTOConfig( +# api_key="YOUR_API_KEY_HERE", # Replace with your actual API key +# ptab_base_url="https://api.uspto.gov", # Optional, uses default if not set +# ) +# client = PTABInterferencesClient(config=config_obj) + +# Method 3: Initialize the client with environment variables (recommended for production) +# print("\nMethod 3: Initialize with environment variables") +# # Ensure USPTO_API_KEY is set in your environment +# try: +# config_from_env = USPTOConfig.from_env() +# client = PTABInterferencesClient(config=config_from_env) +# except ValueError as e: +# print(f"Error initializing from environment: {e}") +# print("Please ensure USPTO_API_KEY environment variable is set.") + +print("\nBeginning PTAB Interferences API requests with configured client:") + +# ============================================================================= +# 1. Search Interference Decisions +# ============================================================================= + +print("\n" + "=" * 80) +print("1. Searching for interference decisions") +print("=" * 80) + +try: + # Search for recent interference decisions + response = client.search_decisions( + decision_date_from_q="2023-01-01", + limit=5, + ) + + print(f"\nFound {response.count} interference decisions since 2023") + print(f"Displaying first {len(response.patent_interference_data_bag)} results:") + + for decision in response.patent_interference_data_bag: + print(f"\n Interference Number: {decision.interference_number}") + + if decision.interference_meta_data: + meta = decision.interference_meta_data + print(f" Style Name: {meta.interference_style_name}") + print(f" Last Modified: {meta.interference_last_modified_date}") + + if decision.senior_party_data: + senior = decision.senior_party_data + print(f" Senior Party: {senior.patent_owner_name}") + if senior.patent_number: + print(f" Senior Patent: {senior.patent_number}") + + if decision.junior_party_data: + junior = decision.junior_party_data + print(f" Junior Party: {junior.patent_owner_name}") + if junior.publication_number: + print(f" Junior Publication: {junior.publication_number}") + + if decision.document_data: + doc = decision.document_data + print(f" Outcome: {doc.interference_outcome_category}") + print(f" Decision Type: {doc.decision_type_category}") + +except Exception as e: + print(f"Error searching interference decisions: {e}") + +# ============================================================================= +# 2. Search by Interference Outcome +# ============================================================================= + +print("\n" + "=" * 80) +print("2. Searching for decisions by outcome") +print("=" * 80) + +try: + # Search for decisions with specific outcomes + response = client.search_decisions( + interference_outcome_category_q="Priority to Senior Party", + decision_date_from_q="2022-01-01", + limit=3, + ) + + print( + f"\nFound {response.count} decisions awarding priority to the senior party since 2022" + ) + print(f"Displaying first {len(response.patent_interference_data_bag)} results:") + + for decision in response.patent_interference_data_bag: + print(f"\n Interference Number: {decision.interference_number}") + + if decision.senior_party_data: + print(f" Senior Party: {decision.senior_party_data.patent_owner_name}") + print( + f" Senior Application: {decision.senior_party_data.application_number_text}" + ) + + if decision.junior_party_data: + print(f" Junior Party: {decision.junior_party_data.patent_owner_name}") + + if decision.document_data: + print(f" Outcome: {decision.document_data.interference_outcome_category}") + print(f" Decision Date: {decision.document_data.decision_issue_date}") + +except Exception as e: + print(f"Error searching by outcome: {e}") + +# ============================================================================= +# 3. Search by Party Name +# ============================================================================= + +print("\n" + "=" * 80) +print("3. Searching for decisions by party name") +print("=" * 80) + +try: + # Search for decisions involving a specific senior party + response = client.search_decisions( + senior_party_name_q="*Corp*", # Any company with "Corp" in the name + limit=3, + ) + + print(f"\nFound {response.count} decisions with 'Corp' in senior party name") + print(f"Displaying first {len(response.patent_interference_data_bag)} results:") + + for decision in response.patent_interference_data_bag: + print(f"\n Interference Number: {decision.interference_number}") + + if decision.senior_party_data: + senior = decision.senior_party_data + print(f" Senior Party: {senior.patent_owner_name}") + if senior.counsel_name: + print(f" Senior Counsel: {senior.counsel_name}") + + if decision.junior_party_data: + junior = decision.junior_party_data + print(f" Junior Party: {junior.patent_owner_name}") + if junior.counsel_name: + print(f" Junior Counsel: {junior.counsel_name}") + +except Exception as e: + print(f"Error searching by party name: {e}") + +# ============================================================================= +# 4. Search by Application Numbers +# ============================================================================= + +print("\n" + "=" * 80) +print("4. Searching for decisions by application numbers") +print("=" * 80) + +try: + # Search for decisions involving specific application numbers + response = client.search_decisions( + senior_party_application_number_q="12/*", # Applications starting with 12/ + limit=3, + ) + + print( + f"\nFound {response.count} decisions with senior applications starting with '12/'" + ) + print(f"Displaying first {len(response.patent_interference_data_bag)} results:") + + for decision in response.patent_interference_data_bag: + print(f"\n Interference Number: {decision.interference_number}") + + if decision.senior_party_data: + print( + f" Senior Application: {decision.senior_party_data.application_number_text}" + ) + + if decision.junior_party_data: + print( + f" Junior Publication: {decision.junior_party_data.publication_number}" + ) + + if decision.document_data: + print(f" Decision Type: {decision.document_data.decision_type_category}") + +except Exception as e: + print(f"Error searching by application numbers: {e}") + +# ============================================================================= +# 5. Pagination Example +# ============================================================================= + +print("\n" + "=" * 80) +print("5. Paginating through interference decisions") +print("=" * 80) + +try: + print("\nIterating through first 5 interference decisions from 2023...") + count = 0 + for decision in client.paginate_decisions( + decision_date_from_q="2023-01-01", + limit=3, # Fetch 3 per page + ): + count += 1 + outcome = ( + decision.document_data.interference_outcome_category + if decision.document_data + else "N/A" + ) + print(f"{count}. {decision.interference_number} - {outcome}") + + if count >= 5: # Stop after 5 results for this example + break + + print(f"\nDisplayed {count} decisions using pagination") + +except Exception as e: + print(f"Error paginating decisions: {e}") + +# ============================================================================= +# 6. Advanced Search with Multiple Criteria +# ============================================================================= + +print("\n" + "=" * 80) +print("6. Advanced search with multiple criteria") +print("=" * 80) + +try: + # Search with multiple convenience parameters + response = client.search_decisions( + decision_type_category_q="Final Decision", + decision_date_from_q="2020-01-01", + decision_date_to_q="2023-12-31", + sort="decisionDate desc", + limit=3, + ) + + print(f"\nFound {response.count} Final Decisions between 2020-2023") + print(f"Displaying first {len(response.patent_interference_data_bag)} results:") + + for decision in response.patent_interference_data_bag: + print(f"\n Interference Number: {decision.interference_number}") + + if decision.interference_meta_data: + print(f" Style: {decision.interference_meta_data.interference_style_name}") + + if decision.document_data: + print(f" Decision Type: {decision.document_data.decision_type_category}") + print(f" Decision Date: {decision.document_data.decision_issue_date}") + print(f" Outcome: {decision.document_data.interference_outcome_category}") + + # Show additional parties if present + if decision.additional_party_data_bag: + print(f" Additional Parties: {len(decision.additional_party_data_bag)}") + for party in decision.additional_party_data_bag: + print(f" - {party.additional_party_name}") + +except Exception as e: + print(f"Error with advanced search: {e}") + +# ============================================================================= +# 7. Direct Query String Example +# ============================================================================= + +print("\n" + "=" * 80) +print("7. Using direct query string for complex searches") +print("=" * 80) + +try: + # Use a direct query string for more complex searches + response = client.search_decisions( + query='interferenceOutcomeCategory:"Priority to Senior Party" OR interferenceOutcomeCategory:"Priority to Junior Party"', + limit=3, + ) + + print(f"\nFound {response.count} decisions awarding priority to either party") + print(f"Displaying first {len(response.patent_interference_data_bag)} results:") + + for decision in response.patent_interference_data_bag: + print(f"\n Interference Number: {decision.interference_number}") + + if decision.document_data: + print(f" Outcome: {decision.document_data.interference_outcome_category}") + +except Exception as e: + print(f"Error with direct query: {e}") + +# ============================================================================= +# 8. Error Handling Example +# ============================================================================= + +print("\n" + "=" * 80) +print("8. Error handling demonstration") +print("=" * 80) + +try: + # Attempt a search that might return no results + print("\nAttempting search with unlikely parameters...") + response = client.search_decisions( + interference_number_q="999999", # Very unlikely interference number + limit=1, + ) + + if response.count == 0: + print("No results found for the given search criteria") + else: + print(f"Found {response.count} results") + +except Exception as e: + print(f"Expected error occurred: {type(e).__name__}: {e}") + +print("\n" + "=" * 80) +print("PTAB Interferences API example completed successfully!") +print("=" * 80) diff --git a/examples/ptab_trials_example.py b/examples/ptab_trials_example.py new file mode 100644 index 0000000..d2b2226 --- /dev/null +++ b/examples/ptab_trials_example.py @@ -0,0 +1,248 @@ +""" +Example usage of the pyUSPTO module for PTAB Trials API + +This example demonstrates how to use the PTABTrialsClient to interact with the USPTO PTAB +(Patent Trial and Appeal Board) Trials API. It shows how to search for trial proceedings, +documents, and decisions using various search criteria. + +PTAB Trials include: +- IPR (Inter Partes Review) +- PGR (Post-Grant Review) +- CBM (Covered Business Method) +- DER (Derivation) proceedings +""" + +import os + +from pyUSPTO import PTABTrialsClient, USPTOConfig + +# --- Initialization --- +# Choose one method to initialize the client. +# For this example, Method 1 is active. Replace "YOUR_API_KEY_HERE" with your actual key. + +# Method 1: Initialize the client with direct API key +print("Method 1: Initialize with direct API key") +api_key = os.environ.get("USPTO_API_KEY", "YOUR_API_KEY_HERE") +if api_key == "YOUR_API_KEY_HERE": + raise ValueError( + "WARNING: API key is not set. Please replace 'YOUR_API_KEY_HERE' or set USPTO_API_KEY environment variable." + ) +client = PTABTrialsClient(api_key=api_key) + +# Method 2: Initialize the client with USPTOConfig (alternative) +# print("\nMethod 2: Initialize with USPTOConfig") +# config_obj = USPTOConfig( +# api_key="YOUR_API_KEY_HERE", # Replace with your actual API key +# ptab_base_url="https://api.uspto.gov", # Optional, uses default if not set +# ) +# client = PTABTrialsClient(config=config_obj) + +# Method 3: Initialize the client with environment variables (recommended for production) +# print("\nMethod 3: Initialize with environment variables") +# # Ensure USPTO_API_KEY is set in your environment +# try: +# config_from_env = USPTOConfig.from_env() +# client = PTABTrialsClient(config=config_from_env) +# except ValueError as e: +# print(f"Error initializing from environment: {e}") +# print("Please ensure USPTO_API_KEY environment variable is set.") + +print("\nBeginning PTAB Trials API requests with configured client:") + +# ============================================================================= +# 1. Search Trial Proceedings +# ============================================================================= + +print("\n" + "=" * 80) +print("1. Searching for IPR trial proceedings") +print("=" * 80) + +try: + # Search for IPR proceedings filed in 2023 + response = client.search_proceedings( + trial_type_code_q="IPR", + petition_filing_date_from_q="2023-01-01", + petition_filing_date_to_q="2023-12-31", + limit=5, + ) + + print(f"\nFound {response.count} IPR proceedings filed in 2023") + print(f"Displaying first {len(response.patent_trial_proceeding_data_bag)} results:") + + for proceeding in response.patent_trial_proceeding_data_bag: + print(f"\n Trial Number: {proceeding.trial_number}") + + if proceeding.trial_meta_data: + meta = proceeding.trial_meta_data + print(f" Trial Type: {meta.trial_type_code}") + print(f" Status: {meta.trial_status_category}") + print(f" Filing Date: {meta.petition_filing_date}") + + if proceeding.patent_owner_data: + print(f" Patent Owner: {proceeding.patent_owner_data.patent_owner_name}") + print(f" Patent Number: {proceeding.patent_owner_data.patent_number}") + + if proceeding.regular_petitioner_data: + print( + f" Petitioner: {proceeding.regular_petitioner_data.real_party_in_interest_name}" + ) + +except Exception as e: + print(f"Error searching proceedings: {e}") + +# ============================================================================= +# 2. Search Trial Documents +# ============================================================================= + +print("\n" + "=" * 80) +print("2. Searching for trial documents") +print("=" * 80) + +try: + # Search for documents in a specific trial + # Using the new convenience parameters for petitioner and patent owner + response = client.search_documents( + trial_number_q="IPR2023-00001", + document_category_q="Paper", + petitioner_real_party_in_interest_name_q="*", # Any petitioner + patent_owner_name_q="*", # Any patent owner + limit=5, + ) + + print(f"\nFound {response.count} documents") + print(f"Displaying first {len(response.patent_trial_document_data_bag)} results:") + + for item in response.patent_trial_document_data_bag: + print(f"\n Trial Number: {item.trial_number}") + + if item.document_data: + doc = item.document_data + print(f" Document Type: {doc.document_type_description_text}") + print(f" Filing Date: {doc.document_filing_date}") + print(f" Document Category: {doc.document_category}") + + if doc.download_uri: + print(f" Download URL: {doc.download_uri}") + +except Exception as e: + print(f"Error searching documents: {e}") + +# ============================================================================= +# 3. Search Trial Decisions with New Convenience Parameters +# ============================================================================= + +print("\n" + "=" * 80) +print("3. Searching for trial decisions with new parameters") +print("=" * 80) + +try: + # Using all the new convenience parameters + response = client.search_decisions( + trial_type_code_q="IPR", + decision_type_category_q="Final Written Decision", + patent_owner_name_q="*", + trial_status_category_q="Terminated", + decision_date_from_q="2023-01-01", + limit=5, + ) + + print(f"\nFound {response.count} Final Written Decisions in IPR proceedings") + print(f"Displaying first {len(response.patent_trial_document_data_bag)} results:") + + for item in response.patent_trial_document_data_bag: + print(f"\n Trial Number: {item.trial_number}") + + if item.trial_meta_data: + print(f" Trial Type: {item.trial_meta_data.trial_type_code}") + print(f" Status: {item.trial_meta_data.trial_status_category}") + + if item.decision_data: + decision = item.decision_data + print(f" Decision Type: {decision.decision_type_category}") + print(f" Decision Date: {decision.decision_issue_date}") + +except Exception as e: + print(f"Error searching decisions: {e}") + +# ============================================================================= +# 4. Pagination Example +# ============================================================================= + +print("\n" + "=" * 80) +print("4. Paginating through proceedings") +print("=" * 80) + +try: + print("\nIterating through first 10 IPR proceedings from 2024...") + count = 0 + for proceeding in client.paginate_proceedings( + trial_type_code_q="IPR", + petition_filing_date_from_q="2024-01-01", + limit=5, # Fetch 5 per page + ): + count += 1 + print(f"{count}. {proceeding.trial_number}") + + if count >= 10: # Stop after 10 results for this example + break + + print(f"\nDisplayed {count} proceedings using pagination") + +except Exception as e: + print(f"Error paginating proceedings: {e}") + +# ============================================================================= +# 5. Advanced Query with Additional Parameters +# ============================================================================= + +print("\n" + "=" * 80) +print("5. Advanced search with additional query parameters") +print("=" * 80) + +try: + # Search using additional_query_params for custom filters + response = client.search_proceedings( + trial_type_code_q="PGR", + trial_status_category_q="Instituted", + sort="petitionFilingDate desc", + fields="trialNumber,lastModifiedDateTime", + limit=3, + ) + + print(f"\nFound {response.count} Instituted PGR proceedings") + print(f"Displaying first {len(response.patent_trial_proceeding_data_bag)} results:") + + for proceeding in response.patent_trial_proceeding_data_bag: + print(f"\n Trial Number: {proceeding.trial_number}") + print(f" Last Modified: {proceeding.last_modified_date_time}") + +except Exception as e: + print(f"Error with advanced search: {e}") + +# ============================================================================= +# 6. Error Handling Example +# ============================================================================= + +print("\n" + "=" * 80) +print("6. Error handling demonstration") +print("=" * 80) + +try: + # Attempt a search that might fail (invalid date format) + print("\nAttempting search with potentially invalid parameters...") + response = client.search_proceedings( + trial_number_q="INVALID-TRIAL-NUMBER", + limit=1, + ) + + if response.count == 0: + print("No results found for the given search criteria") + else: + print(f"Found {response.count} results") + +except Exception as e: + print(f"Expected error occurred: {type(e).__name__}: {e}") + +print("\n" + "=" * 80) +print("PTAB Trials API example completed successfully!") +print("=" * 80) diff --git a/src/pyUSPTO/clients/ptab_trials.py b/src/pyUSPTO/clients/ptab_trials.py index d2b00a2..6b80229 100644 --- a/src/pyUSPTO/clients/ptab_trials.py +++ b/src/pyUSPTO/clients/ptab_trials.py @@ -6,14 +6,20 @@ documents, and decisions. """ -from typing import Any, Dict, Iterator, Optional +from typing import Any, Dict, Iterator, List, Optional, Union from pyUSPTO.clients.base import BaseUSPTOClient from pyUSPTO.config import USPTOConfig -from pyUSPTO.models.ptab import PTABTrialProceeding, PTABTrialProceedingResponse +from pyUSPTO.models.ptab import ( + PTABTrialDocumentResponse, + PTABTrialProceeding, + PTABTrialProceedingResponse, +) -class PTABTrialsClient(BaseUSPTOClient[PTABTrialProceedingResponse]): +class PTABTrialsClient( + BaseUSPTOClient[Union[PTABTrialProceedingResponse, PTABTrialDocumentResponse]] +): """Client for interacting with the USPTO PTAB Trials API. This client provides methods to search for trial proceedings, trial documents, @@ -24,9 +30,9 @@ class PTABTrialsClient(BaseUSPTOClient[PTABTrialProceedingResponse]): """ ENDPOINTS = { - "search_proceedings": "api/v1/ptab/trials/proceedings/search", - "search_documents": "api/v1/ptab/trials/documents/search", - "search_decisions": "api/v1/ptab/trials/decisions/search", + "search_proceedings": "api/v1/patent/trials/proceedings/search", + "search_documents": "api/v1/patent/trials/documents/search", + "search_decisions": "api/v1/patent/trials/decisions/search", } def __init__( @@ -51,6 +57,72 @@ def __init__( api_key=api_key_to_use, base_url=effective_base_url, config=self.config ) + def _perform_search( + self, + endpoint_key: str, + response_class: Any, + query: Optional[str], + query_parts: List[str], + post_body: Optional[Dict[str, Any]], + sort: Optional[str], + offset: Optional[int], + limit: Optional[int], + facets: Optional[str], + fields: Optional[str], + filters: Optional[str], + range_filters: Optional[str], + additional_params: Optional[Dict[str, Any]], + ) -> Union[PTABTrialProceedingResponse, PTABTrialDocumentResponse]: + """Internal helper to execute search requests (GET or POST).""" + endpoint = self.ENDPOINTS[endpoint_key] + + # Handle POST request + if post_body is not None: + result = self._make_request( + method="POST", + endpoint=endpoint, + json_data=post_body, + params=additional_params, + response_class=response_class, + ) + return result # type: ignore + + # Handle GET request + params: Dict[str, Any] = {} + final_q = query + + # Combine specific convenience query parts if no direct query is provided + if final_q is None and query_parts: + final_q = " AND ".join(query_parts) + + if final_q: + params["q"] = final_q + if sort: + params["sort"] = sort + if offset is not None: + params["offset"] = offset + if limit is not None: + params["limit"] = limit + if facets: + params["facets"] = facets + if fields: + params["fields"] = fields + if filters: + params["filters"] = filters + if range_filters: + params["rangeFilters"] = range_filters + + if additional_params: + params.update(additional_params) + + result = self._make_request( + method="GET", + endpoint=endpoint, + params=params, + response_class=response_class, + ) + return result # type: ignore + def search_proceedings( self, query: Optional[str] = None, @@ -65,7 +137,7 @@ def search_proceedings( # Convenience query parameters trial_number_q: Optional[str] = None, patent_owner_name_q: Optional[str] = None, - petitioner_party_name_q: Optional[str] = None, + petitioner_real_party_in_interest_name_q: Optional[str] = None, respondent_name_q: Optional[str] = None, trial_type_code_q: Optional[str] = None, trial_status_category_q: Optional[str] = None, @@ -92,7 +164,7 @@ def search_proceedings( post_body: Optional POST body for complex queries. trial_number_q: Filter by trial number (e.g., "IPR2023-00001"). patent_owner_name_q: Filter by patent owner name. - petitioner_party_name_q: Filter by petitioner party name. + petitioner_real_party_in_interest_name_q: Filter by petitioner real party in interest. respondent_name_q: Filter by respondent name. trial_type_code_q: Filter by trial type code (e.g., "IPR", "PGR", "CBM", "DER"). trial_status_category_q: Filter by trial status category. @@ -113,89 +185,53 @@ def search_proceedings( ... petition_filing_date_from_q="2023-01-01", ... limit=50 ... ) - - # Search with POST body - >>> response = client.search_proceedings( - ... post_body={"q": "trialStatusCategory:Terminated", "limit": 100} - ... ) """ - endpoint = self.ENDPOINTS["search_proceedings"] - - if post_body is not None: - # POST request path - result = self._make_request( - method="POST", - endpoint=endpoint, - json_data=post_body, - params=additional_query_params, - response_class=PTABTrialProceedingResponse, + q_parts = [] + if trial_number_q: + q_parts.append(f"trialNumber:{trial_number_q}") + if patent_owner_name_q: + q_parts.append(f"patentOwnerData.patentOwnerName:{patent_owner_name_q}") + if petitioner_real_party_in_interest_name_q: + q_parts.append( + f"regularPetitionerData.realPartyInInterestName:{petitioner_real_party_in_interest_name_q}" + ) + if respondent_name_q: + q_parts.append(f"respondentData.patentOwnerName:{respondent_name_q}") + if trial_type_code_q: + q_parts.append(f"trialTypeCode:{trial_type_code_q}") + if trial_status_category_q: + q_parts.append( + f"trialMetaData.trialStatusCategory:{trial_status_category_q}" ) - else: - # GET request path - params: Dict[str, Any] = {} - final_q = query - - # Build query from convenience parameters - if final_q is None: - q_parts = [] - if trial_number_q: - q_parts.append(f"trialNumber:{trial_number_q}") - if patent_owner_name_q: - q_parts.append(f"patentOwnerName:{patent_owner_name_q}") - if petitioner_party_name_q: - q_parts.append(f"petitionerPartyName:{petitioner_party_name_q}") - if respondent_name_q: - q_parts.append(f"respondentName:{respondent_name_q}") - if trial_type_code_q: - q_parts.append(f"trialTypeCode:{trial_type_code_q}") - if trial_status_category_q: - q_parts.append(f"trialStatusCategory:{trial_status_category_q}") - - # Handle petition filing date range - if petition_filing_date_from_q and petition_filing_date_to_q: - q_parts.append( - f"petitionFilingDate:[{petition_filing_date_from_q} TO {petition_filing_date_to_q}]" - ) - elif petition_filing_date_from_q: - q_parts.append( - f"petitionFilingDate:>={petition_filing_date_from_q}" - ) - elif petition_filing_date_to_q: - q_parts.append(f"petitionFilingDate:<={petition_filing_date_to_q}") - - if q_parts: - final_q = " AND ".join(q_parts) - - # Add parameters - if final_q is not None: - params["q"] = final_q - if sort is not None: - params["sort"] = sort - if offset is not None: - params["offset"] = offset - if limit is not None: - params["limit"] = limit - if facets is not None: - params["facets"] = facets - if fields is not None: - params["fields"] = fields - if filters is not None: - params["filters"] = filters - if range_filters is not None: - params["rangeFilters"] = range_filters - - if additional_query_params: - params.update(additional_query_params) - result = self._make_request( - method="GET", - endpoint=endpoint, - params=params, - response_class=PTABTrialProceedingResponse, + if petition_filing_date_from_q and petition_filing_date_to_q: + q_parts.append( + f"trialMetaData.petitionFilingDate:[{petition_filing_date_from_q} TO {petition_filing_date_to_q}]" + ) + elif petition_filing_date_from_q: + q_parts.append( + f"trialMetaData.petitionFilingDate:>={petition_filing_date_from_q}" + ) + elif petition_filing_date_to_q: + q_parts.append( + f"trialMetaData.petitionFilingDate:<={petition_filing_date_to_q}" ) - assert isinstance(result, PTABTrialProceedingResponse) - return result + return self._perform_search( + endpoint_key="search_proceedings", + response_class=PTABTrialProceedingResponse, + query=query, + query_parts=q_parts, + post_body=post_body, + sort=sort, + offset=offset, + limit=limit, + facets=facets, + fields=fields, + filters=filters, + range_filters=range_filters, + additional_params=additional_query_params, + ) # type: ignore def search_documents( self, @@ -214,8 +250,13 @@ def search_documents( document_type_name_q: Optional[str] = None, filing_date_from_q: Optional[str] = None, filing_date_to_q: Optional[str] = None, + petitioner_real_party_in_interest_name_q: Optional[str] = None, + inventor_name_q: Optional[str] = None, + real_party_in_interest_name_q: Optional[str] = None, + patent_number_q: Optional[str] = None, + patent_owner_name_q: Optional[str] = None, additional_query_params: Optional[Dict[str, Any]] = None, - ) -> PTABTrialProceedingResponse: + ) -> PTABTrialDocumentResponse: """Searches for PTAB trial documents. This method can perform either a GET request using query parameters or a POST @@ -234,14 +275,19 @@ def search_documents( range_filters: Range filter configuration string. post_body: Optional POST body for complex queries. trial_number_q: Filter by trial number. - document_category_q: Filter by document category. - document_type_name_q: Filter by document type name. + document_category_q: Filter by document category (e.g., "Petition"). + document_type_name_q: Filter by document type name (description). filing_date_from_q: Filter documents from this date (YYYY-MM-DD). filing_date_to_q: Filter documents to this date (YYYY-MM-DD). + petitioner_real_party_in_interest_name_q: Filter by petitioner real party in interest. + inventor_name_q: Filter by inventor name. + real_party_in_interest_name_q: Filter by real party in interest (generic). + patent_number_q: Filter by patent number. + patent_owner_name_q: Filter by patent owner name. additional_query_params: Additional custom query parameters. Returns: - PTABTrialProceedingResponse: Response containing matching trial documents. + PTABTrialDocumentResponse: Response containing matching trial documents. Examples: # Search with direct query @@ -253,82 +299,55 @@ def search_documents( ... filing_date_from_q="2023-01-01", ... limit=50 ... ) - - # Search with POST body - >>> response = client.search_documents( - ... post_body={"q": "documentTypeName:Decision", "limit": 100} - ... ) """ - endpoint = self.ENDPOINTS["search_documents"] - - if post_body is not None: - # POST request path - result = self._make_request( - method="POST", - endpoint=endpoint, - json_data=post_body, - params=additional_query_params, - response_class=PTABTrialProceedingResponse, + q_parts = [] + if trial_number_q: + q_parts.append(f"trialNumber:{trial_number_q}") + if document_category_q: + q_parts.append(f"documentData.documentCategory:{document_category_q}") + if document_type_name_q: + q_parts.append( + f"documentData.documentTypeDescriptionText:{document_type_name_q}" ) - else: - # GET request path - params: Dict[str, Any] = {} - final_q = query - - # TODO: Add convenience parameters for Petitioner, inventor, real party in interest, patent number, patent owner, - # Build query from convenience parameters - if final_q is None: - q_parts = [] - if trial_number_q: - q_parts.append(f"trialNumber:{trial_number_q}") - if document_category_q: - q_parts.append(f"documentCategory:{document_category_q}") - if document_type_name_q: - q_parts.append(f"documentTypeName:{document_type_name_q}") - - # Handle filing date range - if filing_date_from_q and filing_date_to_q: - q_parts.append( - f"filingDate:[{filing_date_from_q} TO {filing_date_to_q}]" - ) - elif filing_date_from_q: - q_parts.append(f"filingDate:>={filing_date_from_q}") - elif filing_date_to_q: - q_parts.append(f"filingDate:<={filing_date_to_q}") - - if q_parts: - final_q = " AND ".join(q_parts) - - # Add parameters - if final_q is not None: - params["q"] = final_q - if sort is not None: - params["sort"] = sort - if offset is not None: - params["offset"] = offset - if limit is not None: - params["limit"] = limit - if facets is not None: - params["facets"] = facets - if fields is not None: - params["fields"] = fields - if filters is not None: - params["filters"] = filters - if range_filters is not None: - params["rangeFilters"] = range_filters - - if additional_query_params: - params.update(additional_query_params) - - result = self._make_request( - method="GET", - endpoint=endpoint, - params=params, - response_class=PTABTrialProceedingResponse, + if petitioner_real_party_in_interest_name_q: + q_parts.append( + f"regularPetitionerData.realPartyInInterestName:{petitioner_real_party_in_interest_name_q}" ) - - assert isinstance(result, PTABTrialProceedingResponse) - return result + if inventor_name_q: + q_parts.append(f"patentOwnerData.inventorName:{inventor_name_q}") + if real_party_in_interest_name_q: + q_parts.append( + f"regularPetitionerData.realPartyInInterestName:{real_party_in_interest_name_q}" + ) + if patent_number_q: + q_parts.append(f"patentOwnerData.patentNumber:{patent_number_q}") + if patent_owner_name_q: + q_parts.append(f"patentOwnerData.patentOwnerName:{patent_owner_name_q}") + + if filing_date_from_q and filing_date_to_q: + q_parts.append( + f"documentData.documentFilingDate:[{filing_date_from_q} TO {filing_date_to_q}]" + ) + elif filing_date_from_q: + q_parts.append(f"documentData.documentFilingDate:>={filing_date_from_q}") + elif filing_date_to_q: + q_parts.append(f"documentData.documentFilingDate:<={filing_date_to_q}") + + return self._perform_search( + endpoint_key="search_documents", + response_class=PTABTrialDocumentResponse, + query=query, + query_parts=q_parts, + post_body=post_body, + sort=sort, + offset=offset, + limit=limit, + facets=facets, + fields=fields, + filters=filters, + range_filters=range_filters, + additional_params=additional_query_params, + ) # type: ignore def search_decisions( self, @@ -342,13 +361,19 @@ def search_decisions( range_filters: Optional[str] = None, post_body: Optional[Dict[str, Any]] = None, # Convenience query parameters - # TODO: parameter for trialTypeCode, patent number, application number, patent owner, trial status, real party in interest, document categroy. trial_number_q: Optional[str] = None, decision_type_category_q: Optional[str] = None, decision_date_from_q: Optional[str] = None, decision_date_to_q: Optional[str] = None, + trial_type_code_q: Optional[str] = None, + patent_number_q: Optional[str] = None, + application_number_q: Optional[str] = None, + patent_owner_name_q: Optional[str] = None, + trial_status_category_q: Optional[str] = None, + real_party_in_interest_name_q: Optional[str] = None, + document_category_q: Optional[str] = None, additional_query_params: Optional[Dict[str, Any]] = None, - ) -> PTABTrialProceedingResponse: + ) -> PTABTrialDocumentResponse: """Searches for PTAB trial decisions. This method can perform either a GET request using query parameters or a POST @@ -370,10 +395,17 @@ def search_decisions( decision_type_category_q: Filter by decision type category. decision_date_from_q: Filter decisions from this date (YYYY-MM-DD). decision_date_to_q: Filter decisions to this date (YYYY-MM-DD). + trial_type_code_q: Filter by trial type code (e.g., "IPR", "PGR", "CBM", "DER"). + patent_number_q: Filter by patent number. + application_number_q: Filter by application number. + patent_owner_name_q: Filter by patent owner name. + trial_status_category_q: Filter by trial status category. + real_party_in_interest_name_q: Filter by real party in interest name. + document_category_q: Filter by document category. additional_query_params: Additional custom query parameters. Returns: - PTABTrialProceedingResponse: Response containing matching trial decisions. + PTABTrialDocumentResponse: Response containing matching trial decisions. Examples: # Search with direct query @@ -385,116 +417,62 @@ def search_decisions( ... decision_date_from_q="2023-01-01", ... limit=50 ... ) - - # Search with POST body - >>> response = client.search_decisions( - ... post_body={"q": "decisionTypeCategory:Institution Decision", "limit": 100} - ... ) """ - endpoint = self.ENDPOINTS["search_decisions"] - - if post_body is not None: - # POST request path - result = self._make_request( - method="POST", - endpoint=endpoint, - json_data=post_body, - params=additional_query_params, - response_class=PTABTrialProceedingResponse, + q_parts = [] + if trial_number_q: + q_parts.append(f"trialNumber:{trial_number_q}") + if decision_type_category_q: + q_parts.append( + f"decisionData.decisionTypeCategory:{decision_type_category_q}" ) - else: - # GET request path - params: Dict[str, Any] = {} - final_q = query - - # Build query from convenience parameters - if final_q is None: - q_parts = [] - if trial_number_q: - q_parts.append(f"trialNumber:{trial_number_q}") - if decision_type_category_q: - q_parts.append(f"decisionTypeCategory:{decision_type_category_q}") - - # Handle decision date range - if decision_date_from_q and decision_date_to_q: - q_parts.append( - f"decisionDate:[{decision_date_from_q} TO {decision_date_to_q}]" - ) - elif decision_date_from_q: - q_parts.append(f"decisionDate:>={decision_date_from_q}") - elif decision_date_to_q: - q_parts.append(f"decisionDate:<={decision_date_to_q}") - - if q_parts: - final_q = " AND ".join(q_parts) - - # Add parameters - if final_q is not None: - params["q"] = final_q - if sort is not None: - params["sort"] = sort - if offset is not None: - params["offset"] = offset - if limit is not None: - params["limit"] = limit - if facets is not None: - params["facets"] = facets - if fields is not None: - params["fields"] = fields - if filters is not None: - params["filters"] = filters - if range_filters is not None: - params["rangeFilters"] = range_filters - - if additional_query_params: - params.update(additional_query_params) - - result = self._make_request( - method="GET", - endpoint=endpoint, - params=params, - response_class=PTABTrialProceedingResponse, + if trial_type_code_q: + q_parts.append(f"trialTypeCode:{trial_type_code_q}") + if patent_number_q: + q_parts.append(f"patentOwnerData.patentNumber:{patent_number_q}") + if application_number_q: + q_parts.append( + f"patentOwnerData.applicationNumberText:{application_number_q}" + ) + if patent_owner_name_q: + q_parts.append(f"patentOwnerData.patentOwnerName:{patent_owner_name_q}") + if trial_status_category_q: + q_parts.append( + f"trialMetaData.trialStatusCategory:{trial_status_category_q}" ) + if real_party_in_interest_name_q: + q_parts.append( + f"regularPetitionerData.realPartyInInterestName:{real_party_in_interest_name_q}" + ) + if document_category_q: + q_parts.append(f"documentData.documentCategory:{document_category_q}") - assert isinstance(result, PTABTrialProceedingResponse) - return result + if decision_date_from_q and decision_date_to_q: + q_parts.append( + f"decisionData.decisionIssueDate:[{decision_date_from_q} TO {decision_date_to_q}]" + ) + elif decision_date_from_q: + q_parts.append(f"decisionData.decisionIssueDate:>={decision_date_from_q}") + elif decision_date_to_q: + q_parts.append(f"decisionData.decisionIssueDate:<={decision_date_to_q}") + + return self._perform_search( + endpoint_key="search_decisions", + response_class=PTABTrialDocumentResponse, + query=query, + query_parts=q_parts, + post_body=post_body, + sort=sort, + offset=offset, + limit=limit, + facets=facets, + fields=fields, + filters=filters, + range_filters=range_filters, + additional_params=additional_query_params, + ) # type: ignore def paginate_proceedings(self, **kwargs: Any) -> Iterator[PTABTrialProceeding]: - """Provides an iterator to paginate through trial proceeding search results. - - This method simplifies fetching all trial proceedings matching a search query - by automatically handling pagination. It internally calls the search_proceedings - method for GET requests, batching results and yielding them one by one. - - All keyword arguments are passed directly to search_proceedings to define the - search criteria. The offset and limit parameters are managed by the pagination - logic; setting them directly in kwargs might lead to unexpected behavior. - - Args: - **kwargs: Keyword arguments passed to search_proceedings for constructing - the search query. Do not include post_body. - - Returns: - Iterator[PTABTrialProceeding]: An iterator yielding PTABTrialProceeding objects, - allowing iteration over all matching proceedings across multiple pages of results. - - Raises: - ValueError: If post_body is included in kwargs, as this method only - supports GET request parameters for pagination. - - Examples: - # Paginate through all IPR proceedings - >>> for proceeding in client.paginate_proceedings(trial_type_code_q="IPR"): - ... print(f"{proceeding.trial_meta_data.trial_number}: " - ... f"{proceeding.trial_meta_data.trial_status_category}") - - # Paginate with date range - >>> for proceeding in client.paginate_proceedings( - ... petition_filing_date_from_q="2023-01-01", - ... petition_filing_date_to_q="2023-12-31" - ... ): - ... process_proceeding(proceeding) - """ + """Provides an iterator to paginate through trial proceeding search results.""" if "post_body" in kwargs: raise ValueError( "paginate_proceedings uses GET requests and does not support 'post_body'. " diff --git a/src/pyUSPTO/models/ptab.py b/src/pyUSPTO/models/ptab.py index 7ed77db..78ca4f6 100644 --- a/src/pyUSPTO/models/ptab.py +++ b/src/pyUSPTO/models/ptab.py @@ -4,6 +4,7 @@ This module provides data models, primarily using frozen dataclasses, for representing responses from the USPTO PTAB APIs. These models cover: - Patent trial proceedings (IPR, PGR, CBM, DER) +- Trial documents and decisions - Appeal decisions - Interference decisions """ @@ -32,6 +33,7 @@ class TrialMetaData: Attributes: petition_filing_date: Date the petition was filed. + accorded_filing_date: The filing date accorded to the petition. trial_last_modified_date_time: Last modification timestamp. trial_last_modified_date: Last modification date. trial_status_category: Status of the trial (e.g., "Institution Denied", "Instituted"). @@ -43,6 +45,7 @@ class TrialMetaData: """ petition_filing_date: Optional[date] = None + accorded_filing_date: Optional[date] = None trial_last_modified_date_time: Optional[datetime] = None trial_last_modified_date: Optional[date] = None trial_status_category: Optional[str] = None @@ -67,6 +70,7 @@ def from_dict( """ return cls( petition_filing_date=parse_to_date(data.get("petitionFilingDate")), + accorded_filing_date=parse_to_date(data.get("accordedFilingDate")), trial_last_modified_date_time=parse_to_datetime_utc( data.get("trialLastModifiedDateTime") ), @@ -389,6 +393,179 @@ def from_dict( ) +@dataclass(frozen=True) +class TrialDocumentData: + """Metadata for a document in a PTAB trial. + + Attributes: + document_category: Category of the document. + document_filing_date: Filing date. + document_identifier: Unique ID. + document_name: Filename. + document_number: Document number in the proceeding. + document_size_quantity: Size in bytes. + document_ocr_text: OCR text content. + document_title_text: Title of the document. + document_type_description_text: Description of document type. + download_uri: URL to download the file. + filing_party_category: Who filed (e.g., "Petitioner"). + mime_type_identifier: MIME type (e.g., "application/pdf"). + document_status: Public status. + """ + + document_category: Optional[str] = None + document_filing_date: Optional[date] = None + document_identifier: Optional[str] = None + document_name: Optional[str] = None + document_number: Optional[str] = None + document_size_quantity: Optional[int] = None + document_ocr_text: Optional[str] = None + document_title_text: Optional[str] = None + document_type_description_text: Optional[str] = None + download_uri: Optional[str] = None + filing_party_category: Optional[str] = None + mime_type_identifier: Optional[str] = None + document_status: Optional[str] = None + + @classmethod + def from_dict(cls, data: Dict[str, Any]) -> "TrialDocumentData": + return cls( + document_category=data.get("documentCategory"), + document_filing_date=parse_to_date(data.get("documentFilingDate")), + document_identifier=data.get("documentIdentifier"), + document_name=data.get("documentName"), + document_number=data.get("documentNumber"), + document_size_quantity=data.get("documentSizeQuantity"), + document_ocr_text=data.get("documentOCRText"), + document_title_text=data.get("documentTitleText"), + document_type_description_text=data.get("documentTypeDescriptionText"), + download_uri=data.get("downloadURI"), + filing_party_category=data.get("filingPartyCategory"), + mime_type_identifier=data.get("mimeTypeIdentifier"), + document_status=data.get("documentStatus"), + ) + + +@dataclass(frozen=True) +class TrialDecisionData: + """Metadata for a decision in a PTAB trial. + + Attributes: + statute_and_rule_bag: Statutes/rules cited (string or list). + decision_issue_date: Date issued. + decision_type_category: Type of decision (e.g. "Final Written Decision"). + issue_type_bag: Issues addressed (string or list). + trial_outcome_category: Outcome (e.g., "Denied"). + """ + + statute_and_rule_bag: Optional[str] = None + decision_issue_date: Optional[date] = None + decision_type_category: Optional[str] = None + issue_type_bag: Optional[str] = None + trial_outcome_category: Optional[str] = None + + @classmethod + def from_dict(cls, data: Dict[str, Any]) -> "TrialDecisionData": + return cls( + statute_and_rule_bag=data.get("statuteAndRuleBag"), + decision_issue_date=parse_to_date(data.get("decisionIssueDate")), + decision_type_category=data.get("decisionTypeCategory"), + issue_type_bag=data.get("issueTypeBag"), + trial_outcome_category=data.get("trialOutcomeCategory"), + ) + + +@dataclass(frozen=True) +class PTABTrialDocument: + """Record representing a Trial Document or Decision from the search APIs. + + This differs from PTABTrialProceeding by including documentData/decisionData + and often omitting some proceeding-level details or structuring them differently. + """ + + trial_document_category: Optional[str] = None + last_modified_date_time: Optional[datetime] = None + trial_number: Optional[str] = None + trial_type_code: Optional[str] = None + trial_meta_data: Optional[TrialMetaData] = None + patent_owner_data: Optional[PatentOwnerData] = None + regular_petitioner_data: Optional[RegularPetitionerData] = None + respondent_data: Optional[RespondentData] = None + derivation_petitioner_data: Optional[DerivationPetitionerData] = None + document_data: Optional[TrialDocumentData] = None + decision_data: Optional[TrialDecisionData] = None + raw_data: Optional[Dict[str, Any]] = None + + @classmethod + def from_dict( + cls, data: Dict[str, Any], include_raw_data: bool = False + ) -> "PTABTrialDocument": + trial_meta = data.get("trialMetaData") + patent_owner = data.get("patentOwnerData") + reg_petitioner = data.get("regularPetitionerData") + respondent = data.get("respondentData") + deriv_petitioner = data.get("derivationPetitionerData") + doc_data = data.get("documentData") + dec_data = data.get("decisionData") + + return cls( + trial_document_category=data.get("trialDocumentCategory"), + last_modified_date_time=parse_to_datetime_utc( + data.get("lastModifiedDateTime") + ), + trial_number=data.get("trialNumber"), + trial_type_code=data.get("trialTypeCode"), + trial_meta_data=( + TrialMetaData.from_dict(trial_meta) if trial_meta else None + ), + patent_owner_data=( + PatentOwnerData.from_dict(patent_owner) if patent_owner else None + ), + regular_petitioner_data=( + RegularPetitionerData.from_dict(reg_petitioner) + if reg_petitioner + else None + ), + respondent_data=( + RespondentData.from_dict(respondent) if respondent else None + ), + derivation_petitioner_data=( + DerivationPetitionerData.from_dict(deriv_petitioner) + if deriv_petitioner + else None + ), + document_data=(TrialDocumentData.from_dict(doc_data) if doc_data else None), + decision_data=(TrialDecisionData.from_dict(dec_data) if dec_data else None), + raw_data=data if include_raw_data else None, + ) + + +@dataclass(frozen=True) +class PTABTrialDocumentResponse: + """Response container for PTAB trial documents/decisions search.""" + + count: Optional[int] = None + patent_trial_document_data_bag: List[PTABTrialDocument] = field( + default_factory=list + ) + raw_data: Optional[Dict[str, Any]] = None + + @classmethod + def from_dict( + cls, data: Dict[str, Any], include_raw_data: bool = False + ) -> "PTABTrialDocumentResponse": + docs_data = data.get("patentTrialDocumentDataBag", []) + docs = [ + PTABTrialDocument.from_dict(item, include_raw_data=include_raw_data) + for item in docs_data + ] + return cls( + count=data.get("count"), + patent_trial_document_data_bag=docs, + raw_data=data if include_raw_data else None, + ) + + # ============================================================================ # APPEAL DECISIONS MODELS # ============================================================================ @@ -473,16 +650,20 @@ def from_dict( Returns: AppellantData: An instance of AppellantData. """ + # Handle aliases seen in API samples + real_party = data.get("realPartyInInterestName") or data.get("realPartyName") + tech_center = data.get("technologyCenterNumber") or data.get("techCenterNumber") + return cls( application_number_text=data.get("applicationNumberText"), counsel_name=data.get("counselName"), group_art_unit_number=data.get("groupArtUnitNumber"), inventor_name=data.get("inventorName"), - real_party_in_interest_name=data.get("realPartyInInterestName"), + real_party_in_interest_name=real_party, patent_owner_name=data.get("patentOwnerName"), publication_date=parse_to_date(data.get("publicationDate")), publication_number=data.get("publicationNumber"), - technology_center_number=data.get("technologyCenterNumber"), + technology_center_number=tech_center, ) @@ -549,14 +730,20 @@ def from_dict( Returns: AppealDocumentData: An instance of AppealDocumentData. """ + # Handle aliases + download_uri = data.get("fileDownloadURI") or data.get("downloadURI") + doc_type = data.get("documentTypeDescriptionText") or data.get( + "documentTypeCategory" + ) + return cls( document_filing_date=parse_to_date(data.get("documentFilingDate")), document_identifier=data.get("documentIdentifier"), document_name=data.get("documentName"), document_size_quantity=data.get("documentSizeQuantity"), document_ocr_text=data.get("documentOCRText"), - document_type_description_text=data.get("documentTypeDescriptionText"), - file_download_uri=data.get("fileDownloadURI"), + document_type_description_text=doc_type, + file_download_uri=download_uri, ) @@ -645,7 +832,8 @@ def from_dict( AppealMetaData.from_dict(appeal_meta) if appeal_meta else None ) - appellant = data.get("appellantData") + # Handle potential typo 'appelantData' vs 'appellantData' + appellant = data.get("appellantData") or data.get("appelantData") appellant_data = AppellantData.from_dict(appellant) if appellant else None requestor = data.get("requestorData") @@ -911,6 +1099,8 @@ class InterferenceDocumentData: decision_issue_date: Date the decision was issued. decision_type_category: Type of decision. file_download_uri: URI to download the document. + statute_and_rule_bag: Statutes and rules cited (list or string). + issue_type_bag: Issues addressed (list or string). """ document_identifier: Optional[str] = None @@ -922,6 +1112,8 @@ class InterferenceDocumentData: decision_issue_date: Optional[date] = None decision_type_category: Optional[str] = None file_download_uri: Optional[str] = None + statute_and_rule_bag: Optional[List[str]] = None + issue_type_bag: Optional[List[str]] = None @classmethod def from_dict( @@ -936,6 +1128,9 @@ def from_dict( Returns: InterferenceDocumentData: An instance of InterferenceDocumentData. """ + # Handle aliases + download_uri = data.get("fileDownloadURI") or data.get("downloadURI") + return cls( document_identifier=data.get("documentIdentifier"), document_name=data.get("documentName"), @@ -945,7 +1140,9 @@ def from_dict( interference_outcome_category=data.get("interferenceOutcomeCategory"), decision_issue_date=parse_to_date(data.get("decisionIssueDate")), decision_type_category=data.get("decisionTypeCategory"), - file_download_uri=data.get("fileDownloadURI"), + file_download_uri=download_uri, + statute_and_rule_bag=data.get("statuteAndRuleBag"), + issue_type_bag=data.get("issueTypeBag"), ) @@ -1011,7 +1208,8 @@ def from_dict( AdditionalPartyData.from_dict(item) for item in additional_parties_data ] - document = data.get("documentData") + # Handle alias: documentData vs decisionDocumentData + document = data.get("documentData") or data.get("decisionDocumentData") document_data = ( InterferenceDocumentData.from_dict(document) if document else None ) @@ -1091,6 +1289,11 @@ def from_dict( "DerivationPetitionerData", "PTABTrialProceeding", "PTABTrialProceedingResponse", + # Trial Documents/Decisions Models + "TrialDocumentData", + "TrialDecisionData", + "PTABTrialDocument", + "PTABTrialDocumentResponse", # Appeal Decisions Models "AppealMetaData", "AppellantData", diff --git a/tests/clients/test_ptab_trials_client.py b/tests/clients/test_ptab_trials_client.py index f879052..e0465f8 100644 --- a/tests/clients/test_ptab_trials_client.py +++ b/tests/clients/test_ptab_trials_client.py @@ -381,6 +381,11 @@ def test_search_documents_with_all_convenience_params( document_type_name_q="Patent Owner Response", filing_date_from_q="2023-01-01", filing_date_to_q="2023-12-31", + petitioner_party_name_q="Test Petitioner", + inventor_name_q="Jane Inventor", + real_party_in_interest_name_q="Real Party LLC", + patent_number_q="US1234567", + patent_owner_name_q="Test Owner", limit=50, ) @@ -391,6 +396,11 @@ def test_search_documents_with_all_convenience_params( assert "trialNumber:IPR2023-00001" in params["q"] assert "documentCategory:Paper" in params["q"] assert "documentTypeName:Patent Owner Response" in params["q"] + assert "petitionerPartyName:Test Petitioner" in params["q"] + assert "inventorName:Jane Inventor" in params["q"] + assert "realPartyInInterestName:Real Party LLC" in params["q"] + assert "patentNumber:US1234567" in params["q"] + assert "patentOwnerName:Test Owner" in params["q"] assert params["limit"] == 50 def test_search_documents_with_date_from_only( @@ -572,9 +582,15 @@ def test_search_decisions_with_all_convenience_params( result = mock_ptab_trials_client.search_decisions( trial_number_q="IPR2023-00001", decision_type_category_q="Final Written Decision", - # document_category_q="Decision", decision_date_from_q="2023-01-01", decision_date_to_q="2023-12-31", + trial_type_code_q="IPR", + patent_number_q="US1234567", + application_number_q="15/123456", + patent_owner_name_q="Test Owner", + trial_status_category_q="Instituted", + real_party_in_interest_name_q="Real Party LLC", + document_category_q="Decision", limit=50, ) @@ -584,7 +600,13 @@ def test_search_decisions_with_all_convenience_params( params = call_args[1]["params"] assert "trialNumber:IPR2023-00001" in params["q"] assert "decisionTypeCategory:Final Written Decision" in params["q"] - # assert "documentCategory:Decision" in params["q"] + assert "trialTypeCode:IPR" in params["q"] + assert "patentNumber:US1234567" in params["q"] + assert "applicationNumber:15/123456" in params["q"] + assert "patentOwnerName:Test Owner" in params["q"] + assert "trialStatusCategory:Instituted" in params["q"] + assert "realPartyInInterestName:Real Party LLC" in params["q"] + assert "documentCategory:Decision" in params["q"] assert "decisionDate:[2023-01-01 TO 2023-12-31]" in params["q"] assert params["limit"] == 50 From 6baa137a12c96f4cd5677d41aee45d083b53ef11 Mon Sep 17 00:00:00 2001 From: Andrew Date: Tue, 2 Dec 2025 14:33:34 -0600 Subject: [PATCH 05/17] refactor based on actual API response isntead of documentation. --- pyproject.toml | 2 +- src/pyUSPTO/models/ptab.py | 427 +++------- tests/clients/test_ptab_trials_client.py | 175 ++-- .../test_patent_data_integration.py | 2 +- .../test_ptab_appeals_integration.py | 254 ++++++ .../test_ptab_interferences_integration.py | 298 +++++++ .../test_ptab_trials_integration.py | 305 +++++++ tests/models/test_ptab_models.py | 796 +++++++++++++++++- 8 files changed, 1854 insertions(+), 405 deletions(-) create mode 100644 tests/integration/test_ptab_appeals_integration.py create mode 100644 tests/integration/test_ptab_interferences_integration.py create mode 100644 tests/integration/test_ptab_trials_integration.py diff --git a/pyproject.toml b/pyproject.toml index 514f887..721b6ca 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -83,7 +83,7 @@ exclude_lines = [ [tool.mypy] mypy_path = "src" -python_version = "3.10" +python_version = "3.11" warn_return_any = true warn_unused_configs = true disallow_untyped_defs = true diff --git a/src/pyUSPTO/models/ptab.py b/src/pyUSPTO/models/ptab.py index 78ca4f6..3fb0c3d 100644 --- a/src/pyUSPTO/models/ptab.py +++ b/src/pyUSPTO/models/ptab.py @@ -12,7 +12,7 @@ import json from dataclasses import dataclass, field from datetime import date, datetime -from typing import Any, Dict, List, Optional +from typing import Any, Dict, List, Optional, Self # Import parsing utilities from models utils module from pyUSPTO.models.utils import ( @@ -22,6 +22,63 @@ serialize_datetime_as_iso, ) + +@dataclass(frozen=True) +class PartyData: + """Base class for all party data models across PTAB endpoints. + + Attributes: + application_number_text: Application number. + counsel_name: Name of counsel. + grant_date: Patent grant date. + group_art_unit_number: Art unit number. + inventor_name: Name of inventor. + patent_number: Patent number. + technology_center_number: Technology center number. + real_party_in_interest_name: Real party in interest name. + patent_owner_name: Patent owner name. + publication_date: Publication date (if applicable). + publication_number: Publication number (if applicable). + """ + + application_number_text: Optional[str] = None + counsel_name: Optional[str] = None + grant_date: Optional[date] = None + group_art_unit_number: Optional[str] = None + inventor_name: Optional[str] = None + real_party_in_interest_name: Optional[str] = None + patent_number: Optional[str] = None + patent_owner_name: Optional[str] = None + technology_center_number: Optional[str] = None + publication_date: Optional[date] = None + publication_number: Optional[str] = None + + @classmethod + def from_dict(cls, data: Dict[str, Any], include_raw_data: bool = False) -> Self: + """Creates a PartyData instance from a dictionary. + + Args: + data: Dictionary containing party data from API response. + include_raw_data: Ignored for this model. + + Returns: + PartyData: A populated PartyData instance. + """ + return cls( + application_number_text=data.get("applicationNumberText"), + counsel_name=data.get("counselName"), + grant_date=parse_to_date(data.get("grantDate")), + group_art_unit_number=data.get("groupArtUnitNumber"), + inventor_name=data.get("inventorName"), + real_party_in_interest_name=data.get("realPartyInInterestName"), + patent_number=data.get("patentNumber"), + patent_owner_name=data.get("patentOwnerName"), + technology_center_number=data.get("technologyCenterNumber"), + publication_date=parse_to_date(data.get("publicationDate")), + publication_number=data.get("publicationNumber"), + ) + + # ============================================================================ # TRIAL PROCEEDINGS MODELS # ============================================================================ @@ -68,6 +125,8 @@ def from_dict( Returns: TrialMetaData: An instance of TrialMetaData. """ + # Handle aliases + file_download_uri = data.get("fileDownloadURI") or data.get("downloadURI") return cls( petition_filing_date=parse_to_date(data.get("petitionFilingDate")), accorded_filing_date=parse_to_date(data.get("accordedFilingDate")), @@ -77,7 +136,7 @@ def from_dict( trial_last_modified_date=parse_to_date(data.get("trialLastModifiedDate")), trial_status_category=data.get("trialStatusCategory"), trial_type_code=data.get("trialTypeCode"), - file_download_uri=data.get("fileDownloadURI"), + file_download_uri=file_download_uri, termination_date=parse_to_date(data.get("terminationDate")), latest_decision_date=parse_to_date(data.get("latestDecisionDate")), institution_decision_date=parse_to_date( @@ -87,55 +146,10 @@ def from_dict( @dataclass(frozen=True) -class PatentOwnerData: - """Patent owner/respondent information. - - Attributes: - application_number_text: Application number. - counsel_name: Name of counsel. - grant_date: Patent grant date. - group_art_unit_number: Art unit number. - inventor_name: Name of inventor. - patent_number: Patent number. - technology_center_number: Technology center number. - real_party_in_interest_name: Real party in interest name. - patent_owner_name: Patent owner name. - """ - - application_number_text: Optional[str] = None - counsel_name: Optional[str] = None - grant_date: Optional[date] = None - group_art_unit_number: Optional[str] = None - inventor_name: Optional[str] = None - patent_number: Optional[str] = None - technology_center_number: Optional[str] = None - real_party_in_interest_name: Optional[str] = None - patent_owner_name: Optional[str] = None - - @classmethod - def from_dict( - cls, data: Dict[str, Any], include_raw_data: bool = False - ) -> "PatentOwnerData": - """Creates a PatentOwnerData instance from a dictionary. - - Args: - data: Dictionary containing patent owner data from API response. - include_raw_data: Ignored for this model. +class PatentOwnerData(PartyData): + """Party data for a patent owner.""" - Returns: - PatentOwnerData: An instance of PatentOwnerData. - """ - return cls( - application_number_text=data.get("applicationNumberText"), - counsel_name=data.get("counselName"), - grant_date=parse_to_date(data.get("grantDate")), - group_art_unit_number=data.get("groupArtUnitNumber"), - inventor_name=data.get("inventorName"), - patent_number=data.get("patentNumber"), - technology_center_number=data.get("technologyCenterNumber"), - real_party_in_interest_name=data.get("realPartyInInterestName"), - patent_owner_name=data.get("patentOwnerName"), - ) + pass @dataclass(frozen=True) @@ -170,104 +184,17 @@ def from_dict( @dataclass(frozen=True) -class RespondentData: - """Respondent information (same structure as PatentOwnerData). +class RespondentData(PartyData): + """Respondent party data.""" - Attributes: - application_number_text: Application number. - counsel_name: Name of counsel. - grant_date: Patent grant date. - group_art_unit_number: Art unit number. - inventor_name: Name of inventor. - patent_number: Patent number. - technology_center_number: Technology center number. - real_party_in_interest_name: Real party in interest name. - patent_owner_name: Patent owner name. - """ - - application_number_text: Optional[str] = None - counsel_name: Optional[str] = None - grant_date: Optional[date] = None - group_art_unit_number: Optional[str] = None - inventor_name: Optional[str] = None - patent_number: Optional[str] = None - technology_center_number: Optional[str] = None - real_party_in_interest_name: Optional[str] = None - patent_owner_name: Optional[str] = None - - @classmethod - def from_dict( - cls, data: Dict[str, Any], include_raw_data: bool = False - ) -> "RespondentData": - """Creates a RespondentData instance from a dictionary. - - Args: - data: Dictionary containing respondent data from API response. - include_raw_data: Ignored for this model. - - Returns: - RespondentData: An instance of RespondentData. - """ - return cls( - application_number_text=data.get("applicationNumberText"), - counsel_name=data.get("counselName"), - grant_date=parse_to_date(data.get("grantDate")), - group_art_unit_number=data.get("groupArtUnitNumber"), - inventor_name=data.get("inventorName"), - patent_number=data.get("patentNumber"), - technology_center_number=data.get("technologyCenterNumber"), - real_party_in_interest_name=data.get("realPartyInInterestName"), - patent_owner_name=data.get("patentOwnerName"), - ) + pass @dataclass(frozen=True) -class DerivationPetitionerData: - """Derivation petitioner information. - - Attributes: - counsel_name: Name of counsel. - grant_date: Patent grant date. - group_art_unit_number: Art unit number. - inventor_name: Name of inventor. - patent_number: Patent number. - technology_center_number: Technology center number. - real_party_in_interest_name: Real party in interest name. - patent_owner_name: Patent owner name. - """ - - counsel_name: Optional[str] = None - grant_date: Optional[date] = None - group_art_unit_number: Optional[str] = None - inventor_name: Optional[str] = None - patent_number: Optional[str] = None - technology_center_number: Optional[str] = None - real_party_in_interest_name: Optional[str] = None - patent_owner_name: Optional[str] = None +class DerivationPetitionerData(PartyData): + """Derivation petitioner data.""" - @classmethod - def from_dict( - cls, data: Dict[str, Any], include_raw_data: bool = False - ) -> "DerivationPetitionerData": - """Creates a DerivationPetitionerData instance from a dictionary. - - Args: - data: Dictionary containing derivation petitioner data from API response. - include_raw_data: Ignored for this model. - - Returns: - DerivationPetitionerData: An instance of DerivationPetitionerData. - """ - return cls( - counsel_name=data.get("counselName"), - grant_date=parse_to_date(data.get("grantDate")), - group_art_unit_number=data.get("groupArtUnitNumber"), - inventor_name=data.get("inventorName"), - patent_number=data.get("patentNumber"), - technology_center_number=data.get("technologyCenterNumber"), - real_party_in_interest_name=data.get("realPartyInInterestName"), - patent_owner_name=data.get("patentOwnerName"), - ) + pass @dataclass(frozen=True) @@ -407,7 +334,7 @@ class TrialDocumentData: document_ocr_text: OCR text content. document_title_text: Title of the document. document_type_description_text: Description of document type. - download_uri: URL to download the file. + file_download_uri: URL to download the file. filing_party_category: Who filed (e.g., "Petitioner"). mime_type_identifier: MIME type (e.g., "application/pdf"). document_status: Public status. @@ -422,13 +349,15 @@ class TrialDocumentData: document_ocr_text: Optional[str] = None document_title_text: Optional[str] = None document_type_description_text: Optional[str] = None - download_uri: Optional[str] = None + file_download_uri: Optional[str] = None filing_party_category: Optional[str] = None mime_type_identifier: Optional[str] = None document_status: Optional[str] = None @classmethod def from_dict(cls, data: Dict[str, Any]) -> "TrialDocumentData": + # Handle aliases + file_download_uri = data.get("fileDownloadURI") or data.get("downloadURI") return cls( document_category=data.get("documentCategory"), document_filing_date=parse_to_date(data.get("documentFilingDate")), @@ -439,7 +368,7 @@ def from_dict(cls, data: Dict[str, Any]) -> "TrialDocumentData": document_ocr_text=data.get("documentOCRText"), document_title_text=data.get("documentTitleText"), document_type_description_text=data.get("documentTypeDescriptionText"), - download_uri=data.get("downloadURI"), + file_download_uri=file_download_uri, filing_party_category=data.get("filingPartyCategory"), mime_type_identifier=data.get("mimeTypeIdentifier"), document_status=data.get("documentStatus"), @@ -451,26 +380,26 @@ class TrialDecisionData: """Metadata for a decision in a PTAB trial. Attributes: - statute_and_rule_bag: Statutes/rules cited (string or list). + statute_and_rule_bag: List of applicable statutes and rules. decision_issue_date: Date issued. decision_type_category: Type of decision (e.g. "Final Written Decision"). - issue_type_bag: Issues addressed (string or list). + issue_type_bag: List of issues addressed. trial_outcome_category: Outcome (e.g., "Denied"). """ - statute_and_rule_bag: Optional[str] = None + statute_and_rule_bag: List[str] = field(default_factory=list) decision_issue_date: Optional[date] = None decision_type_category: Optional[str] = None - issue_type_bag: Optional[str] = None + issue_type_bag: List[str] = field(default_factory=list) trial_outcome_category: Optional[str] = None @classmethod def from_dict(cls, data: Dict[str, Any]) -> "TrialDecisionData": return cls( - statute_and_rule_bag=data.get("statuteAndRuleBag"), + statute_and_rule_bag=data.get("statuteAndRuleBag", []), decision_issue_date=parse_to_date(data.get("decisionIssueDate")), decision_type_category=data.get("decisionTypeCategory"), - issue_type_bag=data.get("issueTypeBag"), + issue_type_bag=data.get("issueTypeBag", []), trial_outcome_category=data.get("trialOutcomeCategory"), ) @@ -585,6 +514,7 @@ class AppealMetaData: appeal_filing_date: Optional[date] = None appeal_last_modified_date: Optional[date] = None + appeal_last_modified_date_time: Optional[date] = None application_type_category: Optional[str] = None docket_notice_mailed_date: Optional[date] = None file_download_uri: Optional[str] = None @@ -602,69 +532,25 @@ def from_dict( Returns: AppealMetaData: An instance of AppealMetaData. """ + # Handle aliases + file_download_uri = data.get("fileDownloadURI") or data.get("downloadURI") return cls( appeal_filing_date=parse_to_date(data.get("appealFilingDate")), appeal_last_modified_date=parse_to_date(data.get("appealLastModifiedDate")), + appeal_last_modified_date_time=parse_to_datetime_utc( + data.get("appealLastModifiedDateTime") + ), application_type_category=data.get("applicationTypeCategory"), docket_notice_mailed_date=parse_to_date(data.get("docketNoticeMailedDate")), - file_download_uri=data.get("fileDownloadURI"), + file_download_uri=file_download_uri, ) @dataclass(frozen=True) -class AppellantData: - """Appellant information. +class AppellantData(PartyData): + """Appellant party data.""" - Attributes: - application_number_text: Application number. - counsel_name: Name of counsel. - group_art_unit_number: Art unit number. - inventor_name: Name of inventor. - real_party_in_interest_name: Real party in interest name. - patent_owner_name: Patent owner name. - publication_date: Publication date. - publication_number: Publication number. - technology_center_number: Technology center number. - """ - - application_number_text: Optional[str] = None - counsel_name: Optional[str] = None - group_art_unit_number: Optional[str] = None - inventor_name: Optional[str] = None - real_party_in_interest_name: Optional[str] = None - patent_owner_name: Optional[str] = None - publication_date: Optional[date] = None - publication_number: Optional[str] = None - technology_center_number: Optional[str] = None - - @classmethod - def from_dict( - cls, data: Dict[str, Any], include_raw_data: bool = False - ) -> "AppellantData": - """Creates an AppellantData instance from a dictionary. - - Args: - data: Dictionary containing appellant data from API response. - include_raw_data: Ignored for this model. - - Returns: - AppellantData: An instance of AppellantData. - """ - # Handle aliases seen in API samples - real_party = data.get("realPartyInInterestName") or data.get("realPartyName") - tech_center = data.get("technologyCenterNumber") or data.get("techCenterNumber") - - return cls( - application_number_text=data.get("applicationNumberText"), - counsel_name=data.get("counselName"), - group_art_unit_number=data.get("groupArtUnitNumber"), - inventor_name=data.get("inventorName"), - real_party_in_interest_name=real_party, - patent_owner_name=data.get("patentOwnerName"), - publication_date=parse_to_date(data.get("publicationDate")), - publication_number=data.get("publicationNumber"), - technology_center_number=tech_center, - ) + pass @dataclass(frozen=True) @@ -731,7 +617,7 @@ def from_dict( AppealDocumentData: An instance of AppealDocumentData. """ # Handle aliases - download_uri = data.get("fileDownloadURI") or data.get("downloadURI") + file_download_uri = data.get("fileDownloadURI") or data.get("downloadURI") doc_type = data.get("documentTypeDescriptionText") or data.get( "documentTypeCategory" ) @@ -743,7 +629,7 @@ def from_dict( document_size_quantity=data.get("documentSizeQuantity"), document_ocr_text=data.get("documentOCRText"), document_type_description_text=doc_type, - file_download_uri=download_uri, + file_download_uri=file_download_uri, ) @@ -935,117 +821,29 @@ def from_dict( Returns: InterferenceMetaData: An instance of InterferenceMetaData. """ + # Handle aliases + file_download_uri = data.get("fileDownloadURI") or data.get("downloadURI") return cls( interference_style_name=data.get("interferenceStyleName"), interference_last_modified_date=parse_to_date( data.get("interferenceLastModifiedDate") ), - file_download_uri=data.get("fileDownloadURI"), + file_download_uri=file_download_uri, ) @dataclass(frozen=True) -class SeniorPartyData: - """Senior party information in an interference. - - Attributes: - application_number_text: Application number. - counsel_name: Name of counsel. - grant_date: Patent grant date. - group_art_unit_number: Art unit number. - real_party_in_interest_name: Real party in interest name. - patent_number: Patent number. - patent_owner_name: Patent owner name. - publication_date: Publication date. - publication_number: Publication number. - technology_center_number: Technology center number. - """ - - application_number_text: Optional[str] = None - counsel_name: Optional[str] = None - grant_date: Optional[date] = None - group_art_unit_number: Optional[str] = None - real_party_in_interest_name: Optional[str] = None - patent_number: Optional[str] = None - patent_owner_name: Optional[str] = None - publication_date: Optional[date] = None - publication_number: Optional[str] = None - technology_center_number: Optional[str] = None +class SeniorPartyData(PartyData): + """Senior party information in an interference.""" - @classmethod - def from_dict( - cls, data: Dict[str, Any], include_raw_data: bool = False - ) -> "SeniorPartyData": - """Creates a SeniorPartyData instance from a dictionary. - - Args: - data: Dictionary containing senior party data from API response. - include_raw_data: Ignored for this model. - - Returns: - SeniorPartyData: An instance of SeniorPartyData. - """ - return cls( - application_number_text=data.get("applicationNumberText"), - counsel_name=data.get("counselName"), - grant_date=parse_to_date(data.get("grantDate")), - group_art_unit_number=data.get("groupArtUnitNumber"), - real_party_in_interest_name=data.get("realPartyInInterestName"), - patent_number=data.get("patentNumber"), - patent_owner_name=data.get("patentOwnerName"), - publication_date=parse_to_date(data.get("publicationDate")), - publication_number=data.get("publicationNumber"), - technology_center_number=data.get("technologyCenterNumber"), - ) + pass @dataclass(frozen=True) -class JuniorPartyData: - """Junior party information in an interference. +class JuniorPartyData(PartyData): + """Junior party information in an interference.""" - Attributes: - publication_number: Publication number. - counsel_name: Name of counsel. - group_art_unit_number: Art unit number. - inventor_name: Name of inventor. - patent_owner_name: Patent owner name. - publication_date: Publication date. - real_party_in_interest_name: Real party in interest name. - technology_center_number: Technology center number. - """ - - publication_number: Optional[str] = None - counsel_name: Optional[str] = None - group_art_unit_number: Optional[str] = None - inventor_name: Optional[str] = None - patent_owner_name: Optional[str] = None - publication_date: Optional[date] = None - real_party_in_interest_name: Optional[str] = None - technology_center_number: Optional[str] = None - - @classmethod - def from_dict( - cls, data: Dict[str, Any], include_raw_data: bool = False - ) -> "JuniorPartyData": - """Creates a JuniorPartyData instance from a dictionary. - - Args: - data: Dictionary containing junior party data from API response. - include_raw_data: Ignored for this model. - - Returns: - JuniorPartyData: An instance of JuniorPartyData. - """ - return cls( - publication_number=data.get("publicationNumber"), - counsel_name=data.get("counselName"), - group_art_unit_number=data.get("groupArtUnitNumber"), - inventor_name=data.get("inventorName"), - patent_owner_name=data.get("patentOwnerName"), - publication_date=parse_to_date(data.get("publicationDate")), - real_party_in_interest_name=data.get("realPartyInInterestName"), - technology_center_number=data.get("technologyCenterNumber"), - ) + pass @dataclass(frozen=True) @@ -1099,8 +897,8 @@ class InterferenceDocumentData: decision_issue_date: Date the decision was issued. decision_type_category: Type of decision. file_download_uri: URI to download the document. - statute_and_rule_bag: Statutes and rules cited (list or string). - issue_type_bag: Issues addressed (list or string). + statute_and_rule_bag: List of applicable statutes and rules. + issue_type_bag: List of issues addressed. """ document_identifier: Optional[str] = None @@ -1112,8 +910,8 @@ class InterferenceDocumentData: decision_issue_date: Optional[date] = None decision_type_category: Optional[str] = None file_download_uri: Optional[str] = None - statute_and_rule_bag: Optional[List[str]] = None - issue_type_bag: Optional[List[str]] = None + statute_and_rule_bag: List[str] = field(default_factory=list) + issue_type_bag: List[str] = field(default_factory=list) @classmethod def from_dict( @@ -1129,7 +927,7 @@ def from_dict( InterferenceDocumentData: An instance of InterferenceDocumentData. """ # Handle aliases - download_uri = data.get("fileDownloadURI") or data.get("downloadURI") + file_download_uri = data.get("fileDownloadURI") or data.get("downloadURI") return cls( document_identifier=data.get("documentIdentifier"), @@ -1140,9 +938,9 @@ def from_dict( interference_outcome_category=data.get("interferenceOutcomeCategory"), decision_issue_date=parse_to_date(data.get("decisionIssueDate")), decision_type_category=data.get("decisionTypeCategory"), - file_download_uri=download_uri, - statute_and_rule_bag=data.get("statuteAndRuleBag"), - issue_type_bag=data.get("issueTypeBag"), + file_download_uri=file_download_uri, + statute_and_rule_bag=data.get("statuteAndRuleBag", []), + issue_type_bag=data.get("issueTypeBag", []), ) @@ -1153,7 +951,6 @@ class PTABInterferenceDecision: Attributes: interference_number: Interference number. last_modified_date_time: Last modification timestamp. - last_ingestion_date_time: Last ingestion timestamp (alternative field). interference_meta_data: Interference metadata. senior_party_data: Senior party information. junior_party_data: Junior party information. @@ -1164,7 +961,6 @@ class PTABInterferenceDecision: interference_number: Optional[str] = None last_modified_date_time: Optional[datetime] = None - last_ingestion_date_time: Optional[datetime] = None interference_meta_data: Optional[InterferenceMetaData] = None senior_party_data: Optional[SeniorPartyData] = None junior_party_data: Optional[JuniorPartyData] = None @@ -1219,9 +1015,6 @@ def from_dict( last_modified_date_time=parse_to_datetime_utc( data.get("lastModifiedDateTime") ), - last_ingestion_date_time=parse_to_datetime_utc( - data.get("lastIngestionDateTime") - ), interference_meta_data=interference_meta_data, senior_party_data=senior_party_data, junior_party_data=junior_party_data, diff --git a/tests/clients/test_ptab_trials_client.py b/tests/clients/test_ptab_trials_client.py index e0465f8..34167ab 100644 --- a/tests/clients/test_ptab_trials_client.py +++ b/tests/clients/test_ptab_trials_client.py @@ -10,7 +10,11 @@ import pytest from pyUSPTO import PTABTrialsClient, USPTOConfig -from pyUSPTO.models.ptab import PTABTrialProceeding, PTABTrialProceedingResponse +from pyUSPTO.models.ptab import ( + PTABTrialProceeding, + PTABTrialProceedingResponse, + PTABTrialDocumentResponse, +) @pytest.fixture @@ -54,6 +58,37 @@ def trial_proceeding_sample() -> Dict[str, Any]: } +@pytest.fixture +def trial_document_sample() -> Dict[str, Any]: + """Sample trial document data for testing.""" + return { + "count": 2, + "patentTrialDocumentDataBag": [ + { + "trialNumber": "IPR2023-00001", + "trialDocumentCategory": "Document", + "lastModifiedDateTime": "2023-01-15T10:30:00Z", + "trialTypeCode": "IPR", + "documentData": { + "documentName": "Petition.pdf", + "documentIdentifier": "doc-123", + "documentFilingDate": "2023-01-10", + }, + }, + { + "trialNumber": "IPR2023-00002", + "trialDocumentCategory": "Decision", + "lastModifiedDateTime": "2023-06-15T14:00:00Z", + "trialTypeCode": "IPR", + "decisionData": { + "decisionTypeCategory": "Final Written Decision", + "decisionIssueDate": "2023-06-10", + }, + }, + ], + } + + @pytest.fixture def mock_ptab_trials_client(api_key_fixture: str) -> PTABTrialsClient: """Fixture for mock PTABTrialsClient.""" @@ -179,7 +214,7 @@ def test_search_proceedings_with_all_convenience_params( result = mock_ptab_trials_client.search_proceedings( trial_number_q="IPR2023-00001", patent_owner_name_q="Test Owner", - petitioner_party_name_q="Test Petitioner", + petitioner_real_party_in_interest_name_q="Test Petitioner", respondent_name_q="Test Respondent", trial_type_code_q="IPR", trial_status_category_q="Instituted", @@ -191,10 +226,10 @@ def test_search_proceedings_with_all_convenience_params( assert isinstance(result, PTABTrialProceedingResponse) call_args = mock_session.get.call_args params = call_args[1]["params"] - assert "patentOwnerName:Test Owner" in params["q"] - assert "petitionerPartyName:Test Petitioner" in params["q"] - assert "respondentName:Test Respondent" in params["q"] - assert "trialStatusCategory:Instituted" in params["q"] + assert "patentOwnerData.patentOwnerName:Test Owner" in params["q"] + assert "regularPetitionerData.realPartyInInterestName:Test Petitioner" in params["q"] + assert "respondentData.patentOwnerName:Test Respondent" in params["q"] + assert "trialMetaData.trialStatusCategory:Instituted" in params["q"] def test_search_proceedings_with_date_from_only( self, @@ -314,13 +349,13 @@ class TestPTABTrialsClientSearchDocuments: def test_search_documents_get_with_query( self, mock_ptab_trials_client: PTABTrialsClient, - trial_proceeding_sample: Dict[str, Any], + trial_document_sample: Dict[str, Any], ) -> None: """Test search_documents with GET and direct query.""" # Setup mock_session = MagicMock() mock_response = MagicMock() - mock_response.json.return_value = trial_proceeding_sample + mock_response.json.return_value = trial_document_sample mock_session.get.return_value = mock_response mock_ptab_trials_client.session = mock_session @@ -330,19 +365,19 @@ def test_search_documents_get_with_query( ) # Verify - assert isinstance(result, PTABTrialProceedingResponse) + assert isinstance(result, PTABTrialDocumentResponse) mock_session.get.assert_called_once() def test_search_documents_with_convenience_params( self, mock_ptab_trials_client: PTABTrialsClient, - trial_proceeding_sample: Dict[str, Any], + trial_document_sample: Dict[str, Any], ) -> None: """Test search_documents with convenience parameters.""" # Setup mock_session = MagicMock() mock_response = MagicMock() - mock_response.json.return_value = trial_proceeding_sample + mock_response.json.return_value = trial_document_sample mock_session.get.return_value = mock_response mock_ptab_trials_client.session = mock_session @@ -355,22 +390,22 @@ def test_search_documents_with_convenience_params( ) # Verify - assert isinstance(result, PTABTrialProceedingResponse) + assert isinstance(result, PTABTrialDocumentResponse) call_args = mock_session.get.call_args params = call_args[1]["params"] assert "q" in params - assert "filingDate:[2023-01-01 TO 2023-12-31]" in params["q"] + assert "documentData.documentFilingDate:[2023-01-01 TO 2023-12-31]" in params["q"] def test_search_documents_with_all_convenience_params( self, mock_ptab_trials_client: PTABTrialsClient, - trial_proceeding_sample: Dict[str, Any], + trial_document_sample: Dict[str, Any], ) -> None: """Test search_documents with all convenience parameters.""" # Setup mock_session = MagicMock() mock_response = MagicMock() - mock_response.json.return_value = trial_proceeding_sample + mock_response.json.return_value = trial_document_sample mock_session.get.return_value = mock_response mock_ptab_trials_client.session = mock_session @@ -381,7 +416,7 @@ def test_search_documents_with_all_convenience_params( document_type_name_q="Patent Owner Response", filing_date_from_q="2023-01-01", filing_date_to_q="2023-12-31", - petitioner_party_name_q="Test Petitioner", + petitioner_real_party_in_interest_name_q="Test Petitioner", inventor_name_q="Jane Inventor", real_party_in_interest_name_q="Real Party LLC", patent_number_q="US1234567", @@ -390,29 +425,29 @@ def test_search_documents_with_all_convenience_params( ) # Verify - assert isinstance(result, PTABTrialProceedingResponse) + assert isinstance(result, PTABTrialDocumentResponse) call_args = mock_session.get.call_args params = call_args[1]["params"] assert "trialNumber:IPR2023-00001" in params["q"] - assert "documentCategory:Paper" in params["q"] - assert "documentTypeName:Patent Owner Response" in params["q"] - assert "petitionerPartyName:Test Petitioner" in params["q"] - assert "inventorName:Jane Inventor" in params["q"] - assert "realPartyInInterestName:Real Party LLC" in params["q"] - assert "patentNumber:US1234567" in params["q"] - assert "patentOwnerName:Test Owner" in params["q"] + assert "documentData.documentCategory:Paper" in params["q"] + assert "documentData.documentTypeDescriptionText:Patent Owner Response" in params["q"] + assert "regularPetitionerData.realPartyInInterestName:Test Petitioner" in params["q"] + assert "patentOwnerData.inventorName:Jane Inventor" in params["q"] + assert "regularPetitionerData.realPartyInInterestName:Real Party LLC" in params["q"] + assert "patentOwnerData.patentNumber:US1234567" in params["q"] + assert "patentOwnerData.patentOwnerName:Test Owner" in params["q"] assert params["limit"] == 50 def test_search_documents_with_date_from_only( self, mock_ptab_trials_client: PTABTrialsClient, - trial_proceeding_sample: Dict[str, Any], + trial_document_sample: Dict[str, Any], ) -> None: """Test search_documents with only filing_date_from.""" # Setup mock_session = MagicMock() mock_response = MagicMock() - mock_response.json.return_value = trial_proceeding_sample + mock_response.json.return_value = trial_document_sample mock_session.get.return_value = mock_response mock_ptab_trials_client.session = mock_session @@ -422,21 +457,21 @@ def test_search_documents_with_date_from_only( ) # Verify - assert isinstance(result, PTABTrialProceedingResponse) + assert isinstance(result, PTABTrialDocumentResponse) call_args = mock_session.get.call_args params = call_args[1]["params"] - assert "filingDate:>=2023-01-01" in params["q"] + assert "documentData.documentFilingDate:>=2023-01-01" in params["q"] def test_search_documents_with_date_to_only( self, mock_ptab_trials_client: PTABTrialsClient, - trial_proceeding_sample: Dict[str, Any], + trial_document_sample: Dict[str, Any], ) -> None: """Test search_documents with only filing_date_to.""" # Setup mock_session = MagicMock() mock_response = MagicMock() - mock_response.json.return_value = trial_proceeding_sample + mock_response.json.return_value = trial_document_sample mock_session.get.return_value = mock_response mock_ptab_trials_client.session = mock_session @@ -444,21 +479,21 @@ def test_search_documents_with_date_to_only( result = mock_ptab_trials_client.search_documents(filing_date_to_q="2023-12-31") # Verify - assert isinstance(result, PTABTrialProceedingResponse) + assert isinstance(result, PTABTrialDocumentResponse) call_args = mock_session.get.call_args params = call_args[1]["params"] - assert "filingDate:<=2023-12-31" in params["q"] + assert "documentData.documentFilingDate:<=2023-12-31" in params["q"] def test_search_documents_post_with_body( self, mock_ptab_trials_client: PTABTrialsClient, - trial_proceeding_sample: Dict[str, Any], + trial_document_sample: Dict[str, Any], ) -> None: """Test search_documents with POST body.""" # Setup mock_session = MagicMock() mock_response = MagicMock() - mock_response.json.return_value = trial_proceeding_sample + mock_response.json.return_value = trial_document_sample mock_session.post.return_value = mock_response mock_ptab_trials_client.session = mock_session @@ -468,7 +503,7 @@ def test_search_documents_post_with_body( result = mock_ptab_trials_client.search_documents(post_body=post_body) # Verify - assert isinstance(result, PTABTrialProceedingResponse) + assert isinstance(result, PTABTrialDocumentResponse) mock_session.post.assert_called_once() call_args = mock_session.post.call_args assert call_args[1]["json"] == post_body @@ -476,13 +511,13 @@ def test_search_documents_post_with_body( def test_search_documents_with_optional_params( self, mock_ptab_trials_client: PTABTrialsClient, - trial_proceeding_sample: Dict[str, Any], + trial_document_sample: Dict[str, Any], ) -> None: """Test search_documents with optional parameters.""" # Setup mock_session = MagicMock() mock_response = MagicMock() - mock_response.json.return_value = trial_proceeding_sample + mock_response.json.return_value = trial_document_sample mock_session.get.return_value = mock_response mock_ptab_trials_client.session = mock_session @@ -500,7 +535,7 @@ def test_search_documents_with_optional_params( ) # Verify - assert isinstance(result, PTABTrialProceedingResponse) + assert isinstance(result, PTABTrialDocumentResponse) call_args = mock_session.get.call_args params = call_args[1]["params"] assert params["sort"] == "filingDate desc" @@ -519,13 +554,13 @@ class TestPTABTrialsClientSearchDecisions: def test_search_decisions_get_with_query( self, mock_ptab_trials_client: PTABTrialsClient, - trial_proceeding_sample: Dict[str, Any], + trial_document_sample: Dict[str, Any], ) -> None: """Test search_decisions with GET and direct query.""" # Setup mock_session = MagicMock() mock_response = MagicMock() - mock_response.json.return_value = trial_proceeding_sample + mock_response.json.return_value = trial_document_sample mock_session.get.return_value = mock_response mock_ptab_trials_client.session = mock_session @@ -535,19 +570,19 @@ def test_search_decisions_get_with_query( ) # Verify - assert isinstance(result, PTABTrialProceedingResponse) + assert isinstance(result, PTABTrialDocumentResponse) mock_session.get.assert_called_once() def test_search_decisions_with_convenience_params( self, mock_ptab_trials_client: PTABTrialsClient, - trial_proceeding_sample: Dict[str, Any], + trial_document_sample: Dict[str, Any], ) -> None: """Test search_decisions with convenience parameters.""" # Setup mock_session = MagicMock() mock_response = MagicMock() - mock_response.json.return_value = trial_proceeding_sample + mock_response.json.return_value = trial_document_sample mock_session.get.return_value = mock_response mock_ptab_trials_client.session = mock_session @@ -559,22 +594,22 @@ def test_search_decisions_with_convenience_params( ) # Verify - assert isinstance(result, PTABTrialProceedingResponse) + assert isinstance(result, PTABTrialDocumentResponse) call_args = mock_session.get.call_args params = call_args[1]["params"] assert "q" in params - assert "decisionDate:>=2023-01-01" in params["q"] + assert "decisionData.decisionIssueDate:>=2023-01-01" in params["q"] def test_search_decisions_with_all_convenience_params( self, mock_ptab_trials_client: PTABTrialsClient, - trial_proceeding_sample: Dict[str, Any], + trial_document_sample: Dict[str, Any], ) -> None: """Test search_decisions with all convenience parameters.""" # Setup mock_session = MagicMock() mock_response = MagicMock() - mock_response.json.return_value = trial_proceeding_sample + mock_response.json.return_value = trial_document_sample mock_session.get.return_value = mock_response mock_ptab_trials_client.session = mock_session @@ -595,31 +630,31 @@ def test_search_decisions_with_all_convenience_params( ) # Verify - assert isinstance(result, PTABTrialProceedingResponse) + assert isinstance(result, PTABTrialDocumentResponse) call_args = mock_session.get.call_args params = call_args[1]["params"] assert "trialNumber:IPR2023-00001" in params["q"] - assert "decisionTypeCategory:Final Written Decision" in params["q"] + assert "decisionData.decisionTypeCategory:Final Written Decision" in params["q"] assert "trialTypeCode:IPR" in params["q"] - assert "patentNumber:US1234567" in params["q"] - assert "applicationNumber:15/123456" in params["q"] - assert "patentOwnerName:Test Owner" in params["q"] - assert "trialStatusCategory:Instituted" in params["q"] - assert "realPartyInInterestName:Real Party LLC" in params["q"] - assert "documentCategory:Decision" in params["q"] - assert "decisionDate:[2023-01-01 TO 2023-12-31]" in params["q"] + assert "patentOwnerData.patentNumber:US1234567" in params["q"] + assert "patentOwnerData.applicationNumberText:15/123456" in params["q"] + assert "patentOwnerData.patentOwnerName:Test Owner" in params["q"] + assert "trialMetaData.trialStatusCategory:Instituted" in params["q"] + assert "regularPetitionerData.realPartyInInterestName:Real Party LLC" in params["q"] + assert "documentData.documentCategory:Decision" in params["q"] + assert "decisionData.decisionIssueDate:[2023-01-01 TO 2023-12-31]" in params["q"] assert params["limit"] == 50 def test_search_decisions_with_date_from_only( self, mock_ptab_trials_client: PTABTrialsClient, - trial_proceeding_sample: Dict[str, Any], + trial_document_sample: Dict[str, Any], ) -> None: """Test search_decisions with only decision_date_from.""" # Setup mock_session = MagicMock() mock_response = MagicMock() - mock_response.json.return_value = trial_proceeding_sample + mock_response.json.return_value = trial_document_sample mock_session.get.return_value = mock_response mock_ptab_trials_client.session = mock_session @@ -629,21 +664,21 @@ def test_search_decisions_with_date_from_only( ) # Verify - assert isinstance(result, PTABTrialProceedingResponse) + assert isinstance(result, PTABTrialDocumentResponse) call_args = mock_session.get.call_args params = call_args[1]["params"] - assert "decisionDate:>=2023-01-01" in params["q"] + assert "decisionData.decisionIssueDate:>=2023-01-01" in params["q"] def test_search_decisions_with_date_to_only( self, mock_ptab_trials_client: PTABTrialsClient, - trial_proceeding_sample: Dict[str, Any], + trial_document_sample: Dict[str, Any], ) -> None: """Test search_decisions with only decision_date_to.""" # Setup mock_session = MagicMock() mock_response = MagicMock() - mock_response.json.return_value = trial_proceeding_sample + mock_response.json.return_value = trial_document_sample mock_session.get.return_value = mock_response mock_ptab_trials_client.session = mock_session @@ -653,21 +688,21 @@ def test_search_decisions_with_date_to_only( ) # Verify - assert isinstance(result, PTABTrialProceedingResponse) + assert isinstance(result, PTABTrialDocumentResponse) call_args = mock_session.get.call_args params = call_args[1]["params"] - assert "decisionDate:<=2023-12-31" in params["q"] + assert "decisionData.decisionIssueDate:<=2023-12-31" in params["q"] def test_search_decisions_post_with_body( self, mock_ptab_trials_client: PTABTrialsClient, - trial_proceeding_sample: Dict[str, Any], + trial_document_sample: Dict[str, Any], ) -> None: """Test search_decisions with POST body.""" # Setup mock_session = MagicMock() mock_response = MagicMock() - mock_response.json.return_value = trial_proceeding_sample + mock_response.json.return_value = trial_document_sample mock_session.post.return_value = mock_response mock_ptab_trials_client.session = mock_session @@ -677,7 +712,7 @@ def test_search_decisions_post_with_body( result = mock_ptab_trials_client.search_decisions(post_body=post_body) # Verify - assert isinstance(result, PTABTrialProceedingResponse) + assert isinstance(result, PTABTrialDocumentResponse) mock_session.post.assert_called_once() call_args = mock_session.post.call_args assert call_args[1]["json"] == post_body @@ -685,13 +720,13 @@ def test_search_decisions_post_with_body( def test_search_decisions_with_optional_params( self, mock_ptab_trials_client: PTABTrialsClient, - trial_proceeding_sample: Dict[str, Any], + trial_document_sample: Dict[str, Any], ) -> None: """Test search_decisions with optional parameters.""" # Setup mock_session = MagicMock() mock_response = MagicMock() - mock_response.json.return_value = trial_proceeding_sample + mock_response.json.return_value = trial_document_sample mock_session.get.return_value = mock_response mock_ptab_trials_client.session = mock_session @@ -709,7 +744,7 @@ def test_search_decisions_with_optional_params( ) # Verify - assert isinstance(result, PTABTrialProceedingResponse) + assert isinstance(result, PTABTrialDocumentResponse) call_args = mock_session.get.call_args params = call_args[1]["params"] assert params["sort"] == "decisionDate desc" diff --git a/tests/integration/test_patent_data_integration.py b/tests/integration/test_patent_data_integration.py index 8877c90..fe64abc 100644 --- a/tests/integration/test_patent_data_integration.py +++ b/tests/integration/test_patent_data_integration.py @@ -484,7 +484,7 @@ def test_download_application_document( file_path = patent_data_client.download_document( document_format=doc_to_download.document_formats[0], - file_path=TEST_DOWNLOAD_DIR, + destination_path=TEST_DOWNLOAD_DIR, ) assert file_path is not None diff --git a/tests/integration/test_ptab_appeals_integration.py b/tests/integration/test_ptab_appeals_integration.py new file mode 100644 index 0000000..390ab04 --- /dev/null +++ b/tests/integration/test_ptab_appeals_integration.py @@ -0,0 +1,254 @@ +""" +Integration tests for the USPTO PTAB Appeals API client. + +This module contains integration tests that make real API calls to the USPTO PTAB Appeals API. +These tests are optional and are skipped by default unless the ENABLE_INTEGRATION_TESTS +environment variable is set to 'true'. +""" + +import os +from typing import Iterator + +import pytest + +from pyUSPTO.clients import PTABAppealsClient +from pyUSPTO.config import USPTOConfig +from pyUSPTO.exceptions import USPTOApiError +from pyUSPTO.models.ptab import PTABAppealDecision, PTABAppealResponse + +# Skip all tests in this module unless ENABLE_INTEGRATION_TESTS is set to 'true' +pytestmark = pytest.mark.skipif( + os.environ.get("ENABLE_INTEGRATION_TESTS", "").lower() != "true", + reason="Integration tests are disabled. Set ENABLE_INTEGRATION_TESTS=true to enable.", +) + + +@pytest.fixture +def ptab_appeals_client(config: USPTOConfig) -> PTABAppealsClient: + """ + Create a PTABAppealsClient instance for integration tests. + + Args: + config: The configuration instance + + Returns: + PTABAppealsClient: A client instance + """ + return PTABAppealsClient(config=config) + + +class TestPTABAppealsIntegration: + """Integration tests for the PTABAppealsClient.""" + + def test_search_decisions_get( + self, ptab_appeals_client: PTABAppealsClient + ) -> None: + """Test searching PTAB appeal decisions using GET method.""" + try: + response = ptab_appeals_client.search_decisions( + query="appealMetaData.applicationTypeCategory:Utility", + limit=2, + ) + + assert response is not None + assert isinstance(response, PTABAppealResponse) + assert response.count >= 0 + + if response.count > 0: + assert response.patent_appeal_data_bag is not None + assert len(response.patent_appeal_data_bag) > 0 + assert len(response.patent_appeal_data_bag) <= 2 + + decision = response.patent_appeal_data_bag[0] + assert isinstance(decision, PTABAppealDecision) + assert decision.appeal_number is not None + + except USPTOApiError as e: + pytest.skip(f"PTAB Appeals API error during search_decisions GET: {e}") + + def test_search_decisions_with_convenience_params( + self, ptab_appeals_client: PTABAppealsClient + ) -> None: + """Test searching appeal decisions with convenience parameters.""" + try: + response = ptab_appeals_client.search_decisions( + application_type_category_q="Utility", + limit=2, + ) + + assert response is not None + assert isinstance(response, PTABAppealResponse) + assert response.count >= 0 + + if response.count > 0: + assert response.patent_appeal_data_bag is not None + for decision in response.patent_appeal_data_bag: + assert isinstance(decision, PTABAppealDecision) + # Verify application type if metadata present + if decision.appeal_meta_data: + if decision.appeal_meta_data.application_type_category: + assert ( + decision.appeal_meta_data.application_type_category + == "Utility" + ) + + except USPTOApiError as e: + pytest.skip( + f"PTAB Appeals API error during search_decisions with convenience params: {e}" + ) + + def test_search_decisions_post( + self, ptab_appeals_client: PTABAppealsClient + ) -> None: + """Test searching PTAB appeal decisions using POST method.""" + post_body = { + "q": "appealMetaData.applicationTypeCategory:Utility", + "pagination": {"offset": 0, "limit": 2}, + } + + try: + response = ptab_appeals_client.search_decisions(post_body=post_body) + + assert response is not None + assert isinstance(response, PTABAppealResponse) + assert response.count >= 0 + + if response.count > 0: + assert response.patent_appeal_data_bag is not None + assert len(response.patent_appeal_data_bag) <= 2 + + except USPTOApiError as e: + pytest.skip(f"PTAB Appeals API error during search_decisions POST: {e}") + + def test_search_decisions_with_date_filters( + self, ptab_appeals_client: PTABAppealsClient + ) -> None: + """Test searching appeal decisions with date range filters.""" + try: + response = ptab_appeals_client.search_decisions( + decision_date_from_q="2023-01-01", + decision_date_to_q="2024-12-31", + limit=2, + ) + + assert response is not None + assert isinstance(response, PTABAppealResponse) + assert response.count >= 0 + + if response.count > 0: + assert response.patent_appeal_data_bag is not None + + except USPTOApiError as e: + pytest.skip( + f"PTAB Appeals API error during search_decisions with date filters: {e}" + ) + + def test_search_decisions_by_decision_type( + self, ptab_appeals_client: PTABAppealsClient + ) -> None: + """Test searching appeal decisions by decision type.""" + try: + response = ptab_appeals_client.search_decisions( + decision_type_category_q="Affirmed", + limit=2, + ) + + assert response is not None + assert isinstance(response, PTABAppealResponse) + assert response.count >= 0 + + if response.count > 0: + assert response.patent_appeal_data_bag is not None + for decision in response.patent_appeal_data_bag: + # Verify decision type if present + if decision.decision_data: + if decision.decision_data.decision_type_category: + assert "Affirmed" in decision.decision_data.decision_type_category + + except USPTOApiError as e: + pytest.skip( + f"PTAB Appeals API error during search by decision type: {e}" + ) + + def test_search_decisions_by_appellant( + self, ptab_appeals_client: PTABAppealsClient + ) -> None: + """Test searching appeal decisions by appellant name.""" + try: + # Use a common corporation name + response = ptab_appeals_client.search_decisions( + appellant_name_q="Corporation", + limit=2, + ) + + assert response is not None + assert isinstance(response, PTABAppealResponse) + assert response.count >= 0 + + if response.count > 0: + assert response.patent_appeal_data_bag is not None + + except USPTOApiError as e: + pytest.skip( + f"PTAB Appeals API error during search by appellant: {e}" + ) + + def test_paginate_decisions( + self, ptab_appeals_client: PTABAppealsClient + ) -> None: + """Test paginating through appeal decisions.""" + try: + # Limit to small number to avoid long test times + results = list( + ptab_appeals_client.paginate_decisions( + query="appealMetaData.applicationTypeCategory:Utility", + limit=5, + max_results=10, + ) + ) + + assert isinstance(results, list) + if len(results) > 0: + assert all(isinstance(d, PTABAppealDecision) for d in results) + assert len(results) <= 10 # Should respect max_results + + except USPTOApiError as e: + pytest.skip(f"PTAB Appeals API error during paginate_decisions: {e}") + + def test_search_with_optional_params( + self, ptab_appeals_client: PTABAppealsClient + ) -> None: + """Test searching with optional parameters like sort and facets.""" + try: + response = ptab_appeals_client.search_decisions( + query="appealMetaData.applicationTypeCategory:Utility", + limit=2, + sort="appealNumber desc", + offset=0, + ) + + assert response is not None + assert isinstance(response, PTABAppealResponse) + assert response.count >= 0 + + except USPTOApiError as e: + pytest.skip( + f"PTAB Appeals API error during search with optional params: {e}" + ) + + def test_invalid_query_handling( + self, ptab_appeals_client: PTABAppealsClient + ) -> None: + """Test proper error handling with an invalid query.""" + try: + # Use an obviously malformed query + response = ptab_appeals_client.search_decisions( + query="INVALID_FIELD:value", limit=1 + ) + + # API may return 0 results instead of error for invalid field + assert isinstance(response, PTABAppealResponse) + + except USPTOApiError as e: + # This is acceptable - API may return error for invalid queries + assert e.status_code in [400, 404, 500] diff --git a/tests/integration/test_ptab_interferences_integration.py b/tests/integration/test_ptab_interferences_integration.py new file mode 100644 index 0000000..97467db --- /dev/null +++ b/tests/integration/test_ptab_interferences_integration.py @@ -0,0 +1,298 @@ +""" +Integration tests for the USPTO PTAB Interferences API client. + +This module contains integration tests that make real API calls to the USPTO PTAB Interferences API. +These tests are optional and are skipped by default unless the ENABLE_INTEGRATION_TESTS +environment variable is set to 'true'. +""" + +import os +from typing import Iterator + +import pytest + +from pyUSPTO.clients import PTABInterferencesClient +from pyUSPTO.config import USPTOConfig +from pyUSPTO.exceptions import USPTOApiError +from pyUSPTO.models.ptab import PTABInterferenceDecision, PTABInterferenceResponse + +# Skip all tests in this module unless ENABLE_INTEGRATION_TESTS is set to 'true' +pytestmark = pytest.mark.skipif( + os.environ.get("ENABLE_INTEGRATION_TESTS", "").lower() != "true", + reason="Integration tests are disabled. Set ENABLE_INTEGRATION_TESTS=true to enable.", +) + + +@pytest.fixture +def ptab_interferences_client(config: USPTOConfig) -> PTABInterferencesClient: + """ + Create a PTABInterferencesClient instance for integration tests. + + Args: + config: The configuration instance + + Returns: + PTABInterferencesClient: A client instance + """ + return PTABInterferencesClient(config=config) + + +class TestPTABInterferencesIntegration: + """Integration tests for the PTABInterferencesClient.""" + + def test_search_decisions_get( + self, ptab_interferences_client: PTABInterferencesClient + ) -> None: + """Test searching PTAB interference decisions using GET method.""" + try: + response = ptab_interferences_client.search_decisions( + query="interferenceNumber:*", + limit=2, + ) + + assert response is not None + assert isinstance(response, PTABInterferenceResponse) + assert response.count >= 0 + + if response.count > 0: + assert response.patent_interference_data_bag is not None + assert len(response.patent_interference_data_bag) > 0 + assert len(response.patent_interference_data_bag) <= 2 + + decision = response.patent_interference_data_bag[0] + assert isinstance(decision, PTABInterferenceDecision) + assert decision.interference_number is not None + + except USPTOApiError as e: + pytest.skip(f"PTAB Interferences API error during search_decisions GET: {e}") + + def test_search_decisions_with_convenience_params( + self, ptab_interferences_client: PTABInterferencesClient + ) -> None: + """Test searching interference decisions with convenience parameters.""" + try: + response = ptab_interferences_client.search_decisions( + interference_outcome_category_q="Priority", + limit=2, + ) + + assert response is not None + assert isinstance(response, PTABInterferenceResponse) + assert response.count >= 0 + + if response.count > 0: + assert response.patent_interference_data_bag is not None + for decision in response.patent_interference_data_bag: + assert isinstance(decision, PTABInterferenceDecision) + # Verify outcome if document data present + if decision.document_data: + if decision.document_data.interference_outcome_category: + assert ( + "Priority" + in decision.document_data.interference_outcome_category + ) + + except USPTOApiError as e: + pytest.skip( + f"PTAB Interferences API error during search_decisions with convenience params: {e}" + ) + + def test_search_decisions_post( + self, ptab_interferences_client: PTABInterferencesClient + ) -> None: + """Test searching PTAB interference decisions using POST method.""" + post_body = { + "q": "interferenceNumber:*", + "pagination": {"offset": 0, "limit": 2}, + } + + try: + response = ptab_interferences_client.search_decisions(post_body=post_body) + + assert response is not None + assert isinstance(response, PTABInterferenceResponse) + assert response.count >= 0 + + if response.count > 0: + assert response.patent_interference_data_bag is not None + assert len(response.patent_interference_data_bag) <= 2 + + except USPTOApiError as e: + pytest.skip(f"PTAB Interferences API error during search_decisions POST: {e}") + + def test_search_decisions_with_date_filters( + self, ptab_interferences_client: PTABInterferencesClient + ) -> None: + """Test searching interference decisions with date range filters.""" + try: + response = ptab_interferences_client.search_decisions( + decision_date_from_q="2020-01-01", + decision_date_to_q="2024-12-31", + limit=2, + ) + + assert response is not None + assert isinstance(response, PTABInterferenceResponse) + assert response.count >= 0 + + if response.count > 0: + assert response.patent_interference_data_bag is not None + + except USPTOApiError as e: + pytest.skip( + f"PTAB Interferences API error during search_decisions with date filters: {e}" + ) + + def test_search_decisions_by_decision_type( + self, ptab_interferences_client: PTABInterferencesClient + ) -> None: + """Test searching interference decisions by decision type.""" + try: + response = ptab_interferences_client.search_decisions( + decision_type_category_q="Final", + limit=2, + ) + + assert response is not None + assert isinstance(response, PTABInterferenceResponse) + assert response.count >= 0 + + if response.count > 0: + assert response.patent_interference_data_bag is not None + for decision in response.patent_interference_data_bag: + # Verify decision type if present + if decision.document_data: + if decision.document_data.decision_type_category: + assert "Final" in decision.document_data.decision_type_category + + except USPTOApiError as e: + pytest.skip( + f"PTAB Interferences API error during search by decision type: {e}" + ) + + def test_search_decisions_by_party( + self, ptab_interferences_client: PTABInterferencesClient + ) -> None: + """Test searching interference decisions by party name.""" + try: + # Search for senior or junior party + response = ptab_interferences_client.search_decisions( + senior_party_name_q="Corporation", + limit=2, + ) + + assert response is not None + assert isinstance(response, PTABInterferenceResponse) + assert response.count >= 0 + + if response.count > 0: + assert response.patent_interference_data_bag is not None + + except USPTOApiError as e: + pytest.skip( + f"PTAB Interferences API error during search by party: {e}" + ) + + def test_search_decisions_by_patent_number( + self, ptab_interferences_client: PTABInterferencesClient + ) -> None: + """Test searching interference decisions by patent number.""" + try: + response = ptab_interferences_client.search_decisions( + senior_party_patent_number_q="US*", + limit=2, + ) + + assert response is not None + assert isinstance(response, PTABInterferenceResponse) + assert response.count >= 0 + + if response.count > 0: + assert response.patent_interference_data_bag is not None + + except USPTOApiError as e: + pytest.skip( + f"PTAB Interferences API error during search by patent number: {e}" + ) + + def test_paginate_decisions( + self, ptab_interferences_client: PTABInterferencesClient + ) -> None: + """Test paginating through interference decisions.""" + try: + # Limit to small number to avoid long test times + results = list( + ptab_interferences_client.paginate_decisions( + query="interferenceNumber:*", + limit=5, + max_results=10, + ) + ) + + assert isinstance(results, list) + if len(results) > 0: + assert all(isinstance(d, PTABInterferenceDecision) for d in results) + assert len(results) <= 10 # Should respect max_results + + except USPTOApiError as e: + pytest.skip(f"PTAB Interferences API error during paginate_decisions: {e}") + + def test_search_with_optional_params( + self, ptab_interferences_client: PTABInterferencesClient + ) -> None: + """Test searching with optional parameters like sort and facets.""" + try: + response = ptab_interferences_client.search_decisions( + query="interferenceNumber:*", + limit=2, + sort="interferenceNumber desc", + offset=0, + ) + + assert response is not None + assert isinstance(response, PTABInterferenceResponse) + assert response.count >= 0 + + except USPTOApiError as e: + pytest.skip( + f"PTAB Interferences API error during search with optional params: {e}" + ) + + def test_search_with_style_name( + self, ptab_interferences_client: PTABInterferencesClient + ) -> None: + """Test searching by interference style name.""" + try: + response = ptab_interferences_client.search_decisions( + interference_style_name_q="*", + limit=2, + ) + + assert response is not None + assert isinstance(response, PTABInterferenceResponse) + assert response.count >= 0 + + if response.count > 0: + assert response.patent_interference_data_bag is not None + + except USPTOApiError as e: + pytest.skip( + f"PTAB Interferences API error during search by style name: {e}" + ) + + def test_invalid_query_handling( + self, ptab_interferences_client: PTABInterferencesClient + ) -> None: + """Test proper error handling with an invalid query.""" + try: + # Use an obviously malformed query + response = ptab_interferences_client.search_decisions( + query="INVALID_FIELD:value", limit=1 + ) + + # API may return 0 results instead of error for invalid field + assert isinstance(response, PTABInterferenceResponse) + + except USPTOApiError as e: + # This is acceptable - API may return error for invalid queries + assert e.status_code in [400, 404, 500] diff --git a/tests/integration/test_ptab_trials_integration.py b/tests/integration/test_ptab_trials_integration.py new file mode 100644 index 0000000..7824edd --- /dev/null +++ b/tests/integration/test_ptab_trials_integration.py @@ -0,0 +1,305 @@ +""" +Integration tests for the USPTO PTAB Trials API client. + +This module contains integration tests that make real API calls to the USPTO PTAB Trials API. +These tests are optional and are skipped by default unless the ENABLE_INTEGRATION_TESTS +environment variable is set to 'true'. +""" + +import os +from typing import Iterator + +import pytest + +from pyUSPTO.clients import PTABTrialsClient +from pyUSPTO.config import USPTOConfig +from pyUSPTO.exceptions import USPTOApiError +from pyUSPTO.models.ptab import ( + PTABTrialDocumentResponse, + PTABTrialProceeding, + PTABTrialProceedingResponse, +) + +# Skip all tests in this module unless ENABLE_INTEGRATION_TESTS is set to 'true' +pytestmark = pytest.mark.skipif( + os.environ.get("ENABLE_INTEGRATION_TESTS", "").lower() != "true", + reason="Integration tests are disabled. Set ENABLE_INTEGRATION_TESTS=true to enable.", +) + + +@pytest.fixture +def ptab_trials_client(config: USPTOConfig) -> PTABTrialsClient: + """ + Create a PTABTrialsClient instance for integration tests. + + Args: + config: The configuration instance + + Returns: + PTABTrialsClient: A client instance + """ + return PTABTrialsClient(config=config) + + +class TestPTABTrialsIntegration: + """Integration tests for the PTABTrialsClient.""" + + def test_search_proceedings_get( + self, ptab_trials_client: PTABTrialsClient + ) -> None: + """Test searching PTAB trial proceedings using GET method.""" + try: + response = ptab_trials_client.search_proceedings( + query="trialMetaData.trialStatusCategory:Instituted", + limit=2, + ) + + assert response is not None + assert isinstance(response, PTABTrialProceedingResponse) + assert response.count >= 0 + + if response.count > 0: + assert response.patent_trial_proceeding_data_bag is not None + assert len(response.patent_trial_proceeding_data_bag) > 0 + assert len(response.patent_trial_proceeding_data_bag) <= 2 + + proceeding = response.patent_trial_proceeding_data_bag[0] + assert isinstance(proceeding, PTABTrialProceeding) + assert proceeding.trial_number is not None + + except USPTOApiError as e: + pytest.skip(f"PTAB Trials API error during search_proceedings GET: {e}") + + def test_search_proceedings_with_convenience_params( + self, ptab_trials_client: PTABTrialsClient + ) -> None: + """Test searching proceedings with convenience parameters.""" + try: + response = ptab_trials_client.search_proceedings( + trial_type_code_q="IPR", + trial_status_category_q="Instituted", + limit=2, + ) + + assert response is not None + assert isinstance(response, PTABTrialProceedingResponse) + assert response.count >= 0 + + if response.count > 0: + assert response.patent_trial_proceeding_data_bag is not None + for proceeding in response.patent_trial_proceeding_data_bag: + assert isinstance(proceeding, PTABTrialProceeding) + if proceeding.trial_meta_data: + # Verify trial type if present + if proceeding.trial_meta_data.trial_type_code: + assert proceeding.trial_meta_data.trial_type_code == "IPR" + + except USPTOApiError as e: + pytest.skip( + f"PTAB Trials API error during search_proceedings with convenience params: {e}" + ) + + def test_search_proceedings_post( + self, ptab_trials_client: PTABTrialsClient + ) -> None: + """Test searching PTAB trial proceedings using POST method.""" + post_body = { + "q": "trialMetaData.trialTypeCode:IPR", + "pagination": {"offset": 0, "limit": 2}, + } + + try: + response = ptab_trials_client.search_proceedings(post_body=post_body) + + assert response is not None + assert isinstance(response, PTABTrialProceedingResponse) + assert response.count >= 0 + + if response.count > 0: + assert response.patent_trial_proceeding_data_bag is not None + assert len(response.patent_trial_proceeding_data_bag) <= 2 + + except USPTOApiError as e: + pytest.skip(f"PTAB Trials API error during search_proceedings POST: {e}") + + def test_search_documents_get( + self, ptab_trials_client: PTABTrialsClient + ) -> None: + """Test searching PTAB trial documents using GET method.""" + try: + response = ptab_trials_client.search_documents( + query="documentData.documentCategory:Paper", + limit=2, + ) + + assert response is not None + assert isinstance(response, PTABTrialDocumentResponse) + assert response.count >= 0 + + if response.count > 0: + assert response.patent_trial_document_data_bag is not None + assert len(response.patent_trial_document_data_bag) > 0 + assert len(response.patent_trial_document_data_bag) <= 2 + + document = response.patent_trial_document_data_bag[0] + assert document.trial_number is not None + + except USPTOApiError as e: + pytest.skip(f"PTAB Trials API error during search_documents GET: {e}") + + def test_search_documents_with_convenience_params( + self, ptab_trials_client: PTABTrialsClient + ) -> None: + """Test searching documents with convenience parameters.""" + try: + response = ptab_trials_client.search_documents( + document_category_q="Paper", + limit=2, + ) + + assert response is not None + assert isinstance(response, PTABTrialDocumentResponse) + assert response.count >= 0 + + if response.count > 0: + assert response.patent_trial_document_data_bag is not None + + except USPTOApiError as e: + pytest.skip( + f"PTAB Trials API error during search_documents with convenience params: {e}" + ) + + def test_search_documents_post( + self, ptab_trials_client: PTABTrialsClient + ) -> None: + """Test searching PTAB trial documents using POST method.""" + post_body = { + "q": "trialTypeCode:IPR", + "pagination": {"offset": 0, "limit": 2}, + } + + try: + response = ptab_trials_client.search_documents(post_body=post_body) + + assert response is not None + assert isinstance(response, PTABTrialDocumentResponse) + assert response.count >= 0 + + if response.count > 0: + assert response.patent_trial_document_data_bag is not None + assert len(response.patent_trial_document_data_bag) <= 2 + + except USPTOApiError as e: + pytest.skip(f"PTAB Trials API error during search_documents POST: {e}") + + def test_search_decisions_get( + self, ptab_trials_client: PTABTrialsClient + ) -> None: + """Test searching PTAB trial decisions using GET method.""" + try: + response = ptab_trials_client.search_decisions( + query="decisionData.decisionTypeCategory:Final Written Decision", + limit=2, + ) + + assert response is not None + assert isinstance(response, PTABTrialDocumentResponse) + assert response.count >= 0 + + if response.count > 0: + assert response.patent_trial_document_data_bag is not None + assert len(response.patent_trial_document_data_bag) > 0 + assert len(response.patent_trial_document_data_bag) <= 2 + + decision = response.patent_trial_document_data_bag[0] + assert decision.trial_number is not None + + except USPTOApiError as e: + pytest.skip(f"PTAB Trials API error during search_decisions GET: {e}") + + def test_search_decisions_with_convenience_params( + self, ptab_trials_client: PTABTrialsClient + ) -> None: + """Test searching decisions with convenience parameters.""" + try: + response = ptab_trials_client.search_decisions( + trial_type_code_q="IPR", + limit=2, + ) + + assert response is not None + assert isinstance(response, PTABTrialDocumentResponse) + assert response.count >= 0 + + if response.count > 0: + assert response.patent_trial_document_data_bag is not None + for decision in response.patent_trial_document_data_bag: + if decision.trial_type_code: + assert decision.trial_type_code == "IPR" + + except USPTOApiError as e: + pytest.skip( + f"PTAB Trials API error during search_decisions with convenience params: {e}" + ) + + def test_search_decisions_post( + self, ptab_trials_client: PTABTrialsClient + ) -> None: + """Test searching PTAB trial decisions using POST method.""" + post_body = { + "q": "trialTypeCode:IPR", + "pagination": {"offset": 0, "limit": 2}, + } + + try: + response = ptab_trials_client.search_decisions(post_body=post_body) + + assert response is not None + assert isinstance(response, PTABTrialDocumentResponse) + assert response.count >= 0 + + if response.count > 0: + assert response.patent_trial_document_data_bag is not None + assert len(response.patent_trial_document_data_bag) <= 2 + + except USPTOApiError as e: + pytest.skip(f"PTAB Trials API error during search_decisions POST: {e}") + + def test_paginate_proceedings( + self, ptab_trials_client: PTABTrialsClient + ) -> None: + """Test paginating through trial proceedings.""" + try: + # Limit to small number to avoid long test times + results = list( + ptab_trials_client.paginate_proceedings( + query="trialMetaData.trialTypeCode:IPR", + limit=5, + max_results=10, + ) + ) + + assert isinstance(results, list) + if len(results) > 0: + assert all(isinstance(p, PTABTrialProceeding) for p in results) + assert len(results) <= 10 # Should respect max_results + + except USPTOApiError as e: + pytest.skip(f"PTAB Trials API error during paginate_proceedings: {e}") + + def test_invalid_query_handling( + self, ptab_trials_client: PTABTrialsClient + ) -> None: + """Test proper error handling with an invalid query.""" + try: + # Use an obviously malformed query + response = ptab_trials_client.search_proceedings( + query="INVALID_FIELD:value", limit=1 + ) + + # API may return 0 results instead of error for invalid field + assert isinstance(response, PTABTrialProceedingResponse) + + except USPTOApiError as e: + # This is acceptable - API may return error for invalid queries + assert e.status_code in [400, 404, 500] diff --git a/tests/models/test_ptab_models.py b/tests/models/test_ptab_models.py index 01c9324..22a11a9 100644 --- a/tests/models/test_ptab_models.py +++ b/tests/models/test_ptab_models.py @@ -1,35 +1,157 @@ """ Tests for PTAB models. -This module contains unit tests for the PTAB model classes. +This module contains unit tests for the PTAB model classes with full coverage. """ +from datetime import date, datetime, timezone from typing import Any, Dict import pytest from pyUSPTO.models.ptab import ( - PTABAppealDecision, - PTABAppealResponse, - PTABInterferenceDecision, - PTABInterferenceResponse, - PTABTrialProceeding, - PTABTrialProceedingResponse, + # Base and shared models + PartyData, + # Trial Proceedings Models + TrialMetaData, + PatentOwnerData, RegularPetitionerData, RespondentData, DerivationPetitionerData, + PTABTrialProceeding, + PTABTrialProceedingResponse, + # Trial Documents/Decisions Models + TrialDocumentData, + TrialDecisionData, + PTABTrialDocument, + PTABTrialDocumentResponse, + # Appeal Decisions Models + AppealMetaData, AppellantData, RequestorData, AppealDocumentData, + DecisionData, + PTABAppealDecision, + PTABAppealResponse, + # Interference Decisions Models + InterferenceMetaData, SeniorPartyData, JuniorPartyData, AdditionalPartyData, + InterferenceDocumentData, + PTABInterferenceDecision, + PTABInterferenceResponse, ) +class TestPartyData: + """Tests for PartyData base class.""" + + def test_party_data_from_dict_full(self) -> None: + """Test PartyData.from_dict() with all fields.""" + data = { + "applicationNumberText": "15/123456", + "counselName": "Test Counsel", + "grantDate": "2023-01-15", + "groupArtUnitNumber": "3600", + "inventorName": "John Inventor", + "realPartyInInterestName": "Real Party Inc", + "patentNumber": "US1234567", + "patentOwnerName": "Patent Owner LLC", + "technologyCenterNumber": "3600", + "publicationDate": "2022-12-01", + "publicationNumber": "US20220012345", + } + result = PartyData.from_dict(data) + assert result.application_number_text == "15/123456" + assert result.counsel_name == "Test Counsel" + assert result.grant_date == date(2023, 1, 15) + assert result.group_art_unit_number == "3600" + assert result.inventor_name == "John Inventor" + assert result.real_party_in_interest_name == "Real Party Inc" + assert result.patent_number == "US1234567" + assert result.patent_owner_name == "Patent Owner LLC" + assert result.technology_center_number == "3600" + assert result.publication_date == date(2022, 12, 1) + assert result.publication_number == "US20220012345" + + def test_party_data_from_dict_empty(self) -> None: + """Test PartyData.from_dict() with empty dict.""" + result = PartyData.from_dict({}) + assert result.application_number_text is None + assert result.counsel_name is None + assert result.grant_date is None + assert result.group_art_unit_number is None + assert result.inventor_name is None + assert result.real_party_in_interest_name is None + assert result.patent_number is None + assert result.patent_owner_name is None + assert result.technology_center_number is None + assert result.publication_date is None + assert result.publication_number is None + + def test_party_data_from_dict_ignores_include_raw_data(self) -> None: + """Test PartyData.from_dict() ignores include_raw_data parameter.""" + data = {"counselName": "Test"} + result = PartyData.from_dict(data, include_raw_data=True) + assert result.counsel_name == "Test" + + class TestPTABTrialModels: """Tests for PTAB trial proceeding models.""" + def test_trial_metadata_from_dict_full(self) -> None: + """Test TrialMetaData.from_dict() with all fields.""" + data = { + "petitionFilingDate": "2023-01-15", + "accordedFilingDate": "2023-01-16", + "trialLastModifiedDateTime": "2023-06-01T10:30:00Z", + "trialLastModifiedDate": "2023-06-01", + "trialStatusCategory": "Instituted", + "trialTypeCode": "IPR", + "fileDownloadURI": "https://example.com/download.zip", + "terminationDate": "2024-01-15", + "latestDecisionDate": "2023-12-15", + "institutionDecisionDate": "2023-07-15", + } + result = TrialMetaData.from_dict(data) + assert result.petition_filing_date == date(2023, 1, 15) + assert result.accorded_filing_date == date(2023, 1, 16) + assert result.trial_last_modified_date_time == datetime(2023, 6, 1, 10, 30, 0, tzinfo=timezone.utc) + assert result.trial_last_modified_date == date(2023, 6, 1) + assert result.trial_status_category == "Instituted" + assert result.trial_type_code == "IPR" + assert result.file_download_uri == "https://example.com/download.zip" + assert result.termination_date == date(2024, 1, 15) + assert result.latest_decision_date == date(2023, 12, 15) + assert result.institution_decision_date == date(2023, 7, 15) + + def test_trial_metadata_from_dict_empty(self) -> None: + """Test TrialMetaData.from_dict() with empty dict.""" + result = TrialMetaData.from_dict({}) + assert result.petition_filing_date is None + assert result.accorded_filing_date is None + assert result.trial_last_modified_date_time is None + assert result.trial_last_modified_date is None + assert result.trial_status_category is None + assert result.trial_type_code is None + assert result.file_download_uri is None + assert result.termination_date is None + assert result.latest_decision_date is None + assert result.institution_decision_date is None + + def test_patent_owner_data_from_dict(self) -> None: + """Test PatentOwnerData.from_dict().""" + data = { + "patentOwnerName": "Owner Inc", + "patentNumber": "US1234567", + "counselName": "Owner Counsel", + } + result = PatentOwnerData.from_dict(data) + assert result.patent_owner_name == "Owner Inc" + assert result.patent_number == "US1234567" + assert result.counsel_name == "Owner Counsel" + def test_regular_petitioner_data_from_dict(self) -> None: """Test RegularPetitionerData.from_dict().""" data = { @@ -40,15 +162,23 @@ def test_regular_petitioner_data_from_dict(self) -> None: assert result.counsel_name == "Test Counsel" assert result.real_party_in_interest_name == "Real Party" + def test_regular_petitioner_data_from_dict_empty(self) -> None: + """Test RegularPetitionerData.from_dict() with empty dict.""" + result = RegularPetitionerData.from_dict({}) + assert result.counsel_name is None + assert result.real_party_in_interest_name is None + def test_respondent_data_from_dict(self) -> None: """Test RespondentData.from_dict().""" data = { "counselName": "Respondent Counsel", "realPartyInInterestName": "Respondent Party", + "patentNumber": "US7654321", } result = RespondentData.from_dict(data) assert result.counsel_name == "Respondent Counsel" assert result.real_party_in_interest_name == "Respondent Party" + assert result.patent_number == "US7654321" def test_derivation_petitioner_data_from_dict(self) -> None: """Test DerivationPetitionerData.from_dict().""" @@ -64,11 +194,12 @@ def test_derivation_petitioner_data_from_dict(self) -> None: } result = DerivationPetitionerData.from_dict(data) assert result.counsel_name == "Derivation Counsel" + assert result.grant_date == date(2023, 1, 15) assert result.patent_number == "US1234567" assert result.patent_owner_name == "Derivation Owner" - def test_trial_proceeding_with_all_nested_objects(self) -> None: - """Test PTABTrialProceeding with all nested objects.""" + def test_trial_proceeding_from_dict_full(self) -> None: + """Test PTABTrialProceeding.from_dict() with all nested objects.""" data = { "trialNumber": "IPR2023-00001", "trialRecordIdentifier": "uuid-1", @@ -97,17 +228,326 @@ def test_trial_proceeding_with_all_nested_objects(self) -> None: } result = PTABTrialProceeding.from_dict(data) assert result.trial_number == "IPR2023-00001" + assert result.trial_record_identifier == "uuid-1" + assert result.last_modified_date_time == datetime(2023, 1, 15, 10, 30, 0, tzinfo=timezone.utc) + assert result.trial_meta_data is not None + assert result.trial_meta_data.trial_status_category == "Instituted" + assert result.patent_owner_data is not None + assert result.patent_owner_data.patent_owner_name == "Owner Inc" + assert result.regular_petitioner_data is not None + assert result.regular_petitioner_data.counsel_name == "Petitioner Counsel" + assert result.respondent_data is not None + assert result.respondent_data.counsel_name == "Respondent Counsel" + assert result.derivation_petitioner_data is not None + assert result.derivation_petitioner_data.patent_number == "US7654321" + assert result.raw_data is None + + def test_trial_proceeding_from_dict_with_raw_data(self) -> None: + """Test PTABTrialProceeding.from_dict() with include_raw_data=True.""" + data = { + "trialNumber": "IPR2023-00001", + "trialRecordIdentifier": "uuid-1", + } + result = PTABTrialProceeding.from_dict(data, include_raw_data=True) + assert result.trial_number == "IPR2023-00001" + assert result.raw_data == data + + def test_trial_proceeding_from_dict_empty(self) -> None: + """Test PTABTrialProceeding.from_dict() with empty dict.""" + result = PTABTrialProceeding.from_dict({}) + assert result.trial_number is None + assert result.trial_record_identifier is None + assert result.last_modified_date_time is None + assert result.trial_meta_data is None + assert result.patent_owner_data is None + assert result.regular_petitioner_data is None + assert result.respondent_data is None + assert result.derivation_petitioner_data is None + assert result.raw_data is None + + def test_trial_proceeding_response_from_dict_full(self) -> None: + """Test PTABTrialProceedingResponse.from_dict() with multiple proceedings.""" + data = { + "count": 2, + "requestIdentifier": "request-uuid-1", + "patentTrialProceedingDataBag": [ + { + "trialNumber": "IPR2023-00001", + "trialRecordIdentifier": "uuid-1", + }, + { + "trialNumber": "IPR2023-00002", + "trialRecordIdentifier": "uuid-2", + }, + ], + } + result = PTABTrialProceedingResponse.from_dict(data) + assert result.count == 2 + assert result.request_identifier == "request-uuid-1" + assert len(result.patent_trial_proceeding_data_bag) == 2 + assert result.patent_trial_proceeding_data_bag[0].trial_number == "IPR2023-00001" + assert result.patent_trial_proceeding_data_bag[1].trial_number == "IPR2023-00002" + assert result.raw_data is None + + def test_trial_proceeding_response_from_dict_with_raw_data(self) -> None: + """Test PTABTrialProceedingResponse.from_dict() with include_raw_data=True.""" + data = { + "count": 1, + "requestIdentifier": "request-uuid-1", + "patentTrialProceedingDataBag": [ + {"trialNumber": "IPR2023-00001"}, + ], + } + result = PTABTrialProceedingResponse.from_dict(data, include_raw_data=True) + assert result.count == 1 + assert result.raw_data == data + assert len(result.patent_trial_proceeding_data_bag) == 1 + assert result.patent_trial_proceeding_data_bag[0].raw_data == { + "trialNumber": "IPR2023-00001" + } + + def test_trial_proceeding_response_from_dict_empty(self) -> None: + """Test PTABTrialProceedingResponse.from_dict() with empty list.""" + data = { + "count": 0, + "patentTrialProceedingDataBag": [], + } + result = PTABTrialProceedingResponse.from_dict(data) + assert result.count == 0 + assert len(result.patent_trial_proceeding_data_bag) == 0 + + +class TestPTABTrialDocumentModels: + """Tests for PTAB trial document models.""" + + def test_trial_document_data_from_dict_full(self) -> None: + """Test TrialDocumentData.from_dict() with all fields.""" + data = { + "documentCategory": "Petition", + "documentFilingDate": "2023-01-15", + "documentIdentifier": "doc-uuid-1", + "documentName": "Petition.pdf", + "documentNumber": "1001", + "documentSizeQuantity": 123456, + "documentOCRText": "Full OCR text content here...", + "documentTitleText": "Petition for IPR", + "documentTypeDescriptionText": "Petition Document", + "downloadURI": "https://example.com/doc1.pdf", + "filingPartyCategory": "Petitioner", + "mimeTypeIdentifier": "application/pdf", + "documentStatus": "Public", + } + result = TrialDocumentData.from_dict(data) + assert result.document_category == "Petition" + assert result.document_filing_date == date(2023, 1, 15) + assert result.document_identifier == "doc-uuid-1" + assert result.document_name == "Petition.pdf" + assert result.document_number == "1001" + assert result.document_size_quantity == 123456 + assert result.document_ocr_text == "Full OCR text content here..." + assert result.document_title_text == "Petition for IPR" + assert result.document_type_description_text == "Petition Document" + assert result.file_download_uri == "https://example.com/doc1.pdf" + assert result.filing_party_category == "Petitioner" + assert result.mime_type_identifier == "application/pdf" + assert result.document_status == "Public" + + def test_trial_document_data_from_dict_empty(self) -> None: + """Test TrialDocumentData.from_dict() with empty dict.""" + result = TrialDocumentData.from_dict({}) + assert result.document_category is None + assert result.document_filing_date is None + assert result.document_identifier is None + assert result.document_name is None + assert result.document_number is None + assert result.document_size_quantity is None + assert result.document_ocr_text is None + assert result.document_title_text is None + assert result.document_type_description_text is None + assert result.file_download_uri is None + assert result.filing_party_category is None + assert result.mime_type_identifier is None + assert result.document_status is None + + def test_trial_decision_data_from_dict_full(self) -> None: + """Test TrialDecisionData.from_dict() with all fields.""" + data = { + "statuteAndRuleBag": ["35 U.S.C. § 103", "37 CFR 42.100"], + "decisionIssueDate": "2023-12-15", + "decisionTypeCategory": "Final Written Decision", + "issueTypeBag": ["Obviousness", "Claim Construction"], + "trialOutcomeCategory": "Denied", + } + result = TrialDecisionData.from_dict(data) + assert result.statute_and_rule_bag == ["35 U.S.C. § 103", "37 CFR 42.100"] + assert result.decision_issue_date == date(2023, 12, 15) + assert result.decision_type_category == "Final Written Decision" + assert result.issue_type_bag == ["Obviousness", "Claim Construction"] + assert result.trial_outcome_category == "Denied" + + def test_trial_decision_data_from_dict_empty(self) -> None: + """Test TrialDecisionData.from_dict() with empty dict.""" + result = TrialDecisionData.from_dict({}) + assert result.statute_and_rule_bag == [] + assert result.decision_issue_date is None + assert result.decision_type_category is None + assert result.issue_type_bag == [] + assert result.trial_outcome_category is None + + def test_trial_document_from_dict_full(self) -> None: + """Test PTABTrialDocument.from_dict() with all nested objects.""" + data = { + "trialDocumentCategory": "Decision", + "lastModifiedDateTime": "2023-12-15T10:30:00Z", + "trialNumber": "IPR2023-00001", + "trialTypeCode": "IPR", + "trialMetaData": { + "trialStatusCategory": "Terminated", + }, + "patentOwnerData": { + "patentOwnerName": "Owner Inc", + }, + "regularPetitionerData": { + "counselName": "Petitioner Counsel", + }, + "respondentData": { + "counselName": "Respondent Counsel", + }, + "derivationPetitionerData": { + "patentNumber": "US7654321", + }, + "documentData": { + "documentName": "Decision.pdf", + "documentIdentifier": "doc-123", + }, + "decisionData": { + "decisionTypeCategory": "Final Written Decision", + "trialOutcomeCategory": "Denied", + }, + } + result = PTABTrialDocument.from_dict(data) + assert result.trial_document_category == "Decision" + assert result.last_modified_date_time == datetime(2023, 12, 15, 10, 30, 0, tzinfo=timezone.utc) + assert result.trial_number == "IPR2023-00001" + assert result.trial_type_code == "IPR" + assert result.trial_meta_data is not None + assert result.trial_meta_data.trial_status_category == "Terminated" + assert result.patent_owner_data is not None + assert result.patent_owner_data.patent_owner_name == "Owner Inc" assert result.regular_petitioner_data is not None assert result.regular_petitioner_data.counsel_name == "Petitioner Counsel" assert result.respondent_data is not None assert result.respondent_data.counsel_name == "Respondent Counsel" assert result.derivation_petitioner_data is not None assert result.derivation_petitioner_data.patent_number == "US7654321" + assert result.document_data is not None + assert result.document_data.document_name == "Decision.pdf" + assert result.decision_data is not None + assert result.decision_data.decision_type_category == "Final Written Decision" + assert result.raw_data is None + + def test_trial_document_from_dict_with_raw_data(self) -> None: + """Test PTABTrialDocument.from_dict() with include_raw_data=True.""" + data = { + "trialNumber": "IPR2023-00001", + "trialDocumentCategory": "Document", + } + result = PTABTrialDocument.from_dict(data, include_raw_data=True) + assert result.trial_number == "IPR2023-00001" + assert result.raw_data == data + + def test_trial_document_from_dict_empty(self) -> None: + """Test PTABTrialDocument.from_dict() with empty dict.""" + result = PTABTrialDocument.from_dict({}) + assert result.trial_document_category is None + assert result.last_modified_date_time is None + assert result.trial_number is None + assert result.trial_type_code is None + assert result.trial_meta_data is None + assert result.patent_owner_data is None + assert result.regular_petitioner_data is None + assert result.respondent_data is None + assert result.derivation_petitioner_data is None + assert result.document_data is None + assert result.decision_data is None + assert result.raw_data is None + + def test_trial_document_response_from_dict_full(self) -> None: + """Test PTABTrialDocumentResponse.from_dict() with multiple documents.""" + data = { + "count": 2, + "patentTrialDocumentDataBag": [ + { + "trialNumber": "IPR2023-00001", + "trialDocumentCategory": "Document", + }, + { + "trialNumber": "IPR2023-00002", + "trialDocumentCategory": "Decision", + }, + ], + } + result = PTABTrialDocumentResponse.from_dict(data) + assert result.count == 2 + assert len(result.patent_trial_document_data_bag) == 2 + assert result.patent_trial_document_data_bag[0].trial_number == "IPR2023-00001" + assert result.patent_trial_document_data_bag[0].trial_document_category == "Document" + assert result.patent_trial_document_data_bag[1].trial_number == "IPR2023-00002" + assert result.patent_trial_document_data_bag[1].trial_document_category == "Decision" + assert result.raw_data is None + + def test_trial_document_response_from_dict_with_raw_data(self) -> None: + """Test PTABTrialDocumentResponse.from_dict() with include_raw_data=True.""" + data = { + "count": 1, + "patentTrialDocumentDataBag": [ + {"trialNumber": "IPR2023-00001"}, + ], + } + result = PTABTrialDocumentResponse.from_dict(data, include_raw_data=True) + assert result.count == 1 + assert result.raw_data == data + assert len(result.patent_trial_document_data_bag) == 1 + assert result.patent_trial_document_data_bag[0].raw_data == { + "trialNumber": "IPR2023-00001" + } + + def test_trial_document_response_from_dict_empty(self) -> None: + """Test PTABTrialDocumentResponse.from_dict() with empty list.""" + result = PTABTrialDocumentResponse.from_dict({}) + assert result.count is None + assert len(result.patent_trial_document_data_bag) == 0 + assert result.raw_data is None class TestPTABAppealModels: """Tests for PTAB appeal decision models.""" + def test_appeal_metadata_from_dict_full(self) -> None: + """Test AppealMetaData.from_dict() with all fields.""" + data = { + "appealFilingDate": "2023-01-15", + "appealLastModifiedDate": "2023-06-01", + "applicationTypeCategory": "Utility", + "docketNoticeMailedDate": "2023-02-01", + "fileDownloadURI": "https://example.com/appeal.zip", + } + result = AppealMetaData.from_dict(data) + assert result.appeal_filing_date == date(2023, 1, 15) + assert result.appeal_last_modified_date == date(2023, 6, 1) + assert result.application_type_category == "Utility" + assert result.docket_notice_mailed_date == date(2023, 2, 1) + assert result.file_download_uri == "https://example.com/appeal.zip" + + def test_appeal_metadata_from_dict_empty(self) -> None: + """Test AppealMetaData.from_dict() with empty dict.""" + result = AppealMetaData.from_dict({}) + assert result.appeal_filing_date is None + assert result.appeal_last_modified_date is None + assert result.application_type_category is None + assert result.docket_notice_mailed_date is None + assert result.file_download_uri is None + def test_appellant_data_from_dict(self) -> None: """Test AppellantData.from_dict().""" data = { @@ -126,6 +566,7 @@ def test_appellant_data_from_dict(self) -> None: assert result.counsel_name == "Appellant Counsel" assert result.inventor_name == "Jane Inventor" assert result.technology_center_number == "3600" + assert result.publication_date == date(2023, 1, 15) def test_requestor_data_from_dict(self) -> None: """Test RequestorData.from_dict().""" @@ -133,8 +574,13 @@ def test_requestor_data_from_dict(self) -> None: result = RequestorData.from_dict(data) assert result.third_party_name == "Third Party Inc" - def test_appeal_document_data_from_dict(self) -> None: - """Test AppealDocumentData.from_dict().""" + def test_requestor_data_from_dict_empty(self) -> None: + """Test RequestorData.from_dict() with empty dict.""" + result = RequestorData.from_dict({}) + assert result.third_party_name is None + + def test_appeal_document_data_from_dict_full(self) -> None: + """Test AppealDocumentData.from_dict() with all fields.""" data = { "documentFilingDate": "2023-01-15", "documentIdentifier": "doc-uuid-1", @@ -145,12 +591,70 @@ def test_appeal_document_data_from_dict(self) -> None: "fileDownloadURI": "https://example.com/download", } result = AppealDocumentData.from_dict(data) + assert result.document_filing_date == date(2023, 1, 15) + assert result.document_identifier == "doc-uuid-1" assert result.document_name == "Appeal Brief" assert result.document_size_quantity == 12345 assert result.document_ocr_text == "Full OCR text content" + assert result.document_type_description_text == "Brief" + assert result.file_download_uri == "https://example.com/download" + + def test_appeal_document_data_from_dict_with_alias_downloaduri(self) -> None: + """Test AppealDocumentData.from_dict() handles downloadURI alias.""" + data = { + "documentName": "Brief.pdf", + "downloadURI": "https://example.com/brief.pdf", + } + result = AppealDocumentData.from_dict(data) + assert result.file_download_uri == "https://example.com/brief.pdf" + + def test_appeal_document_data_from_dict_with_alias_document_type(self) -> None: + """Test AppealDocumentData.from_dict() handles documentTypeCategory alias.""" + data = { + "documentName": "Decision.pdf", + "documentTypeCategory": "Decision", + } + result = AppealDocumentData.from_dict(data) + assert result.document_type_description_text == "Decision" + + def test_appeal_document_data_from_dict_empty(self) -> None: + """Test AppealDocumentData.from_dict() with empty dict.""" + result = AppealDocumentData.from_dict({}) + assert result.document_filing_date is None + assert result.document_identifier is None + assert result.document_name is None + assert result.document_size_quantity is None + assert result.document_ocr_text is None + assert result.document_type_description_text is None + assert result.file_download_uri is None + + def test_decision_data_from_dict_full(self) -> None: + """Test DecisionData.from_dict() with all fields.""" + data = { + "appealOutcomeCategory": "Affirmed", + "statuteAndRuleBag": ["35 U.S.C. § 103", "37 CFR 1.111"], + "decisionIssueDate": "2023-12-15", + "decisionTypeCategory": "Examiner Affirmed", + "issueTypeBag": ["Obviousness", "Anticipation"], + } + result = DecisionData.from_dict(data) + assert result.appeal_outcome_category == "Affirmed" + assert result.statute_and_rule_bag == ["35 U.S.C. § 103", "37 CFR 1.111"] + assert result.decision_issue_date == date(2023, 12, 15) + assert result.decision_type_category == "Examiner Affirmed" + assert result.issue_type_bag == ["Obviousness", "Anticipation"] - def test_appeal_decision_with_all_nested_objects(self) -> None: - """Test PTABAppealDecision with all nested objects.""" + def test_decision_data_from_dict_empty(self) -> None: + """Test DecisionData.from_dict() with empty dict.""" + result = DecisionData.from_dict({}) + assert result.appeal_outcome_category is None + assert result.statute_and_rule_bag == [] + assert result.decision_issue_date is None + assert result.decision_type_category is None + assert result.issue_type_bag == [] + + def test_appeal_decision_from_dict_full(self) -> None: + """Test PTABAppealDecision.from_dict() with all nested objects.""" data = { "appealNumber": "2023-001234", "lastModifiedDateTime": "2023-06-15T10:30:00Z", @@ -171,22 +675,132 @@ def test_appeal_decision_with_all_nested_objects(self) -> None: }, "decisionData": { "decisionTypeCategory": "Affirmed", - "decisionDate": "2023-06-01", + "decisionIssueDate": "2023-06-01", }, } result = PTABAppealDecision.from_dict(data) assert result.appeal_number == "2023-001234" + assert result.last_modified_date_time == datetime(2023, 6, 15, 10, 30, 0, tzinfo=timezone.utc) + assert result.appeal_document_category == "Decision" + assert result.appeal_meta_data is not None + assert result.appeal_meta_data.application_type_category == "Utility" assert result.appellant_data is not None assert result.appellant_data.counsel_name == "Test Counsel" assert result.requestor_data is not None assert result.requestor_data.third_party_name == "Third Party Inc" assert result.document_data is not None assert result.document_data.document_name == "Final Decision" + assert result.decision_data is not None + assert result.decision_data.decision_type_category == "Affirmed" + assert result.raw_data is None + + def test_appeal_decision_from_dict_with_typo_appelant(self) -> None: + """Test PTABAppealDecision.from_dict() handles 'appelantData' typo.""" + data = { + "appealNumber": "2023-001234", + "appelantData": { + "counselName": "Test Counsel", + }, + } + result = PTABAppealDecision.from_dict(data) + assert result.appellant_data is not None + assert result.appellant_data.counsel_name == "Test Counsel" + + def test_appeal_decision_from_dict_with_raw_data(self) -> None: + """Test PTABAppealDecision.from_dict() with include_raw_data=True.""" + data = { + "appealNumber": "2023-001234", + "appealDocumentCategory": "Decision", + } + result = PTABAppealDecision.from_dict(data, include_raw_data=True) + assert result.appeal_number == "2023-001234" + assert result.raw_data == data + + def test_appeal_decision_from_dict_empty(self) -> None: + """Test PTABAppealDecision.from_dict() with empty dict.""" + result = PTABAppealDecision.from_dict({}) + assert result.appeal_number is None + assert result.last_modified_date_time is None + assert result.appeal_document_category is None + assert result.appeal_meta_data is None + assert result.appellant_data is None + assert result.requestor_data is None + assert result.document_data is None + assert result.decision_data is None + assert result.raw_data is None + + def test_appeal_response_from_dict_full(self) -> None: + """Test PTABAppealResponse.from_dict() with multiple appeals.""" + data = { + "count": 2, + "requestIdentifier": "request-uuid-1", + "patentAppealDataBag": [ + { + "appealNumber": "2023-001234", + "appealDocumentCategory": "Decision", + }, + { + "appealNumber": "2023-005678", + "appealDocumentCategory": "Brief", + }, + ], + } + result = PTABAppealResponse.from_dict(data) + assert result.count == 2 + assert result.request_identifier == "request-uuid-1" + assert len(result.patent_appeal_data_bag) == 2 + assert result.patent_appeal_data_bag[0].appeal_number == "2023-001234" + assert result.patent_appeal_data_bag[0].appeal_document_category == "Decision" + assert result.patent_appeal_data_bag[1].appeal_number == "2023-005678" + assert result.patent_appeal_data_bag[1].appeal_document_category == "Brief" + assert result.raw_data is None + + def test_appeal_response_from_dict_with_raw_data(self) -> None: + """Test PTABAppealResponse.from_dict() with include_raw_data=True.""" + data = { + "count": 1, + "requestIdentifier": "request-uuid-1", + "patentAppealDataBag": [ + {"appealNumber": "2023-001234"}, + ], + } + result = PTABAppealResponse.from_dict(data, include_raw_data=True) + assert result.count == 1 + assert result.raw_data == data + assert len(result.patent_appeal_data_bag) == 1 + assert result.patent_appeal_data_bag[0].raw_data == {"appealNumber": "2023-001234"} + + def test_appeal_response_from_dict_empty(self) -> None: + """Test PTABAppealResponse.from_dict() with empty list.""" + result = PTABAppealResponse.from_dict({}) + assert result.count is None + assert result.request_identifier is None + assert len(result.patent_appeal_data_bag) == 0 + assert result.raw_data is None class TestPTABInterferenceModels: """Tests for PTAB interference decision models.""" + def test_interference_metadata_from_dict_full(self) -> None: + """Test InterferenceMetaData.from_dict() with all fields.""" + data = { + "interferenceStyleName": "Senior v. Junior", + "interferenceLastModifiedDate": "2023-03-15", + "fileDownloadURI": "https://example.com/interference.zip", + } + result = InterferenceMetaData.from_dict(data) + assert result.interference_style_name == "Senior v. Junior" + assert result.interference_last_modified_date == date(2023, 3, 15) + assert result.file_download_uri == "https://example.com/interference.zip" + + def test_interference_metadata_from_dict_empty(self) -> None: + """Test InterferenceMetaData.from_dict() with empty dict.""" + result = InterferenceMetaData.from_dict({}) + assert result.interference_style_name is None + assert result.interference_last_modified_date is None + assert result.file_download_uri is None + def test_senior_party_data_from_dict(self) -> None: """Test SeniorPartyData.from_dict().""" data = { @@ -202,6 +816,7 @@ def test_senior_party_data_from_dict(self) -> None: result = SeniorPartyData.from_dict(data) assert result.application_number_text == "12/345678" assert result.counsel_name == "Senior Counsel" + assert result.grant_date == date(2023, 1, 15) assert result.patent_owner_name == "Senior Owner" assert result.patent_number == "US1234567" @@ -222,6 +837,7 @@ def test_junior_party_data_from_dict(self) -> None: assert result.counsel_name == "Junior Counsel" assert result.inventor_name == "Jane Inventor" assert result.patent_owner_name == "Junior Owner" + assert result.publication_date == date(2023, 2, 20) def test_additional_party_data_from_dict(self) -> None: """Test AdditionalPartyData.from_dict().""" @@ -237,8 +853,68 @@ def test_additional_party_data_from_dict(self) -> None: assert result.additional_party_name == "Additional Entity" assert result.patent_number == "US1112223" - def test_interference_decision_with_all_nested_objects(self) -> None: - """Test PTABInterferenceDecision with all nested objects.""" + def test_additional_party_data_from_dict_empty(self) -> None: + """Test AdditionalPartyData.from_dict() with empty dict.""" + result = AdditionalPartyData.from_dict({}) + assert result.application_number_text is None + assert result.inventor_name is None + assert result.additional_party_name is None + assert result.patent_number is None + + def test_interference_document_data_from_dict_full(self) -> None: + """Test InterferenceDocumentData.from_dict() with all fields.""" + data = { + "documentIdentifier": "doc-uuid-1", + "documentName": "Final Decision.pdf", + "documentSizeQuantity": 234567, + "documentOCRText": "Full OCR content...", + "documentTitleText": "Final Decision on Priority", + "interferenceOutcomeCategory": "Priority to Senior Party", + "decisionIssueDate": "2023-03-15", + "decisionTypeCategory": "Final Decision", + "fileDownloadURI": "https://example.com/decision.pdf", + "statuteAndRuleBag": ["35 U.S.C. § 102", "37 CFR 41.125"], + "issueTypeBag": ["Priority", "Patentability"], + } + result = InterferenceDocumentData.from_dict(data) + assert result.document_identifier == "doc-uuid-1" + assert result.document_name == "Final Decision.pdf" + assert result.document_size_quantity == 234567 + assert result.document_ocr_text == "Full OCR content..." + assert result.document_title_text == "Final Decision on Priority" + assert result.interference_outcome_category == "Priority to Senior Party" + assert result.decision_issue_date == date(2023, 3, 15) + assert result.decision_type_category == "Final Decision" + assert result.file_download_uri == "https://example.com/decision.pdf" + assert result.statute_and_rule_bag == ["35 U.S.C. § 102", "37 CFR 41.125"] + assert result.issue_type_bag == ["Priority", "Patentability"] + + def test_interference_document_data_from_dict_with_alias_downloaduri(self) -> None: + """Test InterferenceDocumentData.from_dict() handles downloadURI alias.""" + data = { + "documentName": "Decision.pdf", + "downloadURI": "https://example.com/decision.pdf", + } + result = InterferenceDocumentData.from_dict(data) + assert result.file_download_uri == "https://example.com/decision.pdf" + + def test_interference_document_data_from_dict_empty(self) -> None: + """Test InterferenceDocumentData.from_dict() with empty dict.""" + result = InterferenceDocumentData.from_dict({}) + assert result.document_identifier is None + assert result.document_name is None + assert result.document_size_quantity is None + assert result.document_ocr_text is None + assert result.document_title_text is None + assert result.interference_outcome_category is None + assert result.decision_issue_date is None + assert result.decision_type_category is None + assert result.file_download_uri is None + assert result.statute_and_rule_bag == [] + assert result.issue_type_bag == [] + + def test_interference_decision_from_dict_full(self) -> None: + """Test PTABInterferenceDecision.from_dict() with all nested objects.""" data = { "interferenceNumber": "106123", "lastModifiedDateTime": "2023-03-15T10:30:00Z", @@ -272,6 +948,9 @@ def test_interference_decision_with_all_nested_objects(self) -> None: } result = PTABInterferenceDecision.from_dict(data) assert result.interference_number == "106123" + assert result.last_modified_date_time == datetime(2023, 3, 15, 10, 30, 0, tzinfo=timezone.utc) + assert result.interference_meta_data is not None + assert result.interference_meta_data.interference_style_name == "Senior v. Junior" assert result.senior_party_data is not None assert result.senior_party_data.patent_owner_name == "Senior Inc" assert result.junior_party_data is not None @@ -279,3 +958,88 @@ def test_interference_decision_with_all_nested_objects(self) -> None: assert len(result.additional_party_data_bag) == 2 assert result.additional_party_data_bag[0].additional_party_name == "Additional Party 1" assert result.additional_party_data_bag[1].additional_party_name == "Additional Party 2" + assert result.document_data is not None + assert result.document_data.interference_outcome_category == "Priority to Senior Party" + assert result.raw_data is None + + def test_interference_decision_from_dict_with_alias_decision_document_data( + self, + ) -> None: + """Test PTABInterferenceDecision.from_dict() handles decisionDocumentData alias.""" + data = { + "interferenceNumber": "106123", + "decisionDocumentData": { + "decisionTypeCategory": "Final Decision", + }, + } + result = PTABInterferenceDecision.from_dict(data) + assert result.document_data is not None + assert result.document_data.decision_type_category == "Final Decision" + + def test_interference_decision_from_dict_with_raw_data(self) -> None: + """Test PTABInterferenceDecision.from_dict() with include_raw_data=True.""" + data = { + "interferenceNumber": "106123", + } + result = PTABInterferenceDecision.from_dict(data, include_raw_data=True) + assert result.interference_number == "106123" + assert result.raw_data == data + + def test_interference_decision_from_dict_empty(self) -> None: + """Test PTABInterferenceDecision.from_dict() with empty dict.""" + result = PTABInterferenceDecision.from_dict({}) + assert result.interference_number is None + assert result.last_modified_date_time is None + assert result.interference_meta_data is None + assert result.senior_party_data is None + assert result.junior_party_data is None + assert len(result.additional_party_data_bag) == 0 + assert result.document_data is None + assert result.raw_data is None + + def test_interference_response_from_dict_full(self) -> None: + """Test PTABInterferenceResponse.from_dict() with multiple interferences.""" + data = { + "count": 2, + "requestIdentifier": "request-uuid-1", + "patentInterferenceDataBag": [ + { + "interferenceNumber": "106123", + }, + { + "interferenceNumber": "106456", + }, + ], + } + result = PTABInterferenceResponse.from_dict(data) + assert result.count == 2 + assert result.request_identifier == "request-uuid-1" + assert len(result.patent_interference_data_bag) == 2 + assert result.patent_interference_data_bag[0].interference_number == "106123" + assert result.patent_interference_data_bag[1].interference_number == "106456" + assert result.raw_data is None + + def test_interference_response_from_dict_with_raw_data(self) -> None: + """Test PTABInterferenceResponse.from_dict() with include_raw_data=True.""" + data = { + "count": 1, + "requestIdentifier": "request-uuid-1", + "patentInterferenceDataBag": [ + {"interferenceNumber": "106123"}, + ], + } + result = PTABInterferenceResponse.from_dict(data, include_raw_data=True) + assert result.count == 1 + assert result.raw_data == data + assert len(result.patent_interference_data_bag) == 1 + assert result.patent_interference_data_bag[0].raw_data == { + "interferenceNumber": "106123" + } + + def test_interference_response_from_dict_empty(self) -> None: + """Test PTABInterferenceResponse.from_dict() with empty list.""" + result = PTABInterferenceResponse.from_dict({}) + assert result.count is None + assert result.request_identifier is None + assert len(result.patent_interference_data_bag) == 0 + assert result.raw_data is None From 38ad709184e749329565bc71bf97f6d279388f83 Mon Sep 17 00:00:00 2001 From: Andrew Date: Wed, 3 Dec 2025 15:03:58 -0600 Subject: [PATCH 06/17] Update patent_data models and integration tests --- .gitignore | 1 + src/pyUSPTO/models/patent_data.py | 61 +++-- tests/integration/conftest.py | 8 +- .../test_patent_data_integration.py | 224 ++++++++++++++---- tests/models/test_patent_data_models.py | 63 ++--- 5 files changed, 249 insertions(+), 108 deletions(-) diff --git a/.gitignore b/.gitignore index 72e5097..0b24e70 100644 --- a/.gitignore +++ b/.gitignore @@ -18,3 +18,4 @@ dist/ .claude/settings.local.json .tox/ Python/ +run_integration_tests.py diff --git a/src/pyUSPTO/models/patent_data.py b/src/pyUSPTO/models/patent_data.py index fe43a4c..9ebb749 100644 --- a/src/pyUSPTO/models/patent_data.py +++ b/src/pyUSPTO/models/patent_data.py @@ -430,8 +430,7 @@ def to_dict(self) -> Dict[str, Any]: Returns: Dict[str, Any]: A dictionary representation of the address. """ - - return { + _dict = { "nameLineOneText": self.name_line_one_text, "nameLineTwoText": self.name_line_two_text, "addressLineOneText": self.address_line_one_text, @@ -450,6 +449,8 @@ def to_dict(self) -> Dict[str, Any]: "ictStateCode": self.ict_state_code, "ictCountryCode": self.ict_country_code, } + # Filter out None values to match API behavior + return {k: v for k, v in _dict.items() if v is not None} @dataclass(frozen=True) @@ -488,11 +489,13 @@ def to_dict(self) -> Dict[str, Any]: Returns: Dict[str, Any]: Dictionary representation with camelCase keys. """ - return { + _dict = { "telecommunicationNumber": self.telecommunication_number, "extensionNumber": self.extension_number, "telecomTypeCode": self.telecom_type_code, } + # Filter out None values to match API behavior + return {k: v for k, v in _dict.items() if v is not None} @dataclass(frozen=True) @@ -864,14 +867,12 @@ class RecordAttorney: Contains customer number correspondence data, power of attorney information, and listed attorneys. Attributes: - customer_number_correspondence_data: List of `CustomerNumberCorrespondence` objects. + customer_number_correspondence_data: `CustomerNumberCorrespondence` object with customer number details. power_of_attorney_bag: List of `Attorney` objects named in a power of attorney. attorney_bag: List of `Attorney` objects listed as attorneys of record. """ - customer_number_correspondence_data: List[CustomerNumberCorrespondence] = field( - default_factory=list - ) + customer_number_correspondence_data: Optional[CustomerNumberCorrespondence] = None power_of_attorney_bag: List[Attorney] = field(default_factory=list) attorney_bag: List[Attorney] = field(default_factory=list) @@ -885,11 +886,12 @@ def from_dict(cls, data: Dict[str, Any]) -> "RecordAttorney": Returns: RecordAttorney: An instance of `RecordAttorney`. """ - cust_corr = [ - CustomerNumberCorrespondence.from_dict(c) - for c in data.get("customerNumberCorrespondenceData", []) - if isinstance(c, dict) - ] + cust_corr_data = data.get("customerNumberCorrespondenceData") + cust_corr = ( + CustomerNumberCorrespondence.from_dict(cust_corr_data) + if isinstance(cust_corr_data, dict) + else None + ) poa_bag = [ Attorney.from_dict(a) for a in data.get("powerOfAttorneyBag", []) @@ -909,23 +911,21 @@ def from_dict(cls, data: Dict[str, Any]) -> "RecordAttorney": def to_dict(self) -> Dict[str, Any]: """Converts the `RecordAttorney` instance to a dictionary. - Omits keys with None values or empty lists. + Omits keys with None values. Includes empty lists to match API behavior. Returns: Dict[str, Any]: Dictionary representation. """ d = { - "customerNumberCorrespondenceData": [ - c.to_dict() for c in self.customer_number_correspondence_data - ], + "customerNumberCorrespondenceData": ( + self.customer_number_correspondence_data.to_dict() + if self.customer_number_correspondence_data + else None + ), "powerOfAttorneyBag": [p.to_dict() for p in self.power_of_attorney_bag], "attorneyBag": [a.to_dict() for a in self.attorney_bag], } - return { - k: v - for k, v in d.items() - if v is not None and (not isinstance(v, list) or v) - } + return {k: v for k, v in d.items() if v is not None} @dataclass(frozen=True) @@ -1112,7 +1112,7 @@ def to_dict(self) -> Dict[str, Any]: Returns: Dict[str, Any]: Dictionary representation with camelCase keys. """ - return { + _dict = { "reelNumber": self.reel_number, "frameNumber": self.frame_number, "reelAndFrameNumber": self.reel_and_frame_number, @@ -1137,6 +1137,8 @@ def to_dict(self) -> Dict[str, Any]: else None ), } + # Filter out None values to match API behavior + return {k: v for k, v in _dict.items() if v is not None} @dataclass(frozen=True) @@ -1404,6 +1406,7 @@ class PatentTermAdjustmentHistoryData: event_sequence_number: Sequence number of this event in the PTA history. originating_event_sequence_number: Sequence number of an event that originated this event. pta_pte_code: Code indicating if the event relates to PTA or Patent Term Extension (PTE). + ip_office_day_delay_quantity: Number of days of delay attributable to the IP office for this event. """ event_date: Optional[date] = None @@ -1412,6 +1415,7 @@ class PatentTermAdjustmentHistoryData: event_sequence_number: Optional[float] = None originating_event_sequence_number: Optional[float] = None pta_pte_code: Optional[str] = None + ip_office_day_delay_quantity: Optional[float] = None @classmethod def from_dict(cls, data: Dict[str, Any]) -> "PatentTermAdjustmentHistoryData": @@ -1432,6 +1436,7 @@ def from_dict(cls, data: Dict[str, Any]) -> "PatentTermAdjustmentHistoryData": "originatingEventSequenceNumber" ), pta_pte_code=data.get("ptaPTECode"), + ip_office_day_delay_quantity=data.get("ipOfficeDayDelayQuantity"), ) def to_dict(self) -> Dict[str, Any]: @@ -1457,6 +1462,8 @@ def to_dict(self) -> Dict[str, Any]: ) if self.pta_pte_code is not None: final_dict["ptaPTECode"] = self.pta_pte_code + if self.ip_office_day_delay_quantity is not None: + final_dict["ipOfficeDayDelayQuantity"] = self.ip_office_day_delay_quantity return final_dict @@ -1476,6 +1483,8 @@ class PatentTermAdjustmentData: non_overlapping_day_quantity: Number of non-overlapping delay days. overlapping_day_quantity: Number of overlapping delay days. ip_office_day_delay_quantity: Total days of delay attributable to the IP office. + non_overlapping_day_delay_quantity: Number of non-overlapping delay days specifically for delay calculation. + ip_office_adjustment_delay_quantity: Days of IP office delay used in adjustment calculation. patent_term_adjustment_history_data_bag: List of `PatentTermAdjustmentHistoryData` events. """ @@ -1487,6 +1496,8 @@ class PatentTermAdjustmentData: non_overlapping_day_quantity: Optional[float] = None overlapping_day_quantity: Optional[float] = None ip_office_day_delay_quantity: Optional[float] = None + non_overlapping_day_delay_quantity: Optional[float] = None + ip_office_adjustment_delay_quantity: Optional[float] = None patent_term_adjustment_history_data_bag: List[PatentTermAdjustmentHistoryData] = ( field(default_factory=list) ) @@ -1515,6 +1526,12 @@ def from_dict(cls, data: Dict[str, Any]) -> "PatentTermAdjustmentData": non_overlapping_day_quantity=data.get("nonOverlappingDayQuantity"), overlapping_day_quantity=data.get("overlappingDayQuantity"), ip_office_day_delay_quantity=data.get("ipOfficeDayDelayQuantity"), + non_overlapping_day_delay_quantity=data.get( + "nonOverlappingDayDelayQuantity" + ), + ip_office_adjustment_delay_quantity=data.get( + "ipOfficeAdjustmentDelayQuantity" + ), patent_term_adjustment_history_data_bag=history, ) diff --git a/tests/integration/conftest.py b/tests/integration/conftest.py index 7282298..1717290 100644 --- a/tests/integration/conftest.py +++ b/tests/integration/conftest.py @@ -33,11 +33,13 @@ def manage_test_download_dir() -> Iterator[None]: shutil.rmtree(TEST_DOWNLOAD_DIR) -@pytest.fixture +@pytest.fixture(scope="module") def api_key() -> Optional[str]: """ Get the API key from the environment. + Uses module scope to cache the API key for all tests in the module. + Returns: Optional[str]: The API key or None if not set """ @@ -49,11 +51,13 @@ def api_key() -> Optional[str]: return key -@pytest.fixture +@pytest.fixture(scope="module") def config(api_key: Optional[str]) -> USPTOConfig: """ Create a USPTOConfig instance for integration tests. + Uses module scope to reuse the same config for all tests in the module. + Args: api_key: The API key from the environment diff --git a/tests/integration/test_patent_data_integration.py b/tests/integration/test_patent_data_integration.py index fe64abc..0e6b224 100644 --- a/tests/integration/test_patent_data_integration.py +++ b/tests/integration/test_patent_data_integration.py @@ -29,7 +29,6 @@ PatentDataResponse, PatentFileWrapper, PatentTermAdjustmentData, - PrintedMetaData, PrintedPublication, RecordAttorney, StatusCode, @@ -44,11 +43,14 @@ ) -@pytest.fixture +@pytest.fixture(scope="module") def patent_data_client(config: USPTOConfig) -> PatentDataClient: """ Create a PatentDataClient instance for integration tests. + Uses module scope to reuse the same client for all tests in the module, + reducing overhead from creating multiple client instances. + Args: config: The configuration instance @@ -58,13 +60,16 @@ def patent_data_client(config: USPTOConfig) -> PatentDataClient: return PatentDataClient(config=config) -@pytest.fixture +@pytest.fixture(scope="module") def sample_application_number(patent_data_client: PatentDataClient) -> str: - """Provides a sample application number for tests.""" + """Provides a sample application number for tests. + + Uses module scope to execute once per test module and cache the result, + reducing redundant API calls from 11 to 1. + """ try: - # Updated to use search_applications (GET path) response = patent_data_client.search_applications( - query='applicationMetaData.applicationTypeCategory:Utility AND applicationMetaData.applicationStatusDescriptionText:(Pending OR "Patented Case")', + query='applicationMetaData.applicationTypeLabelName:Utility AND applicationMetaData.applicationStatusDescriptionText:"Patented Case"', limit=1, ) if response.count > 0 and response.patent_file_wrapper_data_bag: @@ -90,11 +95,10 @@ class TestPatentDataIntegration: KNOWN_APP_NUM_WITH_DOCS = "18045436" - def test_search_applications_get( # Renamed test + def test_search_applications_get( self, patent_data_client: PatentDataClient ) -> None: """Test getting patent applications from the API using GET path of search_applications.""" - # Updated to use search_applications response = patent_data_client.search_applications( query="applicationMetaData.applicationTypeLabelName:Utility", limit=2 ) @@ -114,9 +118,8 @@ def test_search_applications_get( # Renamed test def test_search_applications_with_convenience_q_param( self, patent_data_client: PatentDataClient - ) -> None: # Renamed test + ) -> None: """Test searching for patents using convenience _q parameters of search_applications.""" - # Updated to use search_applications with _q parameter response = patent_data_client.search_applications( assignee_name_q="International Business Machines", limit=2 ) @@ -133,11 +136,10 @@ def test_search_applications_with_convenience_q_param( else: assert response.patent_file_wrapper_data_bag == [] - def test_get_application_by_number( # Renamed test + def test_get_application_by_number( self, patent_data_client: PatentDataClient, sample_application_number: str ) -> None: """Test getting a specific patent by application number.""" - # Updated to use get_application_by_number patent_wrapper = patent_data_client.get_application_by_number( sample_application_number ) @@ -149,11 +151,153 @@ def test_get_application_by_number( # Renamed test assert isinstance(patent_wrapper.application_meta_data, ApplicationMetaData) assert patent_wrapper.application_meta_data.invention_title is not None - def test_get_status_codes( # Renamed test - self, patent_data_client: PatentDataClient + def test_to_dict_matches_raw_api_response( + self, api_key: Optional[str], sample_application_number: str ) -> None: + """Test that to_dict() output matches the original API response stored in raw_data. + + This test compares the to_dict() serialization with the original API response + to ensure that the model correctly reconstructs the API format. Some differences + are expected (e.g., requestIdentifier field is not part of the model). + """ + # TEMPORARILY DISABLED: See GitHub issue #17 + # API returns naive datetime strings (e.g., '2025-12-03T07:21:12') without timezone + # indicators, but we serialize with UTC 'Z' suffix (e.g., '2025-12-03T12:21:12Z'). + # Waiting for USPTO ODP to adopt UTC standard for datetime fields. + pytest.skip( + "Test disabled pending USPTO API fix for datetime format. See issue #17" + ) + + # Create a config with include_raw_data=True to preserve original API JSON + config_with_raw = USPTOConfig(api_key=api_key, include_raw_data=True) + client_with_raw = PatentDataClient(config=config_with_raw) + + # Use search_applications to get a PatentDataResponse (which has raw_data) + response = client_with_raw.search_applications( + application_number_q=sample_application_number, limit=1 + ) + + assert response is not None + assert isinstance(response, PatentDataResponse) + assert response.raw_data is not None, ( + "raw_data should be populated when include_raw_data=True" + ) + + # Parse the raw API response JSON + import json + + raw_api_dict = json.loads(response.raw_data) + + # Convert the model back to dict + to_dict_output = response.to_dict() + + # Fields that are expected to be in raw API but not in model serialization + # (these are API metadata, not domain data) + expected_missing_fields = {"requestIdentifier"} + + # Remove expected metadata fields from raw API for comparison + raw_api_dict_filtered = { + k: v for k, v in raw_api_dict.items() if k not in expected_missing_fields + } + + # Deep comparison of the two dictionaries + def compare_dicts(dict1, dict2, path=""): + """Recursively compare two dictionaries and report differences.""" + differences = [] + + # Check keys present in dict1 but not dict2 + keys1 = set(dict1.keys()) + keys2 = set(dict2.keys()) + + missing_in_dict2 = keys1 - keys2 + if missing_in_dict2: + differences.append( + f"Keys in to_dict but not in raw API at {path}: {missing_in_dict2}" + ) + + missing_in_dict1 = keys2 - keys1 + if missing_in_dict1: + differences.append( + f"Keys in raw API but not in to_dict at {path}: {missing_in_dict1}" + ) + + # Compare values for common keys + for key in keys1 & keys2: + val1 = dict1[key] + val2 = dict2[key] + current_path = f"{path}.{key}" if path else key + + if type(val1) != type(val2): + differences.append( + f"Type mismatch at {current_path}: {type(val1).__name__} vs {type(val2).__name__}" + ) + elif isinstance(val1, dict): + differences.extend(compare_dicts(val1, val2, current_path)) + elif isinstance(val1, list): + if len(val1) != len(val2): + differences.append( + f"List length mismatch at {current_path}: {len(val1)} vs {len(val2)}" + ) + else: + for i, (item1, item2) in enumerate(zip(val1, val2)): + if isinstance(item1, dict) and isinstance(item2, dict): + differences.extend( + compare_dicts(item1, item2, f"{current_path}[{i}]") + ) + elif item1 != item2: + differences.append( + f"Value mismatch at {current_path}[{i}]: {item1!r} vs {item2!r}" + ) + elif val1 != val2: + differences.append( + f"Value mismatch at {current_path}: {val1!r} vs {val2!r}" + ) + + return differences + + # Perform the comparison + differences = compare_dicts(to_dict_output, raw_api_dict_filtered) + + # If there are differences, print them and fail + if differences: + diff_report = "\n".join(differences[:20]) # Limit to first 20 differences + if len(differences) > 20: + diff_report += f"\n... and {len(differences) - 20} more differences" + pytest.fail( + f"to_dict() output does not match raw API response. Differences found:\n{diff_report}" + ) + + def test_round_trip_data_integrity( + self, patent_data_client: PatentDataClient, sample_application_number: str + ) -> None: + """Test that parsing and serialization preserves data (round-trip test).""" + # Get application from API + original = patent_data_client.get_application_by_number(sample_application_number) + + assert original is not None + + # Convert to dict + data_dict = original.to_dict() + + # Parse back from dict + reconstructed = PatentFileWrapper.from_dict(data_dict) + + # Verify key fields match + assert reconstructed.application_number_text == original.application_number_text + + if original.application_meta_data: + assert reconstructed.application_meta_data is not None + assert ( + reconstructed.application_meta_data.invention_title + == original.application_meta_data.invention_title + ) + assert ( + reconstructed.application_meta_data.filing_date + == original.application_meta_data.filing_date + ) + + def test_get_status_codes(self, patent_data_client: PatentDataClient) -> None: """Test getting patent status codes.""" - # Updated to use get_status_codes status_codes_response = patent_data_client.get_status_codes() assert status_codes_response is not None @@ -271,9 +415,7 @@ def test_get_application_attorney( has_attorney_info = True if attorney_data.customer_number_correspondence_data: assert ( - attorney_data.customer_number_correspondence_data[ - 0 - ].patron_identifier + attorney_data.customer_number_correspondence_data.patron_identifier is not None ) has_attorney_info = True @@ -432,11 +574,16 @@ def test_get_application_associated_documents( f"No associated documents data for {sample_application_number}" ) - assert isinstance(assoc_docs_data, PrintedMetaData) - assert ( - assoc_docs_data.pgpub_document_meta_data is not None - or assoc_docs_data.grant_document_meta_data is not None - ) + assert isinstance(assoc_docs_data, PrintedPublication) + + # Skip if no document metadata is available + if ( + assoc_docs_data.pgpub_document_meta_data is None + and assoc_docs_data.grant_document_meta_data is None + ): + pytest.skip( + f"No pgpub or grant document metadata for {sample_application_number}" + ) if assoc_docs_data.pgpub_document_meta_data: assert ( assoc_docs_data.pgpub_document_meta_data.file_location_uri @@ -458,7 +605,7 @@ def test_get_application_associated_documents( def test_download_application_document( self, patent_data_client: PatentDataClient - ) -> None: # Renamed test + ) -> None: """Test downloading a document file.""" try: documents_bag = patent_data_client.get_application_documents( @@ -503,16 +650,15 @@ def test_download_application_document( f"No documents available in bag for {self.KNOWN_APP_NUM_WITH_DOCS} to test download." ) - def test_search_applications_post( # Renamed test + def test_search_applications_post( self, patent_data_client: PatentDataClient ) -> None: """Test searching patent applications using POST method with search_applications.""" - search_request_body = { # Renamed from search_request to search_request_body for clarity - "q": "applicationMetaData.applicationTypeCategory:Utility AND applicationMetaData.inventionTitle:(computer OR software)", + search_request_body = { + "q": "applicationMetaData.applicationTypeLabelName:Utility AND applicationMetaData.inventionTitle:(computer OR software)", "pagination": {"offset": 0, "limit": 2}, } try: - # Updated to use search_applications with post_body response = patent_data_client.search_applications( post_body=search_request_body ) @@ -531,16 +677,12 @@ def test_search_applications_post( # Renamed test except USPTOApiError as e: pytest.skip(f"POST search failed: {e}") - def test_get_search_results_get( # Renamed test - self, patent_data_client: PatentDataClient - ) -> None: + def test_get_search_results_get(self, patent_data_client: PatentDataClient) -> None: """Test getting search results (as JSON structure) using GET path of get_search_results.""" - # format is now handled internally by get_search_results for GET try: - # Updated to use get_search_results response = patent_data_client.get_search_results( query=f"applicationNumberText:{self.KNOWN_APP_NUM_WITH_DOCS}", - limit=1, # Pass as keyword argument + limit=1, ) assert response is not None assert isinstance(response, PatentDataResponse) @@ -558,18 +700,16 @@ def test_get_search_results_get( # Renamed test except USPTOApiError as e: pytest.skip(f"get_search_results GET test failed: {e}") - def test_get_search_results_post( # Renamed test + def test_get_search_results_post( self, patent_data_client: PatentDataClient ) -> None: """Test getting search results (as JSON structure) using POST path of get_search_results.""" - # format should be part of the post_body for POST requests to this endpoint - post_body_request = { # Renamed for clarity + post_body_request = { "q": f"applicationNumberText:{self.KNOWN_APP_NUM_WITH_DOCS}", "pagination": {"offset": 0, "limit": 1}, - "format": "json", # Explicitly set format for POST body + "format": "json", } try: - # Updated to use get_search_results with post_body response = patent_data_client.get_search_results( post_body=post_body_request ) @@ -590,7 +730,7 @@ def test_get_search_results_post( # Renamed test except USPTOApiError as e: pytest.skip(f"get_search_results POST test failed: {e}") - def test_search_status_codes_post( # Renamed test + def test_search_status_codes_post( self, patent_data_client: PatentDataClient ) -> None: """Test searching status codes using POST method with search_status_codes.""" @@ -599,7 +739,6 @@ def test_search_status_codes_post( # Renamed test "pagination": {"offset": 0, "limit": 5}, } try: - # Updated to use search_status_codes response = patent_data_client.search_status_codes(search_request) assert response is not None assert isinstance(response, StatusCodeSearchResponse) @@ -628,6 +767,9 @@ def test_invalid_application_number_handling( assert ( metadata is None ), "Expected None for invalid application number if client handles 404 by returning None" + except ValueError as e: + # Client validates application number format before API call + assert "Invalid application number format" in str(e) except USPTOApiNotFoundError as e: assert e.status_code == 404, f"Expected 404 error, got {e.status_code}" except USPTOApiError as e: diff --git a/tests/models/test_patent_data_models.py b/tests/models/test_patent_data_models.py index 439078a..84978b0 100644 --- a/tests/models/test_patent_data_models.py +++ b/tests/models/test_patent_data_models.py @@ -82,9 +82,6 @@ def sample_address_data() -> Dict[str, Any]: "countryName": "United States", "postalAddressCategory": "Mailing", "correspondentNameText": "Test Correspondent", - "countryOrStateCode": None, - "ictStateCode": None, - "ictCountryCode": None, } @@ -507,9 +504,7 @@ def sample_record_attorney_data( attorney_2_data["lastName"] = "Practitioner" return { - "customerNumberCorrespondenceData": [ - sample_customer_number_correspondence_data - ], + "customerNumberCorrespondenceData": sample_customer_number_correspondence_data, "powerOfAttorneyBag": [sample_attorney_data], "attorneyBag": [ sample_attorney_data, @@ -869,26 +864,8 @@ def test_address_from_dict_empty(self) -> None: def test_address_to_dict_empty(self) -> None: address = Address() - expected_camel_case_empty_dict = { - "nameLineOneText": None, - "nameLineTwoText": None, - "addressLineOneText": None, - "addressLineTwoText": None, - "addressLineThreeText": None, - "addressLineFourText": None, - "geographicRegionName": None, - "geographicRegionCode": None, - "postalCode": None, - "cityName": None, - "countryCode": None, - "countryName": None, - "postalAddressCategory": None, - "correspondentNameText": None, - "countryOrStateCode": None, - "ictStateCode": None, - "ictCountryCode": None, - } - assert address.to_dict() == expected_camel_case_empty_dict + # Empty address should serialize to empty dict (None values are filtered out) + assert address.to_dict() == {} class TestTelecommunication: @@ -930,11 +907,8 @@ def test_telecommunication_from_dict_empty(self) -> None: def test_telecommunication_to_dict_empty(self) -> None: telecom = Telecommunication() - assert telecom.to_dict() == { - "telecommunicationNumber": None, - "extensionNumber": None, - "telecomTypeCode": None, - } + # Empty telecommunication should serialize to empty dict (None values are filtered out) + assert telecom.to_dict() == {} class TestPerson: @@ -1206,16 +1180,17 @@ def test_record_attorney_from_dict( self, sample_attorney_data: Dict[str, Any] ) -> None: data = { - "customerNumberCorrespondenceData": [ - {"patronIdentifier": 12345, "organizationStandardName": "Test Law Firm"} - ], + "customerNumberCorrespondenceData": { + "patronIdentifier": 12345, + "organizationStandardName": "Test Law Firm", + }, "powerOfAttorneyBag": [sample_attorney_data], "attorneyBag": [sample_attorney_data], } record_attorney = RecordAttorney.from_dict(data) - assert len(record_attorney.customer_number_correspondence_data) == 1 + assert record_attorney.customer_number_correspondence_data is not None assert ( - record_attorney.customer_number_correspondence_data[0].patron_identifier + record_attorney.customer_number_correspondence_data.patron_identifier == 12345 ) assert len(record_attorney.power_of_attorney_bag) == 1 @@ -1236,13 +1211,13 @@ def test_record_attorney_to_dict( cust_corr_obj = CustomerNumberCorrespondence(patron_identifier=999) record_attorney = RecordAttorney( - customer_number_correspondence_data=[cust_corr_obj], + customer_number_correspondence_data=cust_corr_obj, power_of_attorney_bag=[attorney_obj], attorney_bag=[attorney_obj], ) data = record_attorney.to_dict() - assert len(data["customerNumberCorrespondenceData"]) == 1 - assert data["customerNumberCorrespondenceData"][0]["patronIdentifier"] == 999 + assert "customerNumberCorrespondenceData" in data + assert data["customerNumberCorrespondenceData"]["patronIdentifier"] == 999 assert len(data["powerOfAttorneyBag"]) == 1 assert ( data["powerOfAttorneyBag"][0]["firstName"] @@ -1252,12 +1227,13 @@ def test_record_attorney_to_dict( def test_record_attorney_to_dict_all_empty_bags(self) -> None: record_attorney = RecordAttorney( - customer_number_correspondence_data=[], + customer_number_correspondence_data=None, power_of_attorney_bag=[], attorney_bag=[], ) data = record_attorney.to_dict() - assert data == {} + # Empty lists are now included to match API behavior + assert data == {"powerOfAttorneyBag": [], "attorneyBag": []} def test_record_attorney_roundtrip( self, sample_record_attorney_data: Dict[str, Any] @@ -1412,8 +1388,9 @@ def test_assignment_to_dict_empty_bags(self) -> None: assert data["reelNumber"] == 2002 assert data["assignorBag"] == [] assert data["assigneeBag"] == [] - assert data["correspondenceAddress"] is None - assert data["domesticRepresentative"] is None + # None values are filtered out, so these keys won't exist + assert "correspondenceAddress" not in data + assert "domesticRepresentative" not in data def test_assignment_roundtrip( self, From 65b637fb8c38f05041fc6b89c175bd7ae9a19ed2 Mon Sep 17 00:00:00 2001 From: Andrew Date: Thu, 4 Dec 2025 17:26:19 -0600 Subject: [PATCH 07/17] update patent_data to match API. Update ptab tests for py3.10. update pypi metadata --- .gitignore | 1 + pyproject.toml | 21 +++- src/pyUSPTO/models/patent_data.py | 17 +-- src/pyUSPTO/models/ptab.py | 7 +- tests/models/test_patent_data_models.py | 18 ++-- tests/models/test_ptab_models.py | 135 +++++++++++++++++++++--- tox.ini | 2 + 7 files changed, 171 insertions(+), 30 deletions(-) diff --git a/.gitignore b/.gitignore index 0b24e70..a219980 100644 --- a/.gitignore +++ b/.gitignore @@ -19,3 +19,4 @@ dist/ .tox/ Python/ run_integration_tests.py +.plan.md diff --git a/pyproject.toml b/pyproject.toml index 721b6ca..fc0c632 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -20,14 +20,33 @@ classifiers = [ "Programming Language :: Python :: 3.13", "Programming Language :: Python :: 3.14", "Operating System :: OS Independent", - "Development Status :: 3 - Alpha", + "Development Status :: 4 - Beta", + "Environment :: Console", "Intended Audience :: Developers", + "Intended Audience :: Education", + "Intended Audience :: Information Technology", + "Intended Audience :: Legal Industry", + "Intended Audience :: Science/Research", + "Intended Audience :: Other Audience", + "Natural Language :: English", + "Operating System :: OS Independent", + "Operating System :: MacOS", + "Operating System :: POSIX :: Linux", "Topic :: Software Development :: Libraries", + "Topic :: Scientific/Engineering", "Topic :: Scientific/Engineering :: Information Analysis", + "Topic :: Education", + "Topic :: Internet :: WWW/HTTP", + "Topic :: Office/Business", + "Topic :: Scientific/Engineering :: Interface Engine/Protocol Translator", + "Topic :: Software Development :: Libraries :: Python Modules", + "Topic :: Utilities" ] + keywords = ["uspto", "patent", "odp", "client", "bulk data", "patent data"] dependencies = [ "requests>=2.32.5", + "typing-extensions>=4.0.0; python_version < '3.11'", ] dynamic = ["version"] diff --git a/src/pyUSPTO/models/patent_data.py b/src/pyUSPTO/models/patent_data.py index 9ebb749..90240ff 100644 --- a/src/pyUSPTO/models/patent_data.py +++ b/src/pyUSPTO/models/patent_data.py @@ -1406,7 +1406,7 @@ class PatentTermAdjustmentHistoryData: event_sequence_number: Sequence number of this event in the PTA history. originating_event_sequence_number: Sequence number of an event that originated this event. pta_pte_code: Code indicating if the event relates to PTA or Patent Term Extension (PTE). - ip_office_day_delay_quantity: Number of days of delay attributable to the IP office for this event. + ip_office_adjustment_delay_quantity: Number of days of IP office delay used in adjustment calculation for this event. """ event_date: Optional[date] = None @@ -1415,7 +1415,7 @@ class PatentTermAdjustmentHistoryData: event_sequence_number: Optional[float] = None originating_event_sequence_number: Optional[float] = None pta_pte_code: Optional[str] = None - ip_office_day_delay_quantity: Optional[float] = None + ip_office_adjustment_delay_quantity: Optional[float] = None @classmethod def from_dict(cls, data: Dict[str, Any]) -> "PatentTermAdjustmentHistoryData": @@ -1436,7 +1436,9 @@ def from_dict(cls, data: Dict[str, Any]) -> "PatentTermAdjustmentHistoryData": "originatingEventSequenceNumber" ), pta_pte_code=data.get("ptaPTECode"), - ip_office_day_delay_quantity=data.get("ipOfficeDayDelayQuantity"), + ip_office_adjustment_delay_quantity=data.get( + "ipOfficeAdjustmentDelayQuantity" + ), ) def to_dict(self) -> Dict[str, Any]: @@ -1462,8 +1464,10 @@ def to_dict(self) -> Dict[str, Any]: ) if self.pta_pte_code is not None: final_dict["ptaPTECode"] = self.pta_pte_code - if self.ip_office_day_delay_quantity is not None: - final_dict["ipOfficeDayDelayQuantity"] = self.ip_office_day_delay_quantity + if self.ip_office_adjustment_delay_quantity is not None: + final_dict["ipOfficeAdjustmentDelayQuantity"] = ( + self.ip_office_adjustment_delay_quantity + ) return final_dict @@ -1482,7 +1486,6 @@ class PatentTermAdjustmentData: c_delay_quantity: Number of days of 'C' delay. non_overlapping_day_quantity: Number of non-overlapping delay days. overlapping_day_quantity: Number of overlapping delay days. - ip_office_day_delay_quantity: Total days of delay attributable to the IP office. non_overlapping_day_delay_quantity: Number of non-overlapping delay days specifically for delay calculation. ip_office_adjustment_delay_quantity: Days of IP office delay used in adjustment calculation. patent_term_adjustment_history_data_bag: List of `PatentTermAdjustmentHistoryData` events. @@ -1495,7 +1498,6 @@ class PatentTermAdjustmentData: c_delay_quantity: Optional[float] = None non_overlapping_day_quantity: Optional[float] = None overlapping_day_quantity: Optional[float] = None - ip_office_day_delay_quantity: Optional[float] = None non_overlapping_day_delay_quantity: Optional[float] = None ip_office_adjustment_delay_quantity: Optional[float] = None patent_term_adjustment_history_data_bag: List[PatentTermAdjustmentHistoryData] = ( @@ -1525,7 +1527,6 @@ def from_dict(cls, data: Dict[str, Any]) -> "PatentTermAdjustmentData": c_delay_quantity=data.get("cDelayQuantity"), non_overlapping_day_quantity=data.get("nonOverlappingDayQuantity"), overlapping_day_quantity=data.get("overlappingDayQuantity"), - ip_office_day_delay_quantity=data.get("ipOfficeDayDelayQuantity"), non_overlapping_day_delay_quantity=data.get( "nonOverlappingDayDelayQuantity" ), diff --git a/src/pyUSPTO/models/ptab.py b/src/pyUSPTO/models/ptab.py index 3fb0c3d..61cac5f 100644 --- a/src/pyUSPTO/models/ptab.py +++ b/src/pyUSPTO/models/ptab.py @@ -12,7 +12,12 @@ import json from dataclasses import dataclass, field from datetime import date, datetime -from typing import Any, Dict, List, Optional, Self +from typing import Any, Dict, List, Optional + +try: + from typing import Self +except ImportError: + from typing_extensions import Self # Import parsing utilities from models utils module from pyUSPTO.models.utils import ( diff --git a/tests/models/test_patent_data_models.py b/tests/models/test_patent_data_models.py index 84978b0..77aa5cd 100644 --- a/tests/models/test_patent_data_models.py +++ b/tests/models/test_patent_data_models.py @@ -442,7 +442,7 @@ def sample_pta_history_data() -> Dict[str, Any]: "applicantDayDelayQuantity": 5.0, "eventDescriptionText": "Applicant Delay - Late Response", "eventSequenceNumber": 2.0, - "ipOfficeDayDelayQuantity": 0.0, + "ipOfficeAdjustmentDelayQuantity": 0.0, "originatingEventSequenceNumber": 1.0, "ptaPTECode": "APL", } @@ -463,7 +463,7 @@ def sample_patent_term_adjustment_data( "grantDate": "2023-11-20", "nonOverlappingDayQuantity": 120.0, "overlappingDayQuantity": 20.0, - "ipOfficeDayDelayQuantity": 130.0, + "ipOfficeAdjustmentDelayQuantity": 130.0, "patentTermAdjustmentHistoryDataBag": [ sample_pta_history_data, { @@ -471,7 +471,7 @@ def sample_patent_term_adjustment_data( "applicantDayDelayQuantity": 0.0, "eventDescriptionText": "USPTO Delay - Examination", "eventSequenceNumber": 1.0, - "ipOfficeDayDelayQuantity": 15.0, + "ipOfficeAdjustmentDelayQuantity": 15.0, "originatingEventSequenceNumber": 0.0, "ptaPTECode": "PTO", }, @@ -1372,9 +1372,14 @@ def test_assignment_to_dict(self, sample_address_data: Dict[str, Any]) -> None: assert len(data["assignorBag"]) == 1 assert len(data["assigneeBag"]) == 1 assert data["correspondenceAddress"] is not None - assert data["correspondenceAddress"]["cityName"] == sample_address_data["cityName"] + assert ( + data["correspondenceAddress"]["cityName"] == sample_address_data["cityName"] + ) assert data["domesticRepresentative"] is not None - assert data["domesticRepresentative"]["cityName"] == sample_address_data["cityName"] + assert ( + data["domesticRepresentative"]["cityName"] + == sample_address_data["cityName"] + ) def test_assignment_to_dict_empty_bags(self) -> None: assignment = Assignment( @@ -1527,7 +1532,7 @@ def test_pta_history_from_dict(self) -> None: "applicantDayDelayQuantity": 10.0, "eventDescriptionText": "Response to Office Action", "eventSequenceNumber": 1.0, - "ipOfficeDayDelayQuantity": 5.0, + "ipOfficeAdjustmentDelayQuantity": 5.0, "originatingEventSequenceNumber": 0.0, "ptaPTECode": "A", } @@ -1535,6 +1540,7 @@ def test_pta_history_from_dict(self) -> None: assert pta_hist.event_date == date(2022, 1, 1) assert pta_hist.applicant_day_delay_quantity == 10.0 assert pta_hist.event_description_text == "Response to Office Action" + assert pta_hist.ip_office_adjustment_delay_quantity == 5.0 def test_pta_history_to_dict(self) -> None: pta_hist = PatentTermAdjustmentHistoryData( diff --git a/tests/models/test_ptab_models.py b/tests/models/test_ptab_models.py index 22a11a9..0d7e401 100644 --- a/tests/models/test_ptab_models.py +++ b/tests/models/test_ptab_models.py @@ -6,6 +6,8 @@ from datetime import date, datetime, timezone from typing import Any, Dict +import importlib +from unittest.mock import patch import pytest @@ -44,6 +46,78 @@ ) +class TestSelfImport: + """Tests for Self type import compatibility across Python versions.""" + + def test_self_import_works(self) -> None: + """Test that Self type can be imported from ptab module.""" + # This test verifies the try/except import pattern works + # by importing the module (which happens at test module import time) + # and using a from_dict method that relies on Self type hints + import sys + + # Verify the import succeeded (module is already imported) + import pyUSPTO.models.ptab as ptab_module + + assert hasattr(ptab_module, "PartyData") + + def test_import_fallback_logic(self) -> None: + import sys + import importlib + import typing + import typing_extensions + + module_name = "pyUSPTO.models.ptab" + original_self = getattr(typing, "Self", None) + + if module_name in sys.modules: + del sys.modules[module_name] + + try: + if original_self: + del typing.Self + + ptab_module = importlib.import_module(module_name) + assert ptab_module.Self is typing_extensions.Self + + finally: + if original_self: + typing.Self = original_self + + if module_name in sys.modules: + del sys.modules[module_name] + importlib.import_module(module_name) + + def test_self_type_in_from_dict_methods(self) -> None: + """Test that from_dict methods work correctly with Self return type.""" + # Create an instance using from_dict which uses Self as return type + data = {"counselName": "Test Counsel", "patentNumber": "US1234567"} + result = PartyData.from_dict(data) + + # Verify the return type is correct (should be PartyData instance) + assert isinstance(result, PartyData) + assert result.counsel_name == "Test Counsel" + assert result.patent_number == "US1234567" + + def test_self_type_returns_correct_class_instance(self) -> None: + """Test that from_dict returns an instance of the calling class.""" + # Test with different model classes to ensure Self works correctly + trial_data = {"trialNumber": "IPR2023-00001"} + trial_result = PTABTrialProceeding.from_dict(trial_data) + assert isinstance(trial_result, PTABTrialProceeding) + assert type(trial_result) == PTABTrialProceeding + + appeal_data = {"appealNumber": "2023-001234"} + appeal_result = PTABAppealDecision.from_dict(appeal_data) + assert isinstance(appeal_result, PTABAppealDecision) + assert type(appeal_result) == PTABAppealDecision + + interference_data = {"interferenceNumber": "106123"} + interference_result = PTABInterferenceDecision.from_dict(interference_data) + assert isinstance(interference_result, PTABInterferenceDecision) + assert type(interference_result) == PTABInterferenceDecision + + class TestPartyData: """Tests for PartyData base class.""" @@ -117,7 +191,9 @@ def test_trial_metadata_from_dict_full(self) -> None: result = TrialMetaData.from_dict(data) assert result.petition_filing_date == date(2023, 1, 15) assert result.accorded_filing_date == date(2023, 1, 16) - assert result.trial_last_modified_date_time == datetime(2023, 6, 1, 10, 30, 0, tzinfo=timezone.utc) + assert result.trial_last_modified_date_time == datetime( + 2023, 6, 1, 10, 30, 0, tzinfo=timezone.utc + ) assert result.trial_last_modified_date == date(2023, 6, 1) assert result.trial_status_category == "Instituted" assert result.trial_type_code == "IPR" @@ -229,7 +305,9 @@ def test_trial_proceeding_from_dict_full(self) -> None: result = PTABTrialProceeding.from_dict(data) assert result.trial_number == "IPR2023-00001" assert result.trial_record_identifier == "uuid-1" - assert result.last_modified_date_time == datetime(2023, 1, 15, 10, 30, 0, tzinfo=timezone.utc) + assert result.last_modified_date_time == datetime( + 2023, 1, 15, 10, 30, 0, tzinfo=timezone.utc + ) assert result.trial_meta_data is not None assert result.trial_meta_data.trial_status_category == "Instituted" assert result.patent_owner_data is not None @@ -285,8 +363,12 @@ def test_trial_proceeding_response_from_dict_full(self) -> None: assert result.count == 2 assert result.request_identifier == "request-uuid-1" assert len(result.patent_trial_proceeding_data_bag) == 2 - assert result.patent_trial_proceeding_data_bag[0].trial_number == "IPR2023-00001" - assert result.patent_trial_proceeding_data_bag[1].trial_number == "IPR2023-00002" + assert ( + result.patent_trial_proceeding_data_bag[0].trial_number == "IPR2023-00001" + ) + assert ( + result.patent_trial_proceeding_data_bag[1].trial_number == "IPR2023-00002" + ) assert result.raw_data is None def test_trial_proceeding_response_from_dict_with_raw_data(self) -> None: @@ -427,7 +509,9 @@ def test_trial_document_from_dict_full(self) -> None: } result = PTABTrialDocument.from_dict(data) assert result.trial_document_category == "Decision" - assert result.last_modified_date_time == datetime(2023, 12, 15, 10, 30, 0, tzinfo=timezone.utc) + assert result.last_modified_date_time == datetime( + 2023, 12, 15, 10, 30, 0, tzinfo=timezone.utc + ) assert result.trial_number == "IPR2023-00001" assert result.trial_type_code == "IPR" assert result.trial_meta_data is not None @@ -491,9 +575,15 @@ def test_trial_document_response_from_dict_full(self) -> None: assert result.count == 2 assert len(result.patent_trial_document_data_bag) == 2 assert result.patent_trial_document_data_bag[0].trial_number == "IPR2023-00001" - assert result.patent_trial_document_data_bag[0].trial_document_category == "Document" + assert ( + result.patent_trial_document_data_bag[0].trial_document_category + == "Document" + ) assert result.patent_trial_document_data_bag[1].trial_number == "IPR2023-00002" - assert result.patent_trial_document_data_bag[1].trial_document_category == "Decision" + assert ( + result.patent_trial_document_data_bag[1].trial_document_category + == "Decision" + ) assert result.raw_data is None def test_trial_document_response_from_dict_with_raw_data(self) -> None: @@ -680,7 +770,9 @@ def test_appeal_decision_from_dict_full(self) -> None: } result = PTABAppealDecision.from_dict(data) assert result.appeal_number == "2023-001234" - assert result.last_modified_date_time == datetime(2023, 6, 15, 10, 30, 0, tzinfo=timezone.utc) + assert result.last_modified_date_time == datetime( + 2023, 6, 15, 10, 30, 0, tzinfo=timezone.utc + ) assert result.appeal_document_category == "Decision" assert result.appeal_meta_data is not None assert result.appeal_meta_data.application_type_category == "Utility" @@ -768,7 +860,9 @@ def test_appeal_response_from_dict_with_raw_data(self) -> None: assert result.count == 1 assert result.raw_data == data assert len(result.patent_appeal_data_bag) == 1 - assert result.patent_appeal_data_bag[0].raw_data == {"appealNumber": "2023-001234"} + assert result.patent_appeal_data_bag[0].raw_data == { + "appealNumber": "2023-001234" + } def test_appeal_response_from_dict_empty(self) -> None: """Test PTABAppealResponse.from_dict() with empty list.""" @@ -948,18 +1042,31 @@ def test_interference_decision_from_dict_full(self) -> None: } result = PTABInterferenceDecision.from_dict(data) assert result.interference_number == "106123" - assert result.last_modified_date_time == datetime(2023, 3, 15, 10, 30, 0, tzinfo=timezone.utc) + assert result.last_modified_date_time == datetime( + 2023, 3, 15, 10, 30, 0, tzinfo=timezone.utc + ) assert result.interference_meta_data is not None - assert result.interference_meta_data.interference_style_name == "Senior v. Junior" + assert ( + result.interference_meta_data.interference_style_name == "Senior v. Junior" + ) assert result.senior_party_data is not None assert result.senior_party_data.patent_owner_name == "Senior Inc" assert result.junior_party_data is not None assert result.junior_party_data.patent_owner_name == "Junior LLC" assert len(result.additional_party_data_bag) == 2 - assert result.additional_party_data_bag[0].additional_party_name == "Additional Party 1" - assert result.additional_party_data_bag[1].additional_party_name == "Additional Party 2" + assert ( + result.additional_party_data_bag[0].additional_party_name + == "Additional Party 1" + ) + assert ( + result.additional_party_data_bag[1].additional_party_name + == "Additional Party 2" + ) assert result.document_data is not None - assert result.document_data.interference_outcome_category == "Priority to Senior Party" + assert ( + result.document_data.interference_outcome_category + == "Priority to Senior Party" + ) assert result.raw_data is None def test_interference_decision_from_dict_with_alias_decision_document_data( diff --git a/tox.ini b/tox.ini index dfc82aa..6042ae2 100644 --- a/tox.ini +++ b/tox.ini @@ -1,4 +1,5 @@ [tox] +# py315 commented out - requires C++ build tools for librt (mypy dependency) envlist = py310,py311,py312,py313,py314 isolated_build = True @@ -9,6 +10,7 @@ basepython = py312: {env:LOCALAPPDATA}\Python\pythoncore-3.12-64\python.exe py313: {env:LOCALAPPDATA}\Python\pythoncore-3.13-64\python.exe py314: {env:LOCALAPPDATA}\Python\pythoncore-3.14-64\python.exe + # py315: {env:LOCALAPPDATA}\Python\pythoncore-3.15-64\python.exe deps = -r requirements-dev.txt commands = From 00ebd3f0f0176f5c7f5c60f9220728128edcdb03 Mon Sep 17 00:00:00 2001 From: Andrew Date: Fri, 5 Dec 2025 12:13:42 -0600 Subject: [PATCH 08/17] update unit and integration tests; fix patent_data model issues --- src/pyUSPTO/clients/patent_data.py | 12 +- src/pyUSPTO/models/patent_data.py | 27 +- src/pyUSPTO/models/petition_decisions.py | 8 +- src/pyUSPTO/models/utils.py | 2 +- tests/clients/test_patent_data_clients.py | 44 +- .../test_patent_data_integration.py | 156 +++-- .../test_petition_decisions_integration.py | 614 ++++++++++++------ tests/models/test_patent_data_models.py | 13 +- tests/models/test_petition_decision_models.py | 4 +- tests/models/test_ptab_models.py | 35 +- 10 files changed, 567 insertions(+), 348 deletions(-) diff --git a/src/pyUSPTO/clients/patent_data.py b/src/pyUSPTO/clients/patent_data.py index c988e58..c7fe7b7 100644 --- a/src/pyUSPTO/clients/patent_data.py +++ b/src/pyUSPTO/clients/patent_data.py @@ -363,7 +363,7 @@ def get_search_results( grant_date_to_q: Optional[str] = None, classification_q: Optional[str] = None, additional_query_params: Optional[Dict[str, Any]] = None, - ) -> PatentDataResponse: + ) -> list[ApplicationMetaData]: """ Fetches a dataset of patent applications based on search criteria, always requesting JSON format. For GET, parameters align with OpenAPI for /api/v1/patent/applications/search/download. @@ -380,7 +380,6 @@ def get_search_results( endpoint=endpoint, json_data=post_body, params=additional_query_params, - response_class=PatentDataResponse, ) else: params: Dict[str, Any] = {} @@ -462,10 +461,13 @@ def get_search_results( method="GET", endpoint=endpoint, params=params, - response_class=PatentDataResponse, ) - assert isinstance(result, PatentDataResponse) - return result + assert isinstance(result, Dict) + amd_list = [ + ApplicationMetaData.from_dict(item["applicationMetaData"]) + for item in result["patentdata"] + ] + return amd_list def get_application_by_number( self, application_number: str diff --git a/src/pyUSPTO/models/patent_data.py b/src/pyUSPTO/models/patent_data.py index 90240ff..6fe140e 100644 --- a/src/pyUSPTO/models/patent_data.py +++ b/src/pyUSPTO/models/patent_data.py @@ -1406,7 +1406,7 @@ class PatentTermAdjustmentHistoryData: event_sequence_number: Sequence number of this event in the PTA history. originating_event_sequence_number: Sequence number of an event that originated this event. pta_pte_code: Code indicating if the event relates to PTA or Patent Term Extension (PTE). - ip_office_adjustment_delay_quantity: Number of days of IP office delay used in adjustment calculation for this event. + ip_office_day_delay_quantity: Number of days of IP office delay used in adjustment calculation for this event. """ event_date: Optional[date] = None @@ -1415,7 +1415,7 @@ class PatentTermAdjustmentHistoryData: event_sequence_number: Optional[float] = None originating_event_sequence_number: Optional[float] = None pta_pte_code: Optional[str] = None - ip_office_adjustment_delay_quantity: Optional[float] = None + ip_office_day_delay_quantity: Optional[float] = None @classmethod def from_dict(cls, data: Dict[str, Any]) -> "PatentTermAdjustmentHistoryData": @@ -1436,9 +1436,7 @@ def from_dict(cls, data: Dict[str, Any]) -> "PatentTermAdjustmentHistoryData": "originatingEventSequenceNumber" ), pta_pte_code=data.get("ptaPTECode"), - ip_office_adjustment_delay_quantity=data.get( - "ipOfficeAdjustmentDelayQuantity" - ), + ip_office_day_delay_quantity=data.get("ipOfficeDayDelayQuantity"), ) def to_dict(self) -> Dict[str, Any]: @@ -1464,10 +1462,8 @@ def to_dict(self) -> Dict[str, Any]: ) if self.pta_pte_code is not None: final_dict["ptaPTECode"] = self.pta_pte_code - if self.ip_office_adjustment_delay_quantity is not None: - final_dict["ipOfficeAdjustmentDelayQuantity"] = ( - self.ip_office_adjustment_delay_quantity - ) + if self.ip_office_day_delay_quantity is not None: + final_dict["ipOfficeDayDelayQuantity"] = self.ip_office_day_delay_quantity return final_dict @@ -1660,7 +1656,7 @@ def to_dict(self) -> Dict[str, Any]: @dataclass(frozen=True) class ApplicationMetaData: - """Represents the comprehensive metadata associated with a patent application. + """Represents the metadata associated with a patent application. This class holds a wide range of information including application status, dates (filing, grant, publication), applicant and inventor details, @@ -2109,11 +2105,13 @@ class PatentDataResponse: Attributes: count: The total number of patent applications found matching the query. patent_file_wrapper_data_bag: A list of `PatentFileWrapper` objects. + request_identifier: An identifier for the API request, if provided. raw_data: Optional raw JSON data from the API response (for debugging). """ count: int patent_file_wrapper_data_bag: List[PatentFileWrapper] = field(default_factory=list) + request_identifier: Optional[str] = None raw_data: Optional[str] = field(default=None, compare=False, repr=False) @classmethod @@ -2137,6 +2135,7 @@ def from_dict( return cls( count=data.get("count", 0), patent_file_wrapper_data_bag=wrappers, + request_identifier=data.get("requestIdentifier"), raw_data=json.dumps(data) if include_raw_data else None, ) @@ -2146,11 +2145,17 @@ def to_dict(self) -> Dict[str, Any]: Returns: Dict[str, Any]: Dictionary representation. """ - return { + _dict = { "count": self.count, "patentFileWrapperDataBag": [ w.to_dict() for w in self.patent_file_wrapper_data_bag ], + "requestIdentifier": self.request_identifier, + } + return { + k: v + for k, v in _dict.items() + if v is not None and (not isinstance(v, list) or v) } def to_csv(self) -> str: diff --git a/src/pyUSPTO/models/petition_decisions.py b/src/pyUSPTO/models/petition_decisions.py index 1a22a16..be989fd 100644 --- a/src/pyUSPTO/models/petition_decisions.py +++ b/src/pyUSPTO/models/petition_decisions.py @@ -121,7 +121,7 @@ class PetitionDecisionDocument: document_identifier: A unique identifier for the document. document_code: The code identifying the document type. document_code_description_text: Description of the document code. - document_direction_category: Whether the document is INCOMING or OUTGOING. + direction_category: Whether the document is INCOMING or OUTGOING. download_option_bag: List of available download options for the document. """ @@ -130,7 +130,7 @@ class PetitionDecisionDocument: document_identifier: Optional[str] = None document_code: Optional[str] = None document_code_description_text: Optional[str] = None - document_direction_category: Optional[str] = None + direction_category: Optional[str] = None download_option_bag: List[DocumentDownloadOption] = field(default_factory=list) @classmethod @@ -161,7 +161,7 @@ def from_dict(cls, data: Dict[str, Any]) -> "PetitionDecisionDocument": document_identifier=data.get("documentIdentifier"), document_code=data.get("documentCode"), document_code_description_text=data.get("documentCodeDescriptionText"), - document_direction_category=data.get("documentDirectionCategory"), + direction_category=data.get("directionCategory"), download_option_bag=download_options, ) @@ -177,7 +177,7 @@ def to_dict(self) -> Dict[str, Any]: "documentIdentifier": self.document_identifier, "documentCode": self.document_code, "documentCodeDescriptionText": self.document_code_description_text, - "documentDirectionCategory": self.document_direction_category, + "directionCategory": self.direction_category, "downloadOptionBag": [opt.to_dict() for opt in self.download_option_bag], } return { diff --git a/src/pyUSPTO/models/utils.py b/src/pyUSPTO/models/utils.py index a6092ab..43f6587 100644 --- a/src/pyUSPTO/models/utils.py +++ b/src/pyUSPTO/models/utils.py @@ -65,7 +65,7 @@ def parse_to_datetime_utc(datetime_str: Optional[str]) -> Optional[datetime]: Attempts to parse ISO format strings. If the input string contains timezone information, it's used. If the string is a naive datetime (no timezone), - it's assumed to be in the `ASSUMED_NAIVE_TIMEZONE` (e.g., "America/New_York") + it's assumed to be in the `ASSUMED_NAIVE_TIMEZONE_STR` (e.g., "America/New_York") and then converted to UTC. Args: diff --git a/tests/clients/test_patent_data_clients.py b/tests/clients/test_patent_data_clients.py index 29279e7..e51ebeb 100644 --- a/tests/clients/test_patent_data_clients.py +++ b/tests/clients/test_patent_data_clients.py @@ -217,6 +217,12 @@ def mock_patent_data_response_empty() -> PatentDataResponse: return PatentDataResponse(count=0, patent_file_wrapper_data_bag=[]) +@pytest.fixture +def mock_get_search_results_empty() -> Dict: + """Provides an empty mock PatentDataResponse instance.""" + return {"patentdata": {}} + + @pytest.fixture def client_with_mocked_request( patent_data_client: PatentDataClient, @@ -1798,11 +1804,11 @@ class TestPatentApplicationDataRetrieval: def test_get_search_results_get_direct_query( self, client_with_mocked_request: tuple[PatentDataClient, MagicMock], - mock_patent_data_response_empty: PatentDataResponse, + mock_get_search_results_empty: List[ApplicationMetaData], ) -> None: """Test GET path of get_search_results with direct query, always requests JSON.""" client, mock_make_request = client_with_mocked_request - mock_make_request.return_value = mock_patent_data_response_empty + mock_make_request.return_value = mock_get_search_results_empty method_params: Dict[str, Any] = {"query": "bulk test"} expected_api_params = { @@ -1818,18 +1824,17 @@ def test_get_search_results_get_direct_query( method="GET", endpoint="api/v1/patent/applications/search/download", params=expected_api_params, - response_class=PatentDataResponse, ) - assert result is mock_patent_data_response_empty + assert result == [] def test_get_search_results_get_with_combined_q_convenience_params( self, client_with_mocked_request: tuple[PatentDataClient, MagicMock], - mock_patent_data_response_empty: PatentDataResponse, + mock_get_search_results_empty: List[ApplicationMetaData], ) -> None: """Test get_search_results GET path with a combination of _q convenience params.""" client, mock_make_request = client_with_mocked_request - mock_make_request.return_value = mock_patent_data_response_empty + mock_make_request.return_value = mock_get_search_results_empty client.get_search_results( inventor_name_q="Doe", filing_date_from_q="2021-01-01", limit=5 @@ -1845,7 +1850,6 @@ def test_get_search_results_get_with_combined_q_convenience_params( method="GET", endpoint="api/v1/patent/applications/search/download", params=expected_api_params, - response_class=PatentDataResponse, ) @pytest.mark.parametrize( @@ -1900,11 +1904,11 @@ def test_get_search_results_get_various_q_convenience_filters( search_q_params: Dict[str, Any], expected_q_part: str, client_with_mocked_request: tuple[PatentDataClient, MagicMock], - mock_patent_data_response_empty: PatentDataResponse, + mock_get_search_results_empty: List[ApplicationMetaData], ) -> None: """Test get_search_results GET path with various individual _q convenience filters.""" client, mock_make_request = client_with_mocked_request - mock_make_request.return_value = mock_patent_data_response_empty + mock_make_request.return_value = mock_get_search_results_empty limit = 15 offset = 5 @@ -1927,7 +1931,6 @@ def test_get_search_results_get_various_q_convenience_filters( method="GET", endpoint="api/v1/patent/applications/search/download", params=expected_call_params, - response_class=PatentDataResponse, ) # mock_make_request.reset_mock() # Removed to avoid issues with parametrize if tests are run in certain ways @@ -1939,22 +1942,22 @@ def test_get_search_results_get_various_q_convenience_filters( ("filters_param", "applicationMetaData.applicationTypeCode DES", "filters"), ( "range_filters_param", - "applicationMetaData.filingDate 2021-01-01:2021-12-31", + "applicationMetaData.filingDate 2021-01-01", "rangeFilters", ), ], ) - def test_get_search_results_get_with_openapi_params( # New test + def test_get_search_results_get_with_openapi_params( self, method_param_name: str, param_value: str, expected_api_key: str, client_with_mocked_request: tuple[PatentDataClient, MagicMock], - mock_patent_data_response_empty: PatentDataResponse, + mock_get_search_results_empty: List[ApplicationMetaData], ) -> None: """Test get_search_results GET path with various direct OpenAPI parameters.""" client, mock_make_request = client_with_mocked_request - mock_make_request.return_value = mock_patent_data_response_empty + mock_make_request.return_value = mock_get_search_results_empty method_kwargs: Dict[str, Any] = { method_param_name: param_value, @@ -1973,18 +1976,17 @@ def test_get_search_results_get_with_openapi_params( # New test method="GET", endpoint="api/v1/patent/applications/search/download", params=expected_api_params, - response_class=PatentDataResponse, ) # mock_make_request.reset_mock() # Parametrized tests should not reset mock if one instance per test function def test_get_search_results_get_with_additional_query_params( # New test self, client_with_mocked_request: tuple[PatentDataClient, MagicMock], - mock_patent_data_response_empty: PatentDataResponse, + mock_get_search_results_empty: List[ApplicationMetaData], ) -> None: """Test get_search_results GET path with additional_query_params.""" client, mock_make_request = client_with_mocked_request - mock_make_request.return_value = mock_patent_data_response_empty + mock_make_request.return_value = mock_get_search_results_empty client.get_search_results( query="main_download_query", @@ -2009,17 +2011,16 @@ def test_get_search_results_get_with_additional_query_params( # New test method="GET", endpoint="api/v1/patent/applications/search/download", params=expected_api_params, - response_class=PatentDataResponse, ) def test_get_search_results_post( self, client_with_mocked_request: tuple[PatentDataClient, MagicMock], - mock_patent_data_response_with_data: PatentDataResponse, + mock_get_search_results_empty: PatentDataResponse, ) -> None: """Test POST path of get_search_results.""" client, mock_make_request = client_with_mocked_request - mock_make_request.return_value = mock_patent_data_response_with_data + mock_make_request.return_value = mock_get_search_results_empty post_body_request = {"q": "Test POST", "fields": ["patentNumber"]} @@ -2036,9 +2037,8 @@ def test_get_search_results_post( endpoint="api/v1/patent/applications/search/download", json_data=expected_post_body_sent_to_api, params=None, - response_class=PatentDataResponse, ) - assert result is mock_patent_data_response_with_data + assert result == [] class TestApplicationSpecificDataRetrieval: diff --git a/tests/integration/test_patent_data_integration.py b/tests/integration/test_patent_data_integration.py index 0e6b224..6be1c09 100644 --- a/tests/integration/test_patent_data_integration.py +++ b/tests/integration/test_patent_data_integration.py @@ -77,14 +77,14 @@ def sample_application_number(patent_data_client: PatentDataClient) -> str: if app_num: return app_num - pytest.skip( + pytest.fail( "Could not retrieve a sample application number. Ensure API is reachable and query is valid." ) except USPTOApiError as e: - pytest.skip(f"Could not fetch sample application number due to API error: {e}") + pytest.fail(f"Could not fetch sample application number due to API error: {e}") except Exception as e: - pytest.skip( + pytest.fail( f"Could not fetch sample application number due to unexpected error: {e}" ) return "" @@ -134,39 +134,39 @@ def test_search_applications_with_convenience_q_param( response.patent_file_wrapper_data_bag[0], PatentFileWrapper ) else: - assert response.patent_file_wrapper_data_bag == [] + pytest.fail( + f'No PatentDate returned for: `assignee_name_q="International Business Machines"`' + ) def test_get_application_by_number( - self, patent_data_client: PatentDataClient, sample_application_number: str + self, + patent_data_client: PatentDataClient, ) -> None: """Test getting a specific patent by application number.""" patent_wrapper = patent_data_client.get_application_by_number( - sample_application_number + self.KNOWN_APP_NUM_WITH_DOCS ) assert patent_wrapper is not None assert isinstance(patent_wrapper, PatentFileWrapper) - assert patent_wrapper.application_number_text == sample_application_number + assert patent_wrapper.application_number_text == self.KNOWN_APP_NUM_WITH_DOCS assert patent_wrapper.application_meta_data is not None assert isinstance(patent_wrapper.application_meta_data, ApplicationMetaData) assert patent_wrapper.application_meta_data.invention_title is not None - def test_to_dict_matches_raw_api_response( - self, api_key: Optional[str], sample_application_number: str - ) -> None: + def test_to_dict_matches_raw_api_response(self, api_key: Optional[str]) -> None: """Test that to_dict() output matches the original API response stored in raw_data. This test compares the to_dict() serialization with the original API response - to ensure that the model correctly reconstructs the API format. Some differences - are expected (e.g., requestIdentifier field is not part of the model). + to ensure that the model correctly reconstructs the API format. """ # TEMPORARILY DISABLED: See GitHub issue #17 # API returns naive datetime strings (e.g., '2025-12-03T07:21:12') without timezone # indicators, but we serialize with UTC 'Z' suffix (e.g., '2025-12-03T12:21:12Z'). # Waiting for USPTO ODP to adopt UTC standard for datetime fields. - pytest.skip( - "Test disabled pending USPTO API fix for datetime format. See issue #17" - ) + # pytest.skip( + # "Test disabled pending USPTO API fix for datetime format. See issue #17" + # ) # Create a config with include_raw_data=True to preserve original API JSON config_with_raw = USPTOConfig(api_key=api_key, include_raw_data=True) @@ -174,14 +174,14 @@ def test_to_dict_matches_raw_api_response( # Use search_applications to get a PatentDataResponse (which has raw_data) response = client_with_raw.search_applications( - application_number_q=sample_application_number, limit=1 + application_number_q=self.KNOWN_APP_NUM_WITH_DOCS, limit=1 ) assert response is not None assert isinstance(response, PatentDataResponse) - assert response.raw_data is not None, ( - "raw_data should be populated when include_raw_data=True" - ) + assert ( + response.raw_data is not None + ), "raw_data should be populated when include_raw_data=True" # Parse the raw API response JSON import json @@ -193,7 +193,7 @@ def test_to_dict_matches_raw_api_response( # Fields that are expected to be in raw API but not in model serialization # (these are API metadata, not domain data) - expected_missing_fields = {"requestIdentifier"} + expected_missing_fields: set[str] = set() # Remove expected metadata fields from raw API for comparison raw_api_dict_filtered = { @@ -272,7 +272,9 @@ def test_round_trip_data_integrity( ) -> None: """Test that parsing and serialization preserves data (round-trip test).""" # Get application from API - original = patent_data_client.get_application_by_number(sample_application_number) + original = patent_data_client.get_application_by_number( + sample_application_number + ) assert original is not None @@ -320,7 +322,7 @@ def test_get_application_metadata( sample_application_number ) if metadata is None: - pytest.skip( + pytest.fail( f"No metadata available for application {sample_application_number}" ) @@ -329,11 +331,11 @@ def test_get_application_metadata( assert metadata.filing_date is not None assert isinstance(metadata.filing_date, datetime.date) except USPTOApiNotFoundError: - pytest.skip( + pytest.fail( f"Metadata not found (404) for application {sample_application_number}" ) except USPTOApiError as e: - pytest.skip( + pytest.fail( f"API call for metadata failed for {sample_application_number}: {e}" ) @@ -346,16 +348,16 @@ def test_get_application_adjustment( sample_application_number ) if adjustment_data is None: - pytest.skip(f"No adjustment data for {sample_application_number}") + pytest.fail(f"No adjustment data for {sample_application_number}") assert isinstance(adjustment_data, PatentTermAdjustmentData) assert adjustment_data.adjustment_total_quantity is not None except USPTOApiNotFoundError: - pytest.skip( + pytest.fail( f"Adjustment data not found (404) for application {sample_application_number}" ) except USPTOApiError as e: - pytest.skip( + pytest.fail( f"Adjustment data not available or API error for {sample_application_number}: {e}" ) @@ -368,13 +370,13 @@ def test_get_application_assignment( sample_application_number ) if assignments is None: - pytest.skip( + pytest.fail( f"No assignment data (returned None) for {sample_application_number}" ) assert isinstance(assignments, list) if not assignments: - pytest.skip( + pytest.fail( f"Assignment data list is empty for {sample_application_number}" ) @@ -387,11 +389,11 @@ def test_get_application_assignment( assert assignments[0].assignee_bag[0].assignee_name_text is not None except USPTOApiNotFoundError: - pytest.skip( + pytest.fail( f"Assignment data not found (404) for application {sample_application_number}" ) except USPTOApiError as e: - pytest.skip( + pytest.fail( f"Assignment data not available or API error for {sample_application_number}: {e}" ) @@ -404,7 +406,7 @@ def test_get_application_attorney( sample_application_number ) if attorney_data is None: - pytest.skip(f"No attorney data for {sample_application_number}") + pytest.fail(f"No attorney data for {sample_application_number}") assert isinstance(attorney_data, RecordAttorney) has_attorney_info = False @@ -421,16 +423,16 @@ def test_get_application_attorney( has_attorney_info = True if not has_attorney_info: - pytest.skip( + pytest.fail( f"Attorney data present but bags are empty for {sample_application_number}" ) except USPTOApiNotFoundError: - pytest.skip( + pytest.fail( f"Attorney data not found (404) for application {sample_application_number}" ) except USPTOApiError as e: - pytest.skip( + pytest.fail( f"Attorney data not available or API error for {sample_application_number}: {e}" ) @@ -443,7 +445,7 @@ def test_get_application_continuity( sample_application_number ) if continuity_data is None: - pytest.skip(f"No continuity data for {sample_application_number}") + pytest.fail(f"No continuity data for {sample_application_number}") assert isinstance(continuity_data, ApplicationContinuityData) assert continuity_data.parent_continuity_bag is not None @@ -456,11 +458,11 @@ def test_get_application_continuity( is not None ) except USPTOApiNotFoundError: - pytest.skip( + pytest.fail( f"Continuity data not found (404) for application {sample_application_number}" ) except USPTOApiError as e: - pytest.skip( + pytest.fail( f"Continuity data not available or API error for {sample_application_number}: {e}" ) @@ -473,13 +475,13 @@ def test_get_application_foreign_priority( sample_application_number ) if priorities is None: - pytest.skip( + pytest.fail( f"No foreign priority data (returned None) for {sample_application_number}" ) assert isinstance(priorities, list) if not priorities: - pytest.skip( + pytest.fail( f"Foreign priority data list is empty for {sample_application_number}" ) @@ -489,11 +491,11 @@ def test_get_application_foreign_priority( assert isinstance(priorities[0].filing_date, datetime.date) except USPTOApiNotFoundError: - pytest.skip( + pytest.fail( f"Foreign priority data not found (404) for application {sample_application_number}" ) except USPTOApiError as e: - pytest.skip( + pytest.fail( f"Foreign priority data not available or API error for {sample_application_number}: {e}" ) @@ -506,13 +508,13 @@ def test_get_application_transactions( sample_application_number ) if transactions is None: - pytest.skip( + pytest.fail( f"No transaction data (returned None) for {sample_application_number}" ) assert isinstance(transactions, list) if not transactions: - pytest.skip( + pytest.fail( f"Transaction data list is empty for {sample_application_number}" ) @@ -521,11 +523,11 @@ def test_get_application_transactions( assert transactions[0].event_date is not None assert isinstance(transactions[0].event_date, datetime.date) except USPTOApiNotFoundError: - pytest.skip( + pytest.fail( f"Transaction data not found (404) for application {sample_application_number}" ) except USPTOApiError as e: - pytest.skip( + pytest.fail( f"Transaction data not available or API error for {sample_application_number}: {e}" ) @@ -538,14 +540,14 @@ def test_get_application_documents( self.KNOWN_APP_NUM_WITH_DOCS ) if documents_bag is None: - pytest.skip( + pytest.fail( f"No document bag returned for {self.KNOWN_APP_NUM_WITH_DOCS}" ) assert isinstance(documents_bag, DocumentBag) assert documents_bag.documents is not None if not documents_bag.documents: - pytest.skip(f"Document bag is empty for {self.KNOWN_APP_NUM_WITH_DOCS}") + pytest.fail(f"Document bag is empty for {self.KNOWN_APP_NUM_WITH_DOCS}") first_doc = documents_bag.documents[0] assert isinstance(first_doc, Document) @@ -555,9 +557,9 @@ def test_get_application_documents( assert isinstance(first_doc.official_date, datetime.datetime) except USPTOApiNotFoundError: - pytest.skip(f"Documents not found (404) for {self.KNOWN_APP_NUM_WITH_DOCS}") + pytest.fail(f"Documents not found (404) for {self.KNOWN_APP_NUM_WITH_DOCS}") except USPTOApiError as e: - pytest.skip( + pytest.fail( f"Document endpoint failed for {self.KNOWN_APP_NUM_WITH_DOCS}: {e}" ) @@ -570,18 +572,17 @@ def test_get_application_associated_documents( sample_application_number ) if assoc_docs_data is None: - pytest.skip( + pytest.fail( f"No associated documents data for {sample_application_number}" ) assert isinstance(assoc_docs_data, PrintedPublication) - # Skip if no document metadata is available if ( assoc_docs_data.pgpub_document_meta_data is None and assoc_docs_data.grant_document_meta_data is None ): - pytest.skip( + pytest.fail( f"No pgpub or grant document metadata for {sample_application_number}" ) if assoc_docs_data.pgpub_document_meta_data: @@ -595,11 +596,11 @@ def test_get_application_associated_documents( is not None ) except USPTOApiNotFoundError: - pytest.skip( + pytest.fail( f"Associated documents data not found (404) for application {sample_application_number}" ) except USPTOApiError as e: - pytest.skip( + pytest.fail( f"Associated documents data not available or API error for {sample_application_number}: {e}" ) @@ -612,7 +613,7 @@ def test_download_application_document( self.KNOWN_APP_NUM_WITH_DOCS ) if documents_bag is None or not documents_bag.documents: - pytest.skip( + pytest.fail( f"No documents found for {self.KNOWN_APP_NUM_WITH_DOCS} to test download." ) @@ -623,7 +624,7 @@ def test_download_application_document( break if doc_to_download is None or doc_to_download.document_identifier is None: - pytest.skip( + pytest.fail( f"No downloadable document found for {self.KNOWN_APP_NUM_WITH_DOCS}" ) @@ -673,9 +674,9 @@ def test_search_applications_post( response.patent_file_wrapper_data_bag[0], PatentFileWrapper ) else: - assert response.patent_file_wrapper_data_bag == [] + pytest.fail(f"No PatentDate returned for: {search_request_body}") except USPTOApiError as e: - pytest.skip(f"POST search failed: {e}") + pytest.fail(f"POST search failed: {e}") def test_get_search_results_get(self, patent_data_client: PatentDataClient) -> None: """Test getting search results (as JSON structure) using GET path of get_search_results.""" @@ -685,47 +686,40 @@ def test_get_search_results_get(self, patent_data_client: PatentDataClient) -> N limit=1, ) assert response is not None - assert isinstance(response, PatentDataResponse) - if response.count > 0 and response.patent_file_wrapper_data_bag: - assert ( - response.patent_file_wrapper_data_bag[0].application_number_text - == self.KNOWN_APP_NUM_WITH_DOCS + assert isinstance(response, List) + if len(response) > 0: + assert response[0].application_type_label_name == "Utility" + elif len(response) == 0: + pytest.fail( + f"No applicationMetaData returned for {self.KNOWN_APP_NUM_WITH_DOCS}" ) - elif response.count == 0: - assert response.patent_file_wrapper_data_bag == [] else: pytest.fail( - f"Unexpected response structure for get_search_results GET: count={response.count} but bag is {response.patent_file_wrapper_data_bag}" + f"Unexpected response structure for get_search_results GET: app no={self.KNOWN_APP_NUM_WITH_DOCS}" ) except USPTOApiError as e: - pytest.skip(f"get_search_results GET test failed: {e}") + pytest.fail(f"get_search_results GET test failed: {e}") def test_get_search_results_post( self, patent_data_client: PatentDataClient ) -> None: - """Test getting search results (as JSON structure) using POST path of get_search_results.""" + """Test getting search results using POST path of get_search_results.""" post_body_request = { "q": f"applicationNumberText:{self.KNOWN_APP_NUM_WITH_DOCS}", "pagination": {"offset": 0, "limit": 1}, - "format": "json", } try: response = patent_data_client.get_search_results( post_body=post_body_request ) assert response is not None - assert isinstance(response, PatentDataResponse) + assert isinstance(response, List) - if response.count > 0 and response.patent_file_wrapper_data_bag: - assert ( - response.patent_file_wrapper_data_bag[0].application_number_text - == self.KNOWN_APP_NUM_WITH_DOCS - ) + if len(response) > 0: + assert response[0].application_type_label_name == "Utility" elif response.count == 0: - assert response.patent_file_wrapper_data_bag == [] - else: pytest.fail( - f"Unexpected response structure for get_search_results POST: count={response.count} but bag is {response.patent_file_wrapper_data_bag}" + f"No PatentData returned for US App No.: {self.KNOWN_APP_NUM_WITH_DOCS} with: {post_body_request}" ) except USPTOApiError as e: pytest.skip(f"get_search_results POST test failed: {e}") @@ -751,7 +745,9 @@ def test_search_status_codes_post( assert isinstance(response.status_code_bag[0], StatusCode) assert response.status_code_bag[0].code is not None else: - assert len(response.status_code_bag) == 0 + pytest.fail( + f"No PatentDate returned for abandoned OR expired OR pending applications." + ) except USPTOApiError as e: pytest.skip(f"Status codes POST search failed: {e}") diff --git a/tests/integration/test_petition_decisions_integration.py b/tests/integration/test_petition_decisions_integration.py index 6baf908..cbab93d 100644 --- a/tests/integration/test_petition_decisions_integration.py +++ b/tests/integration/test_petition_decisions_integration.py @@ -6,6 +6,7 @@ environment variable is set to 'true'. """ +import datetime import os from typing import Iterator, List, Optional @@ -34,11 +35,14 @@ ) -@pytest.fixture +@pytest.fixture(scope="module") def petition_decisions_client(config: USPTOConfig) -> FinalPetitionDecisionsClient: """ Create a FinalPetitionDecisionsClient instance for integration tests. + Uses module scope to reuse the same client for all tests in the module, + reducing overhead from creating multiple client instances. + Args: config: The configuration instance @@ -48,37 +52,57 @@ def petition_decisions_client(config: USPTOConfig) -> FinalPetitionDecisionsClie return FinalPetitionDecisionsClient(config=config) -@pytest.fixture -def sample_petition_decision_id( +@pytest.fixture(scope="module") +def sample_petition_decision( petition_decisions_client: FinalPetitionDecisionsClient, -) -> str: - """Provides a sample petition decision record ID for tests.""" +) -> PetitionDecision: + """Provides a sample petition decision for tests. + + Uses module scope to execute once per test module and cache the result, + reducing redundant API calls from multiple tests. + """ try: # Search for a recent decision response = petition_decisions_client.search_decisions(limit=1) - if response.count > 0 and response.petition_decision_data_bag: - decision_id = response.petition_decision_data_bag[ - 0 - ].petition_decision_record_identifier - if decision_id: - return decision_id + if ( + response.count is not None + and response.count > 0 + and response.petition_decision_data_bag + ): + return response.petition_decision_data_bag[0] pytest.skip( - "Could not retrieve a sample petition decision ID. Ensure API is reachable." + "Could not retrieve a sample petition decision. Ensure API is reachable." ) except USPTOApiError as e: - pytest.skip(f"Could not fetch sample petition decision ID due to API error: {e}") + pytest.skip(f"Could not fetch sample petition decision due to API error: {e}") except Exception as e: pytest.skip( - f"Could not fetch sample petition decision ID due to unexpected error: {e}" + f"Could not fetch sample petition decision due to unexpected error: {e}" ) + # This return is unreachable but satisfies type checker + return PetitionDecision() + + +@pytest.fixture(scope="module") +def sample_petition_decision_id(sample_petition_decision: PetitionDecision) -> str: + """Provides a sample petition decision record ID for tests. + + Derives from sample_petition_decision to avoid redundant API calls. + """ + if sample_petition_decision.petition_decision_record_identifier: + return sample_petition_decision.petition_decision_record_identifier + pytest.skip("Sample petition decision does not have a record identifier") return "" class TestFinalPetitionDecisionsIntegration: """Integration tests for the FinalPetitionDecisionsClient.""" + # Known decision ID for consistent testing (update with a stable ID from the API) + KNOWN_DECISION_ID = None # TODO: Add a known stable decision ID when available + def test_search_decisions_basic( self, petition_decisions_client: FinalPetitionDecisionsClient ) -> None: @@ -90,7 +114,7 @@ def test_search_decisions_basic( assert response.count is not None assert response.count >= 0 - if response.count > 0: + if response.count is not None and response.count > 0: assert response.petition_decision_data_bag is not None assert len(response.petition_decision_data_bag) > 0 assert len(response.petition_decision_data_bag) <= 5 @@ -105,88 +129,104 @@ def test_search_decisions_with_query( """Test searching with a custom query.""" try: response = petition_decisions_client.search_decisions( - query="applicantName:*", limit=3 + query="firstApplicantName:*", limit=3 ) assert response is not None assert isinstance(response, PetitionDecisionResponse) - assert response.count >= 0 + assert response.count is not None and response.count >= 0 - if response.count > 0: + if response.count is not None and response.count > 0: assert response.petition_decision_data_bag is not None assert len(response.petition_decision_data_bag) <= 3 except USPTOApiNotFoundError: # 404 may be returned if no records match the query pytest.skip("No records found matching query criteria") + except USPTOApiError as e: + pytest.skip(f"Query search failed: {e}") def test_search_decisions_with_application_number( - self, petition_decisions_client: FinalPetitionDecisionsClient + self, + petition_decisions_client: FinalPetitionDecisionsClient, + sample_petition_decision: PetitionDecision, ) -> None: """Test searching using convenience application_number_q parameter.""" - # First get any decision with an application number - response = petition_decisions_client.search_decisions(limit=10) - if response.count == 0: - pytest.skip("No decisions available to test application number search") - - # Find a decision with an application number - app_num = None - for decision in response.petition_decision_data_bag: - if decision.application_number_text: - app_num = decision.application_number_text - break - - if not app_num: - pytest.skip("No decisions with application numbers found") - - # Search for that specific application number - response = petition_decisions_client.search_decisions( - application_number_q=app_num, limit=5 - ) + # Use the application number from the sample decision + if not sample_petition_decision.application_number_text: + pytest.skip( + "Sample decision does not have an application number to test with" + ) - assert response is not None - assert response.count > 0 - if response.petition_decision_data_bag: - # At least one should match - found = any( - d.application_number_text == app_num - for d in response.petition_decision_data_bag + app_num = sample_petition_decision.application_number_text + + try: + # Search for that specific application number + response = petition_decisions_client.search_decisions( + application_number_q=app_num, limit=5 ) - assert found, f"Expected to find application number {app_num} in results" + + assert response is not None + assert response.count is not None and response.count > 0 + if response.petition_decision_data_bag: + # At least one should match + found = any( + d.application_number_text == app_num + for d in response.petition_decision_data_bag + ) + assert ( + found + ), f"Expected to find application number {app_num} in results" + except USPTOApiError as e: + pytest.skip(f"Application number search failed: {e}") def test_search_decisions_with_patent_number( - self, petition_decisions_client: FinalPetitionDecisionsClient + self, + petition_decisions_client: FinalPetitionDecisionsClient, + sample_petition_decision: PetitionDecision, ) -> None: """Test searching using convenience patent_number_q parameter.""" - # First get any decision with a patent number - response = petition_decisions_client.search_decisions(limit=20) - if response.count == 0: - pytest.skip("No decisions available to test patent number search") - - # Find a decision with a patent number - patent_num = None - for decision in response.petition_decision_data_bag: - if decision.patent_number: - patent_num = decision.patent_number - break - - if not patent_num: - pytest.skip("No decisions with patent numbers found in first 20 results") - - # Search for that specific patent number - response = petition_decisions_client.search_decisions( - patent_number_q=patent_num, limit=5 - ) + try: + # Try to use patent number from sample decision first + patent_num = sample_petition_decision.patent_number + + # If sample doesn't have a patent number, search for one + if not patent_num: + response = petition_decisions_client.search_decisions(limit=20) + if response.count == 0: + pytest.skip("No decisions available to test patent number search") + + # Find a decision with a patent number + for decision in response.petition_decision_data_bag: + if decision.patent_number: + patent_num = decision.patent_number + break - assert response is not None - if response.count > 0 and response.petition_decision_data_bag: - # At least one should match - found = any( - d.patent_number == patent_num - for d in response.petition_decision_data_bag + if not patent_num: + pytest.skip( + "No decisions with patent numbers found in first 20 results" + ) + + # Search for that specific patent number + response = petition_decisions_client.search_decisions( + patent_number_q=patent_num, limit=5 ) - assert ( - found - ), f"Expected to find patent number {patent_num} in results but count is {response.count}" + + assert response is not None + if ( + response.count is not None + and response.count > 0 + and response.petition_decision_data_bag + ): + # At least one should match + found = any( + d.patent_number == patent_num + for d in response.petition_decision_data_bag + ) + assert ( + found + ), f"Expected to find patent number {patent_num} in results but count is {response.count}" + except USPTOApiError as e: + pytest.skip(f"Patent number search failed: {e}") def test_search_decisions_with_technology_center( self, petition_decisions_client: FinalPetitionDecisionsClient @@ -200,7 +240,7 @@ def test_search_decisions_with_technology_center( assert response is not None assert isinstance(response, PetitionDecisionResponse) # May or may not have results depending on data availability - assert response.count >= 0 + assert response.count is not None and response.count >= 0 def test_search_decisions_with_date_range( self, petition_decisions_client: FinalPetitionDecisionsClient @@ -213,9 +253,9 @@ def test_search_decisions_with_date_range( assert response is not None assert isinstance(response, PetitionDecisionResponse) - assert response.count >= 0 + assert response.count is not None and response.count >= 0 - if response.count > 0: + if response.count is not None and response.count > 0: assert response.petition_decision_data_bag is not None assert len(response.petition_decision_data_bag) <= 5 @@ -225,14 +265,205 @@ def test_get_decision_by_id( sample_petition_decision_id: str, ) -> None: """Test getting a specific decision by ID.""" - decision = petition_decisions_client.get_decision_by_id( - sample_petition_decision_id - ) + try: + decision = petition_decisions_client.get_decision_by_id( + sample_petition_decision_id + ) + + assert decision is not None + assert isinstance(decision, PetitionDecision) + assert ( + decision.petition_decision_record_identifier + == sample_petition_decision_id + ) + assert decision.decision_type_code is not None + except USPTOApiNotFoundError: + pytest.skip( + f"Decision not found (404) for ID {sample_petition_decision_id}" + ) + except USPTOApiError as e: + pytest.skip(f"Failed to get decision by ID: {e}") + + def test_round_trip_data_integrity( + self, + petition_decisions_client: FinalPetitionDecisionsClient, + sample_petition_decision_id: str, + ) -> None: + """Test that parsing and serialization preserves data (round-trip test).""" + try: + # Get decision from API + original = petition_decisions_client.get_decision_by_id( + sample_petition_decision_id + ) + + if original is None: + pytest.skip( + f"No decision data returned for {sample_petition_decision_id}" + ) + + # Convert to dict + data_dict = original.to_dict() + + # Parse back from dict + reconstructed = PetitionDecision.from_dict(data_dict) + + # Verify key fields match + assert ( + reconstructed.petition_decision_record_identifier + == original.petition_decision_record_identifier + ) + assert reconstructed.decision_type_code == original.decision_type_code + + if original.decision_date: + assert reconstructed.decision_date == original.decision_date + + if original.application_number_text: + assert ( + reconstructed.application_number_text + == original.application_number_text + ) - assert decision is not None - assert isinstance(decision, PetitionDecision) - assert decision.petition_decision_record_identifier == sample_petition_decision_id - assert decision.decision_type_code is not None + except USPTOApiNotFoundError: + pytest.skip( + f"Decision not found (404) for round-trip test: {sample_petition_decision_id}" + ) + except USPTOApiError as e: + pytest.skip(f"Round-trip test failed due to API error: {e}") + + def test_to_dict_matches_raw_api_response( + self, api_key: Optional[str], sample_petition_decision_id: str + ) -> None: + """Test that to_dict() output matches the original API response stored in raw_data. + + This test compares the to_dict() serialization with the original API response + to ensure that the model correctly reconstructs the API format. Some differences + are expected (e.g., requestIdentifier field is not part of the model). + """ + # TEMPORARILY DISABLED: See GitHub issue #17 + # API returns naive datetime strings (e.g., '2025-12-03T07:21:12') without timezone + # indicators, but we serialize with UTC 'Z' suffix (e.g., '2025-12-03T12:21:12Z'). + # Waiting for USPTO ODP to adopt UTC standard for datetime fields. + # pytest.skip( + # "Test disabled pending USPTO API fix for datetime format. See issue #17" + # ) + + # Create a config with include_raw_data=True to preserve original API JSON + config_with_raw = USPTOConfig(api_key=api_key, include_raw_data=True) + client_with_raw = FinalPetitionDecisionsClient(config=config_with_raw) + + try: + # Get decision with raw data + response = client_with_raw.search_decisions( + query=f"petitionDecisionRecordIdentifier:{sample_petition_decision_id}", + limit=1, + ) + + if response is None or response.count == 0: + pytest.skip( + f"No decision found for raw API comparison: {sample_petition_decision_id}" + ) + + assert ( + response.raw_data is not None + ), "raw_data should be populated when include_raw_data=True" + + # Parse the raw API response JSON + import json + + raw_api_dict = json.loads(response.raw_data) + + # Convert the model back to dict + to_dict_output = response.to_dict() + + # Fields that are expected to be in raw API but not in model serialization + # (these are API metadata, not domain data) + # expected_missing_fields = {"requestIdentifier"} + expected_missing_fields = {} + + # Remove expected metadata fields from raw API for comparison + raw_api_dict_filtered = { + k: v + for k, v in raw_api_dict.items() + if k not in expected_missing_fields + } + + # Deep comparison of the two dictionaries + def compare_dicts(dict1, dict2, path=""): + """Recursively compare two dictionaries and report differences.""" + differences = [] + + # Check keys present in dict1 but not dict2 + keys1 = set(dict1.keys()) + keys2 = set(dict2.keys()) + + missing_in_dict2 = keys1 - keys2 + if missing_in_dict2: + differences.append( + f"Keys in to_dict but not in raw API at {path}: {missing_in_dict2}" + ) + + missing_in_dict1 = keys2 - keys1 + if missing_in_dict1: + differences.append( + f"Keys in raw API but not in to_dict at {path}: {missing_in_dict1}" + ) + + # Compare values for common keys + for key in keys1 & keys2: + val1 = dict1[key] + val2 = dict2[key] + current_path = f"{path}.{key}" if path else key + + if type(val1) != type(val2): + differences.append( + f"Type mismatch at {current_path}: {type(val1).__name__} vs {type(val2).__name__}" + ) + elif isinstance(val1, dict): + differences.extend(compare_dicts(val1, val2, current_path)) + elif isinstance(val1, list): + if len(val1) != len(val2): + differences.append( + f"List length mismatch at {current_path}: {len(val1)} vs {len(val2)}" + ) + else: + for i, (item1, item2) in enumerate(zip(val1, val2)): + if isinstance(item1, dict) and isinstance(item2, dict): + differences.extend( + compare_dicts( + item1, item2, f"{current_path}[{i}]" + ) + ) + elif item1 != item2: + differences.append( + f"Value mismatch at {current_path}[{i}]: {item1!r} vs {item2!r}" + ) + elif val1 != val2: + differences.append( + f"Value mismatch at {current_path}: {val1!r} vs {val2!r}" + ) + + return differences + + # Perform the comparison + differences = compare_dicts(to_dict_output, raw_api_dict_filtered) + + # If there are differences, print them and fail + if differences: + diff_report = "\n".join( + differences[:20] + ) # Limit to first 20 differences + if len(differences) > 20: + diff_report += f"\n... and {len(differences) - 20} more differences" + pytest.fail( + f"to_dict() output does not match raw API response. Differences found:\n{diff_report}" + ) + + except USPTOApiNotFoundError: + pytest.skip( + f"Decision not found (404) for raw API comparison: {sample_petition_decision_id}" + ) + except USPTOApiError as e: + pytest.skip(f"Raw API comparison failed due to API error: {e}") def test_get_decision_by_invalid_id( self, petition_decisions_client: FinalPetitionDecisionsClient @@ -267,9 +498,7 @@ def test_download_decisions_json( if len(response.petition_decision_data) > 0: assert len(response.petition_decision_data) <= 2 - assert isinstance( - response.petition_decision_data[0], PetitionDecision - ) + assert isinstance(response.petition_decision_data[0], PetitionDecision) except USPTOApiError as e: pytest.skip(f"Download endpoint failed: {e}") @@ -309,95 +538,66 @@ def test_paginate_decisions( ) -> None: """Test pagination through petition decisions.""" page_size = 5 - max_pages = 2 # Only test 2 pages to keep test fast + max_decisions = 10 # Only test first 10 decisions to keep test fast - pages_retrieved = 0 total_decisions = 0 try: - for response in petition_decisions_client.paginate_decisions( - limit=page_size, query="applicantName:*" + for decision in petition_decisions_client.paginate_decisions( + limit=page_size, query="firstApplicantName:*" ): - assert isinstance(response, PetitionDecisionResponse) - assert len(response.petition_decision_data_bag) <= page_size + assert isinstance(decision, PetitionDecision) + assert decision.petition_decision_record_identifier is not None - total_decisions += len(response.petition_decision_data_bag) - pages_retrieved += 1 + total_decisions += 1 - if pages_retrieved >= max_pages: + if total_decisions >= max_decisions: break - assert pages_retrieved > 0, "Should have retrieved at least one page" assert total_decisions > 0, "Should have retrieved at least one decision" except USPTOApiError as e: pytest.skip(f"Pagination test failed: {e}") - def test_decision_with_documents( - self, petition_decisions_client: FinalPetitionDecisionsClient - ) -> None: - """Test retrieving a decision that has associated documents.""" - # Search for decisions and find one with documents - response = petition_decisions_client.search_decisions(limit=20) - - if response.count == 0: - pytest.skip("No decisions available to test document retrieval") - - # Find a decision with documents - decision_with_docs = None - for decision in response.petition_decision_data_bag: - if decision.document_bag and len(decision.document_bag) > 0: - decision_with_docs = decision - break - - if not decision_with_docs: - pytest.skip("No decisions with documents found in first 20 results") - - # Verify document structure - assert decision_with_docs.document_bag is not None - assert len(decision_with_docs.document_bag) > 0 - - doc = decision_with_docs.document_bag[0] - assert isinstance(doc, PetitionDecisionDocument) - assert doc.document_identifier is not None - - def test_download_petition_document( - self, petition_decisions_client: FinalPetitionDecisionsClient + def test_decision_with_documents_and_download( + self, + petition_decisions_client: FinalPetitionDecisionsClient, + sample_petition_decision_id: str, ) -> None: - """Test downloading a petition decision document.""" - # Search for decisions with downloadable documents - response = petition_decisions_client.search_decisions(limit=20) - - if response.count == 0: - pytest.skip("No decisions available to test document download") - - # Find a document with download options - download_option = None - for decision in response.petition_decision_data_bag: - if decision.document_bag: - for doc in decision.document_bag: - if doc.download_option_bag and len(doc.download_option_bag) > 0: - download_option = doc.download_option_bag[0] - break - if download_option: - break - - if not download_option or not download_option.download_url: - pytest.skip("No downloadable documents found in first 20 results") - + """Test retrieving a decision with documents and downloading them.""" try: - file_path = petition_decisions_client.download_petition_document( - download_option, file_path=TEST_DOWNLOAD_DIR + # Get decision with documents + response = petition_decisions_client.get_decision_by_id( + petition_decision_record_identifier=sample_petition_decision_id, + include_documents=True, ) - assert file_path is not None - assert os.path.exists(file_path) - assert os.path.getsize(file_path) > 0 + assert response is not None + assert isinstance(response, PetitionDecision) + + if response and response.document_bag and len(response.document_bag) > 0: + doc = response.document_bag[0] + assert isinstance(doc, PetitionDecisionDocument) + assert doc.document_identifier is not None + + # If document has download options, test downloading + if doc.download_option_bag and len(doc.download_option_bag) > 0: + download_option = doc.download_option_bag[0] + if download_option.download_url: + file_path = ( + petition_decisions_client.download_petition_document( + download_option, destination_path=TEST_DOWNLOAD_DIR + ) + ) + + assert file_path is not None + assert os.path.exists(file_path) + assert os.path.getsize(file_path) > 0 + else: + pytest.fail(f"No decisions with documents found") except USPTOApiError as e: - pytest.skip(f"Document download failed: {e}") - except Exception as e: - pytest.skip(f"Document download failed with unexpected error: {e}") + pytest.fail(f"Document retrieval test failed with API error: {e}") def test_search_decisions_with_multiple_params( self, petition_decisions_client: FinalPetitionDecisionsClient @@ -411,76 +611,74 @@ def test_search_decisions_with_multiple_params( assert response is not None assert isinstance(response, PetitionDecisionResponse) - assert response.count >= 0 + assert response.count is not None and response.count >= 0 - if response.count > 0: + if response.count is not None and response.count > 0: assert len(response.petition_decision_data_bag) <= 10 - def test_search_decisions_response_fields( - self, petition_decisions_client: FinalPetitionDecisionsClient - ) -> None: - """Test that response includes expected fields.""" - response = petition_decisions_client.search_decisions(limit=5) - - assert response is not None - assert response.count is not None - assert response.request_identifier is not None - - if response.count > 0: - decision = response.petition_decision_data_bag[0] - - # Check for key fields (some may be None depending on the decision) - assert hasattr(decision, "petition_decision_record_identifier") - assert hasattr(decision, "application_number_text") - assert hasattr(decision, "decision_type_code") - assert hasattr(decision, "decision_date") - assert hasattr(decision, "document_bag") - assert hasattr(decision, "inventor_bag") - assert hasattr(decision, "rule_bag") - assert hasattr(decision, "statute_bag") - def test_decision_type_code_enum( self, petition_decisions_client: FinalPetitionDecisionsClient ) -> None: """Test that decision type codes are properly parsed into enums.""" - response = petition_decisions_client.search_decisions(limit=10) + try: + response = petition_decisions_client.search_decisions(limit=10) + + if response.count == 0: + pytest.fail("No decisions available to test decision type codes") + + # Find a decision with a decision_type_code + found = False + for decision in response.petition_decision_data_bag: + if decision.decision_type_code: + # Should be a valid DecisionTypeCode enum or string + assert isinstance( + decision.decision_type_code, (DecisionTypeCode, str) + ) + found = True + break - if response.count == 0: - pytest.skip("No decisions available to test decision type codes") + if not found: + pytest.fail("No decisions with decision_type_code found in 10 results") - # Find a decision with a decision_type_code - for decision in response.petition_decision_data_bag: - if decision.decision_type_code: - # Should be a valid DecisionTypeCode enum or string - assert isinstance(decision.decision_type_code, (DecisionTypeCode, str)) - break - else: - pytest.skip("No decisions with decision_type_code found") + except USPTOApiError as e: + pytest.fail(f"Decision type code test failed with API error: {e}") def test_document_direction_category_enum( - self, petition_decisions_client: FinalPetitionDecisionsClient + self, + petition_decisions_client: FinalPetitionDecisionsClient, + sample_petition_decision_id: str, ) -> None: """Test that document direction categories are properly parsed into enums.""" - response = petition_decisions_client.search_decisions(limit=20) + try: + # Get decision with documents - same pattern as test_decision_with_documents_and_download + response = petition_decisions_client.get_decision_by_id( + petition_decision_record_identifier=sample_petition_decision_id, + include_documents=True, + ) - if response.count == 0: - pytest.skip("No decisions available to test document direction categories") + assert response is not None + assert isinstance(response, PetitionDecision) - # Find a document with a direction category - found = False - for decision in response.petition_decision_data_bag: - if decision.document_bag: - for doc in decision.document_bag: - if doc.document_direction_category: + # Find a document with a direction category + found = False + if response and response.document_bag and len(response.document_bag) > 0: + for doc in response.document_bag: + if doc.direction_category: # Should be a valid DocumentDirectionCategory enum or string assert isinstance( - doc.document_direction_category, + doc.direction_category, (DocumentDirectionCategory, str), ) found = True break - if found: - break + else: + pytest.fail( + f"No documents found to test in decision: {sample_petition_decision_id}" + ) + if not found: + pytest.fail( + f"No documents with direction categories found to test in decision: {sample_petition_decision_id}" + ) - if not found: - pytest.skip("No documents with direction_category found") + except USPTOApiError as e: + pytest.fail(f"Document direction category test failed with API error: {e}") diff --git a/tests/models/test_patent_data_models.py b/tests/models/test_patent_data_models.py index 77aa5cd..22ce77f 100644 --- a/tests/models/test_patent_data_models.py +++ b/tests/models/test_patent_data_models.py @@ -1532,7 +1532,7 @@ def test_pta_history_from_dict(self) -> None: "applicantDayDelayQuantity": 10.0, "eventDescriptionText": "Response to Office Action", "eventSequenceNumber": 1.0, - "ipOfficeAdjustmentDelayQuantity": 5.0, + "ipOfficeDayDelayQuantity": 5.0, "originatingEventSequenceNumber": 0.0, "ptaPTECode": "A", } @@ -1540,7 +1540,7 @@ def test_pta_history_from_dict(self) -> None: assert pta_hist.event_date == date(2022, 1, 1) assert pta_hist.applicant_day_delay_quantity == 10.0 assert pta_hist.event_description_text == "Response to Office Action" - assert pta_hist.ip_office_adjustment_delay_quantity == 5.0 + assert pta_hist.ip_office_day_delay_quantity == 5.0 def test_pta_history_to_dict(self) -> None: pta_hist = PatentTermAdjustmentHistoryData( @@ -1550,11 +1550,16 @@ def test_pta_history_to_dict(self) -> None: event_sequence_number=1.0, originating_event_sequence_number=0.0, pta_pte_code="A", + ip_office_day_delay_quantity=5.0, ) data = pta_hist.to_dict() assert data["eventDate"] == "2022-01-01" assert data["applicantDayDelayQuantity"] == 10.0 assert data["eventDescriptionText"] == "Response to Office Action" + assert data["eventSequenceNumber"] == 1.0 + assert data["originatingEventSequenceNumber"] == 0.0 + assert data["ptaPTECode"] == "A" + assert data["ipOfficeDayDelayQuantity"] == 5.0 class TestPatentTermAdjustmentData: @@ -1564,11 +1569,13 @@ def test_pta_data_from_dict(self) -> None: data = { "aDelayQuantity": 100.0, "adjustmentTotalQuantity": 150.0, + "ipOfficeAdjustmentDelayQuantity": 2.0, "patentTermAdjustmentHistoryDataBag": [{"eventDate": "2022-01-01"}], } pta_data = PatentTermAdjustmentData.from_dict(data) assert pta_data.a_delay_quantity == 100.0 assert pta_data.adjustment_total_quantity == 150.0 + assert pta_data.ip_office_adjustment_delay_quantity == 2.0 assert len(pta_data.patent_term_adjustment_history_data_bag) == 1 assert pta_data.patent_term_adjustment_history_data_bag[0].event_date == date( 2022, 1, 1 @@ -1941,7 +1948,7 @@ def test_empty_patent_data_response_to_dict(self) -> None: response = PatentDataResponse(count=0, patent_file_wrapper_data_bag=[]) result = response.to_dict() assert result["count"] == 0 - assert result["patentFileWrapperDataBag"] == [] + assert "patentFileWrapperDataBag" not in result def test_patent_data_response_to_csv( self, patent_data_sample: Dict[str, Any] diff --git a/tests/models/test_petition_decision_models.py b/tests/models/test_petition_decision_models.py index 83d8b4e..b8798b2 100644 --- a/tests/models/test_petition_decision_models.py +++ b/tests/models/test_petition_decision_models.py @@ -39,7 +39,7 @@ def sample_document_dict() -> Dict[str, Any]: "documentIdentifier": "M98QOH0NWFYTX17", "documentCode": "PETDEC", "documentCodeDescriptionText": "Petition Decision", - "documentDirectionCategory": "OUTGOING", + "directionCategory": "OUTGOING", "downloadOptionBag": [ { "mimeTypeIdentifier": "PDF", @@ -171,7 +171,7 @@ def test_from_dict_complete(self, sample_document_dict: Dict[str, Any]) -> None: assert doc.document_identifier == "M98QOH0NWFYTX17" assert doc.document_code == "PETDEC" assert doc.document_code_description_text == "Petition Decision" - assert doc.document_direction_category == "OUTGOING" + assert doc.direction_category == "OUTGOING" assert len(doc.download_option_bag) == 2 assert doc.download_option_bag[0].mime_type_identifier == "PDF" assert doc.download_option_bag[1].mime_type_identifier == "XML" diff --git a/tests/models/test_ptab_models.py b/tests/models/test_ptab_models.py index 0d7e401..98cda22 100644 --- a/tests/models/test_ptab_models.py +++ b/tests/models/test_ptab_models.py @@ -62,31 +62,42 @@ def test_self_import_works(self) -> None: assert hasattr(ptab_module, "PartyData") def test_import_fallback_logic(self) -> None: + """ + Tests that the module falls back to typing_extensions.Self if typing.Self fails. + Uses builtins.__import__ patching to avoid corrupting the global typing module. + """ import sys import importlib - import typing + import builtins + from unittest.mock import patch import typing_extensions module_name = "pyUSPTO.models.ptab" - original_self = getattr(typing, "Self", None) + # 1. Ensure the module is unloaded so we can force a fresh import if module_name in sys.modules: del sys.modules[module_name] - try: - if original_self: - del typing.Self + # 2. Define a side_effect that simulates ImportError ONLY when importing Self from typing + # This intercepts 'from typing import Self' + original_import = builtins.__import__ + def mock_import(name, globals=None, locals=None, fromlist=(), level=0): + if name == "typing" and "Self" in fromlist: + raise ImportError("Simulated missing Self in typing") + return original_import(name, globals, locals, fromlist, level) + + # 3. Apply the patch and import + with patch("builtins.__import__", side_effect=mock_import): ptab_module = importlib.import_module(module_name) - assert ptab_module.Self is typing_extensions.Self - finally: - if original_self: - typing.Self = original_self + # 4. Verify the fallback works (it should be the typing_extensions version) + assert ptab_module.Self is typing_extensions.Self - if module_name in sys.modules: - del sys.modules[module_name] - importlib.import_module(module_name) + # 5. Cleanup: Restore the module to its normal state for other tests + if module_name in sys.modules: + del sys.modules[module_name] + importlib.import_module(module_name) def test_self_type_in_from_dict_methods(self) -> None: """Test that from_dict methods work correctly with Self return type.""" From 478f40290255dcec7cdd734b1d46467f0a7c3b2b Mon Sep 17 00:00:00 2001 From: Andrew Date: Mon, 8 Dec 2025 11:10:02 -0600 Subject: [PATCH 09/17] Fixed integration tests. Now need to fix unit tests. --- src/pyUSPTO/clients/ptab_appeals.py | 2 +- src/pyUSPTO/clients/ptab_interferences.py | 37 +- src/pyUSPTO/clients/ptab_trials.py | 12 +- src/pyUSPTO/models/patent_data.py | 24 +- src/pyUSPTO/models/petition_decisions.py | 14 +- src/pyUSPTO/models/ptab.py | 545 +++++++++++++++++- src/pyUSPTO/models/utils.py | 8 + .../test_patent_data_integration.py | 2 +- .../test_ptab_appeals_integration.py | 206 +++++-- .../test_ptab_interferences_integration.py | 170 +++++- .../test_ptab_trials_integration.py | 373 ++++++++++-- 11 files changed, 1246 insertions(+), 147 deletions(-) diff --git a/src/pyUSPTO/clients/ptab_appeals.py b/src/pyUSPTO/clients/ptab_appeals.py index dc21976..107c18e 100644 --- a/src/pyUSPTO/clients/ptab_appeals.py +++ b/src/pyUSPTO/clients/ptab_appeals.py @@ -23,7 +23,7 @@ class PTABAppealsClient(BaseUSPTOClient[PTABAppealResponse]): """ ENDPOINTS = { - "search_decisions": "api/v1/ptab/appeals/decisions/search", + "search_decisions": "api/v1/patent/appeals/decisions/search", } def __init__( diff --git a/src/pyUSPTO/clients/ptab_interferences.py b/src/pyUSPTO/clients/ptab_interferences.py index a93bd91..8bcd6cf 100644 --- a/src/pyUSPTO/clients/ptab_interferences.py +++ b/src/pyUSPTO/clients/ptab_interferences.py @@ -23,7 +23,7 @@ class PTABInterferencesClient(BaseUSPTOClient[PTABInterferenceResponse]): """ ENDPOINTS = { - "search_decisions": "api/v1/ptab/interferences/decisions/search", + "search_decisions": "api/v1/patent/interferences/decisions/search", } def __init__( @@ -65,6 +65,7 @@ def search_decisions( junior_party_application_number_q: Optional[str] = None, senior_party_name_q: Optional[str] = None, junior_party_name_q: Optional[str] = None, + real_party_in_interest_q: Optional[str] = None, interference_outcome_category_q: Optional[str] = None, decision_type_category_q: Optional[str] = None, decision_date_from_q: Optional[str] = None, @@ -93,6 +94,7 @@ def search_decisions( junior_party_application_number_q: Filter by junior party application number. senior_party_name_q: Filter by senior party name. junior_party_name_q: Filter by junior party name. + real_party_in_interest_q: Filter by Real Party in Interest. interference_outcome_category_q: Filter by interference outcome category. decision_type_category_q: Filter by decision type category. decision_date_from_q: Filter decisions from this date (YYYY-MM-DD). @@ -141,32 +143,47 @@ def search_decisions( q_parts.append(f"interferenceNumber:{interference_number_q}") if senior_party_application_number_q: q_parts.append( - f"seniorPartyApplicationNumber:{senior_party_application_number_q}" + f"seniorPartyData.applicationNumberText:{senior_party_application_number_q}" ) if junior_party_application_number_q: q_parts.append( - f"juniorPartyApplicationNumber:{junior_party_application_number_q}" + f"juniorPartyData.applicationNumberText:{junior_party_application_number_q}" ) if senior_party_name_q: - q_parts.append(f"seniorPartyName:{senior_party_name_q}") + q_parts.append( + f"seniorPartyData.patentOwnerName:{senior_party_name_q} OR seniorPartyData.inventorName:{senior_party_name_q} OR seniorPartyData.realPartyInInterestName:{senior_party_name_q}" + ) if junior_party_name_q: - q_parts.append(f"juniorPartyName:{junior_party_name_q}") + q_parts.append( + f"juniorPartyData.patentOwnerName:{junior_party_name_q} OR juniorPartyData.inventorName:{junior_party_name_q} OR juniorPartyData.realPartyInInterestName:{junior_party_name_q}" + ) + if real_party_in_interest_q: + q_parts.append( + f"seniorPartyData.realPartyInInterestName:{real_party_in_interest_q} OR juniorPartyData.realPartyInInterestName:{real_party_in_interest_q}" + ) + if interference_outcome_category_q: q_parts.append( - f"interferenceOutcomeCategory:{interference_outcome_category_q}" + f'documentData.interferenceOutcomeCategory:"{interference_outcome_category_q}"' ) if decision_type_category_q: - q_parts.append(f"decisionTypeCategory:{decision_type_category_q}") + q_parts.append( + f'documentData.decisionTypeCategory:"{decision_type_category_q}"' + ) # Handle decision date range if decision_date_from_q and decision_date_to_q: q_parts.append( - f"decisionDate:[{decision_date_from_q} TO {decision_date_to_q}]" + f"documentData.decisionIssueDate:[{decision_date_from_q} TO {decision_date_to_q}]" ) elif decision_date_from_q: - q_parts.append(f"decisionDate:>={decision_date_from_q}") + q_parts.append( + f"documentData.decisionIssueDate:>={decision_date_from_q}" + ) elif decision_date_to_q: - q_parts.append(f"decisionDate:<={decision_date_to_q}") + q_parts.append( + f"documentData.decisionIssueDate:<={decision_date_to_q}" + ) if q_parts: final_q = " AND ".join(q_parts) diff --git a/src/pyUSPTO/clients/ptab_trials.py b/src/pyUSPTO/clients/ptab_trials.py index 6b80229..441f203 100644 --- a/src/pyUSPTO/clients/ptab_trials.py +++ b/src/pyUSPTO/clients/ptab_trials.py @@ -198,7 +198,7 @@ def search_proceedings( if respondent_name_q: q_parts.append(f"respondentData.patentOwnerName:{respondent_name_q}") if trial_type_code_q: - q_parts.append(f"trialTypeCode:{trial_type_code_q}") + q_parts.append(f"trialMetaData.trialTypeCode:{trial_type_code_q}") if trial_status_category_q: q_parts.append( f"trialMetaData.trialStatusCategory:{trial_status_category_q}" @@ -275,7 +275,7 @@ def search_documents( range_filters: Range filter configuration string. post_body: Optional POST body for complex queries. trial_number_q: Filter by trial number. - document_category_q: Filter by document category (e.g., "Petition"). + document_category_q: Filter by document category (e.g., "Petition") DOCUMENTED BUT NOT IN API. document_type_name_q: Filter by document type name (description). filing_date_from_q: Filter documents from this date (YYYY-MM-DD). filing_date_to_q: Filter documents to this date (YYYY-MM-DD). @@ -363,6 +363,7 @@ def search_decisions( # Convenience query parameters trial_number_q: Optional[str] = None, decision_type_category_q: Optional[str] = None, + document_type_description_q: Optional[str] = None, decision_date_from_q: Optional[str] = None, decision_date_to_q: Optional[str] = None, trial_type_code_q: Optional[str] = None, @@ -393,6 +394,7 @@ def search_decisions( post_body: Optional POST body for complex queries. trial_number_q: Filter by trial number. decision_type_category_q: Filter by decision type category. + document_type_description_q: Filter by "*[description]*". decision_date_from_q: Filter decisions from this date (YYYY-MM-DD). decision_date_to_q: Filter decisions to this date (YYYY-MM-DD). trial_type_code_q: Filter by trial type code (e.g., "IPR", "PGR", "CBM", "DER"). @@ -425,8 +427,12 @@ def search_decisions( q_parts.append( f"decisionData.decisionTypeCategory:{decision_type_category_q}" ) + if document_type_description_q: + q_parts.append( + f"documentData.documentTypeDescriptionText:*{document_type_description_q}*" + ) if trial_type_code_q: - q_parts.append(f"trialTypeCode:{trial_type_code_q}") + q_parts.append(f"trialMetaData.trialTypeCode:{trial_type_code_q}") if patent_number_q: q_parts.append(f"patentOwnerData.patentNumber:{patent_number_q}") if application_number_q: diff --git a/src/pyUSPTO/models/patent_data.py b/src/pyUSPTO/models/patent_data.py index 6fe140e..13ffd10 100644 --- a/src/pyUSPTO/models/patent_data.py +++ b/src/pyUSPTO/models/patent_data.py @@ -27,7 +27,7 @@ parse_yn_to_bool, serialize_bool_to_yn, serialize_date, - serialize_datetime_as_iso, + serialize_datetime_as_naive, to_camel_case, ) from pyUSPTO.warnings import USPTOEnumParseWarning @@ -226,7 +226,11 @@ def to_dict(self) -> Dict[str, Any]: d = { "applicationNumberText": self.application_number_text, - "officialDate": serialize_datetime_as_iso(self.official_date), + "officialDate": ( + serialize_datetime_as_naive(self.official_date) + if self.official_date + else None + ), "documentIdentifier": self.document_identifier, "documentCode": self.document_code, "documentCodeDescriptionText": self.document_code_description_text, @@ -1297,11 +1301,12 @@ def to_dict(self) -> Dict[str, Any]: """Converts the `ParentContinuity` instance to a dictionary. Maps attributes to specific camelCase keys expected by the API for parent continuity. + Filters out None values to match the API response structure. Returns: Dict[str, Any]: Dictionary representation. """ - return { + _dict = { "firstInventorToFileIndicator": self.first_inventor_to_file_indicator, "parentApplicationStatusCode": self.parent_application_status_code, "parentPatentNumber": self.parent_patent_number, @@ -1314,6 +1319,7 @@ def to_dict(self) -> Dict[str, Any]: "claimParentageTypeCode": self.claim_parentage_type_code, "claimParentageTypeCodeDescriptionText": self.claim_parentage_type_code_description_text, } + return {k: v for k, v in _dict.items() if v is not None} @dataclass(frozen=True) @@ -1374,11 +1380,12 @@ def to_dict(self) -> Dict[str, Any]: """Converts the `ChildContinuity` instance to a dictionary. Maps attributes to specific camelCase keys expected by the API for child continuity. + Filters out None values to match the API response structure. Returns: Dict[str, Any]: Dictionary representation. """ - return { + _dict = { "childApplicationStatusCode": self.child_application_status_code, "parentApplicationNumberText": self.parent_application_number_text, "childApplicationNumberText": self.child_application_number_text, @@ -1391,6 +1398,7 @@ def to_dict(self) -> Dict[str, Any]: "claimParentageTypeCode": self.claim_parentage_type_code, "claimParentageTypeCodeDescriptionText": self.claim_parentage_type_code_description_text, } + return {k: v for k, v in _dict.items() if v is not None} @dataclass(frozen=True) @@ -1646,7 +1654,7 @@ def to_dict(self) -> Dict[str, Any]: if self.file_location_uri is not None: final_dict["fileLocationURI"] = self.file_location_uri if self.file_create_date_time is not None: - final_dict["fileCreateDateTime"] = serialize_datetime_as_iso( + final_dict["fileCreateDateTime"] = serialize_datetime_as_naive( self.file_create_date_time ) if self.xml_file_name is not None: @@ -2084,8 +2092,10 @@ def to_dict(self) -> Dict[str, Any]: if self.grant_document_meta_data else None ), - "lastIngestionDateTime": serialize_datetime_as_iso( - self.last_ingestion_date_time + "lastIngestionDateTime": ( + serialize_datetime_as_naive(self.last_ingestion_date_time) + if self.last_ingestion_date_time + else None ), } return { diff --git a/src/pyUSPTO/models/petition_decisions.py b/src/pyUSPTO/models/petition_decisions.py index be989fd..0bf2575 100644 --- a/src/pyUSPTO/models/petition_decisions.py +++ b/src/pyUSPTO/models/petition_decisions.py @@ -17,7 +17,7 @@ parse_to_date, parse_to_datetime_utc, serialize_date, - serialize_datetime_as_iso, + serialize_datetime_as_naive, ) @@ -173,7 +173,11 @@ def to_dict(self) -> Dict[str, Any]: """ d = { "applicationNumberText": self.application_number_text, - "officialDate": serialize_datetime_as_iso(self.official_date), + "officialDate": ( + serialize_datetime_as_naive(self.official_date) + if self.official_date + else None + ), "documentIdentifier": self.document_identifier, "documentCode": self.document_code, "documentCodeDescriptionText": self.document_code_description_text, @@ -366,8 +370,10 @@ def to_dict(self) -> Dict[str, Any]: "statuteBag": self.statute_bag, "ruleBag": self.rule_bag, "documentBag": [doc.to_dict() for doc in self.document_bag], - "lastIngestionDateTime": serialize_datetime_as_iso( - self.last_ingestion_datetime + "lastIngestionDateTime": ( + serialize_datetime_as_naive(self.last_ingestion_datetime) + if self.last_ingestion_datetime + else None ), } return { diff --git a/src/pyUSPTO/models/ptab.py b/src/pyUSPTO/models/ptab.py index 61cac5f..c813dab 100644 --- a/src/pyUSPTO/models/ptab.py +++ b/src/pyUSPTO/models/ptab.py @@ -10,7 +10,7 @@ """ import json -from dataclasses import dataclass, field +from dataclasses import asdict, dataclass, field from datetime import date, datetime from typing import Any, Dict, List, Optional @@ -25,6 +25,8 @@ parse_to_datetime_utc, serialize_date, serialize_datetime_as_iso, + to_camel_case, + serialize_datetime_as_naive, ) @@ -83,6 +85,21 @@ def from_dict(cls, data: Dict[str, Any], include_raw_data: bool = False) -> Self publication_number=data.get("publicationNumber"), ) + def to_dict(self) -> Dict[str, Any]: + """Converts the PartyData instance to a dictionary. + + Returns: + Dict[str, Any]: Dictionary with camelCase keys and None values filtered. + """ + result = {} + for k, v in asdict(self).items(): + if v is not None: + if isinstance(v, date): + result[to_camel_case(k)] = serialize_date(v) + else: + result[to_camel_case(k)] = v + return result + # ============================================================================ # TRIAL PROCEEDINGS MODELS @@ -149,6 +166,43 @@ def from_dict( ), ) + def to_dict(self) -> Dict[str, Any]: + """Converts the TrialMetaData instance to a dictionary. + + Returns: + Dict[str, Any]: Dictionary with camelCase keys and None values filtered. + """ + result = {} + + if self.petition_filing_date is not None: + result["petitionFilingDate"] = serialize_date(self.petition_filing_date) + if self.accorded_filing_date is not None: + result["accordedFilingDate"] = serialize_date(self.accorded_filing_date) + if self.trial_last_modified_date_time is not None: + result["trialLastModifiedDateTime"] = serialize_datetime_as_naive( + self.trial_last_modified_date_time + ) + if self.trial_last_modified_date is not None: + result["trialLastModifiedDate"] = serialize_date( + self.trial_last_modified_date + ) + if self.trial_status_category is not None: + result["trialStatusCategory"] = self.trial_status_category + if self.trial_type_code is not None: + result["trialTypeCode"] = self.trial_type_code + if self.file_download_uri is not None: + result["fileDownloadURI"] = self.file_download_uri + if self.termination_date is not None: + result["terminationDate"] = serialize_date(self.termination_date) + if self.latest_decision_date is not None: + result["latestDecisionDate"] = serialize_date(self.latest_decision_date) + if self.institution_decision_date is not None: + result["institutionDecisionDate"] = serialize_date( + self.institution_decision_date + ) + + return result + @dataclass(frozen=True) class PatentOwnerData(PartyData): @@ -187,6 +241,21 @@ def from_dict( real_party_in_interest_name=data.get("realPartyInInterestName"), ) + def to_dict(self) -> Dict[str, Any]: + """Converts the RegularPetitionerData instance to a dictionary. + + Returns: + Dict[str, Any]: Dictionary with camelCase keys and None values filtered. + """ + result = {} + + if self.counsel_name is not None: + result["counselName"] = self.counsel_name + if self.real_party_in_interest_name is not None: + result["realPartyInInterestName"] = self.real_party_in_interest_name + + return result + @dataclass(frozen=True) class RespondentData(PartyData): @@ -279,6 +348,37 @@ def from_dict( raw_data=data if include_raw_data else None, ) + def to_dict(self) -> Dict[str, Any]: + """Converts the PTABTrialProceeding instance to a dictionary. + + Returns: + Dict[str, Any]: Dictionary with camelCase keys and None values filtered. + """ + result = {} + + if self.trial_number is not None: + result["trialNumber"] = self.trial_number + if self.trial_record_identifier is not None: + result["trialRecordIdentifier"] = self.trial_record_identifier + if self.last_modified_date_time is not None: + result["lastModifiedDateTime"] = serialize_datetime_as_naive( + self.last_modified_date_time + ) + if self.trial_meta_data is not None: + result["trialMetaData"] = self.trial_meta_data.to_dict() + if self.patent_owner_data is not None: + result["patentOwnerData"] = self.patent_owner_data.to_dict() + if self.regular_petitioner_data is not None: + result["regularPetitionerData"] = self.regular_petitioner_data.to_dict() + if self.respondent_data is not None: + result["respondentData"] = self.respondent_data.to_dict() + if self.derivation_petitioner_data is not None: + result["derivationPetitionerData"] = ( + self.derivation_petitioner_data.to_dict() + ) + + return result + @dataclass(frozen=True) class PTABTrialProceedingResponse: @@ -291,7 +391,7 @@ class PTABTrialProceedingResponse: raw_data: Raw JSON response data (if include_raw_data=True). """ - count: Optional[int] = None + count: int = 0 request_identifier: Optional[str] = None patent_trial_proceeding_data_bag: List[PTABTrialProceeding] = field( default_factory=list @@ -318,12 +418,35 @@ def from_dict( ] return cls( - count=data.get("count"), + count=data.get("count", 0), request_identifier=data.get("requestIdentifier"), patent_trial_proceeding_data_bag=proceedings, raw_data=data if include_raw_data else None, ) + def to_dict(self) -> Dict[str, Any]: + """Converts the PTABTrialProceedingResponse instance to a dictionary. + + Returns: + Dict[str, Any]: Dictionary with camelCase keys and None values filtered. + """ + result = {} + + if self.count is not None: + result["count"] = self.count + if self.request_identifier is not None: + result["requestIdentifier"] = self.request_identifier + if ( + self.patent_trial_proceeding_data_bag is not None + and len(self.patent_trial_proceeding_data_bag) > 0 + ): + result["patentTrialProceedingDataBag"] = [ + proceeding.to_dict() + for proceeding in self.patent_trial_proceeding_data_bag + ] + + return result + @dataclass(frozen=True) class TrialDocumentData: @@ -379,6 +502,43 @@ def from_dict(cls, data: Dict[str, Any]) -> "TrialDocumentData": document_status=data.get("documentStatus"), ) + def to_dict(self) -> Dict[str, Any]: + """Converts the TrialDocumentData instance to a dictionary. + + Returns: + Dict[str, Any]: Dictionary with camelCase keys and None values filtered. + """ + result = {} + + if self.document_category is not None: + result["documentCategory"] = self.document_category + if self.document_filing_date is not None: + result["documentFilingDate"] = serialize_date(self.document_filing_date) + if self.document_identifier is not None: + result["documentIdentifier"] = self.document_identifier + if self.document_name is not None: + result["documentName"] = self.document_name + if self.document_number is not None: + result["documentNumber"] = self.document_number + if self.document_size_quantity is not None: + result["documentSizeQuantity"] = self.document_size_quantity + if self.document_ocr_text is not None: + result["documentOCRText"] = self.document_ocr_text # Uppercase OCR + if self.document_title_text is not None: + result["documentTitleText"] = self.document_title_text + if self.document_type_description_text is not None: + result["documentTypeDescriptionText"] = self.document_type_description_text + if self.file_download_uri is not None: + result["fileDownloadURI"] = self.file_download_uri # Uppercase URI + if self.filing_party_category is not None: + result["filingPartyCategory"] = self.filing_party_category + if self.mime_type_identifier is not None: + result["mimeTypeIdentifier"] = self.mime_type_identifier + if self.document_status is not None: + result["documentStatus"] = self.document_status + + return result + @dataclass(frozen=True) class TrialDecisionData: @@ -408,6 +568,27 @@ def from_dict(cls, data: Dict[str, Any]) -> "TrialDecisionData": trial_outcome_category=data.get("trialOutcomeCategory"), ) + def to_dict(self) -> Dict[str, Any]: + """Converts the TrialDecisionData instance to a dictionary. + + Returns: + Dict[str, Any]: Dictionary with camelCase keys and None values filtered. + """ + result = {} + + if self.statute_and_rule_bag is not None and len(self.statute_and_rule_bag) > 0: + result["statuteAndRuleBag"] = self.statute_and_rule_bag + if self.decision_issue_date is not None: + result["decisionIssueDate"] = serialize_date(self.decision_issue_date) + if self.decision_type_category is not None: + result["decisionTypeCategory"] = self.decision_type_category + if self.issue_type_bag is not None and len(self.issue_type_bag) > 0: + result["issueTypeBag"] = self.issue_type_bag + if self.trial_outcome_category is not None: + result["trialOutcomeCategory"] = self.trial_outcome_category + + return result + @dataclass(frozen=True) class PTABTrialDocument: @@ -473,12 +654,50 @@ def from_dict( raw_data=data if include_raw_data else None, ) + def to_dict(self) -> Dict[str, Any]: + """Converts the PTABTrialDocument instance to a dictionary. + + Returns: + Dict[str, Any]: Dictionary with camelCase keys and None values filtered. + """ + result = {} + + if self.trial_document_category is not None: + result["trialDocumentCategory"] = self.trial_document_category + if self.last_modified_date_time is not None: + result["lastModifiedDateTime"] = serialize_datetime_as_naive( + self.last_modified_date_time + ) + if self.trial_number is not None: + result["trialNumber"] = self.trial_number + if self.trial_type_code is not None: + result["trialTypeCode"] = self.trial_type_code + if self.trial_meta_data is not None: + result["trialMetaData"] = self.trial_meta_data.to_dict() + if self.patent_owner_data is not None: + result["patentOwnerData"] = self.patent_owner_data.to_dict() + if self.regular_petitioner_data is not None: + result["regularPetitionerData"] = self.regular_petitioner_data.to_dict() + if self.respondent_data is not None: + result["respondentData"] = self.respondent_data.to_dict() + if self.derivation_petitioner_data is not None: + result["derivationPetitionerData"] = ( + self.derivation_petitioner_data.to_dict() + ) + if self.document_data is not None: + result["documentData"] = self.document_data.to_dict() + if self.decision_data is not None: + result["decisionData"] = self.decision_data.to_dict() + + return result + @dataclass(frozen=True) class PTABTrialDocumentResponse: """Response container for PTAB trial documents/decisions search.""" - count: Optional[int] = None + count: int = 0 + request_identifier: Optional[str] = None patent_trial_document_data_bag: List[PTABTrialDocument] = field( default_factory=list ) @@ -494,11 +713,34 @@ def from_dict( for item in docs_data ] return cls( - count=data.get("count"), + count=data.get("count", 0), patent_trial_document_data_bag=docs, + request_identifier=data.get("requestIdentifier"), raw_data=data if include_raw_data else None, ) + def to_dict(self) -> Dict[str, Any]: + """Converts the PTABTrialDocumentResponse instance to a dictionary. + + Returns: + Dict[str, Any]: Dictionary with camelCase keys and None values filtered. + """ + result = {} + + if self.count is not None: + result["count"] = self.count + if self.request_identifier is not None: + result["requestIdentifier"] = self.request_identifier + if ( + self.patent_trial_document_data_bag is not None + and len(self.patent_trial_document_data_bag) > 0 + ): + result["patentTrialDocumentDataBag"] = [ + doc.to_dict() for doc in self.patent_trial_document_data_bag + ] + + return result + # ============================================================================ # APPEAL DECISIONS MODELS @@ -519,7 +761,7 @@ class AppealMetaData: appeal_filing_date: Optional[date] = None appeal_last_modified_date: Optional[date] = None - appeal_last_modified_date_time: Optional[date] = None + appeal_last_modified_date_time: Optional[datetime] = None application_type_category: Optional[str] = None docket_notice_mailed_date: Optional[date] = None file_download_uri: Optional[str] = None @@ -550,6 +792,35 @@ def from_dict( file_download_uri=file_download_uri, ) + def to_dict(self) -> Dict[str, Any]: + """Converts the AppealMetaData instance to a dictionary. + + Returns: + Dict[str, Any]: Dictionary with camelCase keys and None values filtered. + """ + result = {} + + if self.appeal_filing_date is not None: + result["appealFilingDate"] = serialize_date(self.appeal_filing_date) + if self.appeal_last_modified_date is not None: + result["appealLastModifiedDate"] = serialize_date( + self.appeal_last_modified_date + ) + if self.appeal_last_modified_date_time is not None: + result["appealLastModifiedDateTime"] = serialize_datetime_as_naive( + self.appeal_last_modified_date_time + ) + if self.application_type_category is not None: + result["applicationTypeCategory"] = self.application_type_category + if self.docket_notice_mailed_date is not None: + result["docketNoticeMailedDate"] = serialize_date( + self.docket_notice_mailed_date + ) + if self.file_download_uri is not None: + result["fileDownloadURI"] = self.file_download_uri + + return result + @dataclass(frozen=True) class AppellantData(PartyData): @@ -585,6 +856,18 @@ def from_dict( third_party_name=data.get("thirdPartyName"), ) + def to_dict(self) -> Dict[str, Any]: + """Converts the RequestorData instance to a dictionary. + + Returns: + Dict[str, Any]: Dictionary with camelCase keys and None values filtered. + """ + result = {} + for k, v in asdict(self).items(): + if v is not None: + result[to_camel_case(k)] = v + return result + @dataclass(frozen=True) class AppealDocumentData: @@ -637,6 +920,31 @@ def from_dict( file_download_uri=file_download_uri, ) + def to_dict(self) -> Dict[str, Any]: + """Converts the AppealDocumentData instance to a dictionary. + + Returns: + Dict[str, Any]: Dictionary with camelCase keys and None values filtered. + """ + result = {} + + if self.document_filing_date is not None: + result["documentFilingDate"] = serialize_date(self.document_filing_date) + if self.document_identifier is not None: + result["documentIdentifier"] = self.document_identifier + if self.document_name is not None: + result["documentName"] = self.document_name + if self.document_size_quantity is not None: + result["documentSizeQuantity"] = self.document_size_quantity + if self.document_ocr_text is not None: + result["documentOCRText"] = self.document_ocr_text + if self.document_type_description_text is not None: + result["documentTypeDescriptionText"] = self.document_type_description_text + if self.file_download_uri is not None: + result["fileDownloadURI"] = self.file_download_uri + + return result + @dataclass(frozen=True) class DecisionData: @@ -677,6 +985,24 @@ def from_dict( issue_type_bag=data.get("issueTypeBag", []), ) + def to_dict(self) -> Dict[str, Any]: + """Converts the DecisionData instance to a dictionary. + + Returns: + Dict[str, Any]: Dictionary with camelCase keys and None values filtered. + """ + result = {} + for k, v in asdict(self).items(): + if v is not None: + if isinstance(v, date): + result[to_camel_case(k)] = serialize_date(v) + elif isinstance(v, list) and len(v) == 0: + # Skip empty lists + continue + else: + result[to_camel_case(k)] = v + return result + @dataclass(frozen=True) class PTABAppealDecision: @@ -750,6 +1076,36 @@ def from_dict( raw_data=data if include_raw_data else None, ) + def to_dict(self) -> Dict[str, Any]: + """Converts the PTABAppealDecision instance to a dictionary. + + Returns: + Dict[str, Any]: Dictionary with camelCase keys and None values filtered. + """ + result = {} + + # Manually process each field to preserve nested objects + if self.appeal_number is not None: + result["appealNumber"] = self.appeal_number + if self.last_modified_date_time is not None: + result["lastModifiedDateTime"] = serialize_datetime_as_naive( + self.last_modified_date_time + ) + if self.appeal_document_category is not None: + result["appealDocumentCategory"] = self.appeal_document_category + if self.appeal_meta_data is not None: + result["appealMetaData"] = self.appeal_meta_data.to_dict() + if self.appellant_data is not None: + result["appellantData"] = self.appellant_data.to_dict() + if self.requestor_data is not None: + result["requestorData"] = self.requestor_data.to_dict() + if self.document_data is not None: + result["documentData"] = self.document_data.to_dict() + if self.decision_data is not None: + result["decisionData"] = self.decision_data.to_dict() + + return result + @dataclass(frozen=True) class PTABAppealResponse: @@ -762,7 +1118,7 @@ class PTABAppealResponse: raw_data: Raw JSON response data (if include_raw_data=True). """ - count: Optional[int] = None + count: int = 0 request_identifier: Optional[str] = None patent_appeal_data_bag: List[PTABAppealDecision] = field(default_factory=list) raw_data: Optional[Dict[str, Any]] = None @@ -787,12 +1143,35 @@ def from_dict( ] return cls( - count=data.get("count"), + count=data.get("count", 0), request_identifier=data.get("requestIdentifier"), patent_appeal_data_bag=appeals, raw_data=data if include_raw_data else None, ) + def to_dict(self) -> Dict[str, Any]: + """Converts the PTABAppealResponse instance to a dictionary. + + Returns: + Dict[str, Any]: Dictionary with camelCase keys and None values filtered. + """ + result = {} + + # Manually process each field + if self.count is not None: + result["count"] = self.count + if self.request_identifier is not None: + result["requestIdentifier"] = self.request_identifier + if ( + self.patent_appeal_data_bag is not None + and len(self.patent_appeal_data_bag) > 0 + ): + result["patentAppealDataBag"] = [ + decision.to_dict() for decision in self.patent_appeal_data_bag + ] + + return result + # ============================================================================ # INTERFERENCE DECISIONS MODELS @@ -806,11 +1185,15 @@ class InterferenceMetaData: Attributes: interference_style_name: Style name of the interference. interference_last_modified_date: Last modification date. + interference_last_modified_date_time: Last modification datetime. + declaration_date: Declaration date. file_download_uri: URI to download ZIP of interference documents. """ interference_style_name: Optional[str] = None interference_last_modified_date: Optional[date] = None + interference_last_modified_date_time: Optional[datetime] = None + declaration_date: Optional[date] = None file_download_uri: Optional[str] = None @classmethod @@ -833,9 +1216,38 @@ def from_dict( interference_last_modified_date=parse_to_date( data.get("interferenceLastModifiedDate") ), + interference_last_modified_date_time=parse_to_datetime_utc( + data.get("interferenceLastModifiedDateTime") + ), + declaration_date=parse_to_date(data.get("declarationDate")), file_download_uri=file_download_uri, ) + def to_dict(self) -> Dict[str, Any]: + """Converts the InterferenceMetaData instance to a dictionary. + + Returns: + Dict[str, Any]: Dictionary with camelCase keys and None values filtered. + """ + result = {} + + if self.interference_style_name is not None: + result["interferenceStyleName"] = self.interference_style_name + if self.interference_last_modified_date is not None: + result["interferenceLastModifiedDate"] = serialize_date( + self.interference_last_modified_date + ) + if self.interference_last_modified_date_time is not None: + result["interferenceLastModifiedDateTime"] = serialize_datetime_as_naive( + self.interference_last_modified_date_time + ) + if self.declaration_date is not None: + result["declarationDate"] = serialize_date(self.declaration_date) + if self.file_download_uri is not None: + result["fileDownloadURI"] = self.file_download_uri + + return result + @dataclass(frozen=True) class SeniorPartyData(PartyData): @@ -887,6 +1299,25 @@ def from_dict( additional_party_name=data.get("additionalPartyName"), ) + def to_dict(self) -> Dict[str, Any]: + """Converts the AdditionalPartyData instance to a dictionary. + + Returns: + Dict[str, Any]: Dictionary with camelCase keys and None values filtered. + """ + result = {} + + if self.application_number_text is not None: + result["applicationNumberText"] = self.application_number_text + if self.inventor_name is not None: + result["inventorName"] = self.inventor_name + if self.patent_number is not None: + result["patentNumber"] = self.patent_number + if self.additional_party_name is not None: + result["additionalPartyName"] = self.additional_party_name + + return result + @dataclass(frozen=True) class InterferenceDocumentData: @@ -899,6 +1330,7 @@ class InterferenceDocumentData: document_ocr_text: Full OCR text of the document. document_title_text: Title of the document. interference_outcome_category: Outcome of the interference. + document_filing_date: Date the document was filed. decision_issue_date: Date the decision was issued. decision_type_category: Type of decision. file_download_uri: URI to download the document. @@ -912,6 +1344,7 @@ class InterferenceDocumentData: document_ocr_text: Optional[str] = None document_title_text: Optional[str] = None interference_outcome_category: Optional[str] = None + document_filing_date: Optional[date] = None decision_issue_date: Optional[date] = None decision_type_category: Optional[str] = None file_download_uri: Optional[str] = None @@ -941,6 +1374,7 @@ def from_dict( document_ocr_text=data.get("documentOCRText"), document_title_text=data.get("documentTitleText"), interference_outcome_category=data.get("interferenceOutcomeCategory"), + document_filing_date=parse_to_date(data.get("documentFilingDate")), decision_issue_date=parse_to_date(data.get("decisionIssueDate")), decision_type_category=data.get("decisionTypeCategory"), file_download_uri=file_download_uri, @@ -948,6 +1382,41 @@ def from_dict( issue_type_bag=data.get("issueTypeBag", []), ) + def to_dict(self) -> Dict[str, Any]: + """Converts the InterferenceDocumentData instance to a dictionary. + + Returns: + Dict[str, Any]: Dictionary with camelCase keys and None values filtered. + """ + result = {} + + if self.document_identifier is not None: + result["documentIdentifier"] = self.document_identifier + if self.document_name is not None: + result["documentName"] = self.document_name + if self.document_size_quantity is not None: + result["documentSizeQuantity"] = self.document_size_quantity + if self.document_ocr_text is not None: + result["documentOCRText"] = self.document_ocr_text + if self.document_title_text is not None: + result["documentTitleText"] = self.document_title_text + if self.interference_outcome_category is not None: + result["interferenceOutcomeCategory"] = self.interference_outcome_category + if self.document_filing_date is not None: + result["documentFilingDate"] = serialize_date(self.document_filing_date) + if self.decision_issue_date is not None: + result["decisionIssueDate"] = serialize_date(self.decision_issue_date) + if self.decision_type_category is not None: + result["decisionTypeCategory"] = self.decision_type_category + if self.file_download_uri is not None: + result["fileDownloadURI"] = self.file_download_uri + if self.statute_and_rule_bag is not None and len(self.statute_and_rule_bag) > 0: + result["statuteAndRuleBag"] = self.statute_and_rule_bag + if self.issue_type_bag is not None and len(self.issue_type_bag) > 0: + result["issueTypeBag"] = self.issue_type_bag + + return result + @dataclass(frozen=True) class PTABInterferenceDecision: @@ -1028,6 +1497,39 @@ def from_dict( raw_data=data if include_raw_data else None, ) + def to_dict(self) -> Dict[str, Any]: + """Converts the PTABInterferenceDecision instance to a dictionary. + + Returns: + Dict[str, Any]: Dictionary with camelCase keys and None values filtered. + """ + result = {} + + # Manually process each field to preserve nested objects + if self.interference_number is not None: + result["interferenceNumber"] = self.interference_number + if self.last_modified_date_time is not None: + result["lastModifiedDateTime"] = serialize_datetime_as_naive( + self.last_modified_date_time + ) + if self.interference_meta_data is not None: + result["interferenceMetaData"] = self.interference_meta_data.to_dict() + if self.senior_party_data is not None: + result["seniorPartyData"] = self.senior_party_data.to_dict() + if self.junior_party_data is not None: + result["juniorPartyData"] = self.junior_party_data.to_dict() + if ( + self.additional_party_data_bag is not None + and len(self.additional_party_data_bag) > 0 + ): + result["additionalPartyDataBag"] = [ + party.to_dict() for party in self.additional_party_data_bag + ] + if self.document_data is not None: + result["documentData"] = self.document_data.to_dict() + + return result + @dataclass(frozen=True) class PTABInterferenceResponse: @@ -1040,7 +1542,7 @@ class PTABInterferenceResponse: raw_data: Raw JSON response data (if include_raw_data=True). """ - count: Optional[int] = None + count: int = 0 request_identifier: Optional[str] = None patent_interference_data_bag: List[PTABInterferenceDecision] = field( default_factory=list @@ -1067,12 +1569,35 @@ def from_dict( ] return cls( - count=data.get("count"), + count=data.get("count", 0), request_identifier=data.get("requestIdentifier"), patent_interference_data_bag=interferences, raw_data=data if include_raw_data else None, ) + def to_dict(self) -> Dict[str, Any]: + """Converts the PTABInterferenceResponse instance to a dictionary. + + Returns: + Dict[str, Any]: Dictionary with camelCase keys and None values filtered. + """ + result = {} + + # Manually process each field + if self.count is not None: + result["count"] = self.count + if self.request_identifier is not None: + result["requestIdentifier"] = self.request_identifier + if ( + self.patent_interference_data_bag is not None + and len(self.patent_interference_data_bag) > 0 + ): + result["patentInterferenceDataBag"] = [ + decision.to_dict() for decision in self.patent_interference_data_bag + ] + + return result + # ============================================================================ # EXPORTS diff --git a/src/pyUSPTO/models/utils.py b/src/pyUSPTO/models/utils.py index 43f6587..32c9070 100644 --- a/src/pyUSPTO/models/utils.py +++ b/src/pyUSPTO/models/utils.py @@ -159,6 +159,14 @@ def serialize_datetime_as_iso(dt: Optional[datetime]) -> Optional[str]: return dt_utc.isoformat().replace("+00:00", "Z") +def serialize_datetime_as_naive(dt: datetime) -> str: + if dt.tzinfo is not None and dt.tzinfo.utcoffset(dt) is not None: + dt = dt.astimezone(ASSUMED_NAIVE_TIMEZONE).replace(tzinfo=None) + else: + dt = dt.replace(tzinfo=ASSUMED_NAIVE_TIMEZONE).replace(tzinfo=None) + return dt.isoformat() + + def parse_yn_to_bool(value: Optional[str]) -> Optional[bool]: """Converts a 'Y'/'N' (case-insensitive) string to a boolean. diff --git a/tests/integration/test_patent_data_integration.py b/tests/integration/test_patent_data_integration.py index 6be1c09..9db81ed 100644 --- a/tests/integration/test_patent_data_integration.py +++ b/tests/integration/test_patent_data_integration.py @@ -93,7 +93,7 @@ def sample_application_number(patent_data_client: PatentDataClient) -> str: class TestPatentDataIntegration: """Integration tests for the PatentDataClient.""" - KNOWN_APP_NUM_WITH_DOCS = "18045436" + KNOWN_APP_NUM_WITH_DOCS = "14412875" def test_search_applications_get( self, patent_data_client: PatentDataClient diff --git a/tests/integration/test_ptab_appeals_integration.py b/tests/integration/test_ptab_appeals_integration.py index 390ab04..2079ef7 100644 --- a/tests/integration/test_ptab_appeals_integration.py +++ b/tests/integration/test_ptab_appeals_integration.py @@ -14,7 +14,8 @@ from pyUSPTO.clients import PTABAppealsClient from pyUSPTO.config import USPTOConfig from pyUSPTO.exceptions import USPTOApiError -from pyUSPTO.models.ptab import PTABAppealDecision, PTABAppealResponse +from pyUSPTO.models.ptab import AppealMetaData, PTABAppealDecision, PTABAppealResponse +from typing import Optional # Skip all tests in this module unless ENABLE_INTEGRATION_TESTS is set to 'true' pytestmark = pytest.mark.skipif( @@ -40,13 +41,11 @@ def ptab_appeals_client(config: USPTOConfig) -> PTABAppealsClient: class TestPTABAppealsIntegration: """Integration tests for the PTABAppealsClient.""" - def test_search_decisions_get( - self, ptab_appeals_client: PTABAppealsClient - ) -> None: + def test_search_decisions_get(self, ptab_appeals_client: PTABAppealsClient) -> None: """Test searching PTAB appeal decisions using GET method.""" try: response = ptab_appeals_client.search_decisions( - query="appealMetaData.applicationTypeCategory:Utility", + query="appealMetaData.applicationTypeCategory:Appeal", limit=2, ) @@ -62,17 +61,20 @@ def test_search_decisions_get( decision = response.patent_appeal_data_bag[0] assert isinstance(decision, PTABAppealDecision) assert decision.appeal_number is not None + else: + pytest.fail(f"There should always be a response to this query.") except USPTOApiError as e: - pytest.skip(f"PTAB Appeals API error during search_decisions GET: {e}") + pytest.fail(f"PTAB Appeals API error during search_decisions GET: {e}") def test_search_decisions_with_convenience_params( self, ptab_appeals_client: PTABAppealsClient ) -> None: - """Test searching appeal decisions with convenience parameters.""" + """Test searching appeal decisions with application number.""" try: + # Use direct query since applicationNumberText is nested under appellantData response = ptab_appeals_client.search_decisions( - application_type_category_q="Utility", + query="appellantData.applicationNumberText:12608694", limit=2, ) @@ -86,14 +88,10 @@ def test_search_decisions_with_convenience_params( assert isinstance(decision, PTABAppealDecision) # Verify application type if metadata present if decision.appeal_meta_data: - if decision.appeal_meta_data.application_type_category: - assert ( - decision.appeal_meta_data.application_type_category - == "Utility" - ) + assert isinstance(decision.appeal_meta_data, AppealMetaData) except USPTOApiError as e: - pytest.skip( + pytest.fail( f"PTAB Appeals API error during search_decisions with convenience params: {e}" ) @@ -102,7 +100,7 @@ def test_search_decisions_post( ) -> None: """Test searching PTAB appeal decisions using POST method.""" post_body = { - "q": "appealMetaData.applicationTypeCategory:Utility", + "q": "appealMetaData.applicationTypeCategory:Appeal", "pagination": {"offset": 0, "limit": 2}, } @@ -118,16 +116,16 @@ def test_search_decisions_post( assert len(response.patent_appeal_data_bag) <= 2 except USPTOApiError as e: - pytest.skip(f"PTAB Appeals API error during search_decisions POST: {e}") + pytest.fail(f"PTAB Appeals API error during search_decisions POST: {e}") def test_search_decisions_with_date_filters( self, ptab_appeals_client: PTABAppealsClient ) -> None: """Test searching appeal decisions with date range filters.""" try: + # Use direct query with correct field name (decisionIssueDate, not decisionDate) response = ptab_appeals_client.search_decisions( - decision_date_from_q="2023-01-01", - decision_date_to_q="2024-12-31", + query="decisionData.decisionIssueDate:[2014-01-01 TO 2020-12-31]", limit=2, ) @@ -139,7 +137,7 @@ def test_search_decisions_with_date_filters( assert response.patent_appeal_data_bag is not None except USPTOApiError as e: - pytest.skip( + pytest.fail( f"PTAB Appeals API error during search_decisions with date filters: {e}" ) @@ -148,8 +146,9 @@ def test_search_decisions_by_decision_type( ) -> None: """Test searching appeal decisions by decision type.""" try: + # Use direct query since decisionTypeCategory is nested under decisionData response = ptab_appeals_client.search_decisions( - decision_type_category_q="Affirmed", + query="decisionData.decisionTypeCategory:Decision", limit=2, ) @@ -163,21 +162,22 @@ def test_search_decisions_by_decision_type( # Verify decision type if present if decision.decision_data: if decision.decision_data.decision_type_category: - assert "Affirmed" in decision.decision_data.decision_type_category + assert ( + "Decision" + in decision.decision_data.decision_type_category + ) except USPTOApiError as e: - pytest.skip( - f"PTAB Appeals API error during search by decision type: {e}" - ) + pytest.fail(f"PTAB Appeals API error during search by decision type: {e}") def test_search_decisions_by_appellant( self, ptab_appeals_client: PTABAppealsClient ) -> None: - """Test searching appeal decisions by appellant name.""" + """Test searching appeal decisions by inventor name.""" try: - # Use a common corporation name + # Search by inventor name (realPartyInInterestName contains inventor info) response = ptab_appeals_client.search_decisions( - appellant_name_q="Corporation", + query="appellantData.inventorName:*", limit=2, ) @@ -189,31 +189,32 @@ def test_search_decisions_by_appellant( assert response.patent_appeal_data_bag is not None except USPTOApiError as e: - pytest.skip( - f"PTAB Appeals API error during search by appellant: {e}" - ) + pytest.fail(f"PTAB Appeals API error during search by appellant: {e}") - def test_paginate_decisions( - self, ptab_appeals_client: PTABAppealsClient - ) -> None: + def test_paginate_decisions(self, ptab_appeals_client: PTABAppealsClient) -> None: """Test paginating through appeal decisions.""" + page_size = 5 + max_decisions = 10 # Only test first 10 decisions to keep test fast + + total_decisions = 0 + try: - # Limit to small number to avoid long test times - results = list( - ptab_appeals_client.paginate_decisions( - query="appealMetaData.applicationTypeCategory:Utility", - limit=5, - max_results=10, - ) - ) + for decision in ptab_appeals_client.paginate_decisions( + query="appealMetaData.applicationTypeCategory:Appeal", + limit=page_size, + ): + assert isinstance(decision, PTABAppealDecision) + assert decision.appeal_number is not None + + total_decisions += 1 - assert isinstance(results, list) - if len(results) > 0: - assert all(isinstance(d, PTABAppealDecision) for d in results) - assert len(results) <= 10 # Should respect max_results + if total_decisions >= max_decisions: + break + + assert total_decisions > 0, "Should have retrieved at least one decision" except USPTOApiError as e: - pytest.skip(f"PTAB Appeals API error during paginate_decisions: {e}") + pytest.fail(f"Pagination test failed with API error: {e}") def test_search_with_optional_params( self, ptab_appeals_client: PTABAppealsClient @@ -221,7 +222,7 @@ def test_search_with_optional_params( """Test searching with optional parameters like sort and facets.""" try: response = ptab_appeals_client.search_decisions( - query="appealMetaData.applicationTypeCategory:Utility", + query="appealMetaData.applicationTypeCategory:Appeal", limit=2, sort="appealNumber desc", offset=0, @@ -232,10 +233,119 @@ def test_search_with_optional_params( assert response.count >= 0 except USPTOApiError as e: - pytest.skip( + pytest.fail( f"PTAB Appeals API error during search with optional params: {e}" ) + def test_to_dict_matches_raw_api_response( + self, api_key: Optional[str] + ) -> None: + """Test that to_dict() output matches the original API response stored in raw_data. + + This test compares the to_dict() serialization with the original API response + to ensure that the model correctly reconstructs the API format. + """ + # Create a config with include_raw_data=True to preserve original API data + config_with_raw = USPTOConfig(api_key=api_key, include_raw_data=True) + client_with_raw = PTABAppealsClient(config=config_with_raw) + + try: + # Search for a known appeal number + response = client_with_raw.search_decisions( + query="appealNumber:2015000194", + limit=1, + ) + + if response is None or response.count == 0: + pytest.fail("No decision found for raw API comparison test") + + assert ( + response.raw_data is not None + ), "raw_data should be populated when include_raw_data=True" + + # PTAB models store raw_data as dict (not JSON string like other models) + assert isinstance(response.raw_data, dict), "raw_data should be a dictionary" + + # Get the raw API response dict + raw_api_dict = response.raw_data + + # Convert the model back to dict + to_dict_output = response.to_dict() + + # Deep comparison function + def compare_dicts(dict1, dict2, path=""): + """Recursively compare two dictionaries and report differences.""" + differences = [] + + # Check keys present in dict1 but not dict2 + keys1 = set(dict1.keys()) + keys2 = set(dict2.keys()) + + missing_in_dict2 = keys1 - keys2 + if missing_in_dict2: + differences.append( + f"Keys in to_dict but not in raw API at {path}: {missing_in_dict2}" + ) + + missing_in_dict1 = keys2 - keys1 + if missing_in_dict1: + differences.append( + f"Keys in raw API but not in to_dict at {path}: {missing_in_dict1}" + ) + + # Compare values for common keys + for key in keys1 & keys2: + val1 = dict1[key] + val2 = dict2[key] + current_path = f"{path}.{key}" if path else key + + if type(val1) != type(val2): + differences.append( + f"Type mismatch at {current_path}: {type(val1).__name__} vs {type(val2).__name__}" + ) + elif isinstance(val1, dict): + differences.extend(compare_dicts(val1, val2, current_path)) + elif isinstance(val1, list): + if len(val1) != len(val2): + differences.append( + f"List length mismatch at {current_path}: {len(val1)} vs {len(val2)}" + ) + else: + for i, (item1, item2) in enumerate(zip(val1, val2)): + if isinstance(item1, dict) and isinstance(item2, dict): + differences.extend( + compare_dicts( + item1, item2, f"{current_path}[{i}]" + ) + ) + elif item1 != item2: + differences.append( + f"Value mismatch at {current_path}[{i}]: {item1!r} vs {item2!r}" + ) + elif val1 != val2: + differences.append( + f"Value mismatch at {current_path}: {val1!r} vs {val2!r}" + ) + + return differences + + # Perform the comparison + differences = compare_dicts(to_dict_output, raw_api_dict) + + # If there are differences, print them and fail + if differences: + diff_report = "\n".join( + differences[:20] + ) # Limit to first 20 differences + if len(differences) > 20: + diff_report += f"\n... and {len(differences) - 20} more differences" + pytest.fail( + f"to_dict() output does not match raw API response. Differences found:\n{diff_report}" + ) + + except USPTOApiError as e: + pytest.fail(f"Raw API comparison test failed with API error: {e}") + def test_invalid_query_handling( self, ptab_appeals_client: PTABAppealsClient ) -> None: diff --git a/tests/integration/test_ptab_interferences_integration.py b/tests/integration/test_ptab_interferences_integration.py index 97467db..6f292db 100644 --- a/tests/integration/test_ptab_interferences_integration.py +++ b/tests/integration/test_ptab_interferences_integration.py @@ -7,7 +7,7 @@ """ import os -from typing import Iterator +from typing import Iterator, Optional import pytest @@ -64,7 +64,9 @@ def test_search_decisions_get( assert decision.interference_number is not None except USPTOApiError as e: - pytest.skip(f"PTAB Interferences API error during search_decisions GET: {e}") + pytest.skip( + f"PTAB Interferences API error during search_decisions GET: {e}" + ) def test_search_decisions_with_convenience_params( self, ptab_interferences_client: PTABInterferencesClient @@ -72,7 +74,7 @@ def test_search_decisions_with_convenience_params( """Test searching interference decisions with convenience parameters.""" try: response = ptab_interferences_client.search_decisions( - interference_outcome_category_q="Priority", + interference_outcome_category_q="Final Decision", limit=2, ) @@ -88,7 +90,7 @@ def test_search_decisions_with_convenience_params( if decision.document_data: if decision.document_data.interference_outcome_category: assert ( - "Priority" + "Final Decision" in decision.document_data.interference_outcome_category ) @@ -118,16 +120,19 @@ def test_search_decisions_post( assert len(response.patent_interference_data_bag) <= 2 except USPTOApiError as e: - pytest.skip(f"PTAB Interferences API error during search_decisions POST: {e}") + pytest.skip( + f"PTAB Interferences API error during search_decisions POST: {e}" + ) def test_search_decisions_with_date_filters( self, ptab_interferences_client: PTABInterferencesClient ) -> None: """Test searching interference decisions with date range filters.""" try: + # Use date range that matches actual interference data response = ptab_interferences_client.search_decisions( - decision_date_from_q="2020-01-01", - decision_date_to_q="2024-12-31", + decision_date_from_q="2000-01-01", + decision_date_to_q="2010-12-31", limit=2, ) @@ -149,7 +154,7 @@ def test_search_decisions_by_decision_type( """Test searching interference decisions by decision type.""" try: response = ptab_interferences_client.search_decisions( - decision_type_category_q="Final", + decision_type_category_q="Decision", limit=2, ) @@ -163,7 +168,10 @@ def test_search_decisions_by_decision_type( # Verify decision type if present if decision.document_data: if decision.document_data.decision_type_category: - assert "Final" in decision.document_data.decision_type_category + assert ( + "Decision" + in decision.document_data.decision_type_category + ) except USPTOApiError as e: pytest.skip( @@ -175,9 +183,9 @@ def test_search_decisions_by_party( ) -> None: """Test searching interference decisions by party name.""" try: - # Search for senior or junior party + # Search for senior or junior party with wildcard to ensure results response = ptab_interferences_client.search_decisions( - senior_party_name_q="Corporation", + senior_party_name_q="*", limit=2, ) @@ -189,17 +197,16 @@ def test_search_decisions_by_party( assert response.patent_interference_data_bag is not None except USPTOApiError as e: - pytest.skip( - f"PTAB Interferences API error during search by party: {e}" - ) + pytest.skip(f"PTAB Interferences API error during search by party: {e}") def test_search_decisions_by_patent_number( self, ptab_interferences_client: PTABInterferencesClient ) -> None: - """Test searching interference decisions by patent number.""" + """Test searching interference decisions by patent number or application number.""" try: + # Use application number which is more common than patent number response = ptab_interferences_client.search_decisions( - senior_party_patent_number_q="US*", + query="seniorPartyData.applicationNumberText:10618977", limit=2, ) @@ -221,18 +228,20 @@ def test_paginate_decisions( """Test paginating through interference decisions.""" try: # Limit to small number to avoid long test times - results = list( - ptab_interferences_client.paginate_decisions( - query="interferenceNumber:*", - limit=5, - max_results=10, - ) - ) + max_results = 10 + results = [] + for decision in ptab_interferences_client.paginate_decisions( + query="interferenceNumber:*", + limit=5, + ): + results.append(decision) + if len(results) >= max_results: + break assert isinstance(results, list) if len(results) > 0: assert all(isinstance(d, PTABInterferenceDecision) for d in results) - assert len(results) <= 10 # Should respect max_results + assert len(results) <= max_results except USPTOApiError as e: pytest.skip(f"PTAB Interferences API error during paginate_decisions: {e}") @@ -264,7 +273,7 @@ def test_search_with_style_name( """Test searching by interference style name.""" try: response = ptab_interferences_client.search_decisions( - interference_style_name_q="*", + query="interferenceMetaData.interferenceStyleName:*", limit=2, ) @@ -280,6 +289,117 @@ def test_search_with_style_name( f"PTAB Interferences API error during search by style name: {e}" ) + def test_to_dict_matches_raw_api_response(self, api_key: Optional[str]) -> None: + """Test that to_dict() output matches the original API response stored in raw_data. + + This test compares the to_dict() serialization with the original API response + to ensure that the model correctly reconstructs the API format. + """ + # Create a config with include_raw_data=True to preserve original API data + config_with_raw = USPTOConfig(api_key=api_key, include_raw_data=True) + client_with_raw = PTABInterferencesClient(config=config_with_raw) + + try: + # Search for any interference decision + response = client_with_raw.search_decisions( + query="interferenceNumber:*", + limit=1, + ) + + if response is None or response.count == 0: + pytest.skip( + "No interference decisions found for raw API comparison test" + ) + + assert ( + response.raw_data is not None + ), "raw_data should be populated when include_raw_data=True" + + # PTAB models store raw_data as dict (not JSON string like other models) + assert isinstance( + response.raw_data, dict + ), "raw_data should be a dictionary" + + # Get the raw API response dict + raw_api_dict = response.raw_data + + # Convert the model back to dict + to_dict_output = response.to_dict() + + # Deep comparison function + def compare_dicts(dict1, dict2, path=""): + """Recursively compare two dictionaries and report differences.""" + differences = [] + + # Check keys present in dict1 but not dict2 + keys1 = set(dict1.keys()) + keys2 = set(dict2.keys()) + + missing_in_dict2 = keys1 - keys2 + if missing_in_dict2: + differences.append( + f"Keys in to_dict but not in raw API at {path}: {missing_in_dict2}" + ) + + missing_in_dict1 = keys2 - keys1 + if missing_in_dict1: + differences.append( + f"Keys in raw API but not in to_dict at {path}: {missing_in_dict1}" + ) + + # Compare values for common keys + for key in keys1 & keys2: + val1 = dict1[key] + val2 = dict2[key] + current_path = f"{path}.{key}" if path else key + + if type(val1) != type(val2): + differences.append( + f"Type mismatch at {current_path}: {type(val1).__name__} vs {type(val2).__name__}" + ) + elif isinstance(val1, dict): + differences.extend(compare_dicts(val1, val2, current_path)) + elif isinstance(val1, list): + if len(val1) != len(val2): + differences.append( + f"List length mismatch at {current_path}: {len(val1)} vs {len(val2)}" + ) + else: + for i, (item1, item2) in enumerate(zip(val1, val2)): + if isinstance(item1, dict) and isinstance(item2, dict): + differences.extend( + compare_dicts( + item1, item2, f"{current_path}[{i}]" + ) + ) + elif item1 != item2: + differences.append( + f"Value mismatch at {current_path}[{i}]: {item1!r} vs {item2!r}" + ) + elif val1 != val2: + differences.append( + f"Value mismatch at {current_path}: {val1!r} vs {val2!r}" + ) + + return differences + + # Perform the comparison + differences = compare_dicts(to_dict_output, raw_api_dict) + + # If there are differences, print them and fail + if differences: + diff_report = "\n".join( + differences[:20] + ) # Limit to first 20 differences + if len(differences) > 20: + diff_report += f"\n... and {len(differences) - 20} more differences" + pytest.fail( + f"to_dict() output does not match raw API response. Differences found:\n{diff_report}" + ) + + except USPTOApiError as e: + pytest.skip(f"Raw API comparison test failed with API error: {e}") + def test_invalid_query_handling( self, ptab_interferences_client: PTABInterferencesClient ) -> None: diff --git a/tests/integration/test_ptab_trials_integration.py b/tests/integration/test_ptab_trials_integration.py index 7824edd..16cb3c0 100644 --- a/tests/integration/test_ptab_trials_integration.py +++ b/tests/integration/test_ptab_trials_integration.py @@ -7,7 +7,7 @@ """ import os -from typing import Iterator +from typing import Iterator, Optional import pytest @@ -44,9 +44,7 @@ def ptab_trials_client(config: USPTOConfig) -> PTABTrialsClient: class TestPTABTrialsIntegration: """Integration tests for the PTABTrialsClient.""" - def test_search_proceedings_get( - self, ptab_trials_client: PTABTrialsClient - ) -> None: + def test_search_proceedings_get(self, ptab_trials_client: PTABTrialsClient) -> None: """Test searching PTAB trial proceedings using GET method.""" try: response = ptab_trials_client.search_proceedings( @@ -122,13 +120,11 @@ def test_search_proceedings_post( except USPTOApiError as e: pytest.skip(f"PTAB Trials API error during search_proceedings POST: {e}") - def test_search_documents_get( - self, ptab_trials_client: PTABTrialsClient - ) -> None: + def test_search_documents_get(self, ptab_trials_client: PTABTrialsClient) -> None: """Test searching PTAB trial documents using GET method.""" try: response = ptab_trials_client.search_documents( - query="documentData.documentCategory:Paper", + query="documentData.documentTypeDescriptionText:Exhibit", limit=2, ) @@ -153,7 +149,7 @@ def test_search_documents_with_convenience_params( """Test searching documents with convenience parameters.""" try: response = ptab_trials_client.search_documents( - document_category_q="Paper", + document_type_name_q="Exhibit", limit=2, ) @@ -169,13 +165,11 @@ def test_search_documents_with_convenience_params( f"PTAB Trials API error during search_documents with convenience params: {e}" ) - def test_search_documents_post( - self, ptab_trials_client: PTABTrialsClient - ) -> None: + def test_search_documents_post(self, ptab_trials_client: PTABTrialsClient) -> None: """Test searching PTAB trial documents using POST method.""" post_body = { - "q": "trialTypeCode:IPR", - "pagination": {"offset": 0, "limit": 2}, + "q": "trialMetaData.trialTypeCode:IPR", + "pagination": {"offset": 0, "limit": 1}, } try: @@ -192,9 +186,7 @@ def test_search_documents_post( except USPTOApiError as e: pytest.skip(f"PTAB Trials API error during search_documents POST: {e}") - def test_search_decisions_get( - self, ptab_trials_client: PTABTrialsClient - ) -> None: + def test_search_decisions_get(self, ptab_trials_client: PTABTrialsClient) -> None: """Test searching PTAB trial decisions using GET method.""" try: response = ptab_trials_client.search_decisions( @@ -224,7 +216,7 @@ def test_search_decisions_with_convenience_params( try: response = ptab_trials_client.search_decisions( trial_type_code_q="IPR", - limit=2, + limit=1, ) assert response is not None @@ -233,21 +225,19 @@ def test_search_decisions_with_convenience_params( if response.count > 0: assert response.patent_trial_document_data_bag is not None - for decision in response.patent_trial_document_data_bag: - if decision.trial_type_code: - assert decision.trial_type_code == "IPR" + for document in response.patent_trial_document_data_bag: + if document.trial_type_code: + assert document.trial_type_code == "IPR" except USPTOApiError as e: pytest.skip( f"PTAB Trials API error during search_decisions with convenience params: {e}" ) - def test_search_decisions_post( - self, ptab_trials_client: PTABTrialsClient - ) -> None: + def test_search_decisions_post(self, ptab_trials_client: PTABTrialsClient) -> None: """Test searching PTAB trial decisions using POST method.""" post_body = { - "q": "trialTypeCode:IPR", + "q": "trialMetaData.trialTypeCode:IPR", "pagination": {"offset": 0, "limit": 2}, } @@ -265,31 +255,338 @@ def test_search_decisions_post( except USPTOApiError as e: pytest.skip(f"PTAB Trials API error during search_decisions POST: {e}") - def test_paginate_proceedings( - self, ptab_trials_client: PTABTrialsClient - ) -> None: + def test_paginate_proceedings(self, ptab_trials_client: PTABTrialsClient) -> None: """Test paginating through trial proceedings.""" try: # Limit to small number to avoid long test times - results = list( - ptab_trials_client.paginate_proceedings( - query="trialMetaData.trialTypeCode:IPR", - limit=5, - max_results=10, - ) - ) + max_results = 10 + results = [] + for proceeding in ptab_trials_client.paginate_proceedings( + query="trialMetaData.trialTypeCode:IPR", + limit=5, + ): + results.append(proceeding) + if len(results) >= max_results: + break assert isinstance(results, list) if len(results) > 0: assert all(isinstance(p, PTABTrialProceeding) for p in results) - assert len(results) <= 10 # Should respect max_results + assert len(results) <= max_results except USPTOApiError as e: pytest.skip(f"PTAB Trials API error during paginate_proceedings: {e}") - def test_invalid_query_handling( - self, ptab_trials_client: PTABTrialsClient + def test_to_dict_matches_raw_api_response_proceedings( + self, api_key: Optional[str] ) -> None: + """Test that to_dict() output matches the original API response for trial proceedings. + + This test compares the to_dict() serialization with the original API response + to ensure that the model correctly reconstructs the API format. + """ + # Create a config with include_raw_data=True to preserve original API data + config_with_raw = USPTOConfig(api_key=api_key, include_raw_data=True) + client_with_raw = PTABTrialsClient(config=config_with_raw) + + try: + # Search for trial proceedings + response = client_with_raw.search_proceedings( + query="trialMetaData.trialTypeCode:IPR", + limit=1, + ) + + if response is None or response.count == 0: + pytest.skip("No trial proceedings found for raw API comparison test") + + assert ( + response.raw_data is not None + ), "raw_data should be populated when include_raw_data=True" + + # PTAB models store raw_data as dict (not JSON string like other models) + assert isinstance( + response.raw_data, dict + ), "raw_data should be a dictionary" + + # Get the raw API response dict + raw_api_dict = response.raw_data + + # Convert the model back to dict + to_dict_output = response.to_dict() + + # Deep comparison function + def compare_dicts(dict1, dict2, path=""): + """Recursively compare two dictionaries and report differences.""" + differences = [] + + # Check keys present in dict1 but not dict2 + keys1 = set(dict1.keys()) + keys2 = set(dict2.keys()) + + missing_in_dict2 = keys1 - keys2 + if missing_in_dict2: + differences.append( + f"Keys in to_dict but not in raw API at {path}: {missing_in_dict2}" + ) + + missing_in_dict1 = keys2 - keys1 + if missing_in_dict1: + differences.append( + f"Keys in raw API but not in to_dict at {path}: {missing_in_dict1}" + ) + + # Compare values for common keys + for key in keys1 & keys2: + val1 = dict1[key] + val2 = dict2[key] + current_path = f"{path}.{key}" if path else key + + if type(val1) != type(val2): + differences.append( + f"Type mismatch at {current_path}: {type(val1).__name__} vs {type(val2).__name__}" + ) + elif isinstance(val1, dict): + differences.extend(compare_dicts(val1, val2, current_path)) + elif isinstance(val1, list): + if len(val1) != len(val2): + differences.append( + f"List length mismatch at {current_path}: {len(val1)} vs {len(val2)}" + ) + else: + for i, (item1, item2) in enumerate(zip(val1, val2)): + if isinstance(item1, dict) and isinstance(item2, dict): + differences.extend( + compare_dicts( + item1, item2, f"{current_path}[{i}]" + ) + ) + elif item1 != item2: + differences.append( + f"Value mismatch at {current_path}[{i}]: {item1!r} vs {item2!r}" + ) + elif val1 != val2: + differences.append( + f"Value mismatch at {current_path}: {val1!r} vs {val2!r}" + ) + + return differences + + # Perform the comparison + differences = compare_dicts(to_dict_output, raw_api_dict) + + # If there are differences, print them and fail + if differences: + diff_report = "\n".join( + differences[:20] + ) # Limit to first 20 differences + if len(differences) > 20: + diff_report += f"\n... and {len(differences) - 20} more differences" + pytest.fail( + f"to_dict() output does not match raw API response. Differences found:\n{diff_report}" + ) + + except USPTOApiError as e: + pytest.skip(f"Raw API comparison test failed with API error: {e}") + + def test_to_dict_matches_raw_api_response_documents( + self, api_key: Optional[str] + ) -> None: + """Test that to_dict() output matches the original API response for trial documents. + + This test compares the to_dict() serialization with the original API response + to ensure that the model correctly reconstructs the API format. + """ + # Create a config with include_raw_data=True to preserve original API data + config_with_raw = USPTOConfig(api_key=api_key, include_raw_data=True) + client_with_raw = PTABTrialsClient(config=config_with_raw) + + try: + # Search for trial documents + response = client_with_raw.search_documents( + query="trialMetaData.trialTypeCode:IPR", + limit=1, + ) + + if response is None or response.count == 0: + pytest.fail("No trial documents found for raw API comparison test") + + assert ( + response.raw_data is not None + ), "raw_data should be populated when include_raw_data=True" + + # PTAB models store raw_data as dict (not JSON string like other models) + assert isinstance( + response.raw_data, dict + ), "raw_data should be a dictionary" + + # Get the raw API response dict + raw_api_dict = response.raw_data + + # Convert the model back to dict + to_dict_output = response.to_dict() + + # Deep comparison function + def compare_dicts(dict1, dict2, path=""): + """Recursively compare two dictionaries and report differences.""" + differences = [] + + # Check keys present in dict1 but not dict2 + keys1 = set(dict1.keys()) + keys2 = set(dict2.keys()) + + missing_in_dict2 = keys1 - keys2 + if missing_in_dict2: + differences.append( + f"Keys in to_dict but not in raw API at {path}: {missing_in_dict2}" + ) + + missing_in_dict1 = keys2 - keys1 + if missing_in_dict1: + differences.append( + f"Keys in raw API but not in to_dict at {path}: {missing_in_dict1}" + ) + + # Compare values for common keys + for key in keys1 & keys2: + val1 = dict1[key] + val2 = dict2[key] + current_path = f"{path}.{key}" if path else key + + if type(val1) != type(val2): + differences.append( + f"Type mismatch at {current_path}: {type(val1).__name__} vs {type(val2).__name__}" + ) + elif isinstance(val1, dict): + differences.extend(compare_dicts(val1, val2, current_path)) + elif isinstance(val1, list): + if len(val1) != len(val2): + differences.append( + f"List length mismatch at {current_path}: {len(val1)} vs {len(val2)}" + ) + else: + for i, (item1, item2) in enumerate(zip(val1, val2)): + if isinstance(item1, dict) and isinstance(item2, dict): + differences.extend( + compare_dicts( + item1, item2, f"{current_path}[{i}]" + ) + ) + elif item1 != item2: + differences.append( + f"Value mismatch at {current_path}[{i}]: {item1!r} vs {item2!r}" + ) + elif val1 != val2: + differences.append( + f"Value mismatch at {current_path}: {val1!r} vs {val2!r}" + ) + + return differences + + # Perform the comparison + differences = compare_dicts(to_dict_output, raw_api_dict) + + # If there are differences, print them and fail + if differences: + diff_report = "\n".join( + differences[:20] + ) # Limit to first 20 differences + if len(differences) > 20: + diff_report += f"\n... and {len(differences) - 20} more differences" + pytest.fail( + f"to_dict() output does not match raw API response. Differences found:\n{diff_report}" + ) + + except USPTOApiError as e: + pytest.fail(f"Raw API comparison test failed with API error: {e}") + + def test_to_dict_matches_raw_api_response_trials( + self, api_key: Optional[str] + ) -> None: + """Test that to_dict() output matches the original API response for trial decisions.""" + config_with_raw = USPTOConfig(api_key=api_key, include_raw_data=True) + client_with_raw = PTABTrialsClient(config=config_with_raw) + + try: + response = client_with_raw.search_decisions( + query="trialMetaData.trialTypeCode:IPR", + limit=1, + ) + + if response is None or response.count == 0: + pytest.fail("No trial decisions found for raw API comparison test") + + assert response.raw_data is not None + assert isinstance(response.raw_data, dict) + + raw_api_dict = response.raw_data + to_dict_output = response.to_dict() + + def compare_dicts(dict1, dict2, path=""): + differences = [] + keys1 = set(dict1.keys()) + keys2 = set(dict2.keys()) + + missing_in_dict2 = keys1 - keys2 + if missing_in_dict2: + differences.append( + f"Keys in to_dict but not in raw API at {path}: {missing_in_dict2}" + ) + + missing_in_dict1 = keys2 - keys1 + if missing_in_dict1: + differences.append( + f"Keys in raw API but not in to_dict at {path}: {missing_in_dict1}" + ) + + for key in keys1 & keys2: + val1 = dict1[key] + val2 = dict2[key] + current_path = f"{path}.{key}" if path else key + + if type(val1) != type(val2): + differences.append( + f"Type mismatch at {current_path}: {type(val1).__name__} vs {type(val2).__name__}" + ) + elif isinstance(val1, dict): + differences.extend(compare_dicts(val1, val2, current_path)) + elif isinstance(val1, list): + if len(val1) != len(val2): + differences.append( + f"List length mismatch at {current_path}: {len(val1)} vs {len(val2)}" + ) + else: + for i, (item1, item2) in enumerate(zip(val1, val2)): + if isinstance(item1, dict) and isinstance(item2, dict): + differences.extend( + compare_dicts( + item1, item2, f"{current_path}[{i}]" + ) + ) + elif item1 != item2: + differences.append( + f"Value mismatch at {current_path}[{i}]: {item1!r} vs {item2!r}" + ) + elif val1 != val2: + differences.append( + f"Value mismatch at {current_path}: {val1!r} vs {val2!r}" + ) + + return differences + + differences = compare_dicts(to_dict_output, raw_api_dict) + + if differences: + diff_report = "\n".join(differences[:20]) + if len(differences) > 20: + diff_report += f"\n... and {len(differences) - 20} more differences" + pytest.fail( + f"to_dict() output does not match raw API response. Differences found:\n{diff_report}" + ) + + except USPTOApiError as e: + pytest.skip(f"Raw API comparison test failed with API error: {e}") + + def test_invalid_query_handling(self, ptab_trials_client: PTABTrialsClient) -> None: """Test proper error handling with an invalid query.""" try: # Use an obviously malformed query From 1cb5f988c16f0730bb5cd9b0f1e240db8363ba20 Mon Sep 17 00:00:00 2001 From: Andrew Date: Mon, 8 Dec 2025 14:28:39 -0600 Subject: [PATCH 10/17] Update unit tests based on corrections from integrationt tests. --- src/pyUSPTO/clients/ptab_interferences.py | 6 +- src/pyUSPTO/clients/ptab_trials.py | 32 +- src/pyUSPTO/models/ptab.py | 77 +- .../clients/test_ptab_interferences_client.py | 150 ++- tests/clients/test_ptab_trials_client.py | 54 +- tests/models/test_patent_data_models.py | 11 +- tests/models/test_ptab_models.py | 896 +++++++++++++++--- tests/models/test_utils.py | 23 + 8 files changed, 1014 insertions(+), 235 deletions(-) diff --git a/src/pyUSPTO/clients/ptab_interferences.py b/src/pyUSPTO/clients/ptab_interferences.py index 8bcd6cf..3e6465b 100644 --- a/src/pyUSPTO/clients/ptab_interferences.py +++ b/src/pyUSPTO/clients/ptab_interferences.py @@ -151,15 +151,15 @@ def search_decisions( ) if senior_party_name_q: q_parts.append( - f"seniorPartyData.patentOwnerName:{senior_party_name_q} OR seniorPartyData.inventorName:{senior_party_name_q} OR seniorPartyData.realPartyInInterestName:{senior_party_name_q}" + f'seniorPartyData.patentOwnerName:"{senior_party_name_q}" OR seniorPartyData.inventorName:"{senior_party_name_q}" OR seniorPartyData.realPartyInInterestName:"{senior_party_name_q}"' ) if junior_party_name_q: q_parts.append( - f"juniorPartyData.patentOwnerName:{junior_party_name_q} OR juniorPartyData.inventorName:{junior_party_name_q} OR juniorPartyData.realPartyInInterestName:{junior_party_name_q}" + f'juniorPartyData.patentOwnerName:"{junior_party_name_q}" OR juniorPartyData.inventorName:"{junior_party_name_q}" OR juniorPartyData.realPartyInInterestName:"{junior_party_name_q}"' ) if real_party_in_interest_q: q_parts.append( - f"seniorPartyData.realPartyInInterestName:{real_party_in_interest_q} OR juniorPartyData.realPartyInInterestName:{real_party_in_interest_q}" + f'seniorPartyData.realPartyInInterestName:"{real_party_in_interest_q}" OR juniorPartyData.realPartyInInterestName:"{real_party_in_interest_q}"' ) if interference_outcome_category_q: diff --git a/src/pyUSPTO/clients/ptab_trials.py b/src/pyUSPTO/clients/ptab_trials.py index 441f203..0a62eaa 100644 --- a/src/pyUSPTO/clients/ptab_trials.py +++ b/src/pyUSPTO/clients/ptab_trials.py @@ -190,18 +190,18 @@ def search_proceedings( if trial_number_q: q_parts.append(f"trialNumber:{trial_number_q}") if patent_owner_name_q: - q_parts.append(f"patentOwnerData.patentOwnerName:{patent_owner_name_q}") + q_parts.append(f'patentOwnerData.patentOwnerName:"{patent_owner_name_q}"') if petitioner_real_party_in_interest_name_q: q_parts.append( - f"regularPetitionerData.realPartyInInterestName:{petitioner_real_party_in_interest_name_q}" + f'regularPetitionerData.realPartyInInterestName:"{petitioner_real_party_in_interest_name_q}"' ) if respondent_name_q: - q_parts.append(f"respondentData.patentOwnerName:{respondent_name_q}") + q_parts.append(f'respondentData.patentOwnerName:"{respondent_name_q}"') if trial_type_code_q: q_parts.append(f"trialMetaData.trialTypeCode:{trial_type_code_q}") if trial_status_category_q: q_parts.append( - f"trialMetaData.trialStatusCategory:{trial_status_category_q}" + f'trialMetaData.trialStatusCategory:"{trial_status_category_q}"' ) if petition_filing_date_from_q and petition_filing_date_to_q: @@ -304,25 +304,25 @@ def search_documents( if trial_number_q: q_parts.append(f"trialNumber:{trial_number_q}") if document_category_q: - q_parts.append(f"documentData.documentCategory:{document_category_q}") + q_parts.append(f'documentData.documentCategory:"{document_category_q}"') if document_type_name_q: q_parts.append( - f"documentData.documentTypeDescriptionText:{document_type_name_q}" + f'documentData.documentTypeDescriptionText:"{document_type_name_q}"' ) if petitioner_real_party_in_interest_name_q: q_parts.append( - f"regularPetitionerData.realPartyInInterestName:{petitioner_real_party_in_interest_name_q}" + f'regularPetitionerData.realPartyInInterestName:"{petitioner_real_party_in_interest_name_q}"' ) if inventor_name_q: - q_parts.append(f"patentOwnerData.inventorName:{inventor_name_q}") + q_parts.append(f'patentOwnerData.inventorName:"{inventor_name_q}"') if real_party_in_interest_name_q: q_parts.append( - f"regularPetitionerData.realPartyInInterestName:{real_party_in_interest_name_q}" + f'regularPetitionerData.realPartyInInterestName:"{real_party_in_interest_name_q}"' ) if patent_number_q: q_parts.append(f"patentOwnerData.patentNumber:{patent_number_q}") if patent_owner_name_q: - q_parts.append(f"patentOwnerData.patentOwnerName:{patent_owner_name_q}") + q_parts.append(f'patentOwnerData.patentOwnerName:"{patent_owner_name_q}"') if filing_date_from_q and filing_date_to_q: q_parts.append( @@ -425,11 +425,11 @@ def search_decisions( q_parts.append(f"trialNumber:{trial_number_q}") if decision_type_category_q: q_parts.append( - f"decisionData.decisionTypeCategory:{decision_type_category_q}" + f'decisionData.decisionTypeCategory:"{decision_type_category_q}"' ) if document_type_description_q: q_parts.append( - f"documentData.documentTypeDescriptionText:*{document_type_description_q}*" + f'documentData.documentTypeDescriptionText:"*{document_type_description_q}*"' ) if trial_type_code_q: q_parts.append(f"trialMetaData.trialTypeCode:{trial_type_code_q}") @@ -440,17 +440,17 @@ def search_decisions( f"patentOwnerData.applicationNumberText:{application_number_q}" ) if patent_owner_name_q: - q_parts.append(f"patentOwnerData.patentOwnerName:{patent_owner_name_q}") + q_parts.append(f'patentOwnerData.patentOwnerName:"{patent_owner_name_q}"') if trial_status_category_q: q_parts.append( - f"trialMetaData.trialStatusCategory:{trial_status_category_q}" + f'trialMetaData.trialStatusCategory:"{trial_status_category_q}"' ) if real_party_in_interest_name_q: q_parts.append( - f"regularPetitionerData.realPartyInInterestName:{real_party_in_interest_name_q}" + f'regularPetitionerData.realPartyInInterestName:"{real_party_in_interest_name_q}"' ) if document_category_q: - q_parts.append(f"documentData.documentCategory:{document_category_q}") + q_parts.append(f'documentData.documentCategory:"{document_category_q}"') if decision_date_from_q and decision_date_to_q: q_parts.append( diff --git a/src/pyUSPTO/models/ptab.py b/src/pyUSPTO/models/ptab.py index c813dab..b3d7f3f 100644 --- a/src/pyUSPTO/models/ptab.py +++ b/src/pyUSPTO/models/ptab.py @@ -25,8 +25,8 @@ parse_to_datetime_utc, serialize_date, serialize_datetime_as_iso, - to_camel_case, serialize_datetime_as_naive, + to_camel_case, ) @@ -91,7 +91,7 @@ def to_dict(self) -> Dict[str, Any]: Returns: Dict[str, Any]: Dictionary with camelCase keys and None values filtered. """ - result = {} + result: Dict[str, Any] = {} for k, v in asdict(self).items(): if v is not None: if isinstance(v, date): @@ -172,7 +172,7 @@ def to_dict(self) -> Dict[str, Any]: Returns: Dict[str, Any]: Dictionary with camelCase keys and None values filtered. """ - result = {} + result: Dict[str, Any] = {} if self.petition_filing_date is not None: result["petitionFilingDate"] = serialize_date(self.petition_filing_date) @@ -247,7 +247,7 @@ def to_dict(self) -> Dict[str, Any]: Returns: Dict[str, Any]: Dictionary with camelCase keys and None values filtered. """ - result = {} + result: Dict[str, Any] = {} if self.counsel_name is not None: result["counselName"] = self.counsel_name @@ -288,7 +288,7 @@ class PTABTrialProceeding: """ trial_number: Optional[str] = None - trial_record_identifier: Optional[str] = None + # trial_record_identifier: Optional[str] = None last_modified_date_time: Optional[datetime] = None trial_meta_data: Optional[TrialMetaData] = None patent_owner_data: Optional[PatentOwnerData] = None @@ -336,7 +336,7 @@ def from_dict( return cls( trial_number=data.get("trialNumber"), - trial_record_identifier=data.get("trialRecordIdentifier"), + # trial_record_identifier=data.get("trialRecordIdentifier"), last_modified_date_time=parse_to_datetime_utc( data.get("lastModifiedDateTime") ), @@ -354,12 +354,12 @@ def to_dict(self) -> Dict[str, Any]: Returns: Dict[str, Any]: Dictionary with camelCase keys and None values filtered. """ - result = {} + result: Dict[str, Any] = {} if self.trial_number is not None: result["trialNumber"] = self.trial_number - if self.trial_record_identifier is not None: - result["trialRecordIdentifier"] = self.trial_record_identifier + # if self.trial_record_identifier is not None: + # result["trialRecordIdentifier"] = self.trial_record_identifier if self.last_modified_date_time is not None: result["lastModifiedDateTime"] = serialize_datetime_as_naive( self.last_modified_date_time @@ -430,7 +430,7 @@ def to_dict(self) -> Dict[str, Any]: Returns: Dict[str, Any]: Dictionary with camelCase keys and None values filtered. """ - result = {} + result: Dict[str, Any] = {} if self.count is not None: result["count"] = self.count @@ -468,7 +468,7 @@ class TrialDocumentData: document_status: Public status. """ - document_category: Optional[str] = None + # document_category: Optional[str] = None document_filing_date: Optional[date] = None document_identifier: Optional[str] = None document_name: Optional[str] = None @@ -479,15 +479,15 @@ class TrialDocumentData: document_type_description_text: Optional[str] = None file_download_uri: Optional[str] = None filing_party_category: Optional[str] = None - mime_type_identifier: Optional[str] = None - document_status: Optional[str] = None + # mime_type_identifier: Optional[str] = None + # document_status: Optional[str] = None @classmethod def from_dict(cls, data: Dict[str, Any]) -> "TrialDocumentData": # Handle aliases file_download_uri = data.get("fileDownloadURI") or data.get("downloadURI") return cls( - document_category=data.get("documentCategory"), + # document_category=data.get("documentCategory"), document_filing_date=parse_to_date(data.get("documentFilingDate")), document_identifier=data.get("documentIdentifier"), document_name=data.get("documentName"), @@ -498,8 +498,8 @@ def from_dict(cls, data: Dict[str, Any]) -> "TrialDocumentData": document_type_description_text=data.get("documentTypeDescriptionText"), file_download_uri=file_download_uri, filing_party_category=data.get("filingPartyCategory"), - mime_type_identifier=data.get("mimeTypeIdentifier"), - document_status=data.get("documentStatus"), + # mime_type_identifier=data.get("mimeTypeIdentifier"), + # document_status=data.get("documentStatus"), ) def to_dict(self) -> Dict[str, Any]: @@ -508,10 +508,10 @@ def to_dict(self) -> Dict[str, Any]: Returns: Dict[str, Any]: Dictionary with camelCase keys and None values filtered. """ - result = {} + result: Dict[str, Any] = {} - if self.document_category is not None: - result["documentCategory"] = self.document_category + # if self.document_category is not None: + # result["documentCategory"] = self.document_category if self.document_filing_date is not None: result["documentFilingDate"] = serialize_date(self.document_filing_date) if self.document_identifier is not None: @@ -532,10 +532,10 @@ def to_dict(self) -> Dict[str, Any]: result["fileDownloadURI"] = self.file_download_uri # Uppercase URI if self.filing_party_category is not None: result["filingPartyCategory"] = self.filing_party_category - if self.mime_type_identifier is not None: - result["mimeTypeIdentifier"] = self.mime_type_identifier - if self.document_status is not None: - result["documentStatus"] = self.document_status + # if self.mime_type_identifier is not None: + # result["mimeTypeIdentifier"] = self.mime_type_identifier + # if self.document_status is not None: + # result["documentStatus"] = self.document_status return result @@ -574,7 +574,7 @@ def to_dict(self) -> Dict[str, Any]: Returns: Dict[str, Any]: Dictionary with camelCase keys and None values filtered. """ - result = {} + result: Dict[str, Any] = {} if self.statute_and_rule_bag is not None and len(self.statute_and_rule_bag) > 0: result["statuteAndRuleBag"] = self.statute_and_rule_bag @@ -629,7 +629,6 @@ def from_dict( data.get("lastModifiedDateTime") ), trial_number=data.get("trialNumber"), - trial_type_code=data.get("trialTypeCode"), trial_meta_data=( TrialMetaData.from_dict(trial_meta) if trial_meta else None ), @@ -660,7 +659,7 @@ def to_dict(self) -> Dict[str, Any]: Returns: Dict[str, Any]: Dictionary with camelCase keys and None values filtered. """ - result = {} + result: Dict[str, Any] = {} if self.trial_document_category is not None: result["trialDocumentCategory"] = self.trial_document_category @@ -670,8 +669,6 @@ def to_dict(self) -> Dict[str, Any]: ) if self.trial_number is not None: result["trialNumber"] = self.trial_number - if self.trial_type_code is not None: - result["trialTypeCode"] = self.trial_type_code if self.trial_meta_data is not None: result["trialMetaData"] = self.trial_meta_data.to_dict() if self.patent_owner_data is not None: @@ -725,7 +722,7 @@ def to_dict(self) -> Dict[str, Any]: Returns: Dict[str, Any]: Dictionary with camelCase keys and None values filtered. """ - result = {} + result: Dict[str, Any] = {} if self.count is not None: result["count"] = self.count @@ -798,7 +795,7 @@ def to_dict(self) -> Dict[str, Any]: Returns: Dict[str, Any]: Dictionary with camelCase keys and None values filtered. """ - result = {} + result: Dict[str, Any] = {} if self.appeal_filing_date is not None: result["appealFilingDate"] = serialize_date(self.appeal_filing_date) @@ -862,7 +859,7 @@ def to_dict(self) -> Dict[str, Any]: Returns: Dict[str, Any]: Dictionary with camelCase keys and None values filtered. """ - result = {} + result: Dict[str, Any] = {} for k, v in asdict(self).items(): if v is not None: result[to_camel_case(k)] = v @@ -926,7 +923,7 @@ def to_dict(self) -> Dict[str, Any]: Returns: Dict[str, Any]: Dictionary with camelCase keys and None values filtered. """ - result = {} + result: Dict[str, Any] = {} if self.document_filing_date is not None: result["documentFilingDate"] = serialize_date(self.document_filing_date) @@ -991,7 +988,7 @@ def to_dict(self) -> Dict[str, Any]: Returns: Dict[str, Any]: Dictionary with camelCase keys and None values filtered. """ - result = {} + result: Dict[str, Any] = {} for k, v in asdict(self).items(): if v is not None: if isinstance(v, date): @@ -1082,7 +1079,7 @@ def to_dict(self) -> Dict[str, Any]: Returns: Dict[str, Any]: Dictionary with camelCase keys and None values filtered. """ - result = {} + result: Dict[str, Any] = {} # Manually process each field to preserve nested objects if self.appeal_number is not None: @@ -1155,7 +1152,7 @@ def to_dict(self) -> Dict[str, Any]: Returns: Dict[str, Any]: Dictionary with camelCase keys and None values filtered. """ - result = {} + result: Dict[str, Any] = {} # Manually process each field if self.count is not None: @@ -1229,7 +1226,7 @@ def to_dict(self) -> Dict[str, Any]: Returns: Dict[str, Any]: Dictionary with camelCase keys and None values filtered. """ - result = {} + result: Dict[str, Any] = {} if self.interference_style_name is not None: result["interferenceStyleName"] = self.interference_style_name @@ -1305,7 +1302,7 @@ def to_dict(self) -> Dict[str, Any]: Returns: Dict[str, Any]: Dictionary with camelCase keys and None values filtered. """ - result = {} + result: Dict[str, Any] = {} if self.application_number_text is not None: result["applicationNumberText"] = self.application_number_text @@ -1388,7 +1385,7 @@ def to_dict(self) -> Dict[str, Any]: Returns: Dict[str, Any]: Dictionary with camelCase keys and None values filtered. """ - result = {} + result: Dict[str, Any] = {} if self.document_identifier is not None: result["documentIdentifier"] = self.document_identifier @@ -1503,7 +1500,7 @@ def to_dict(self) -> Dict[str, Any]: Returns: Dict[str, Any]: Dictionary with camelCase keys and None values filtered. """ - result = {} + result: Dict[str, Any] = {} # Manually process each field to preserve nested objects if self.interference_number is not None: @@ -1581,7 +1578,7 @@ def to_dict(self) -> Dict[str, Any]: Returns: Dict[str, Any]: Dictionary with camelCase keys and None values filtered. """ - result = {} + result: Dict[str, Any] = {} # Manually process each field if self.count is not None: diff --git a/tests/clients/test_ptab_interferences_client.py b/tests/clients/test_ptab_interferences_client.py index 8d3147f..0bc8f8e 100644 --- a/tests/clients/test_ptab_interferences_client.py +++ b/tests/clients/test_ptab_interferences_client.py @@ -24,36 +24,84 @@ def interference_decision_sample() -> Dict[str, Any]: """Sample interference decision data for testing.""" return { "count": 2, - "requestIdentifier": "req-123", + "requestIdentifier": "c76aa849-bd60-40db-a98b-c8cbc143d4f9", "patentInterferenceDataBag": [ { - "interferenceNumber": "106123", - "interferenceRecordIdentifier": "interference-uuid-1", - "lastModifiedDateTime": "2023-03-15T10:30:00Z", + "interferenceNumber": "104807", + "lastModifiedDateTime": "2025-11-20T03:12:32", "interferenceMetaData": { - "seniorPartyApplicationNumber": "12/345678", - "juniorPartyApplicationNumber": "13/987654", - "seniorPartyName": "Senior Party Inc.", - "juniorPartyName": "Junior Party LLC", + "interferenceLastModifiedDateTime": "2006-12-22T00:00:00", + "interferenceLastModifiedDate": "2006-12-22", + "declarationDate": "2002-12-11", + "interferenceStyleName": "VINOGRADOV V. FLAMM", + "fileDownloadURI": "https://api.uspto.gov/api/v1/patent/ptab-files/INTF/104807/104807.zip", + }, + "seniorPartyData": { + "applicationNumberText": "08739037", + "grantDate": "1999-10-12", + "groupArtUnitNumber": "1763", + "inventorName": "GEORGY VINOGRADOV et al", + "patentNumber": "5965034", + "patentOwnerName": "GEORGY VINOGRADOV et al", + "realPartyInInterestName": "GEORGY VINOGRADOV et al", + "technologyCenterNumber": "1700", + }, + "juniorPartyData": { + "applicationNumberText": "08748746", + "grantDate": "2005-02-22", + "groupArtUnitNumber": "1763", + "inventorName": "DANIEL L. FLAMM et al", + "patentNumber": "6858112", + "patentOwnerName": "DANIEL L. FLAMM et al", + "publicationDate": "2003-09-11", + "publicationNumber": "20030168427A1", + "realPartyInInterestName": "DANIEL L. FLAMM et al", + "technologyCenterNumber": "1700", }, "documentData": { - "interferenceOutcomeCategory": "Priority to Senior Party", - "decisionTypeCategory": "Final Decision", - "decisionDate": "2023-03-01", + "documentIdentifier": "b8c473a3bcab88d5c33ef3231daf45a10f967103a89b8db9c791d1ee", + "documentName": "fd10480712-11-2002", + "documentSizeQuantity": 160468, + "documentOCRText": "The opinion in support of the decision being \nentered today is not binding precedent of the Board. \n\nPaper 20 \nFiled by: Trial Section Motions Panel \n\nBox Interference Filed: December 11, 2002 \nWashington, D.C. 20231 \nTel: 703-308-9797 \nFax: 703-305-0942 \n\nUNITED STATES PATENT AND TRADEMARK OFFICE \n\nBEFORE THE BOARD OF PATENT APPEALS \nAND INTERFERENCES \n\nMAILED \nDANIEL L. FLAMM \n\nJunior Party DEC 2002 \n(U.S. Application 08/748,746), \n\nPAT & TM OFFICE BOARD OF PATENT \nV. AND INTERFER,'N\"FALS \n\nGEORGY", + "documentTitleText": "DECISION-104807", + "interferenceOutcomeCategory": "Final Decision", + "decisionIssueDate": "2002-12-11", + "decisionTypeCategory": "Decision", + "fileDownloadURI": "https://api.uspto.gov/api/v1/patent/ptab-files/INTF/104807/Intf608_10480708739037_1039582800000.pdf", + "documentFilingDate": "2002-12-11", }, }, { - "interferenceNumber": "106124", - "interferenceRecordIdentifier": "interference-uuid-2", - "lastModifiedDateTime": "2023-03-20T14:00:00Z", + "interferenceNumber": "103751", + "lastModifiedDateTime": "2025-11-20T03:12:32", "interferenceMetaData": { - "seniorPartyApplicationNumber": "14/111222", - "juniorPartyApplicationNumber": "14/333444", + "interferenceLastModifiedDateTime": "2006-02-08T00:00:00", + "interferenceLastModifiedDate": "2006-02-08", + "declarationDate": "2002-02-25", + "interferenceStyleName": "TANG", + "fileDownloadURI": "https://api.uspto.gov/api/v1/patent/ptab-files/INTF/103751/103751.zip", + }, + "seniorPartyData": { + "applicationNumberText": "07996817", + "grantDate": "2003-09-02", + "groupArtUnitNumber": "1763", + "inventorName": " TANG", + "patentNumber": "6614529", + "patentOwnerName": " TANG", + "realPartyInInterestName": " TANG", + "technologyCenterNumber": "1700", }, "documentData": { - "interferenceOutcomeCategory": "Priority to Junior Party", - "decisionTypeCategory": "Judgment", - "decisionDate": "2023-03-10", + "documentIdentifier": "a1adf3e98f9e07271420b607222b5ad0ddc7198317be600b7c48a3be", + "documentName": "jd103751", + "documentSizeQuantity": 45224, + "documentOCRText": "E:\\FY2002~5\\FEB200~7\\FEB200~4\\JD103751.WPD\n\n\nThe opinion in support of the decision being\nentered today is not binding precedent of the Board.\n\n Paper 62\nFiled by: Interference Trial Section Merits Panel\n Box Interference Filed:\n Washington, D.C. 20231 25 February 2002\n Tel: 703-308-9797\n Fax: 703-305-0942\n\nUNITED STATES PATENT AND TRADEMARK OFFICE\n____________", + "documentTitleText": "DECISION-103751", + "interferenceOutcomeCategory": "Final Decision", + "decisionIssueDate": "2002-02-25", + "decisionTypeCategory": "Decision", + "fileDownloadURI": "https://api.uspto.gov/api/v1/patent/ptab-files/INTF/103751/Intf608_10375107996817_1014613200000.pdf", + "documentFilingDate": "2002-02-25", }, }, ], @@ -153,8 +201,8 @@ def test_search_decisions_get_with_convenience_params( interference_number_q="106123", senior_party_name_q="Senior Party Inc.", junior_party_name_q="Junior Party LLC", - interference_outcome_category_q="Priority to Senior Party", - decision_type_category_q="Final Decision", + interference_outcome_category_q="Final Decision", + decision_type_category_q="Decision", decision_date_from_q="2023-01-01", decision_date_to_q="2023-12-31", limit=25, @@ -168,11 +216,15 @@ def test_search_decisions_get_with_convenience_params( params = call_args[1]["params"] assert "q" in params assert "106123" in params["interferenceNumber"] - assert "seniorPartyName:Senior Party Inc." in params["q"] - assert "juniorPartyName:Junior Party LLC" in params["q"] - assert "interferenceOutcomeCategory:Priority to Senior Party" in params["q"] - assert "decisionTypeCategory:Final Decision" in params["q"] - assert "decisionDate:[2023-01-01 TO 2023-12-31]" in params["q"] + assert 'seniorPartyData.patentOwnerName:"Senior Party Inc."' in params["q"] + assert 'juniorPartyData.patentOwnerName:"Junior Party LLC"' in params["q"] + assert ( + 'documentData.interferenceOutcomeCategory:"Final Decision"' in params["q"] + ) + assert 'documentData.decisionTypeCategory:"Decision"' in params["q"] + assert ( + "documentData.decisionIssueDate:[2023-01-01 TO 2023-12-31]" in params["q"] + ) assert params["limit"] == 25 def test_search_decisions_get_with_date_from_only( @@ -197,7 +249,7 @@ def test_search_decisions_get_with_date_from_only( assert isinstance(result, PTABInterferenceResponse) call_args = mock_session.get.call_args params = call_args[1]["params"] - assert "decisionDate:>=2023-01-01" in params["q"] + assert "documentData.decisionIssueDate:>=2023-01-01" in params["q"] def test_search_decisions_get_with_date_to_only( self, @@ -221,7 +273,7 @@ def test_search_decisions_get_with_date_to_only( assert isinstance(result, PTABInterferenceResponse) call_args = mock_session.get.call_args params = call_args[1]["params"] - assert "decisionDate:<=2023-12-31" in params["q"] + assert "documentData.decisionIssueDate:<=2023-12-31" in params["q"] def test_search_decisions_get_with_all_convenience_params( self, @@ -254,12 +306,42 @@ def test_search_decisions_get_with_all_convenience_params( call_args = mock_session.get.call_args params = call_args[1]["params"] assert "interferenceNumber:106123" in params["q"] - assert "seniorPartyApplicationNumber:12/345678" in params["q"] - assert "juniorPartyApplicationNumber:13/987654" in params["q"] - assert "seniorPartyName:Senior Party Inc." in params["q"] - assert "juniorPartyName:Junior Party LLC" in params["q"] - assert "interferenceOutcomeCategory:Priority to Senior Party" in params["q"] - assert "decisionTypeCategory:Final Decision" in params["q"] + assert "seniorPartyData.applicationNumberText:12/345678" in params["q"] + assert "juniorPartyData.applicationNumberText:13/987654" in params["q"] + assert 'seniorPartyData.patentOwnerName:"Senior Party Inc."' in params["q"] + assert 'juniorPartyData.patentOwnerName:"Junior Party LLC"' in params["q"] + assert ( + 'documentData.interferenceOutcomeCategory:"Priority to Senior Party"' + in params["q"] + ) + assert 'documentData.decisionTypeCategory:"Final Decision"' in params["q"] + + def test_search_decisions_with_real_party_in_interest_q( + self, + mock_ptab_interferences_client: PTABInterferencesClient, + interference_decision_sample: Dict[str, Any], + ) -> None: + """Test search_decisions with real_party_in_interest_q parameter.""" + # Setup + mock_session = MagicMock() + mock_response = MagicMock() + mock_response.json.return_value = interference_decision_sample + mock_session.get.return_value = mock_response + mock_ptab_interferences_client.session = mock_session + + # Test + result = mock_ptab_interferences_client.search_decisions( + real_party_in_interest_q="Tech Company Inc." + ) + + # Verify + assert isinstance(result, PTABInterferenceResponse) + call_args = mock_session.get.call_args + params = call_args[1]["params"] + assert ( + 'seniorPartyData.realPartyInInterestName:"Tech Company Inc." OR juniorPartyData.realPartyInInterestName:"Tech Company Inc."' + in params["q"] + ) def test_search_decisions_post_with_body( self, diff --git a/tests/clients/test_ptab_trials_client.py b/tests/clients/test_ptab_trials_client.py index 34167ab..8b438cd 100644 --- a/tests/clients/test_ptab_trials_client.py +++ b/tests/clients/test_ptab_trials_client.py @@ -226,10 +226,10 @@ def test_search_proceedings_with_all_convenience_params( assert isinstance(result, PTABTrialProceedingResponse) call_args = mock_session.get.call_args params = call_args[1]["params"] - assert "patentOwnerData.patentOwnerName:Test Owner" in params["q"] - assert "regularPetitionerData.realPartyInInterestName:Test Petitioner" in params["q"] - assert "respondentData.patentOwnerName:Test Respondent" in params["q"] - assert "trialMetaData.trialStatusCategory:Instituted" in params["q"] + assert 'patentOwnerData.patentOwnerName:"Test Owner"' in params["q"] + assert 'regularPetitionerData.realPartyInInterestName:"Test Petitioner"' in params["q"] + assert 'respondentData.patentOwnerName:"Test Respondent"' in params["q"] + assert 'trialMetaData.trialStatusCategory:"Instituted"' in params["q"] def test_search_proceedings_with_date_from_only( self, @@ -429,13 +429,13 @@ def test_search_documents_with_all_convenience_params( call_args = mock_session.get.call_args params = call_args[1]["params"] assert "trialNumber:IPR2023-00001" in params["q"] - assert "documentData.documentCategory:Paper" in params["q"] - assert "documentData.documentTypeDescriptionText:Patent Owner Response" in params["q"] - assert "regularPetitionerData.realPartyInInterestName:Test Petitioner" in params["q"] - assert "patentOwnerData.inventorName:Jane Inventor" in params["q"] - assert "regularPetitionerData.realPartyInInterestName:Real Party LLC" in params["q"] + assert 'documentData.documentCategory:"Paper"' in params["q"] + assert 'documentData.documentTypeDescriptionText:"Patent Owner Response"' in params["q"] + assert 'regularPetitionerData.realPartyInInterestName:"Test Petitioner"' in params["q"] + assert 'patentOwnerData.inventorName:"Jane Inventor"' in params["q"] + assert 'regularPetitionerData.realPartyInInterestName:"Real Party LLC"' in params["q"] assert "patentOwnerData.patentNumber:US1234567" in params["q"] - assert "patentOwnerData.patentOwnerName:Test Owner" in params["q"] + assert 'patentOwnerData.patentOwnerName:"Test Owner"' in params["q"] assert params["limit"] == 50 def test_search_documents_with_date_from_only( @@ -634,14 +634,14 @@ def test_search_decisions_with_all_convenience_params( call_args = mock_session.get.call_args params = call_args[1]["params"] assert "trialNumber:IPR2023-00001" in params["q"] - assert "decisionData.decisionTypeCategory:Final Written Decision" in params["q"] + assert 'decisionData.decisionTypeCategory:"Final Written Decision"' in params["q"] assert "trialTypeCode:IPR" in params["q"] assert "patentOwnerData.patentNumber:US1234567" in params["q"] assert "patentOwnerData.applicationNumberText:15/123456" in params["q"] - assert "patentOwnerData.patentOwnerName:Test Owner" in params["q"] - assert "trialMetaData.trialStatusCategory:Instituted" in params["q"] - assert "regularPetitionerData.realPartyInInterestName:Real Party LLC" in params["q"] - assert "documentData.documentCategory:Decision" in params["q"] + assert 'patentOwnerData.patentOwnerName:"Test Owner"' in params["q"] + assert 'trialMetaData.trialStatusCategory:"Instituted"' in params["q"] + assert 'regularPetitionerData.realPartyInInterestName:"Real Party LLC"' in params["q"] + assert 'documentData.documentCategory:"Decision"' in params["q"] assert "decisionData.decisionIssueDate:[2023-01-01 TO 2023-12-31]" in params["q"] assert params["limit"] == 50 @@ -693,6 +693,30 @@ def test_search_decisions_with_date_to_only( params = call_args[1]["params"] assert "decisionData.decisionIssueDate:<=2023-12-31" in params["q"] + def test_search_decisions_with_document_type_description_q( + self, + mock_ptab_trials_client: PTABTrialsClient, + trial_document_sample: Dict[str, Any], + ) -> None: + """Test search_decisions with document_type_description_q parameter.""" + # Setup + mock_session = MagicMock() + mock_response = MagicMock() + mock_response.json.return_value = trial_document_sample + mock_session.get.return_value = mock_response + mock_ptab_trials_client.session = mock_session + + # Test + result = mock_ptab_trials_client.search_decisions( + document_type_description_q="Final Written Decision" + ) + + # Verify + assert isinstance(result, PTABTrialDocumentResponse) + call_args = mock_session.get.call_args + params = call_args[1]["params"] + assert 'documentData.documentTypeDescriptionText:"*Final Written Decision*"' in params["q"] + def test_search_decisions_post_with_body( self, mock_ptab_trials_client: PTABTrialsClient, diff --git a/tests/models/test_patent_data_models.py b/tests/models/test_patent_data_models.py index 22ce77f..50264b8 100644 --- a/tests/models/test_patent_data_models.py +++ b/tests/models/test_patent_data_models.py @@ -58,7 +58,7 @@ parse_yn_to_bool, serialize_bool_to_yn, serialize_date, - serialize_datetime_as_iso, + serialize_datetime_as_naive, to_camel_case, ) @@ -197,7 +197,6 @@ def sample_child_continuity_data() -> Dict[str, Any]: "childApplicationNumberText": "87654321", "childApplicationStatusDescriptionText": "Docketed New Case - Ready for Examination", "childApplicationFilingDate": "2022-01-01", - "childPatentNumber": None, "claimParentageTypeCode": "CON", "claimParentageTypeCodeDescriptionText": "Continuation", } @@ -642,7 +641,7 @@ def test_document_to_dict_basic(self) -> None: ) data = doc.to_dict() assert data["documentIdentifier"] == "doc123" - assert data["officialDate"] == "2023-03-15T10:30:00Z" + assert data["officialDate"] == "2023-03-15T06:30:00" assert data["documentDirectionCategory"] == "OUTGOING" assert len(data["downloadOptionBag"]) == 1 assert data["downloadOptionBag"][0]["mimeTypeIdentifier"] == "image/tiff" @@ -1520,6 +1519,8 @@ def test_child_continuity_to_dict( expected_data["childApplicationFilingDate"] = serialize_date( parse_to_date(expected_data["childApplicationFilingDate"]) ) + # Remove None values from expected data to match to_dict() filtering behavior + expected_data = {k: v for k, v in expected_data.items() if v is not None} assert data == expected_data @@ -1671,7 +1672,7 @@ def test_document_meta_data_to_dict( ) data = doc_meta.to_dict() assert data["zipFileName"] == sample_document_meta_data_data["zipFileName"] - assert data["fileCreateDateTime"] == "2023-01-01T12:00:00Z" + assert data["fileCreateDateTime"] == "2023-01-01T07:00:00" def test_document_meta_data_with_null_input(self) -> None: doc_meta = PrintedMetaData.from_dict({}) @@ -1844,7 +1845,7 @@ def test_patent_file_wrapper_to_dict( data["pgpubDocumentMetaData"]["zipFileName"] == sample_document_meta_data_data["zipFileName"] ) - assert data["lastIngestionDateTime"] == "2023-02-02T11:00:00Z" + assert data["lastIngestionDateTime"] == "2023-02-02T06:00:00" def test_patent_file_wrapper_with_grant_document_meta_data( self, sample_document_meta_data_data: Dict[str, Any] diff --git a/tests/models/test_ptab_models.py b/tests/models/test_ptab_models.py index 98cda22..3a0c535 100644 --- a/tests/models/test_ptab_models.py +++ b/tests/models/test_ptab_models.py @@ -46,6 +46,430 @@ ) +# Sample API response fixtures for round-trip testing +@pytest.fixture +def trial_proceeding_api_sample() -> Dict[str, Any]: + """Sample trial proceeding API response for testing.""" + return { + "count": 1, + "requestIdentifier": "4649ea27-4192-4ea4-86f9-e033ca24c17a", + "patentTrialProceedingDataBag": [ + { + "lastModifiedDateTime": "2025-11-20T01:27:05", + "respondentData": { + "patentOwnerName": "ADAMS et al", + "patentNumber": "9780412", + "grantDate": "2017-10-03", + "technologyCenterNumber": "1700", + "groupArtUnitNumber": "1725", + "applicationNumberText": "15461849", + "inventorName": "Brian D. ADAMS et al", + }, + "patentOwnerData": { + "patentOwnerName": "ADAMS et al", + "patentNumber": "9780412", + "grantDate": "2017-10-03", + "technologyCenterNumber": "1700", + "groupArtUnitNumber": "1725", + "applicationNumberText": "15461849", + "inventorName": "Brian D. ADAMS et al", + }, + "trialMetaData": { + "accordedFilingDate": "2018-07-20", + "terminationDate": "2019-01-30", + "trialTypeCode": "DER", + "fileDownloadURI": "https://api.uspto.gov/api/v1/patent/ptab-files/DER/2018/00018/DER2018-00018.zip", + "trialStatusCategory": "Terminated-Settled", + "trialLastModifiedDate": "2020-06-04", + "petitionFilingDate": "2018-07-20", + "trialLastModifiedDateTime": "2020-06-04T13:49:04", + }, + "trialNumber": "DER2018-00018", + "regularPetitionerData": {"counselName": "Todd Baker"}, + "derivationPetitionerData": { + "technologyCenterNumber": "1700", + "groupArtUnitNumber": "1722", + "applicationNumberText": "15513914", + "inventorName": "Brian D. ADAMS et al", + "counselName": "Todd Baker", + }, + } + ], + } + + +@pytest.fixture +def trial_decision_api_sample() -> Dict[str, Any]: + """Sample trial decision API response for testing.""" + return { + "count": 1, + "requestIdentifier": "e303e566-a896-4b1e-9b22-1f8b1b1cc5cf", + "patentTrialDocumentDataBag": [ + { + "trialNumber": "IPR2025-01319", + "lastModifiedDateTime": "2025-11-21T03:56:35", + "trialDocumentCategory": "Decision", + "trialMetaData": { + "institutionDecisionDate": "2025-11-20", + "accordedFilingDate": "2025-07-17", + "petitionFilingDate": "2025-07-17", + "trialLastModifiedDateTime": "2025-11-20T15:34:55", + "trialLastModifiedDate": "2025-11-20", + "terminationDate": "2025-11-20", + "trialStatusCategory": "Discretionary Denial", + "latestDecisionDate": "2025-11-20", + "trialTypeCode": "IPR", + }, + "patentOwnerData": { + "applicationNumberText": "17980669", + "counselName": "Cohen, Alexiset al", + "grantDate": "2023-07-18", + "groupArtUnitNumber": "2884", + "inventorName": "Yong Qin Chen", + "realPartyInInterestName": "Beckman Coulter, Inc. et al.", + "patentNumber": "11703443", + "technologyCenterNumber": "2800", + }, + "regularPetitionerData": { + "counselName": "Knight, Dustinet al", + "realPartyInInterestName": "Cytek Biosciences, Inc.", + }, + "documentData": { + "documentTypeDescriptionText": "RESPONSE", + "documentFilingDate": "2025-11-20", + "documentIdentifier": "171242096", + "documentName": "20251120 Director Notice Regarding Institution Paper 13.pdf", + "documentNumber": 13, + "documentSizeQuantity": 85780, + "documentTitleText": "Director Discretionary Decision: Deny", + "fileDownloadURI": "https://api.uspto.gov/api/v1/patent/ptab-files/IPR/2025/01319/171242096.pdf", + "filingPartyCategory": "BOARD", + "documentOCRText": "Trials@uspto.gov Paper 13", + }, + "decisionData": { + "statuteAndRuleBag": ["35 USC 314", "35 USC 324"], + "decisionIssueDate": "2025-11-20", + "decisionTypeCategory": "Decision", + "trialOutcomeCategory": "Institution Denied", + }, + } + ], + } + + +@pytest.fixture +def trial_document_api_sample() -> Dict[str, Any]: + """Sample trial document API response for testing.""" + return { + "count": 2, + "requestIdentifier": "e02d1512-7e81-489f-9c98-4d0c6070864e", + "patentTrialDocumentDataBag": [ + { + "trialNumber": "DER2023-00012", + "lastModifiedDateTime": "2025-11-20T01:22:58", + "trialDocumentCategory": "Document", + "trialMetaData": { + "accordedFilingDate": "2023-05-11", + "petitionFilingDate": "2023-05-11", + "trialLastModifiedDateTime": "2025-07-24T12:21:16", + "trialLastModifiedDate": "2025-07-24", + "trialStatusCategory": "Pending", + "trialTypeCode": "DER", + }, + "patentOwnerData": { + "applicationNumberText": "17522731", + "counselName": "Ringenberg, Scotet al", + "groupArtUnitNumber": "3676", + "inventorName": "Nicholas Kleinschmit et al", + "realPartyInInterestName": "Holmberg, Aaron et al.", + "technologyCenterNumber": "3600", + }, + "regularPetitionerData": { + "counselName": "Brewer, Peteret al", + "realPartyInInterestName": "Rasmussen, Jon et al.", + }, + "respondentData": { + "applicationNumberText": "17522731", + "counselName": "Ringenberg, Scotet al", + "groupArtUnitNumber": "3676", + "inventorName": "Nicholas Kleinschmit et al", + "realPartyInInterestName": "Holmberg, Aaron et al.", + "technologyCenterNumber": "3600", + }, + "derivationPetitionerData": { + "applicationNumberText": "17846932", + "counselName": "Brewer, Peteret al", + "groupArtUnitNumber": "3674", + "inventorName": "Jon Randall Rasmussen et al", + "realPartyInInterestName": "Rasmussen, Jon et al.", + "patentOwnerName": "Rasmussen, JonRandall", + "technologyCenterNumber": "3600", + }, + "documentData": { + "documentTypeDescriptionText": "ORDER", + "documentFilingDate": "2025-07-24", + "documentIdentifier": "171138150", + "documentName": "Order Limited Remand Final DER2023-00012 Circ.pdf", + "documentNumber": 25, + "documentSizeQuantity": 94697, + "documentTitleText": "ORDER Conduct of Proceeding Limited Remand 37 C.F.R. § 42.5(a)", + "fileDownloadURI": "https://api.uspto.gov/api/v1/patent/ptab-files/DER/2023/00012/171138150.pdf", + "filingPartyCategory": "BOARD", + }, + "decisionData": {"statuteAndRuleBag": []}, + }, + { + "trialNumber": "DER2022-00004", + "lastModifiedDateTime": "2025-11-20T01:22:56", + "trialDocumentCategory": "Decision", + "trialMetaData": { + "institutionDecisionDate": "2023-11-28", + "accordedFilingDate": "2022-03-17", + "petitionFilingDate": "2022-03-17", + "trialLastModifiedDateTime": "2023-12-29T00:00:02", + "trialLastModifiedDate": "2023-12-29", + "terminationDate": "2023-11-28", + "trialStatusCategory": "Institution Denied", + "latestDecisionDate": "2023-11-28", + "trialTypeCode": "DER", + }, + "patentOwnerData": { + "applicationNumberText": "17018233", + "counselName": "Miotke, Josephet al", + "grantDate": "2024-05-21", + "groupArtUnitNumber": "2144", + "inventorName": "Grant Vergottini", + "realPartyInInterestName": "Xcential Corporation", + "patentNumber": "11989794", + "technologyCenterNumber": "2100", + }, + "regularPetitionerData": { + "counselName": "Totten, Jeffreyet al", + "realPartyInInterestName": "Akin Gump Strauss Hauer & Feld LLP et al.", + }, + "respondentData": { + "applicationNumberText": "17018233", + "counselName": "Miotke, Josephet al", + "grantDate": "2024-05-21", + "groupArtUnitNumber": "2144", + "inventorName": "Grant Vergottini", + "realPartyInInterestName": "Xcential Corporation", + "patentNumber": "11989794", + "technologyCenterNumber": "2100", + }, + "derivationPetitionerData": { + "applicationNumberText": "17696389", + "counselName": "Totten, Jeffreyet al", + "groupArtUnitNumber": "2144", + "inventorName": "Louis AGNELLO", + "realPartyInInterestName": "Akin Gump Strauss Hauer & Feld LLP et al.", + "technologyCenterNumber": "2100", + }, + "documentData": { + "documentTypeDescriptionText": "DECISION", + "documentFilingDate": "2023-11-28", + "documentIdentifier": "170697659", + "documentName": "DER2022-00004 Institution Decision.pdf", + "documentNumber": 15, + "documentSizeQuantity": 382075, + "documentTitleText": "Institution Decision: Deny", + "fileDownloadURI": "https://api.uspto.gov/api/v1/patent/ptab-files/DER/2022/00004/170697659.pdf", + "filingPartyCategory": "BOARD", + "documentOCRText": "DER2022-00004 Akin Gump Strauss Hauer & Feld LLP et al. v. Xcential Corporation\n\n\nTrials@uspto.gov Paper 15 \n571-272-7822 Date: November 28, 2023 \n \n\n \n\nUNITED STATES PATENT AND TRADEMARK OFFICE \n \n\nBEFORE THE PATENT TRIAL AND APPEAL BOARD \n \n\n \n \n\nAKIN GUMP STRAUSS HAUER & FELD LLP, \nPetitioner Application 17/696,389, \n\nPetitioner, \n \n\nv. \n \n\nXCENTIAL CORP., \nRespondent Application 17/018,233, \n\nRespondent. \n____________ \n\n \nDER2022-00004 \n______________ \n\n \nBefore JAMESON LEE, JUSTIN T. ARBES", + }, + "decisionData": { + "statuteAndRuleBag": [ + "37 CFR 42.405", + " 47 CFR 42.401", + " 40 CFR 42.401", + "37 CFR 42.408", + ], + "decisionIssueDate": "2023-11-28", + "decisionTypeCategory": "Decision", + "issueTypeBag": ["102", "103"], + "trialOutcomeCategory": "Institution Denied", + }, + }, + ], + } + + +@pytest.fixture +def appeal_decision_api_sample() -> Dict[str, Any]: + """Sample appeal decision API response for testing.""" + return { + "count": 1, + "requestIdentifier": "7cf343b3-cad4-4813-9d46-993cf3c50283", + "patentAppealDataBag": [ + { + "appealNumber": "2015000194", + "lastModifiedDateTime": "2015-02-18T14:23:45Z", + "appealDocumentCategory": "Decision", + "appealMetaData": { + "appealFilingDate": "2014-10-02", + "appealLastModifiedDate": "2015-02-18", + "appealLastModifiedDateTime": "2015-02-18T10:07:59", + "applicationTypeCategory": "Utility", + "docketNoticeMailedDate": "2014-11-15", + "fileDownloadURI": "https://api.uspto.gov/api/v1/patent/ptab-files/APPEAL/2015/000194.zip", + }, + "appellantData": { + "applicationNumberText": "12608694", + "counselName": "PAULEY ERICKSON & SWANSON", + "groupArtUnitNumber": "3992", + "inventorName": "John Smith", + "realPartyInInterestName": "Tech Company Inc.", + "patentOwnerName": "Tech Company Inc.", + "publicationDate": "2010-06-10", + "publicationNumber": "US20100145456", + "technologyCenterNumber": "3900", + }, + "requestorData": {"thirdPartyName": "Third Party Requestor LLC"}, + "documentData": { + "documentFilingDate": "2015-02-18", + "documentIdentifier": "appeal-doc-12345", + "documentName": "Decision on Appeal.pdf", + "documentSizeQuantity": 345678, + "documentOCRText": "Decision on Appeal text content...", + "documentTypeDescriptionText": "Decision", + "fileDownloadURI": "https://api.uspto.gov/api/v1/patent/ptab-files/APPEAL/2015/000194/decision.pdf", + }, + "decisionData": { + "appealOutcomeCategory": "Affirmed", + "statuteAndRuleBag": ["35 U.S.C. § 103", "37 CFR 1.111"], + "decisionIssueDate": "2015-02-18", + "decisionTypeCategory": "Examiner Affirmed", + "issueTypeBag": ["Obviousness"], + }, + } + ], + } + + +@pytest.fixture +def interference_decision_api_sample() -> Dict[str, Any]: + """Sample interference decision API response for testing.""" + return { + "count": 2, + "requestIdentifier": "66576984-9c20-4e41-b4da-e28d13fe18f1", + "patentInterferenceDataBag": [ + { + "interferenceNumber": "104807", + "lastModifiedDateTime": "2025-11-20T03:12:32", + "interferenceMetaData": { + "interferenceLastModifiedDateTime": "2006-12-22T00:00:00", + "interferenceLastModifiedDate": "2006-12-22", + "declarationDate": "2002-12-11", + "interferenceStyleName": "VINOGRADOV V. FLAMM", + "fileDownloadURI": "https://api.uspto.gov/api/v1/patent/ptab-files/INTF/104807/104807.zip", + }, + "seniorPartyData": { + "applicationNumberText": "08739037", + "grantDate": "1999-10-12", + "groupArtUnitNumber": "1763", + "inventorName": "GEORGY VINOGRADOV et al", + "patentNumber": "5965034", + "patentOwnerName": "GEORGY VINOGRADOV et al", + "realPartyInInterestName": "GEORGY VINOGRADOV et al", + "technologyCenterNumber": "1700", + }, + "juniorPartyData": { + "applicationNumberText": "08748746", + "grantDate": "2005-02-22", + "groupArtUnitNumber": "1763", + "inventorName": "DANIEL L. FLAMM et al", + "patentNumber": "6858112", + "patentOwnerName": "DANIEL L. FLAMM et al", + "publicationDate": "2003-09-11", + "publicationNumber": "20030168427A1", + "realPartyInInterestName": "DANIEL L. FLAMM et al", + "technologyCenterNumber": "1700", + }, + "documentData": { + "documentIdentifier": "b8c473a3bcab88d5c33ef3231daf45a10f967103a89b8db9c791d1ee", + "documentName": "fd10480712-11-2002", + "documentSizeQuantity": 160468, + "documentOCRText": "The opinion in support of the decision being \nentered today is not binding precedent of the Board. \n\nPaper 20 \nFiled by: Trial Section Motions Panel \n\nBox Interference Filed: December 11, 2002 \nWashington, D.C. 20231 \nTel: 703-308-9797 \nFax: 703-305-0942 \n\nUNITED STATES PATENT AND TRADEMARK OFFICE \n\nBEFORE THE BOARD OF PATENT APPEALS \nAND INTERFERENCES \n\nMAILED \nDANIEL L. FLAMM \n\nJunior Party DEC 2002 \n(U.S. Application 08/748,746), \n\nPAT & TM OFFICE BOARD OF PATENT \nAND INTERFER,'N\"FALS \n\nGEORGY", + "documentTitleText": "DECISION-104807", + "interferenceOutcomeCategory": "Final Decision", + "decisionIssueDate": "2002-12-11", + "decisionTypeCategory": "Decision", + "fileDownloadURI": "https://api.uspto.gov/api/v1/patent/ptab-files/INTF/104807/Intf608_10480708739037_1039582800000.pdf", + "documentFilingDate": "2002-12-11", + }, + }, + { + "interferenceNumber": "106130", + "lastModifiedDateTime": "2025-11-20T03:12:32", + "additionalPartyDataBag": [ + { + "applicationNumberText": "16159021", + "inventorName": "Lee M Kaplan et al", + "patentNumber": "", + "additionalPartyName": "LEE M. KAPLAN, ALICE P. LIOU, PETER J. TURNBAUGH, and JASON L. HARRIS", + }, + { + "applicationNumberText": "15698965", + "inventorName": "Lee M Kaplan et al", + "patentNumber": "10149870", + "additionalPartyName": "LEE M. KAPLAN, ALICE P. LIOU, PETER J. TURNBAUGH, and JASON L. HARRIS", + }, + { + "applicationNumberText": "16669143", + "inventorName": "Lee M Kaplan et al", + "patentNumber": "10729732", + "additionalPartyName": "LEE M. KAPLAN, ALICE P. LIOU, PETER J. TURNBAUGH, and JASON L. HARRIS", + }, + ], + "interferenceMetaData": { + "interferenceLastModifiedDateTime": "2025-11-13T00:00:00", + "interferenceLastModifiedDate": "2025-11-13", + "declarationDate": "2021-01-26", + "interferenceStyleName": "LEE M. KAPLAN, ALICE P. LIOU, PETER J. TURNBAUGH, and JASON L. HARRIS v. PATRICE CANI, AMANDINE EVERARD, CLARA BELZER, and WILLEM DE VOS", + "fileDownloadURI": "https://api.uspto.gov/api/v1/patent/ptab-files/INTF/106130/106130.zip", + }, + "seniorPartyData": { + "applicationNumberText": "14443829", + "counselName": "ALSTON & BIRD and GEMINI LAW LLP ", + "groupArtUnitNumber": "1651", + "inventorName": "Patrice Cani et al", + "patentOwnerName": "CANI, PATRICE; EVERARD, Amandine; BELZER, Clara; DE VOS Willem", + "publicationDate": "2015-10-29", + "publicationNumber": "US20150306152A1", + "realPartyInInterestName": "UNIVERSITÉ CATHOLIQUE DE LOUVAIN; WAGENINGEN UNIVERSITEIT", + "technologyCenterNumber": "1600", + }, + "juniorPartyData": { + "applicationNumberText": "14862663", + "counselName": "ROTHWELL, FIGG, ERNST & MANBECK, P.C. and LATHROP GAGE LLP", + "grantDate": "2018-12-11", + "groupArtUnitNumber": "1651", + "inventorName": "Lee M. Kaplan et al", + "patentNumber": "10149867", + "publicationDate": "2016-04-28", + "publicationNumber": "US20160113971A1", + "realPartyInInterestName": "Ethicon Endo-Surgery, Inc.; The General Hospital Corporation D/B/A Massachusetts General Hospital; President and Fellows of Harvard College ", + "technologyCenterNumber": "1600", + }, + "documentData": { + "documentIdentifier": "229ba0b8d5f70d2e45cc36b79476f56f3faf51bd26c7ccc977208e7b", + "documentName": "106130_106130-jd-20250128.pdf", + "documentSizeQuantity": 97923, + "documentOCRText": "Microsoft Word - 106,130 Judgment (to be mailed)\n\n\n \nTrials@uspto.gov Filed: January 28, 2025 \nTel: 571-272-7822 \n \n\nUNITED STATES PATENT AND TRADEMARK OFFICE \n_______________ \n\n \nBEFORE THE PATENT TRIAL AND APPEAL BOARD \n\n \n________________ \n\n \nLEE M. KAPLAN, \n\nALICE P. LIOU, PETER J. TURNBAUGH, and JASON L. HARRIS, \n \n\nJunior Party \n(Patents 10,149,867; 10,149,870; and 10,729,732; \n\nand Application 16/159,021), \n \n\nv. \n \n\nPATRICE CANI, \nAMANDINE EVERARD, CLARA BELZER, and WILLEM", + "documentTitleText": "Judgment 37 C.F.R. § 41.127(a)", + "interferenceOutcomeCategory": "Judgment", + "statuteAndRuleBag": ["37 CFR 41.127(a)"], + "decisionIssueDate": "2025-01-28", + "decisionTypeCategory": "Decision", + "fileDownloadURI": "https://api.uspto.gov/api/v1/patent/ptab-files/INTF/106130/Intf508_10613014862663_1738040400000.pdf", + "documentFilingDate": "2025-01-28", + "issueTypeBag": ["112"], + }, + }, + ], + } + + class TestSelfImport: """Tests for Self type import compatibility across Python versions.""" @@ -285,57 +709,33 @@ def test_derivation_petitioner_data_from_dict(self) -> None: assert result.patent_number == "US1234567" assert result.patent_owner_name == "Derivation Owner" - def test_trial_proceeding_from_dict_full(self) -> None: - """Test PTABTrialProceeding.from_dict() with all nested objects.""" - data = { - "trialNumber": "IPR2023-00001", - "trialRecordIdentifier": "uuid-1", - "lastModifiedDateTime": "2023-01-15T10:30:00Z", - "trialMetaData": { - "petitionFilingDate": "2023-01-01", - "trialStatusCategory": "Instituted", - "trialTypeCode": "IPR", - }, - "patentOwnerData": { - "patentOwnerName": "Owner Inc", - "patentNumber": "US1234567", - }, - "regularPetitionerData": { - "counselName": "Petitioner Counsel", - "realPartyInInterestName": "Petitioner Party", - }, - "respondentData": { - "counselName": "Respondent Counsel", - "realPartyInInterestName": "Respondent Party", - }, - "derivationPetitionerData": { - "counselName": "Derivation Counsel", - "patentNumber": "US7654321", - }, - } + def test_trial_proceeding_from_dict_full( + self, trial_proceeding_api_sample: Dict[str, Any] + ) -> None: + """Test PTABTrialProceeding.from_dict() with all nested objects using real API data.""" + data = trial_proceeding_api_sample["patentTrialProceedingDataBag"][0] result = PTABTrialProceeding.from_dict(data) - assert result.trial_number == "IPR2023-00001" - assert result.trial_record_identifier == "uuid-1" - assert result.last_modified_date_time == datetime( - 2023, 1, 15, 10, 30, 0, tzinfo=timezone.utc - ) + + assert result.trial_number == "DER2018-00018" assert result.trial_meta_data is not None - assert result.trial_meta_data.trial_status_category == "Instituted" + assert result.trial_meta_data.trial_status_category == "Terminated-Settled" + assert result.trial_meta_data.trial_type_code == "DER" assert result.patent_owner_data is not None - assert result.patent_owner_data.patent_owner_name == "Owner Inc" + assert result.patent_owner_data.patent_owner_name == "ADAMS et al" + assert result.patent_owner_data.patent_number == "9780412" assert result.regular_petitioner_data is not None - assert result.regular_petitioner_data.counsel_name == "Petitioner Counsel" + assert result.regular_petitioner_data.counsel_name == "Todd Baker" assert result.respondent_data is not None - assert result.respondent_data.counsel_name == "Respondent Counsel" + assert result.respondent_data.patent_owner_name == "ADAMS et al" assert result.derivation_petitioner_data is not None - assert result.derivation_petitioner_data.patent_number == "US7654321" + assert result.derivation_petitioner_data.counsel_name == "Todd Baker" assert result.raw_data is None def test_trial_proceeding_from_dict_with_raw_data(self) -> None: """Test PTABTrialProceeding.from_dict() with include_raw_data=True.""" data = { "trialNumber": "IPR2023-00001", - "trialRecordIdentifier": "uuid-1", + # "trialRecordIdentifier": "uuid-1", } result = PTABTrialProceeding.from_dict(data, include_raw_data=True) assert result.trial_number == "IPR2023-00001" @@ -345,7 +745,7 @@ def test_trial_proceeding_from_dict_empty(self) -> None: """Test PTABTrialProceeding.from_dict() with empty dict.""" result = PTABTrialProceeding.from_dict({}) assert result.trial_number is None - assert result.trial_record_identifier is None + # assert result.trial_record_identifier is None assert result.last_modified_date_time is None assert result.trial_meta_data is None assert result.patent_owner_data is None @@ -354,31 +754,16 @@ def test_trial_proceeding_from_dict_empty(self) -> None: assert result.derivation_petitioner_data is None assert result.raw_data is None - def test_trial_proceeding_response_from_dict_full(self) -> None: - """Test PTABTrialProceedingResponse.from_dict() with multiple proceedings.""" - data = { - "count": 2, - "requestIdentifier": "request-uuid-1", - "patentTrialProceedingDataBag": [ - { - "trialNumber": "IPR2023-00001", - "trialRecordIdentifier": "uuid-1", - }, - { - "trialNumber": "IPR2023-00002", - "trialRecordIdentifier": "uuid-2", - }, - ], - } - result = PTABTrialProceedingResponse.from_dict(data) - assert result.count == 2 - assert result.request_identifier == "request-uuid-1" - assert len(result.patent_trial_proceeding_data_bag) == 2 - assert ( - result.patent_trial_proceeding_data_bag[0].trial_number == "IPR2023-00001" - ) + def test_trial_proceeding_response_from_dict_full( + self, trial_proceeding_api_sample: Dict[str, Any] + ) -> None: + """Test PTABTrialProceedingResponse.from_dict() using real API data.""" + result = PTABTrialProceedingResponse.from_dict(trial_proceeding_api_sample) + assert result.count == 1 + assert result.request_identifier == "4649ea27-4192-4ea4-86f9-e033ca24c17a" + assert len(result.patent_trial_proceeding_data_bag) == 1 assert ( - result.patent_trial_proceeding_data_bag[1].trial_number == "IPR2023-00002" + result.patent_trial_proceeding_data_bag[0].trial_number == "DER2018-00018" ) assert result.raw_data is None @@ -416,7 +801,7 @@ class TestPTABTrialDocumentModels: def test_trial_document_data_from_dict_full(self) -> None: """Test TrialDocumentData.from_dict() with all fields.""" data = { - "documentCategory": "Petition", + # "documentCategory": "Petition", "documentFilingDate": "2023-01-15", "documentIdentifier": "doc-uuid-1", "documentName": "Petition.pdf", @@ -427,11 +812,11 @@ def test_trial_document_data_from_dict_full(self) -> None: "documentTypeDescriptionText": "Petition Document", "downloadURI": "https://example.com/doc1.pdf", "filingPartyCategory": "Petitioner", - "mimeTypeIdentifier": "application/pdf", - "documentStatus": "Public", + # "mimeTypeIdentifier": "application/pdf", + # "documentStatus": "Public", } result = TrialDocumentData.from_dict(data) - assert result.document_category == "Petition" + # assert result.document_category == "Petition" assert result.document_filing_date == date(2023, 1, 15) assert result.document_identifier == "doc-uuid-1" assert result.document_name == "Petition.pdf" @@ -442,13 +827,13 @@ def test_trial_document_data_from_dict_full(self) -> None: assert result.document_type_description_text == "Petition Document" assert result.file_download_uri == "https://example.com/doc1.pdf" assert result.filing_party_category == "Petitioner" - assert result.mime_type_identifier == "application/pdf" - assert result.document_status == "Public" + # assert result.mime_type_identifier == "application/pdf" + # assert result.document_status == "Public" def test_trial_document_data_from_dict_empty(self) -> None: """Test TrialDocumentData.from_dict() with empty dict.""" result = TrialDocumentData.from_dict({}) - assert result.document_category is None + # assert result.document_category is None assert result.document_filing_date is None assert result.document_identifier is None assert result.document_name is None @@ -459,8 +844,8 @@ def test_trial_document_data_from_dict_empty(self) -> None: assert result.document_type_description_text is None assert result.file_download_uri is None assert result.filing_party_category is None - assert result.mime_type_identifier is None - assert result.document_status is None + # assert result.mime_type_identifier is None + # assert result.document_status is None def test_trial_decision_data_from_dict_full(self) -> None: """Test TrialDecisionData.from_dict() with all fields.""" @@ -487,58 +872,27 @@ def test_trial_decision_data_from_dict_empty(self) -> None: assert result.issue_type_bag == [] assert result.trial_outcome_category is None - def test_trial_document_from_dict_full(self) -> None: - """Test PTABTrialDocument.from_dict() with all nested objects.""" - data = { - "trialDocumentCategory": "Decision", - "lastModifiedDateTime": "2023-12-15T10:30:00Z", - "trialNumber": "IPR2023-00001", - "trialTypeCode": "IPR", - "trialMetaData": { - "trialStatusCategory": "Terminated", - }, - "patentOwnerData": { - "patentOwnerName": "Owner Inc", - }, - "regularPetitionerData": { - "counselName": "Petitioner Counsel", - }, - "respondentData": { - "counselName": "Respondent Counsel", - }, - "derivationPetitionerData": { - "patentNumber": "US7654321", - }, - "documentData": { - "documentName": "Decision.pdf", - "documentIdentifier": "doc-123", - }, - "decisionData": { - "decisionTypeCategory": "Final Written Decision", - "trialOutcomeCategory": "Denied", - }, - } + def test_trial_document_from_dict_full( + self, trial_document_api_sample: Dict[str, Any] + ) -> None: + """Test PTABTrialDocument.from_dict() with all nested objects using real API data.""" + data = trial_document_api_sample["patentTrialDocumentDataBag"][0] result = PTABTrialDocument.from_dict(data) - assert result.trial_document_category == "Decision" - assert result.last_modified_date_time == datetime( - 2023, 12, 15, 10, 30, 0, tzinfo=timezone.utc - ) - assert result.trial_number == "IPR2023-00001" - assert result.trial_type_code == "IPR" + + assert result.trial_document_category == "Document" + assert result.trial_number == "DER2023-00012" assert result.trial_meta_data is not None - assert result.trial_meta_data.trial_status_category == "Terminated" + assert result.trial_meta_data.trial_status_category == "Pending" assert result.patent_owner_data is not None - assert result.patent_owner_data.patent_owner_name == "Owner Inc" + assert result.patent_owner_data.patent_number == None assert result.regular_petitioner_data is not None - assert result.regular_petitioner_data.counsel_name == "Petitioner Counsel" - assert result.respondent_data is not None - assert result.respondent_data.counsel_name == "Respondent Counsel" - assert result.derivation_petitioner_data is not None - assert result.derivation_petitioner_data.patent_number == "US7654321" + assert ( + result.regular_petitioner_data.real_party_in_interest_name + == "Rasmussen, Jon et al." + ) assert result.document_data is not None - assert result.document_data.document_name == "Decision.pdf" + assert result.document_data.document_number == 25 assert result.decision_data is not None - assert result.decision_data.decision_type_category == "Final Written Decision" assert result.raw_data is None def test_trial_document_from_dict_with_raw_data(self) -> None: @@ -616,7 +970,7 @@ def test_trial_document_response_from_dict_with_raw_data(self) -> None: def test_trial_document_response_from_dict_empty(self) -> None: """Test PTABTrialDocumentResponse.from_dict() with empty list.""" result = PTABTrialDocumentResponse.from_dict({}) - assert result.count is None + assert result.count == 0 assert len(result.patent_trial_document_data_bag) == 0 assert result.raw_data is None @@ -629,6 +983,7 @@ def test_appeal_metadata_from_dict_full(self) -> None: data = { "appealFilingDate": "2023-01-15", "appealLastModifiedDate": "2023-06-01", + "appealLastModifiedDateTime": "2023-06-01T12:00:01", "applicationTypeCategory": "Utility", "docketNoticeMailedDate": "2023-02-01", "fileDownloadURI": "https://example.com/appeal.zip", @@ -636,6 +991,9 @@ def test_appeal_metadata_from_dict_full(self) -> None: result = AppealMetaData.from_dict(data) assert result.appeal_filing_date == date(2023, 1, 15) assert result.appeal_last_modified_date == date(2023, 6, 1) + assert result.appeal_last_modified_date_time == datetime( + 2023, 6, 1, 16, 0, 1, tzinfo=timezone.utc + ) assert result.application_type_category == "Utility" assert result.docket_notice_mailed_date == date(2023, 2, 1) assert result.file_download_uri == "https://example.com/appeal.zip" @@ -754,6 +1112,27 @@ def test_decision_data_from_dict_empty(self) -> None: assert result.decision_type_category is None assert result.issue_type_bag == [] + def test_decision_data_to_dict_with_empty_lists(self) -> None: + """Test DecisionData.to_dict() filters out empty lists.""" + # Create DecisionData with empty lists + result = DecisionData.from_dict({ + "appealOutcomeCategory": "Affirmed", + "decisionIssueDate": "2023-12-15", + "statuteAndRuleBag": [], + "issueTypeBag": [] + }) + + # Convert to dict - empty lists should be filtered out + result_dict = result.to_dict() + + # Verify non-empty fields are present + assert result_dict["appealOutcomeCategory"] == "Affirmed" + assert result_dict["decisionIssueDate"] == "2023-12-15" + + # Verify empty lists are NOT in the result + assert "statuteAndRuleBag" not in result_dict + assert "issueTypeBag" not in result_dict + def test_appeal_decision_from_dict_full(self) -> None: """Test PTABAppealDecision.from_dict() with all nested objects.""" data = { @@ -878,7 +1257,7 @@ def test_appeal_response_from_dict_with_raw_data(self) -> None: def test_appeal_response_from_dict_empty(self) -> None: """Test PTABAppealResponse.from_dict() with empty list.""" result = PTABAppealResponse.from_dict({}) - assert result.count is None + assert result.count == 0 assert result.request_identifier is None assert len(result.patent_appeal_data_bag) == 0 assert result.raw_data is None @@ -1157,7 +1536,280 @@ def test_interference_response_from_dict_with_raw_data(self) -> None: def test_interference_response_from_dict_empty(self) -> None: """Test PTABInterferenceResponse.from_dict() with empty list.""" result = PTABInterferenceResponse.from_dict({}) - assert result.count is None + assert result.count == 0 assert result.request_identifier is None assert len(result.patent_interference_data_bag) == 0 assert result.raw_data is None + + +class TestToDictRoundTripping: + """Tests for to_dict() methods via round-trip serialization using real API response data.""" + + def test_trial_proceeding_response_round_trip( + self, trial_proceeding_api_sample: Dict[str, Any] + ) -> None: + """Test PTABTrialProceedingResponse round-trip: from_dict → to_dict.""" + # Parse the API response + response = PTABTrialProceedingResponse.from_dict(trial_proceeding_api_sample) + + # Convert back to dict + result = response.to_dict() + + # Verify top-level fields + assert result["count"] == trial_proceeding_api_sample["count"] + assert ( + result["requestIdentifier"] + == trial_proceeding_api_sample["requestIdentifier"] + ) + assert len(result["patentTrialProceedingDataBag"]) == 1 + + # Verify nested proceeding data + proceeding = result["patentTrialProceedingDataBag"][0] + original_proceeding = trial_proceeding_api_sample[ + "patentTrialProceedingDataBag" + ][0] + + assert proceeding["trialNumber"] == original_proceeding["trialNumber"] + assert ( + proceeding["trialMetaData"]["trialTypeCode"] + == original_proceeding["trialMetaData"]["trialTypeCode"] + ) + assert ( + proceeding["patentOwnerData"]["patentNumber"] + == original_proceeding["patentOwnerData"]["patentNumber"] + ) + + def test_trial_decision_response_round_trip( + self, trial_decision_api_sample: Dict[str, Any] + ) -> None: + """Test PTABTrialDocumentResponse round-trip with decision data.""" + # Parse the API response + response = PTABTrialDocumentResponse.from_dict(trial_decision_api_sample) + + # Convert back to dict + result = response.to_dict() + + # Verify top-level fields + assert result["count"] == trial_decision_api_sample["count"] + assert len(result["patentTrialDocumentDataBag"]) == 1 + + # Verify nested document and decision data + document = result["patentTrialDocumentDataBag"][0] + original_document = trial_decision_api_sample["patentTrialDocumentDataBag"][0] + + assert document["trialNumber"] == original_document["trialNumber"] + assert ( + document["trialDocumentCategory"] + == original_document["trialDocumentCategory"] + ) + assert ( + document["documentData"]["documentName"] + == original_document["documentData"]["documentName"] + ) + assert ( + document["decisionData"]["decisionTypeCategory"] + == original_document["decisionData"]["decisionTypeCategory"] + ) + + def test_trial_document_response_round_trip( + self, trial_document_api_sample: Dict[str, Any] + ) -> None: + """Test PTABTrialDocumentResponse round-trip with document data.""" + # Parse the API response + response = PTABTrialDocumentResponse.from_dict(trial_document_api_sample) + + # Convert back to dict + result = response.to_dict() + + # Verify top-level fields + assert result["count"] == trial_document_api_sample["count"] + assert len(result["patentTrialDocumentDataBag"]) == 2 + + # Verify nested document data + document = result["patentTrialDocumentDataBag"][0] + original_document = trial_document_api_sample["patentTrialDocumentDataBag"][0] + + assert document["trialNumber"] == original_document["trialNumber"] + assert ( + document["documentData"]["documentNumber"] + == original_document["documentData"]["documentNumber"] + ) + assert ( + document["regularPetitionerData"]["counselName"] + == original_document["regularPetitionerData"]["counselName"] + ) + + def test_party_data_with_dates_round_trip( + self, trial_proceeding_api_sample: Dict[str, Any] + ) -> None: + """Test that PartyData properly serializes dates in to_dict().""" + # Get patent owner data which has dates + party_data_dict = trial_proceeding_api_sample["patentTrialProceedingDataBag"][ + 0 + ]["patentOwnerData"] + party = PatentOwnerData.from_dict(party_data_dict) + result = party.to_dict() + + # Verify date serialization + assert result["grantDate"] == party_data_dict["grantDate"] + assert isinstance(result["grantDate"], str) + assert result["patentNumber"] == party_data_dict["patentNumber"] + + def test_to_dict_filters_none_values(self) -> None: + """Test that to_dict() filters out None values.""" + data = { + "applicationNumberText": "12/345678", + "patentNumber": "US1234567", + # Other fields omitted, will be None + } + party = PartyData.from_dict(data) + result = party.to_dict() + + # Should only contain non-None values + assert "applicationNumberText" in result + assert "patentNumber" in result + # None fields should be filtered out + assert "grantDate" not in result + + def test_appeal_decision_response_round_trip( + self, appeal_decision_api_sample: Dict[str, Any] + ) -> None: + """Test PTABAppealResponse round-trip: from_dict → to_dict.""" + # Parse the API response + response = PTABAppealResponse.from_dict(appeal_decision_api_sample) + + # Convert back to dict + result = response.to_dict() + + # Verify top-level fields + assert result["count"] == appeal_decision_api_sample["count"] + assert ( + result["requestIdentifier"] + == appeal_decision_api_sample["requestIdentifier"] + ) + assert len(result["patentAppealDataBag"]) == 1 + + # Verify nested appeal data + appeal = result["patentAppealDataBag"][0] + original_appeal = appeal_decision_api_sample["patentAppealDataBag"][0] + + assert appeal["appealNumber"] == original_appeal["appealNumber"] + assert ( + appeal["appealDocumentCategory"] + == original_appeal["appealDocumentCategory"] + ) + + # Verify appealMetaData.to_dict() was called + assert ( + appeal["appealMetaData"]["appealFilingDate"] + == original_appeal["appealMetaData"]["appealFilingDate"] + ) + assert ( + appeal["appealMetaData"]["applicationTypeCategory"] + == original_appeal["appealMetaData"]["applicationTypeCategory"] + ) + + # Verify appellantData.to_dict() was called + assert ( + appeal["appellantData"]["applicationNumberText"] + == original_appeal["appellantData"]["applicationNumberText"] + ) + assert ( + appeal["appellantData"]["counselName"] + == original_appeal["appellantData"]["counselName"] + ) + + # Verify requestorData.to_dict() was called + assert ( + appeal["requestorData"]["thirdPartyName"] + == original_appeal["requestorData"]["thirdPartyName"] + ) + + # Verify documentData.to_dict() was called + assert ( + appeal["documentData"]["documentName"] + == original_appeal["documentData"]["documentName"] + ) + assert ( + appeal["documentData"]["documentFilingDate"] + == original_appeal["documentData"]["documentFilingDate"] + ) + + # Verify decisionData.to_dict() was called + assert ( + appeal["decisionData"]["appealOutcomeCategory"] + == original_appeal["decisionData"]["appealOutcomeCategory"] + ) + assert ( + appeal["decisionData"]["decisionTypeCategory"] + == original_appeal["decisionData"]["decisionTypeCategory"] + ) + + def test_interference_decision_response_round_trip( + self, interference_decision_api_sample: Dict[str, Any] + ) -> None: + """Test PTABInterferenceResponse round-trip: from_dict → to_dict.""" + # Parse the API response + response = PTABInterferenceResponse.from_dict(interference_decision_api_sample) + + # Convert back to dict + result = response.to_dict() + + # Verify top-level fields + assert result["count"] == interference_decision_api_sample["count"] + assert ( + result["requestIdentifier"] + == interference_decision_api_sample["requestIdentifier"] + ) + assert len(result["patentInterferenceDataBag"]) == 2 + + # Verify nested interference data + interference = result["patentInterferenceDataBag"][0] + original_interference = interference_decision_api_sample[ + "patentInterferenceDataBag" + ][0] + + assert ( + interference["interferenceNumber"] + == original_interference["interferenceNumber"] + ) + + # Verify interferenceMetaData.to_dict() was called + assert ( + interference["interferenceMetaData"]["interferenceStyleName"] + == original_interference["interferenceMetaData"]["interferenceStyleName"] + ) + assert ( + interference["interferenceMetaData"]["declarationDate"] + == original_interference["interferenceMetaData"]["declarationDate"] + ) + + # Verify seniorPartyData.to_dict() was called + assert ( + interference["seniorPartyData"]["patentNumber"] + == original_interference["seniorPartyData"]["patentNumber"] + ) + assert ( + interference["seniorPartyData"]["patentOwnerName"] + == original_interference["seniorPartyData"]["patentOwnerName"] + ) + + # Verify juniorPartyData.to_dict() was called + assert ( + interference["juniorPartyData"]["patentNumber"] + == original_interference["juniorPartyData"]["patentNumber"] + ) + assert ( + interference["juniorPartyData"]["publicationNumber"] + == original_interference["juniorPartyData"]["publicationNumber"] + ) + + # Verify documentData.to_dict() was called + assert ( + interference["documentData"]["documentName"] + == original_interference["documentData"]["documentName"] + ) + assert ( + interference["documentData"]["interferenceOutcomeCategory"] + == original_interference["documentData"]["interferenceOutcomeCategory"] + ) diff --git a/tests/models/test_utils.py b/tests/models/test_utils.py index caa62d1..6924a7f 100644 --- a/tests/models/test_utils.py +++ b/tests/models/test_utils.py @@ -21,6 +21,7 @@ serialize_bool_to_yn, serialize_date, serialize_datetime_as_iso, + serialize_datetime_as_naive, to_camel_case, ) @@ -105,6 +106,28 @@ def test_serialize_datetime_as_iso(self) -> None: assert serialize_datetime_as_iso(None) is None + def test_serialize_datetime_as_naive(self) -> None: + """Test serialize_datetime_as_naive utility function with both aware and naive datetimes.""" + # Test with timezone-aware datetime (hits if branch, line 163-164) + dt_utc = datetime(2023, 1, 1, 10, 0, 0, tzinfo=timezone.utc) + result_aware = serialize_datetime_as_naive(dt_utc) + assert isinstance(result_aware, str) + # Should convert to ASSUMED_NAIVE_TIMEZONE and serialize as ISO + assert result_aware.startswith("2023-01-01") + + # Test with naive datetime (hits else branch, line 165-166) + dt_naive = datetime(2023, 1, 1, 15, 30, 45) + result_naive = serialize_datetime_as_naive(dt_naive) + assert isinstance(result_naive, str) + assert result_naive == "2023-01-01T15:30:45" + + # Test with timezone-aware datetime with offset + minus_five = timezone(timedelta(hours=-5)) + dt_est = datetime(2023, 1, 1, 10, 0, 0, tzinfo=minus_five) + result_est = serialize_datetime_as_naive(dt_est) + assert isinstance(result_est, str) + assert result_est.startswith("2023-01-01") + def test_parse_to_datetime_utc_localization_failure_and_fallback(self) -> None: """Triggers the except block by making astimezone() raise, and tests fallback path.""" From b5f32f3462c8f056e825e5e04b572fbcee0eac6f Mon Sep 17 00:00:00 2001 From: Andrew Date: Mon, 8 Dec 2025 14:41:36 -0600 Subject: [PATCH 11/17] Update integration tests based on change to model. --- tests/integration/test_ptab_interferences_integration.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/integration/test_ptab_interferences_integration.py b/tests/integration/test_ptab_interferences_integration.py index 6f292db..6d5645b 100644 --- a/tests/integration/test_ptab_interferences_integration.py +++ b/tests/integration/test_ptab_interferences_integration.py @@ -185,7 +185,7 @@ def test_search_decisions_by_party( try: # Search for senior or junior party with wildcard to ensure results response = ptab_interferences_client.search_decisions( - senior_party_name_q="*", + senior_party_name_q="PATRICE", limit=2, ) @@ -197,7 +197,7 @@ def test_search_decisions_by_party( assert response.patent_interference_data_bag is not None except USPTOApiError as e: - pytest.skip(f"PTAB Interferences API error during search by party: {e}") + pytest.fail(f"PTAB Interferences API error during search by party: {e}") def test_search_decisions_by_patent_number( self, ptab_interferences_client: PTABInterferencesClient From e42e46c0328ec34f58d49e42d128610b5313b118 Mon Sep 17 00:00:00 2001 From: Andrew Date: Tue, 9 Dec 2025 10:20:00 -0600 Subject: [PATCH 12/17] Updated docstrings and lock files. --- pyproject.toml | 11 +++-- requirements-dev.txt | 41 +++++++----------- requirements.txt | 24 +++++++---- src/pyUSPTO/models/ptab.py | 85 +++++++++++++++++++++++++++++++------- tox.ini | 5 ++- 5 files changed, 111 insertions(+), 55 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index fc0c632..5f4684c 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -6,7 +6,7 @@ build-backend = "setuptools.build_meta" name = "pyUSPTO" description = "A Modern Python client for accessing United Stated Patent and Trademark Office (USPTO) Open Data Portal (ODP) APIs." authors = [ - {name = "Andrew Piechocki", email = "apiechocki@dunlapcodding.com"} + { name = "Andrew Piechocki", email = "apiechocki@dunlapcodding.com" }, ] readme = "README.md" requires-python = ">=3.10" @@ -29,7 +29,6 @@ classifiers = [ "Intended Audience :: Science/Research", "Intended Audience :: Other Audience", "Natural Language :: English", - "Operating System :: OS Independent", "Operating System :: MacOS", "Operating System :: POSIX :: Linux", "Topic :: Software Development :: Libraries", @@ -40,7 +39,7 @@ classifiers = [ "Topic :: Office/Business", "Topic :: Scientific/Engineering :: Interface Engine/Protocol Translator", "Topic :: Software Development :: Libraries :: Python Modules", - "Topic :: Utilities" + "Topic :: Utilities", ] keywords = ["uspto", "patent", "odp", "client", "bulk data", "patent data"] @@ -61,7 +60,7 @@ Documentation = "https://pyuspto.readthedocs.io/en/latest/" [tool.setuptools] zip-safe = true -[tool.setuptools.packages.find] +[tool.setuptools.packages.find] where = ["src"] [tool.setuptools.package-data] @@ -117,7 +116,7 @@ warn_unreachable = true # Per-module configs for production code [[tool.mypy.overrides]] -module= "pyUSPTO.*" +module = "pyUSPTO.*" disallow_untyped_defs = true # Less strict for tests - allow untyped test functions @@ -132,5 +131,5 @@ warn_unreachable = false # Ignore missing stubs for third-party packages [[tool.mypy.overrides]] -module = ["pytest.*","pytest", "requests.*", "urllib3.*"] +module = ["pytest.*", "pytest", "requests.*", "urllib3.*"] ignore_missing_imports = true diff --git a/requirements-dev.txt b/requirements-dev.txt index 647fd5b..e59a494 100644 --- a/requirements-dev.txt +++ b/requirements-dev.txt @@ -1,25 +1,16 @@ -# Include all base requirements --r requirements.txt - -# Testing -pytest>=8.4.2 -pytest-cov>=7.0.0 -pytest-mock>=3.15.1 - -# Documentation -sphinx>=8.1.3 -sphinx-rtd-theme>=3.0.2 -sphinx-autodoc-typehints>=3.0.1 -sphinx-copybutton>=0.5.2 -myst-parser>=4.0.1 - -# Type checking -mypy >= 1.18.2 -types-requests >= 2.31.0 - -# Code quality and formatting -flake8>=7.3.0 -black>=25.9.0 -isort>=7.0.0 - -setuptools>=80.9.0 \ No newline at end of file +# +# This file is autogenerated by pip-compile with Python 3.14 +# by the following command: +# +# pip-compile --extra=dev --output-file=requirements-dev.txt pyproject.toml +# +certifi==2025.11.12 + # via requests +charset-normalizer==3.4.4 + # via requests +idna==3.11 + # via requests +requests==2.32.5 + # via pyUSPTO (pyproject.toml) +urllib3==2.6.1 + # via requests diff --git a/requirements.txt b/requirements.txt index 479e353..c172232 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,8 +1,16 @@ -# Core dependencies -requests>=2.32.5 -urllib3>=2.5.0 -tzdata>=2025.2 - -# Development dependencies -pytest>=8.4.2 -pytest-cov>=7.0.0 +# +# This file is autogenerated by pip-compile with Python 3.14 +# by the following command: +# +# pip-compile --output-file=requirements.txt pyproject.toml +# +certifi==2025.11.12 + # via requests +charset-normalizer==3.4.4 + # via requests +idna==3.11 + # via requests +requests==2.32.5 + # via pyUSPTO (pyproject.toml) +urllib3==2.6.1 + # via requests diff --git a/src/pyUSPTO/models/ptab.py b/src/pyUSPTO/models/ptab.py index b3d7f3f..07db84b 100644 --- a/src/pyUSPTO/models/ptab.py +++ b/src/pyUSPTO/models/ptab.py @@ -206,7 +206,11 @@ def to_dict(self) -> Dict[str, Any]: @dataclass(frozen=True) class PatentOwnerData(PartyData): - """Party data for a patent owner.""" + """Party data for a patent owner in PTAB trial proceedings. + + Inherits all attributes from PartyData. Used in IPR, PGR, CBM, + and DER proceedings to represent the patent holder. + """ pass @@ -259,14 +263,22 @@ def to_dict(self) -> Dict[str, Any]: @dataclass(frozen=True) class RespondentData(PartyData): - """Respondent party data.""" + """Respondent party data in derivation proceedings. + + Inherits all attributes from PartyData. Used in DER proceedings + to represent the responding party. + """ pass @dataclass(frozen=True) class DerivationPetitionerData(PartyData): - """Derivation petitioner data.""" + """Derivation petitioner data in derivation proceedings. + + Inherits all attributes from PartyData. Used in DER proceedings + to represent the petitioning party claiming derivation. + """ pass @@ -288,7 +300,7 @@ class PTABTrialProceeding: """ trial_number: Optional[str] = None - # trial_record_identifier: Optional[str] = None + # trial_record_identifier: Optional[str] = None # Removed: Documented but not in API. last_modified_date_time: Optional[datetime] = None trial_meta_data: Optional[TrialMetaData] = None patent_owner_data: Optional[PatentOwnerData] = None @@ -358,6 +370,7 @@ def to_dict(self) -> Dict[str, Any]: if self.trial_number is not None: result["trialNumber"] = self.trial_number + # Removed: Documented but not in API. # if self.trial_record_identifier is not None: # result["trialRecordIdentifier"] = self.trial_record_identifier if self.last_modified_date_time is not None: @@ -468,7 +481,7 @@ class TrialDocumentData: document_status: Public status. """ - # document_category: Optional[str] = None + # document_category: Optional[str] = None # Removed: Documented but not in API. document_filing_date: Optional[date] = None document_identifier: Optional[str] = None document_name: Optional[str] = None @@ -479,15 +492,26 @@ class TrialDocumentData: document_type_description_text: Optional[str] = None file_download_uri: Optional[str] = None filing_party_category: Optional[str] = None - # mime_type_identifier: Optional[str] = None - # document_status: Optional[str] = None + # mime_type_identifier: Optional[str] = None # Removed: Documented but not in API. + # document_status: Optional[str] = None # Removed: Documented but not in API. @classmethod - def from_dict(cls, data: Dict[str, Any]) -> "TrialDocumentData": + def from_dict( + cls, data: Dict[str, Any], include_raw_data: bool = False + ) -> "TrialDocumentData": + """Creates a TrialDocumentData instance from a dictionary. + + Args: + data: Dictionary containing document data from API response. + include_raw_data: Ignored for this model. + + Returns: + TrialDocumentData: An instance of TrialDocumentData. + """ # Handle aliases file_download_uri = data.get("fileDownloadURI") or data.get("downloadURI") return cls( - # document_category=data.get("documentCategory"), + # document_category=data.get("documentCategory"), # Removed: Documented but not in API. document_filing_date=parse_to_date(data.get("documentFilingDate")), document_identifier=data.get("documentIdentifier"), document_name=data.get("documentName"), @@ -510,6 +534,7 @@ def to_dict(self) -> Dict[str, Any]: """ result: Dict[str, Any] = {} + # Removed: Documented but not in API. # if self.document_category is not None: # result["documentCategory"] = self.document_category if self.document_filing_date is not None: @@ -532,6 +557,7 @@ def to_dict(self) -> Dict[str, Any]: result["fileDownloadURI"] = self.file_download_uri # Uppercase URI if self.filing_party_category is not None: result["filingPartyCategory"] = self.filing_party_category + # Removed: Documented but not in API. # if self.mime_type_identifier is not None: # result["mimeTypeIdentifier"] = self.mime_type_identifier # if self.document_status is not None: @@ -592,10 +618,26 @@ def to_dict(self) -> Dict[str, Any]: @dataclass(frozen=True) class PTABTrialDocument: - """Record representing a Trial Document or Decision from the search APIs. + """Individual trial document or decision record from PTAB document/decision search APIs. + + Used by search_documents() and search_decisions() endpoints. Contains document-specific + metadata (documentData) or decision information (decisionData), plus trial context. + Differs from PTABTrialProceeding which represents the entire proceeding rather than + individual documents within it. - This differs from PTABTrialProceeding by including documentData/decisionData - and often omitting some proceeding-level details or structuring them differently. + Attributes: + trial_document_category: Category (Document or Decision). + last_modified_date_time: Last modification timestamp. + trial_number: Trial number (e.g., "IPR2023-00123"). + trial_type_code: Type of trial (IPR, PGR, CBM, DER). + trial_meta_data: Trial metadata. + patent_owner_data: Patent owner information. + regular_petitioner_data: Regular petitioner information. + respondent_data: Respondent information. + derivation_petitioner_data: Derivation petitioner information. + document_data: Document metadata (if document). + decision_data: Decision information (if decision). + raw_data: Raw JSON response data (if include_raw_data=True). """ trial_document_category: Optional[str] = None @@ -751,6 +793,7 @@ class AppealMetaData: Attributes: appeal_filing_date: Date the appeal was filed. appeal_last_modified_date: Last modification date. + appeal_last_modified_date_time: Last modification timestamp. application_type_category: Type of application. docket_notice_mailed_date: Date the docket notice was mailed. file_download_uri: URI to download ZIP of appeal documents. @@ -821,7 +864,11 @@ def to_dict(self) -> Dict[str, Any]: @dataclass(frozen=True) class AppellantData(PartyData): - """Appellant party data.""" + """Appellant party data in PTAB appeals. + + Inherits all attributes from PartyData. Used in appeal proceedings + to represent the party appealing an examiner decision. + """ pass @@ -1248,14 +1295,22 @@ def to_dict(self) -> Dict[str, Any]: @dataclass(frozen=True) class SeniorPartyData(PartyData): - """Senior party information in an interference.""" + """Senior party information in PTAB interference proceedings. + + Inherits all attributes from PartyData. Represents the party with + the earlier effective filing date in an interference. + """ pass @dataclass(frozen=True) class JuniorPartyData(PartyData): - """Junior party information in an interference.""" + """Junior party information in PTAB interference proceedings. + + Inherits all attributes from PartyData. Represents the party with + the later effective filing date in an interference. + """ pass diff --git a/tox.ini b/tox.ini index 6042ae2..0d172d0 100644 --- a/tox.ini +++ b/tox.ini @@ -4,6 +4,9 @@ envlist = py310,py311,py312,py313,py314 isolated_build = True [testenv] +allowlist_externals = + pip + pytest basepython = py310: {env:LOCALAPPDATA}\Python\pythoncore-3.10-64\python.exe py311: {env:LOCALAPPDATA}\Python\pythoncore-3.11-64\python.exe @@ -12,6 +15,6 @@ basepython = py314: {env:LOCALAPPDATA}\Python\pythoncore-3.14-64\python.exe # py315: {env:LOCALAPPDATA}\Python\pythoncore-3.15-64\python.exe deps = - -r requirements-dev.txt commands = + pip install -e . pytest tests/ --cov=src/pyUSPTO From af8e71b2661fe09c20e51d5094233cf84eb6b4fe Mon Sep 17 00:00:00 2001 From: Andrew Date: Tue, 9 Dec 2025 13:18:44 -0600 Subject: [PATCH 13/17] Update loc files, doc theme, utc utils. --- docs/source/conf.py | 3 +- pyproject.toml | 24 +++- requirements-dev.txt | 153 +++++++++++++++++++++++- requirements.txt | 2 +- src/pyUSPTO/models/patent_data.py | 3 +- src/pyUSPTO/models/utils.py | 39 ++++-- tests/models/test_patent_data_models.py | 12 +- tests/models/test_utils.py | 10 +- tox.ini | 5 +- 9 files changed, 217 insertions(+), 34 deletions(-) diff --git a/docs/source/conf.py b/docs/source/conf.py index e026c44..1249439 100644 --- a/docs/source/conf.py +++ b/docs/source/conf.py @@ -36,6 +36,7 @@ "sphinx_autodoc_typehints", "sphinx_copybutton", "myst_parser", + "sphinx_immaterial", ] templates_path = ["_templates"] @@ -46,7 +47,7 @@ # -- Options for HTML output ------------------------------------------------- # https://www.sphinx-doc.org/en/master/usage/configuration.html#options-for-html-output -html_theme = "sphinx_rtd_theme" +html_theme = "sphinx_immaterial" html_static_path = ["_static"] # -- Extension configuration ------------------------------------------------- diff --git a/pyproject.toml b/pyproject.toml index 5f4684c..9830150 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -45,10 +45,32 @@ classifiers = [ keywords = ["uspto", "patent", "odp", "client", "bulk data", "patent data"] dependencies = [ "requests>=2.32.5", - "typing-extensions>=4.0.0; python_version < '3.11'", + "typing-extensions>=4.15.0; python_version < '3.11'", + "tzdata>=2025.2", ] dynamic = ["version"] +[project.optional-dependencies] +dev = [ + # Testing + "pytest>=9.0.2", + "pytest-cov>=7.0.0", + "pytest-mock>=3.15.1", + # Documentation + "sphinx==8.1.3", + "sphinx_immaterial>=0.13.8", + "sphinx-autodoc-typehints==3.0.1", + "sphinx-copybutton>=0.5.2", + "myst-parser>=4.0.1", + # Type checking + "mypy>=1.19.0", + "types-requests>=2.32.4", + # Code quality and formatting + "flake8>=7.3.0", + "black>=25.12.0", + "isort>=7.0.0", +] + [project.urls] GitHub = "https://github.com/DunlapCoddingPC/pyUSPTO" issues = "https://github.com/DunlapCoddingPC/pyUSPTO/issues" diff --git a/requirements-dev.txt b/requirements-dev.txt index e59a494..97634c1 100644 --- a/requirements-dev.txt +++ b/requirements-dev.txt @@ -2,15 +2,164 @@ # This file is autogenerated by pip-compile with Python 3.14 # by the following command: # -# pip-compile --extra=dev --output-file=requirements-dev.txt pyproject.toml +# pip-compile --extra=dev --output-file=requirements-dev.txt --strip-extras pyproject.toml # +alabaster==1.0.0 + # via sphinx +annotated-types==0.7.0 + # via pydantic +appdirs==1.4.4 + # via sphinx-immaterial +babel==2.17.0 + # via sphinx +black==25.12.0 + # via pyUSPTO (pyproject.toml) certifi==2025.11.12 # via requests charset-normalizer==3.4.4 # via requests +click==8.3.1 + # via black +colorama==0.4.6 + # via + # click + # pytest + # sphinx +coverage==7.13.0 + # via pytest-cov +docutils==0.21.2 + # via + # myst-parser + # sphinx +flake8==7.3.0 + # via pyUSPTO (pyproject.toml) idna==3.11 # via requests +imagesize==1.4.1 + # via sphinx +iniconfig==2.3.0 + # via pytest +isort==7.0.0 + # via pyUSPTO (pyproject.toml) +jinja2==3.1.6 + # via + # myst-parser + # sphinx +librt==0.7.3 + # via mypy +markdown-it-py==3.0.0 + # via + # mdit-py-plugins + # myst-parser +markupsafe==3.0.3 + # via + # jinja2 + # sphinx-immaterial +mccabe==0.7.0 + # via flake8 +mdit-py-plugins==0.5.0 + # via myst-parser +mdurl==0.1.2 + # via markdown-it-py +mypy==1.19.0 + # via pyUSPTO (pyproject.toml) +mypy-extensions==1.1.0 + # via + # black + # mypy +myst-parser==4.0.1 + # via pyUSPTO (pyproject.toml) +packaging==25.0 + # via + # black + # pytest + # sphinx +pathspec==0.12.1 + # via + # black + # mypy +platformdirs==4.5.1 + # via black +pluggy==1.6.0 + # via + # pytest + # pytest-cov +pycodestyle==2.14.0 + # via flake8 +pydantic==2.12.5 + # via + # pydantic-extra-types + # sphinx-immaterial +pydantic-core==2.41.5 + # via pydantic +pydantic-extra-types==2.10.6 + # via sphinx-immaterial +pyflakes==3.4.0 + # via flake8 +pygments==2.19.2 + # via + # pytest + # sphinx +pytest==9.0.2 + # via + # pyUSPTO (pyproject.toml) + # pytest-cov + # pytest-mock +pytest-cov==7.0.0 + # via pyUSPTO (pyproject.toml) +pytest-mock==3.15.1 + # via pyUSPTO (pyproject.toml) +pytokens==0.3.0 + # via black +pyyaml==6.0.3 + # via myst-parser requests==2.32.5 + # via + # pyUSPTO (pyproject.toml) + # sphinx + # sphinx-immaterial +snowballstemmer==3.0.1 + # via sphinx +sphinx==8.1.3 + # via + # myst-parser + # pyUSPTO (pyproject.toml) + # sphinx-autodoc-typehints + # sphinx-copybutton + # sphinx-immaterial +sphinx-autodoc-typehints==3.0.1 + # via pyUSPTO (pyproject.toml) +sphinx-copybutton==0.5.2 + # via pyUSPTO (pyproject.toml) +sphinx-immaterial==0.13.8 + # via pyUSPTO (pyproject.toml) +sphinxcontrib-applehelp==2.0.0 + # via sphinx +sphinxcontrib-devhelp==2.0.0 + # via sphinx +sphinxcontrib-htmlhelp==2.1.0 + # via sphinx +sphinxcontrib-jsmath==1.0.1 + # via sphinx +sphinxcontrib-qthelp==2.0.0 + # via sphinx +sphinxcontrib-serializinghtml==2.0.0 + # via sphinx +types-requests==2.32.4.20250913 + # via pyUSPTO (pyproject.toml) +typing-extensions==4.15.0 + # via + # mypy + # pydantic + # pydantic-core + # pydantic-extra-types + # sphinx-immaterial + # typing-inspection +typing-inspection==0.4.2 + # via pydantic +tzdata==2025.2 # via pyUSPTO (pyproject.toml) urllib3==2.6.1 - # via requests + # via + # requests + # types-requests diff --git a/requirements.txt b/requirements.txt index c172232..9c85d9e 100644 --- a/requirements.txt +++ b/requirements.txt @@ -2,7 +2,7 @@ # This file is autogenerated by pip-compile with Python 3.14 # by the following command: # -# pip-compile --output-file=requirements.txt pyproject.toml +# pip-compile --output-file=requirements.txt --strip-extras pyproject.toml # certifi==2025.11.12 # via requests diff --git a/src/pyUSPTO/models/patent_data.py b/src/pyUSPTO/models/patent_data.py index 13ffd10..140cb8e 100644 --- a/src/pyUSPTO/models/patent_data.py +++ b/src/pyUSPTO/models/patent_data.py @@ -27,6 +27,7 @@ parse_yn_to_bool, serialize_bool_to_yn, serialize_date, + serialize_datetime_as_iso, serialize_datetime_as_naive, to_camel_case, ) @@ -227,7 +228,7 @@ def to_dict(self) -> Dict[str, Any]: d = { "applicationNumberText": self.application_number_text, "officialDate": ( - serialize_datetime_as_naive(self.official_date) + serialize_datetime_as_iso(self.official_date) if self.official_date else None ), diff --git a/src/pyUSPTO/models/utils.py b/src/pyUSPTO/models/utils.py index 32c9070..ccb9108 100644 --- a/src/pyUSPTO/models/utils.py +++ b/src/pyUSPTO/models/utils.py @@ -90,11 +90,22 @@ def parse_to_datetime_utc(datetime_str: Optional[str]) -> Optional[datetime]: try: if datetime_str.endswith("Z"): dt_obj = datetime.fromisoformat(datetime_str.replace("Z", "+00:00")) + # Normalize offsets like -0500 → -05:00 for Python <3.11 + elif ( + len(datetime_str) > 5 + and (datetime_str[-5] in "+-") + and datetime_str[-3] != ":" + ): + datetime_str = ( + datetime_str[:-5] + datetime_str[-5:-2] + ":" + datetime_str[-2:] + ) + dt_obj = datetime.fromisoformat(datetime_str) else: dt_obj = datetime.fromisoformat(datetime_str) parsed_successfully = True except ValueError: pass + if not parsed_successfully or dt_obj is None: warnings.warn( f"Could not parse datetime string '{datetime_str}' with any known format", @@ -134,29 +145,33 @@ def serialize_date(d: Optional[date]) -> Optional[str]: def serialize_datetime_as_iso(dt: Optional[datetime]) -> Optional[str]: - """Serializes a datetime object to an ISO 8601 string in UTC, using 'Z'. + """Serializes a datetime object to a local-timezone ISO 8601 string. + + If the input datetime object is timezone-aware, it is converted to the + assumed local timezone defined by `ASSUMED_NAIVE_TIMEZONE`. + If it is naive (lacks timezone information), it is first assigned that + assumed local timezone. - If the input datetime object is timezone-aware, it is converted to UTC. - If it is naive (lacks timezone information), it is assumed to be UTC. - The resulting UTC datetime is then formatted as an ISO 8601 string, - with the UTC timezone explicitly indicated by 'Z'. + The resulting datetime is formatted as: + YYYY-MM-DDTHH:MM:SS.000±HHMM + (e.g., "2024-12-10T00:00:00.000-0500") Args: dt (Optional[datetime]): The datetime object to serialize. Can be naive or timezone-aware. Returns: - Optional[str]: The datetime as a UTC ISO 8601 formatted string - (e.g., "YYYY-MM-DDTHH:MM:SS.ffffffZ" or "YYYY-MM-DDTHH:MM:SSZ"), + Optional[str]: The datetime formatted in the assumed local timezone, or None if the input `dt` is None. """ - if not dt: return None - dt_utc = ( - dt.astimezone(timezone.utc) if dt.tzinfo else dt.replace(tzinfo=timezone.utc) - ) - return dt_utc.isoformat().replace("+00:00", "Z") + + if dt.tzinfo is None or dt.tzinfo.utcoffset(dt) is None: + dt = dt.replace(tzinfo=ASSUMED_NAIVE_TIMEZONE) + + dt_local = dt.astimezone(ASSUMED_NAIVE_TIMEZONE) + return dt_local.strftime("%Y-%m-%dT%H:%M:%S.000%z") def serialize_datetime_as_naive(dt: datetime) -> str: diff --git a/tests/models/test_patent_data_models.py b/tests/models/test_patent_data_models.py index 50264b8..bbbd034 100644 --- a/tests/models/test_patent_data_models.py +++ b/tests/models/test_patent_data_models.py @@ -417,7 +417,7 @@ def sample_document_data( """Provides sample data for a Document.""" return { "applicationNumberText": "16000001", - "officialDate": "2023-03-15T10:30:00Z", + "officialDate": "2024-12-10T00:00:00.000-0500", "documentIdentifier": "OFFICE_ACTION_NON_FINAL", "documentCode": "CTNF", "documentCodeDescriptionText": "Non-Final Rejection", @@ -608,7 +608,7 @@ def test_document_from_dict_basic(self) -> None: data = { "documentIdentifier": "doc123", "documentCode": "CODE_X", - "officialDate": "2023-03-15T10:30:00Z", + "officialDate": "2024-12-10T00:00:00.000-0500", "documentDirectionCategory": "INCOMING", "downloadOptionBag": [ { @@ -622,9 +622,7 @@ def test_document_from_dict_basic(self) -> None: assert doc.document_identifier == "doc123" assert doc.document_code == "CODE_X" - assert doc.official_date == datetime( - 2023, 3, 15, 10, 30, 0, tzinfo=timezone.utc - ) + assert doc.official_date == datetime(2024, 12, 10, 5, 0, 0, tzinfo=timezone.utc) assert doc.direction_category == DirectionCategory.INCOMING assert len(doc.document_formats) == 1 assert doc.document_formats[0].mime_type_identifier == "application/pdf" @@ -633,7 +631,7 @@ def test_document_to_dict_basic(self) -> None: doc = Document( document_identifier="doc123", document_code="CODE_X", - official_date=datetime(2023, 3, 15, 10, 30, 0, tzinfo=timezone.utc), + official_date=datetime(2024, 12, 10, 5, 0, 0, tzinfo=timezone.utc), direction_category=DirectionCategory.OUTGOING, document_formats=[ DocumentFormat(mime_type_identifier="image/tiff", page_total_quantity=5) @@ -641,7 +639,7 @@ def test_document_to_dict_basic(self) -> None: ) data = doc.to_dict() assert data["documentIdentifier"] == "doc123" - assert data["officialDate"] == "2023-03-15T06:30:00" + assert data["officialDate"] == "2024-12-10T00:00:00.000-0500" assert data["documentDirectionCategory"] == "OUTGOING" assert len(data["downloadOptionBag"]) == 1 assert data["downloadOptionBag"][0]["mimeTypeIdentifier"] == "image/tiff" diff --git a/tests/models/test_utils.py b/tests/models/test_utils.py index 6924a7f..02e6128 100644 --- a/tests/models/test_utils.py +++ b/tests/models/test_utils.py @@ -95,14 +95,14 @@ def test_serialize_date(self) -> None: def test_serialize_datetime_as_iso(self) -> None: """Test serialize_datetime_as_iso utility function.""" dt_utc = datetime(2023, 1, 1, 10, 0, 0, tzinfo=timezone.utc) - assert serialize_datetime_as_iso(dt_utc) == "2023-01-01T10:00:00Z" + assert serialize_datetime_as_iso(dt_utc) == "2023-01-01T05:00:00.000-0500" - dt_naive = datetime(2023, 1, 1, 10, 0, 0) - assert serialize_datetime_as_iso(dt_naive) == "2023-01-01T10:00:00Z" + dt_naive = datetime(2023, 1, 2, 17, 0, 0) + assert serialize_datetime_as_iso(dt_naive) == "2023-01-02T17:00:00.000-0500" minus_five = timezone(timedelta(hours=-5)) - dt_est = datetime(2023, 1, 1, 10, 0, 0, tzinfo=minus_five) - assert serialize_datetime_as_iso(dt_est) == "2023-01-01T15:00:00Z" + dt_est = datetime(2023, 1, 3, 23, 0, 0, tzinfo=minus_five) + assert serialize_datetime_as_iso(dt_est) == "2023-01-03T23:00:00.000-0500" assert serialize_datetime_as_iso(None) is None diff --git a/tox.ini b/tox.ini index 0d172d0..6042ae2 100644 --- a/tox.ini +++ b/tox.ini @@ -4,9 +4,6 @@ envlist = py310,py311,py312,py313,py314 isolated_build = True [testenv] -allowlist_externals = - pip - pytest basepython = py310: {env:LOCALAPPDATA}\Python\pythoncore-3.10-64\python.exe py311: {env:LOCALAPPDATA}\Python\pythoncore-3.11-64\python.exe @@ -15,6 +12,6 @@ basepython = py314: {env:LOCALAPPDATA}\Python\pythoncore-3.14-64\python.exe # py315: {env:LOCALAPPDATA}\Python\pythoncore-3.15-64\python.exe deps = + -r requirements-dev.txt commands = - pip install -e . pytest tests/ --cov=src/pyUSPTO From b5588f23f15073817183652056a8bfc2c4479af2 Mon Sep 17 00:00:00 2001 From: Andrew Date: Tue, 9 Dec 2025 13:52:59 -0600 Subject: [PATCH 14/17] Updating docs. --- docs/build/html/.buildinfo | 2 +- docs/build/html/.doctrees/api/clients.doctree | Bin 215412 -> 669696 bytes docs/build/html/.doctrees/api/config.doctree | Bin 18443 -> 66079 bytes .../html/.doctrees/api/exceptions.doctree | Bin 16266 -> 91185 bytes docs/build/html/.doctrees/api/index.doctree | Bin 3318 -> 2881 bytes docs/build/html/.doctrees/api/models.doctree | Bin 678563 -> 1982411 bytes .../build/html/.doctrees/api/warnings.doctree | Bin 0 -> 21936 bytes docs/build/html/.doctrees/development.doctree | Bin 5085 -> 4699 bytes docs/build/html/.doctrees/environment.pickle | Bin 2666143 -> 3592211 bytes .../html/.doctrees/examples/bulk_data.doctree | Bin 3389 -> 2955 bytes .../.doctrees/examples/ifw_example.doctree | Bin 0 -> 8602 bytes .../html/.doctrees/examples/index.doctree | Bin 2830 -> 2983 bytes .../.doctrees/examples/patent_data.doctree | Bin 3409 -> 34024 bytes .../examples/petition_decisions.doctree | Bin 0 -> 25520 bytes .../.doctrees/examples/ptab_appeals.doctree | Bin 0 -> 23354 bytes .../examples/ptab_interferences.doctree | Bin 0 -> 27988 bytes .../.doctrees/examples/ptab_trials.doctree | Bin 0 -> 20742 bytes docs/build/html/.doctrees/index.doctree | Bin 4595 -> 4593 bytes .../build/html/.doctrees/installation.doctree | Bin 3495 -> 3096 bytes docs/build/html/.doctrees/quickstart.doctree | Bin 5882 -> 5496 bytes docs/build/html/_modules/index.html | 14 +- .../_modules/pyUSPTO/clients/bulk_data.html | 19 +- .../_modules/pyUSPTO/clients/patent_data.html | 1467 ++-- .../pyUSPTO/clients/petition_decisions.html | 737 ++ .../pyUSPTO/clients/ptab_appeals.html | 363 + .../pyUSPTO/clients/ptab_interferences.html | 389 + .../_modules/pyUSPTO/clients/ptab_trials.html | 618 ++ docs/build/html/_modules/pyUSPTO/config.html | 59 +- .../html/_modules/pyUSPTO/exceptions.html | 286 +- .../html/_modules/pyUSPTO/http_config.html | 196 + .../_modules/pyUSPTO/models/bulk_data.html | 33 +- .../_modules/pyUSPTO/models/patent_data.html | 2673 +++++-- .../html/_modules/pyUSPTO/models/ptab.html | 1985 +++++ .../html/_modules/pyUSPTO/models/utils.html | 376 + .../build/html/_modules/pyUSPTO/warnings.html | 205 + docs/build/html/_sources/api/clients.rst.txt | 20 + docs/build/html/_sources/api/config.rst.txt | 7 +- docs/build/html/_sources/api/index.rst.txt | 3 +- docs/build/html/_sources/api/models.rst.txt | 15 + docs/build/html/_sources/api/warnings.rst.txt | 7 + docs/build/html/_sources/development.rst.txt | 2 +- .../html/_sources/examples/bulk_data.rst.txt | 2 +- .../_sources/examples/ifw_example.rst.txt | 6 + .../html/_sources/examples/index.rst.txt | 5 + .../_sources/examples/patent_data.rst.txt | 4 +- .../examples/petition_decisions.rst.txt | 6 + .../_sources/examples/ptab_appeals.rst.txt | 6 + .../examples/ptab_interferences.rst.txt | 6 + .../_sources/examples/ptab_trials.rst.txt | 6 + docs/build/html/_sources/installation.rst.txt | 2 +- docs/build/html/_sources/quickstart.rst.txt | 2 +- .../html/_static/documentation_options.js | 2 +- docs/build/html/api/clients.html | 1505 +++- docs/build/html/api/config.html | 194 +- docs/build/html/api/exceptions.html | 218 +- docs/build/html/api/index.html | 75 +- docs/build/html/api/models.html | 6830 +++++++++++++++-- docs/build/html/api/warnings.html | 202 + docs/build/html/development.html | 10 +- docs/build/html/examples/bulk_data.html | 11 +- docs/build/html/examples/ifw_example.html | 204 + docs/build/html/examples/index.html | 20 +- docs/build/html/examples/patent_data.html | 361 +- .../html/examples/petition_decisions.html | 439 ++ docs/build/html/examples/ptab_appeals.html | 409 + .../html/examples/ptab_interferences.html | 463 ++ docs/build/html/examples/ptab_trials.html | 376 + docs/build/html/genindex.html | 1297 +++- docs/build/html/index.html | 11 +- docs/build/html/installation.html | 6 +- docs/build/html/objects.inv | Bin 2616 -> 5863 bytes docs/build/html/py-modindex.html | 46 +- docs/build/html/quickstart.html | 6 +- docs/build/html/search.html | 6 +- docs/build/html/searchindex.js | 2 +- docs/source/api/clients.rst | 20 + docs/source/api/config.rst | 5 + docs/source/api/index.rst | 1 + docs/source/api/models.rst | 15 + docs/source/api/warnings.rst | 7 + docs/source/conf.py | 5 +- docs/source/examples/bulk_data.rst | 2 +- docs/source/examples/ifw_example.rst | 6 + docs/source/examples/index.rst | 5 + docs/source/examples/patent_data.rst | 2 +- docs/source/examples/petition_decisions.rst | 6 + docs/source/examples/ptab_appeals.rst | 6 + docs/source/examples/ptab_interferences.rst | 6 + docs/source/examples/ptab_trials.rst | 6 + pyproject.toml | 1 + src/pyUSPTO/models/utils.py | 3 + 91 files changed, 20077 insertions(+), 2233 deletions(-) create mode 100644 docs/build/html/.doctrees/api/warnings.doctree create mode 100644 docs/build/html/.doctrees/examples/ifw_example.doctree create mode 100644 docs/build/html/.doctrees/examples/petition_decisions.doctree create mode 100644 docs/build/html/.doctrees/examples/ptab_appeals.doctree create mode 100644 docs/build/html/.doctrees/examples/ptab_interferences.doctree create mode 100644 docs/build/html/.doctrees/examples/ptab_trials.doctree create mode 100644 docs/build/html/_modules/pyUSPTO/clients/petition_decisions.html create mode 100644 docs/build/html/_modules/pyUSPTO/clients/ptab_appeals.html create mode 100644 docs/build/html/_modules/pyUSPTO/clients/ptab_interferences.html create mode 100644 docs/build/html/_modules/pyUSPTO/clients/ptab_trials.html create mode 100644 docs/build/html/_modules/pyUSPTO/http_config.html create mode 100644 docs/build/html/_modules/pyUSPTO/models/ptab.html create mode 100644 docs/build/html/_modules/pyUSPTO/models/utils.html create mode 100644 docs/build/html/_modules/pyUSPTO/warnings.html create mode 100644 docs/build/html/_sources/api/warnings.rst.txt create mode 100644 docs/build/html/_sources/examples/ifw_example.rst.txt create mode 100644 docs/build/html/_sources/examples/petition_decisions.rst.txt create mode 100644 docs/build/html/_sources/examples/ptab_appeals.rst.txt create mode 100644 docs/build/html/_sources/examples/ptab_interferences.rst.txt create mode 100644 docs/build/html/_sources/examples/ptab_trials.rst.txt create mode 100644 docs/build/html/api/warnings.html create mode 100644 docs/build/html/examples/ifw_example.html create mode 100644 docs/build/html/examples/petition_decisions.html create mode 100644 docs/build/html/examples/ptab_appeals.html create mode 100644 docs/build/html/examples/ptab_interferences.html create mode 100644 docs/build/html/examples/ptab_trials.html create mode 100644 docs/source/api/warnings.rst create mode 100644 docs/source/examples/ifw_example.rst create mode 100644 docs/source/examples/petition_decisions.rst create mode 100644 docs/source/examples/ptab_appeals.rst create mode 100644 docs/source/examples/ptab_interferences.rst create mode 100644 docs/source/examples/ptab_trials.rst diff --git a/docs/build/html/.buildinfo b/docs/build/html/.buildinfo index 4c27933..26e37b3 100644 --- a/docs/build/html/.buildinfo +++ b/docs/build/html/.buildinfo @@ -1,4 +1,4 @@ # Sphinx build info version 1 # This file records the configuration used when building these files. When it is not found, a full rebuild will be done. -config: 41a512eb26efab7f3a442ee890fc7d4c +config: c43a1a90993d7b5542e6aff794c219e2 tags: 645f666f9bcd5a90fca523b33c5a78b7 diff --git a/docs/build/html/.doctrees/api/clients.doctree b/docs/build/html/.doctrees/api/clients.doctree index 788a88b737b1ea01a850bfb126c937b774e80a01..75ed98f97c4d43ff17d08527f1ec119180177bed 100644 GIT binary patch literal 669696 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 literal 215412 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
qrvpR+=rODhx{OQOlE&z|o^qfoq6-=Ci&-b($_ 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 M7X4&>)WJCSH^bjZ{Qv*} diff --git a/docs/build/html/.doctrees/api/config.doctree b/docs/build/html/.doctrees/api/config.doctree index a44ac64d0f38686623dfb22ebb3aafba38f9caef..f9f064cff33254ad5dbe9172a1a88712970f3505 100644 GIT binary patch literal 66079 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 diff --git a/docs/build/html/.doctrees/api/exceptions.doctree b/docs/build/html/.doctrees/api/exceptions.doctree index 8406a620381d504bd3644d2a4491b13e0e4aca61..1aee39983cb7e415807a7ddfc5a94fc0ce9c0457 100644 GIT binary patch literal 91185 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 NAJI@#h}E8%`hPG)cLo3e literal 16266 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 IWGXrReO#lD@ diff --git a/docs/build/html/.doctrees/api/index.doctree b/docs/build/html/.doctrees/api/index.doctree index b4d61c9e205fb836adb80e3cf8967f642c7dfb1a..c6da02c335172a3216c0f78a4c8c920faad34f83 100644 GIT binary patch delta 103 zcmew+c~FeCfpw}G_eNH0Mn>n!j*QZ5?wKVXrAd=h7+>@G_3$JXWa^hE7UgB;rBC)| zl4r{B*qp^w!pzvW`9AA?W|_o{xZ)npyu{qplFEYA;wiOLG7>wBGZcVy+~!-HT#S=f H^LPUQ@5>}x delta 487 zcmaKo&q@MO6vmwy$AA4<2nCHAv&@7ZplIQuLIe>B+9<;vJ9)Ix8Sb5tgu-035bkbn z4-!5>PtpTeL=mpLQxLZCZq9}CopXNQ_q@H>(eL%g`TCQ7q$nq0S;?j9)a^mrXQ8dk zLrcxgZdG4X`0PV}(ef5H8BY&LAN-LAOxy{yrVLG4o3qz+Mj2y_Z?X~dp>OqpG137M zisD2n_fW?KCR_3o<7tmj(xJq|r8YOtyS@WvFt`NjbO&Jiu4^)Msed4%N!(f~c@UHA z&mjZ9FozoEYgnj-Q!PIZa34R>!1utG*EgK550p5T?YQmhe+1=v#caS8P#Cl!bG-Ea z2v$fWL6nKniz~4hvkC4-zRgxBv}`eb({~P;N7^8G%A>%54nat=o+{N59OkhU*bs8f zIMp2(f+MObk4ISxp1deGYL(iV;PEJ%sFPrBK;=3)CH=k06>Gn~v4n-H8rURUWUAlm CJ``TeQU4ksycPf=}FJ`|9?J@ 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

1X`t#axs<&q>xf;A!T(c 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

91KDCj1V>rI2LN)FskYUjesw;ohGfN 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 z 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

ySb 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

W$6eh))=&BX-b(gySL0+8 zBnzJ7uCP_JE0@rTE}Hxn!az1^Yt8gvV}2q)q4C=LftQ@)wGTiM3Djio0@(9A5yt#L zE#j^KS%HiNS~h5gQDdaf0%;rseGZ=(2x3nqK#)KeMaM_$aOu9cAI?7SUYut<#P0d6 zsDrJRdDPzH2kWZA5`bxSM%CSr>R4R@D7$ZHtiRSP&)8qhZkkUo(_XM?Rex=?uXl8C zTki{NJ9pF@{VOZ0j=-JYD=Ui_tDMtCr=7N>qQ4y-srJ>3FDvl7xVC5DMl}O4&8R>o z=UMMGu>TQs3)6J%P%+?NxcxqM_$}F9=2vv({)Jm!x!u=8ZvAo9Ko8*j88CihZ$pz*SnLb4}T!%5I9q6?_LnOgefr=>Gmb=Ifx5{`(*`i!ahc_i(D zMX=dWh(Z=JdgGek4EC+D<~Q4KXMz_^cKVuEp@Z}fS`{Z0VW)?Y7`3K%23bG3rYBml z*7WvbE=HQU_)Bwh5#8G9Ft1rP&8szYbZlg#4yQ?sZil&pYsTu$+UWQ$h;PXWm@qdl z;Y4H`sMZ|)t#4J&+odOXRj(zNBJ6~r9&Ow<+C`CwB|l9r500AQfscT_E4EhPA9eNvrxX5p5 z=6QS73Wk43$*MMXs;Q__b?E+nJK5jOo{kLT`E}2t$N@6HRnQMIFLZX@K9Cd%GkkCm z%c%4T<|{3zH{=nNJOJ%=Scp0RE!hmW2umQs&j9PDF9E+8qe-P3FNxU%*9k4D!0}dB zvn#;y74Iallrh|_4h|0vZ!^~uSxGd{%9;)5LLSKINF7eg;XSH588#>pF-wk@odEVw zE>VaZzuyOi00hly?NRAAf+4;(0hN8@_Y0gGzq{mxNyuy0=B}$MT~~E&ay|m7z)wpm z{58_vwGv*)q98B$OJ3gi5IAWmfA7tQ*pl!5@JEnvF`t0n7(6}d@MMETb3P$EJN(N` zY<3N%RoXt*nyYyniW)Ntk=fzsDidezJ?mzohZ&Ke+daD~=81Rs-cqh5?TGoX-(Usa z`LL&*s%;77lku+@`F0JFGX66ZZI6sY^I=N1_JMn}XyflDnzdO=*glE|Wy$*>FLwjZJfgy9F+ zr*z~x!5xKEy0_HpLo9ZkyKT7MfGr8Q7o#~aI9l0W@2?GcLsNPz5-~`*itNk|^N9#q zSF&!K3R(EtGz>dr&2pj;5SB3y4Im0Y@XRcrokAs zYcOR(*yqhq)UeMIL1r>z5c?G0X#{A9=SvNHs3T2J>CG}dS8YDi^L#TW)HStbxuvo# z>oN~ZrodB{MOK;gawEJy!d}H;!U#+=($DLvlNl^Q}teytV#?L73e^PRsDp=hBJ ziCgvV&UNRXdq;L=Pa@I>G zWq&760Y{PN>Ls-2xQ^SH97Rj4M;8+N;N*0NzfgBF8@Or_2L|Kse6eK}KC#6X_SCt> zmWfD4W638cmsm?FkW+vf%6f1uLQQfu84 zlejXVMB&R2BNwgvp=iu<(zRq0fkkUxx#f{t5d-x*ur2RE{Z5h!a~PS8Q(w$D52FSG zr@jh`YB%4C#Hqdni_kz_s3n!Sg6~a(v1OZ`xbiM6FUA1QJ#FuHss)2$05+)}i>skQRID9MW2)ZZ^x4)S}W^ zj*m}gQI{QAH?+xZMpCL&_HSUJQ*j{H(bYzsmbxKJ_-*yKhEXd(5vD0QuA97@ZJ8?D zx~-EiN=equpvZMAo8~4t3mIdTP4wFJA^w>G$&nrIa56%yTx()eE7v_he4E@@auw9Y z{ZcNpg7%pGj2tUK7e0@RZ)q1)HWRif=@NKh^9*R~&L zE{&~QKWj_{WIm{6UTD=iVy^9$JOYvvIyYjW$O#>DO=8DjbD+`(>*zyktE06Fr079z z1Dqv|#a^r4c#T^0(~M zw%)k*-aM>H1-=^#MJlkwjccEarmf7>Tl&T|^oEIVrtMSk1IsS3Zd}8+W{|apUTUI| z4d`^2`mR$b>{(3SlCMLtGB>Vevt};HcQ-@P>_=6QtR^S*xxtYkI8U?x(KSUl`2dG| zUPD5?QH4F_D{os9+X1#aYiR=w`J(k)tCnt94sY~}3&_-^W9bz64&D593Fyvrv5vR& zC&aIZLNPO#Rl0J2LOicL+=I>OqVrV)tmd(MFuK#|relq1a>)m>uIlT|jZJiF}S}9K13GbYQ zYy-rE_g68YI8NiakeqoG{M!xxzHQ*`zJzygADQ4ugX9h%HaIh&DN4-@oDJnl%?!x1 znUMfKE%0M}!awCPR`@Ij_tJntzR!c#QG@$p$5=fjs+SPJ0@$s%W2~OWI{5mAJmX1Q z!ZS_-c26-^II>rdegkz;AkkK>1@8X}MU6F%$kijJB$i6c6c;+is$-D{`Ufg70}bQk zNpfI6j|ouZr$QwVz;)uy!b=gQh~qOF5(U9@Q2GR`m``;FI2aoaW}*7#c{(XhLpDYC zd!FXTozVQafg`Mgt4_!Sraf*GHd0j@2E8A}^qz5ORXS8Mdsg5fS&6l96HkAub-jwz zHJw^;vMMWRb`Gyv2ES+f;Dnj%TOj5!=bGGy*+7R{&?hZC?U7p!9%`kzm8(VTfgb6v zxschRRm%k%{?#IFZwJdmtC|BfOqi9nrzY3JA82`Bu4LxJiyqsOqQyh3E>V=)KG`WI z53!PrnSIKJ2vHlfw?nIZ&^U}wY$c056&W=0j&64HqDH$)ZF&oD(l+hY*_?e$w#ljn zg0`AHuv~6;WL4$=tDCW3M)zO;*z+Y&C}!;Wdb)D|*ppXo_iNK2%(3Tfs)5!G9T!{w=RR%^YjAl>tYvF5QzOJN-YA2`AQ3DT^<3+#m+TYh+6E-zq@(^+an#nySkx*r~P&3bEx+dvi6uHoKj@Q|(#2xq1f@E^=O-&DA>{p6t;_z8Rr0CN{eU6Rz2= z)0z>w4T|QU5ke2hH&^Q!p{&i-*DxYs=GNIG+CGdNks%;77 zlkw{r`F0JFGJXdXZI6sYIonFM_S!lv+W5`YpEM+FFT{U3TEdx|t3Od(z+bin9JjgJ z*M~DUS1U1F%lxjCZJ&TRdSbIPrPsGC4mQ%Av3vJz7eJD01VvMu5y5dk_ zbCl2jEntk=HJBZOh%rY)(f0Vi;NI$kJ=Bqwr}So7o~t&W<$1n|*jw$E%C@Y(=Cv%c zO1ZasV??bYZ4hB;#+r)UTYVZg?RM;~u9JP%>~Uy?VsG^j7NQWevBYyoYHzhMhEns+ z8DD9ad2=3mS(4Wcp1$hxB~*ZXwOIw$zG>k%taqBVd-AX*Rq+Na6sZblnE|P>R$f(V zqw}FA@%_;xny5GL-f5?KGbNCr2$so-NEo{$JM{q$9bu{q`%Czg^@azszms{qDB4`T zf%XVu&$JvH%e8O1kVyHHlNJ6#-N~nbRBF#O{?6Aweu__Q{ewM~SpN_U2SwLDN-tQl z4brESSl7r}phNpGcSEOF<%B(_f6x~5SCF@fOza*?&vE}rm2JJa6I1=^^*=BEYz7)#~Fz#$}zTBzWmW(OetWC}vp(bk8hLG%L zC~8PHYLl~1uEEp!xnRRFM6M{|CTHzVlIbWM*O+y_Uw8Hn;p<891`OyrCdsHx&MzhF zCw%~KC7Xr6Cz~Ky@FYZHt7ca&p%Yy+`ELjTZCX)@Oi1|<@R3?=Nk=%Dkn&;p9I+K{ zUzWWJ`r02v=<=?v#B5)d6$B7Z%=YDnfiw;d#~H8uk1L1a2CG<9x|&%HLOIci+X5 zUP-zs1-Z5-Yc7&sAw#UPiC)Zwg9v<_*Z~R$O=2lm6Pa4d{SFY_CdZTPJpktSR$SEG z51vxaMfD%KkQ?lY($PqXf}?pt^cJt9F_&>qbhaTIg38{0T&%FRhuOe)*d9!n#>c4( zI^Xp{wlf9QMVE0Swi_RlM=)~EqZBk$G?F)amGkc1!<)O^IGZ`;8a+bHwou2U&+bg(^23 zx0<_a%F(9f5PH|hm4`r%u`Pq{>Ik05$}YU`9Uj}hrPk=hE526ajL;H!KX@A{@k;tK-Btl5aS{qDXj-6;8(51 zACsI1wD`k#E&i6QpVXpgC0>hN35CXz0$SuG6x8C3G-OX{Z@Tr3)SB~FYilmaVL)56 zpipECTSV4RYD=^dudU^DTLrYmNhqi-xKXe=Bo3+?9PS;&0T7(0MT9i+TxBtBOMavE zdJ!p$fL_mw*Xvbe{iI$+EAe_w=(Y;zm6K3VuQSp^;ItK5-zY1z-)e2$MsgU?)=lx+ zx{Iuz)Rt%^UR!Ub+bWgvyNchf;OEpS1F>AQ=uQ?~-`s)yVou<%w3}l{ZSaRX};1ggnZl zzx5r^;GKJ%;GCZ1co@e86L>U5sRW*1!vuB}S0cNUyD|0VjqsnExh|ai1H2*5Vvwf? zA^|*m=U&hnqeq?|h(F1k962=%(^OB3xpVLu_d^@)cXMv{*iq$mG~b@N2ysfrq-?e{xv z+lw7$wsH1>gYSX5sAXciH(1O2ABUnwzH#J%gG{gNz(J;KcHrP4q#njG|AgPS+QH=! z=xV6*jCFE$5aCx*Kd^8CMef5#c5#KVOYJzlh9OQPgwR`s#IQ<#tuc5lTU)G*H0ph| zTL0kiwo$clEq_7n(Z3}qkxSEdr!j3+WQ8TaMav@C*mCah0MOfnYZQit^znXhi$bHm zy`nm9Pvx>vxHTELTX)t*ldXN={*6X$1jgU64haXu)!;9-JPSN?xhTeWM^jo<|6Wv7 zds-R~`+V%sBH=;0FUV--@`e>@yP!C8PMDYNRUg|EobCSrxjg6LPx!=g9@taStN~5Q zK+z3XJ(tvm2kQ;h2`b$gN0lGpa{*2zf!u+y-IF_zA|@+&;80i{bPD}n_JEmf@T|!m zm^;M1big;Yc6?FdXCZDtP~s2XT>%oN(0KCnvh!*Qk^sp#|p zEsNw-tj0|r*xxZoIT}j6*U{j-405Oh0zWzbmq4(jk{+0{1SB!_(7^`bkxZ zR^nClKDw;}s^TORR8{*D2);xz7EsdX)(Mr5tZ>QTTpjS>pLA_2u0>PU|4g=bH zL%g=$P1a9pOSBTNt&h@e70?zZp`f-VIDz0BB)0+0JsPjMACdKwniH+WYwlNcTLm=7 zNhqkfP9zXKXP5#P0d-D>LXqKcHd#NZPSHxdI-g6oRY0Abgo5gv$OMAbB&z|nof5CM z^U3;2wTV{Z)%JY4tpaM}BotKJ#3v9mNQMK-8;)1r&1C(g@LyW*OmkVB!DLnd>piv;GZ&q z0H1Mf6HgD4lfyvOe(;(v(eBm+f=@f0s+|c0U&gwL1cFDLww)RF~cX97V7S4g0*q0-&;U2|DSF1(&~aoPKSsvUP9>6ALiQ5v5ce zwq&H_(y{inQ2$a?sF;7C`%5@vpidV02h#iDiE2zU`STBE)n)#{YKcl7Tq&y@R8pV>R;x0rg9B=SZy=4kM^-gCb%FKmVHj z;#Al~ne^7jntk={PO)drQv5RLLb*5c9}9(Img3jYmHU_CdF5eaGMD0yQ4O?q?4GQY zRJR%zYu;_z%YV7zDF0%-mPT?JR^u+lALt>TqZZFE+CBDXkVGxW`$`HH`^Gk00c{&rT2{6;hSt|E-Sy$quVhXRw!WyXh~$Y4#Hzt0rm z@1M)?H=hWvE{oaUf+DH!|sMx#d9+~&%Um3d*4t5$SGnsG@)I~)KTea41goRKv|6~GF5}Qn5ier-rl0_UP ziERfR1#{3xP>C_~1}CB}_~3dfKDzS;-51uHRkqn+YrRo{TSUbWgAIuJ!~yd7Dq{<4~ z&)?JZ3(4j1d$zw$n0dbiW;2;1PVlbZ)=`nd)Ly*h8IA;`B~Pkv0DaQebK#$llQUNe zw!E9wj2%KpT`)M>tkkzw#DQ2_hH4d|9oTI%++V@@0=+LN_H(V9ol3sGVV!SEQgE>s zaB;2T!uIt}F*(H~nKt{O4JX7Fm#Nhzc%LmWCo=BY=JI#YD&OXE7e29RCiYZhnu!~S zX&6Nf|19Z4jcJ-9c7IBo-FsRqY4$U{RoYg6KWdy?z4vq7vEC*6hTr+qM*ntIRvP^j z%joZg-wPW3k!hp%v7KS_Uf!k2e*&m;OnwR&%YA~WER)|CCMjWJ8mIdDRrs}EYAJtC zNh+uLP6diSttg5zU&%m8^ZhQg%FXwC_{7YYJ$2T6pQpNkHT*7O!K-pwu+?BmBcAPN zgO59P^nMyu&+Rx=LU*!fL_aBF%D+)%r72IdO!*h^dqGp~CQR8DX@)h2Bp?m?IoG5N zdK#F|e+kyI4Ep#>VR9a0xKvH0yVkRy%?{_Mp^CX1aKF@@=nT;hikSZ@RaTn+{$_Vd zR>1EC&A*a1e}~x&vv)a`=6(s#dO?;uH z{sJYroRR%Np!EtxD{1l4bR}ygP4^mTm78t@pP1>gr_P%0^I$CDS?(-i!jX~P-(X2o zo*k;yHtAicdJ)+JC3Giyndm1)O#3COtTgSJmTBJ#zZW!ZPh=0Ul40T@nMqTB6VT|G z`b;pN7Yo)hO?^FILgxW}NoC>KJ^8qx(Q-9WnI4ftO*B^XqC4-{QdqS2H*L<} zCOZ*5=Ki`W+j?1tG8TFyKsIJjWEO+I{df7&rGukO8>7voON}*)8!?@$Ik>&ngAbc4 z*R$iDV2xtsX1tI?tc*C9fUe}jqFJp;D-F>6l#+zc6v<0Ke*#5g@=tzGHW9c4lvi#q z+sq4#fbnK8-%M$!*f1HzWH3Dye}YwlKqSbO3Az{5WrhNG&_FES%!H!tS-hEUbqM3= zC^!&|FN_FfrLG6Y_ogUpiDzFAe2gJw=X&6!(NfO39(Zwa8LzNq9CbagZ+R?uJunxn zJ+o_03ClDOydGG)o#e+Tcb*!gtzF-X5OF>5C8T%*X0@J4((w$dm1kIO7)h0^pY#m8 zmF(+*>tquo3!aN3uvN1wm(YnWnmhuE%0_m?A%DgqOk|McIPc}aj&}{l8y6+Wdj*t| zAW!x&=y{I{GxvkMLvMhfT!9rYILpxNyHJrFHOUI3%hVEL2O!2=7W^h4jYFt6;}e5W z?5PBV62PSBGDaKcK^cNNz665ui~|%zuxI#O5EYuzlOv-*H5y9&6X?UV92;2EQ0jxK zZ0i*rhfpBs7fp>e8>JxBmz4x^L#T(LXbgmUoNOZCD0$^}K;PehP{_9jH$8=I z@iDb?A?D9XD)ODc`7_43-O)_fL%^nIplEww6XOq^98Y*rU`ePY1(xu=X(zU9v%%8z zQ6*X)>a_{(k3U60(k!qv4QeU~NasRPL$d7$OI)ya>@c-%f+g)(lFy^uU1QD#mX?#^ z4H(ezOp;MxX)Rel36^*(*1H5}L#A8si9sgz)H%p>2A*@<+dtUX>|Pu@ ztISV9-Ck=B)cYaX>)5!pA=OX`P<8mF?vAJ)Rc$v6nycw8Ko@LU)n6O!>m423*89TR z&K>ne|H{g$Bk;P@m6b(|70$_`(_p)j{&sYv+E+8atibO8r`d$pjq-r*)-5%XyP`PQMPO$W!&-n)I%v-X($-C*w{hNY#<=Woe@q+2TU#l8u-O?#ss8lT{)>KYF zYpU@Z2Rp_at%FZ1E_~RIM#fqK$)~Uy9>Daj8=RG@@;;!qx)?9@h8E-HtQP-6llT}( zVqkO1H=qy&5~L<^bIPL;-}+MFz5GvbDtv1`VesQNs6^l=_ULO;xtetsPwoQl+Z580 zKSNzSSnbse1S_K#iulwzgkY(AF;4ce&Hb{EfyQ19?V#uIhOT7iWcR{=ho8+qJT5bC>tlgOp^u#E9r2v#t}2K~r2czHwC#vdCSH zhXXCY<4F1C8)Yqlx+pWZ4Z_-4uo8+IV}Zzf4zOP*&d!3!EykX4Sht7#-eYp$)?~=D1jEUvurq=(=ftKs}Tn7zSh?L za#GzipxC9#w(jT@q_VXnag|=eILSN3b|b_MIEJDJvxPQaRk>=D;ZboKO5kK?sO?{| z{0AikA0#7(+HZuSG2r+;WD|j*Hm}^C5<1x6(~<#;q4s*^KVzdjK1@bA8A~yrBI(H& z5FG11#A;GtrHqGb{zST;hC|IlBWQYOZn%>=(b;Q)>lUM;4u`{*# zW2b6cKKUg4L#V4@(ETqc+8zmqrZ%-?uO=j`@h>&R)BY&A8|B9aIJ#)^VtCmm=-kS7 z%^X-CFctvTu1l7)KLH?+AC+rNKLcm@BDI(nZ9dN4hZ<0b~ELpWBbvaMF9qPKsqqdT)c z@iF`&C5zlK{5&Wc6T`0}n+U{kUb!7t^2G2VY}6mahe>+!MVN%i!0vqJpoNIx*Fn+t zM3}4?E)?a&aC~c8kS*(o82)!yfj5S~%Bk9xPd*910_rLl!`}!++auvn4A+u1W4J3> z9f+wIuDw!nF3Qi1;U~b$cE#{mm(3&jKcgHyGbI^&kUt54~{{O=xOv{)a$#o19a!-?d4MCk z6urkgFK^!3d-B@)@U^uDTr!HMdZvU12bTbn!!u6dGEq3s1QuiAyvJ%|r`mN@yaH_} zhk_i;P;J|Zi8qkd(+3tjJ4^!PJYP@_a!xOHbZ4)2OyMgVqjIG~{jG(wERS&HD#vkH zC~}qKj0 zT(bG}HBf>APH5O-J{_eIIiJ3ieVVPf9LrSIJgi9t{tXt2RN#K7z)di_xumjYc&D7< ze8^Z>5-VGG;#(=pdZ(`GK&@EqJ}joQ}Qbt6NAeS^*MT^ficcpwb>yjg8*t2M_( ztI4-!bamaCd>j7DJYVt{K8aJicw!u!PsrpCX++k19KJOjgoWi5bIwfL%bh}DuVV6+ zycmkL;(23@=3{M-B^5&jk-ULsjY9YB9^SCge7sFE2MR80;ei78>+_O2@D*v)Xd$_b znruB0i)7NFOUOnS5{Ep?XzMT3&ASw_NQPaG!}TZdiNSUD)H%4`#@)Sa0`9~Tu-ucM z*Yxf^PGR)WMpZGa5B;pe($k<1)A86ogkD7Zl`7l0eD#o=+=;k}$yeWd2PHjn0c{T` z8Z-HJ5ZOdv@{Lz+1(8<7gwS)bE$@WTQ6v@lCWIC;&h3t7LSTFNVuh~bps0?+t;kFY z-?CX~LP)43m9LKPO*^q=o1L%zJS;D!Go8(S=Q&l|k}+kQm9Ks_)I21juE%=`#Af#2#ohKK6a{@$_1pr}@G$Zp-SZy-tU zBRD&IA3>oV1fu_nxGetC*!XAAbxnQRfqB5cYvA9ZPzuqqkG_?fe%@(NJ`^=aOqka$yBU{LkgXJC|1WT;yGON{Gz+a z!5Jh`Sqy%X)TV|j_W~E8jPn1_4nd51_0EpDL9vKW^?r|oe4k1j=l@Y_w};ejU_Z#w zPzZp-LSuHa1%OdF84EhDBI_sbpcJiGiTWBAdr;qbbXx`PpyVWEJ0slqaugGabt_9C zo~1N6Q)y5~J}FJ_Z(4tSB+mi;^)gbU^mh$eKdC>_O1%DVqT4EwLqBUp z?y-}?Rslu+C0>ySkoA*_6s^Q7@=&_10*d4$6jY=ZzBRH+>F_|ML;0OlpXV2?xfLY0 z0nIIgLXjZlEV6!5bE1`a&0RvbRX}r`go2toSZTx=`=)fKfr$Q6YR~(d*544xb3lIs z@%noaSwE>i(Mr7j?xfo)pg&GRLH!+}^%tC>NU8Erx{%ar)@NG5_mV;hDEOXu1;3Z9 zpH#4DC0@awpxY{-U`|3o1<&@+E~RvOVCp-mM$a!=bKfSp4QTG`@tXTFSwE>c(Mr7L zeoMDiKy#dgf|{Ebp8rc}Z2H0f zB3&Oux)yYHE*<28O3cU#V;8dA3g3xtbp<}M4I9SMAE}EO#e7`+O^(3=xOz^~O%>1O|f!>l()u;XNTnk)Bjr z_JU+0`GGV0U&nex#vP7&s40o(aaOIABoAOUVreAZy4L-Jr0(g=vUjSof@gti9cH1(oz>xWP%OfP2QSd3COnP=MaCUFw+XX{j&u&=d z+_kdHz`aknVL?h*ZAT!!(6WD6$KF=M=4^xynod$(q^2Y={tbJLA7W zt32P~2l&MD9oSQmi~-*5%`RWmn9r69Fqh+^YTG>(2ED(Lel7oi^;>sj{-i**7%)3VttW*kVg$rZ6*X+t0l;?`eOV zGH<-2@i&64Ec4#??7<;8yrqI#RTgc()N-ByZ4v1Q#z7+@cuJAt9gX{o!W4u;R3p-T zBm*UlcrmofjreGMVn)oKI%~vdDI?ZPh(&CexMJ1Y?R0A;O;}GMnpN5syaqMSE!g|H z?pSL@-zZ|hr>nBEx7qhHu7uwU8n8IhKTDDs_Uq+cn(yU6ofDn$M#fcwsVwu|=d$6! zYsPAobJr>3HD757U#+B+GydZJi7!ypM8#i8d`Z)7LaW?#$MA`nE_>>%>7K4k7uT7K z811s0ffw5;X|B!^H?v9|YFnsZZm7C{+Sjx!nx4R8J@U5t_((dP&L$hQ){9e%R#cr7h*=Cr3NEFfwtNXUk0u6 zfPFbWG3#beowaT~B`s5niWqj@DQVeONt@QQt-3-3j-?LIpwi zBvn?L{}Gn?|1b2Bg64l5F*D{Db%rO%l8AH)2Ln%zQ#b<5?JvsQlKUZXMPBBTx&h{p zb$Z(_x(3-X+4VFk(r0|7wR4z~a84I-B+$G-6gG82Y*CjimUIy(L95(FtiUJcBG^-B zUBp^gthF~z7x4;_kUiB_Nk`zxs&#DtBGk2j?CI8ZhuR?eM3HEJfhsG_eUaI}f7CEZid`Y1Dl{nPb$8z(CFw3}r?7xtDFc0ME0O+wR$98`7r?n)pJ?K2h?^ zY0Qg()@_Q`sCX|~D{0KPK Z^b8O%_7qC!R{7)q=<39PL-9$eT-$?uY%tT8uy}fEceSZ!@vXlOCx^|Q0N%> zF#uazdbaf}sVv-3gOLWDzfo%}T&zs}h}3sa-uy=W<&!tx z1K(<$Jf!5B)97(M=KYHHD5ICGmNfdWK&#y7AHgSP^z5m#Mt}D9!R>Hf3hq48SsO)c zJ~DO8*IY@HKgeIFJ#_yuDxF)r|9joJek%G$5rcnHm6Zm6tYz@uhu;etyeDXE9W+%)L5-XVX^E;*TBa-)h)=cj{xXdFON2 z@VjoL23F3rIZH7Y`K`wT7k^eazhx}@RH0g}1lAB<1T@Yz#m4PP&hvrA$|i`abL z<#FCpNpsihzp^^p(vQV1!Yw`ZsW$TC$&N%XlPy(crI9bQjJz9uFKFb{^0;6(!@g5I zOVeHlR5_--42v1BwEX#uPo!Sw+h{n zt|vPZZK~I)vb*;ZF7GAcf4c}dwLRqQ9f$_aLCv8hS`*7f| zVR<2C=WyU}I91y+GNqh#IPjxTlNn3hnN>o@--n`xjH3<*_HC!+2b4ji6q_kwHk$9c zb-E0@rTE}D!&t=X`xHPbV>HO_9^;CpiK!#%mNfs%u{Wgs2z z9zK8El!)#`C?*k|>}AmR#)NeIh%R(j6n1#A&qh`t2f$iJXpT`E<<}hz==~Z{|gkL7AMpE_GrqPq;?0pBpu8hoUj4=_ay?fN$iL+c7-i@`P7nTRez6_w?LF zQenpM>|+sL&N#PwnHedGD1J8-HKKTlV-Z4^CkVBq@DaW@jl`C1Ha_|QmiObMhn%Wy z$(XXu!bk6enhN5hPeM^cvhBx5T(EYqFtu*tBkfg^Ary{l%(?K0|W(<&S#N|kNh-fEh+qi?@jZtWt)wEUW4WR z_~&&_)wX0z*=FINS3^w&@z1?b)R1iZ@edcQ4w&xTm5G0}KS?e^;kd?}3;%qA6mP(Q zKEfm!g@3+G)=%Oe-byz9d7Ny5WWj@fuvN1wm(YnWnyi3Y+l7BJV;x66zlSEh6GKjr zlbGiZ@V&%5vR?t_IYr2$Fy@gJl)yaCxkX~0srbY&4}0ny=Fv;wV#jZ{XKJq}m1kw0 zfW}bI$t6$^wc;x_M7y|0FYy{5fElFTYwWWSWNuo7nG6@WWj@euvN1wm(YnWn#_e- z+l782Vjjmok3*wg{F4fG5&=B{B_slpeG3rKd?Ay<2uM~?0s;Le(766#WATe~`rgtTB> z_c<|GXpUk&Hx`-+MPsngkz^AAKgcV$<8=fUT8?dbvCs;V3Nv13W1(e?bGwg4Vxcuq z)QH#Cx(aE zQ|Itd8xI&mP;|<1B|uU9iCHc(3LTLpd~)b#jgfu|`Y^4=@zNwldQz2by`tk7$vI!m z^{sxOG&tNWm1zA(C4t;P=@}>*1C*xRMky%ZBzfg_FgJk`^6km4o`Y=(pah>7$<=d7 zD$HP>4U}d6Z9h=rg4L0g0!rGkB)>zsyT+UgDD{!z4H!@_lVlW7x`wQu1WLS>Y@l=# z*#yag2Pk2yW>+qu6J0dRa5gI_ua+;jgnk(@5%FpfA(1>=;LHPCgj!Od z3g4UdV#_ugRQ(mpbJ4n>YSQg?)wX0z*=B*NKNpwmG$6u|Z2LhK7p#uL6sXb;Ciy3n zTPaYrh!k(YfR2Dd5LoB$sn5u5P4e&MUryFff-2rhHmF)lHbJuB0ae(l*_BJ^L>Eo& z1x2+BROOGC9A8y|GcUf%ii;9zZGj3T)RH|9pw@lZ3E55AzEhJU_V>#QNnG+ zlk0SMsYGl-{hE&yAGshN3Y@=|QrIfS2Tz+tEA%DSZOl@*<^Al2n+{ zJbQ`mV~lgVk3}M-FG5ixo|jpo3m_$-mK0LL_oj*1vdu~Ur1bAj)wX0z*=8Z7 zA3#k7r=NZaMGeWeA1QIc>d;CdCGAs^H=uA_W6rfiH}wu%bGCQ`2DBFxibP6t$ofg7 z#9PTmN=K4SkSutR61Hk~{ zx*fY(89XE_D1nDA1=2Vkx(uHf9%4_O!$a*m&YfYR6H8#C=(Ebv)0z`afy2p#Lk|3^ z@zF5o!n7FMh0xPVi7MNAd8ek8#DS6af&Aksw>mKx=@un`+!*NwC>n#2UP(3)@Q=K5 zJB~+Sq&H(*UW{}vNrf55voX>=jB~r6MPj4}pr{eaCjcV}wWKf-zBkRpmTfjh`Ye|B zW2Ap^s;$JqK0JKkCC`wbx@@+lJ+af^(dTD80qJvcmoFXGbYKX z*`z;`^^+Khw~~#Kro6=Ne0C2ZS@2*aY}M?_C3K>TCN-$FT^K1k7IK_)B#6h0lLEm{ zVx^;?oWx49p8;0dCgf9inNC(v0xO*aq;agY0-qRGVo#mJN@r|s)VKHc5B4>?7snT5j4yUKgaT0;5<&Cc73uyZdXFA$cIPib8Qmv#KffxvPl??aQD(L;-3k>gY3sJSPQ{7%txV-M$e-N}vK;#6j=R#CG z3jXcBnlXC%z=CH>gaA1|qvgDFvfHh@lN&wnZZqDs_SsNvQ~@8<8l%$o%~x7T)1jXd z(cKnOax1g})a`?X77QE%u>`zy@@k`HZg|P&1Jgv;QtyoZvL53~rF$LpgiWxJu%xnP zc<0rND@&JF@D=YI><0Pj;4oZ;s4tpjIFeO7YYH)nbq2((rs+N!q=uy6U!yPpbPHM=vv7TSl7y~&0RM_ZW8d+ zgPg*jS5>;M>e}Rd1Tul2mQ?s_q}?hC(t@7_&a-C;4mNM>Fk13uOP_&+i}?bi#^C8p zhbP;b%=v=sxtP%NW)pr|op5IGlvPBD2LJTkus;0btYO*3TSOPgNF zhy>m4*;UzO2m;?*%6$lGQ+_XEzN;TA@XmK_b*i={luyQ682NS$kun~EqV17!=%jBY z+dY<4qD4C!J2LkCm7Ar-K)3gG<2wxr!zV@yFO8P)l#!iFnTx2IQp3ppQ6AavC@$b} zTfiJKx26Gvs9lG5@(nh}cQFO*s5XYjcO~D!p6lzw`-nb_Od@F?MA8A4RUm(DR>d@~3U-679MM?sG;3S)uqIW~hlL_la$ssi%P6v7x0ryK|kmn zdo=4A&Ft@F&pKU{>U&rlPj+W&}pDy$cj^E@|hQCmEvI|IU?ak-d$1M<;JhmqY z3xDT}CGW*2wphZRI=5JIa*VWp-D_R2aYqMnv>+)$P}w=qGv?sru<-! z_q=u;r%;*5zVG&LXkNg%vk^P#_ly7+wPGw|ed!Y$R8L-tb7^; z9m;Mq=R!|jTOYo*)@Y8xIG~me;5xiF>lN>0Xz>cPo%~r)E8Sg|TVL?(FbR?|#WUoMpNX&=Qh>Yy}vQM+&w}tP7@~n57 zwKMXtCNbY?EEK80{ZN5=W|~JTKjNG0%$!~pO{U$Ol0GQro9_w$Sk`Dh*6fMJNZ#zZ!drI_Z`f!)-mKX?mo*am zGNZl-_=+@Yw2)jzO}3s0xGo*K3`KMy0oP@;^%v^qU5bF~*yT7}{|G)YxXzwR!}Tcg zzqiA-F1wJpxmT=acm^AvSJXeOsAo?_s2`Xng*Z_3%HAam`dwISR@bq0JDzeiI9%}z zBOnFqaL;RgeT%HZ9#H^=#_2Hw+vV~KA60h`G~|mb7f$NxvS{fZsllO1uwd9Layk>fuMg6wYW<#{nvKEgP%k8oH8C4taO)s^g(Z8NgWF~C&^MxX{xhs>H^)YM z`=IQ$dSj>c8@jjNK9~j;Z&SPMUQM%|Jcxd25mLrmqxZjdQ zvNu-43Daq9(=C&f6gh7-DYG(2d3fLpUQ#|9Bt@mST{#mR#Q(X3luO_M)<~M08x)fG zROihdsXe75Y9^D)j!SRk)dCJD|d=7`0I<946~0RVZ4CSK;+^TLo0e zNhqkog&~ZgaY#y+hmd8YQZv5N+ITIgjhdhxk*v zoaOyiDl+h^*5Y4D&I4NfQ@j?ZwP)l}ud@wwTLpB+NhqkZ+5VApN^71Y3&haW^NZHp zAjxe&bG3NQ?I7zXH78n$*WB%NTLm=7NhqkfS+J~;p4&(%?f~~QX>aKtwA$W8vKmm^ z8{*aWZnAz-ZK9QUwSAOstAN@#2?fBCk==ZS(|N4*)z*waWy!}3Qj#jx!Be63=1m$6^f?XKlk54? zr+c9;YK_oVt+lqh9g5~ppJqy8J9L=h*bW`ZqDo0z(7Abc=pU%SjKxq`UtN&ggnHmz z>Qa1UDMCg@FFzyz&nKwD3Qkp=2!NZ~_(*a|1s8TkVYv#DLge9;mCH7stCB%V)Sw;n z9fCHw7HD@Da}5M-1-D0bY|#URZ%DG}n&p|kX=~z43Ayf4sWxHow`Hser!=%q@-4Ys zii?Nx^B!L__VT9U271dl>n#_-0#|sI6V`G(i<&$Pt3{XOeyoW*2mkk4_wOQgPbW>j zU6mEIpTDQ+DUy5P_iPWIFoS=KbjQqRw-!bSQv39lvz`=?l00|i6F`^r`dsMe?+G32 zKEaOH>l;?PU>z7GOW>2bsO+e+L@gsri~dN<|8q))zVjSBwkJis7f}3ZMKNiziAbD~ z44Qq-1`#6rV5;ipzI5mBLaRJ~;(PeS@+a6+kqiWG0A}YeY}CHBiU}}kUo&Nm+FvJH zur}(aQQ5+%z2ECj^^E8jeuqvQ^>0*J+0&+2M*R!;y*)`m?f&%aU{1DI(g6gQgV2&Jca4h)Y_3b0dFVG)pjl4ifHD~0X4isOZD2|H! zlEIR$;2LO^yMhKjF;~EzI_nC~4t1NnUI0ekmtC^q()B(3*q|dhFO0(bJGW%QM_kw1BRGit56BZxlUK;zGfIi3A z_XpE?v0y99*yp5;9Y^EJ&V#>e>Ay`$FsF$h2z0(h(HUjplC6>^{&8rPoA@X2iJ3Ti z>a2;c<#y*Ru;;b!6|wg1v{TZ!18e$@Wq%X(%`H1nKzFQfi@s6BtiP_xO0%A6ne`*^ zdqK12XUnVU53kNBn-1_T4f-jd%rWShU?`6YhO!L$^h;Pmb_KT1BcNy0Rk~|E+j^E% z7M`oqrYq}e!;tj7(0B`fEmnqq4pGmOH@`7m(~~#fvjk2-QNPss;SJQM_4#Y1lbnuX z7V!T|#ebBekm4%oD5ktpI*RAu6LS>osk4q^HScsPha<0xI6l@zs1`~(hg8~#;}#AB z=?b@y`c!wI!|^L)qlDcP=n?-Rs;qPfb1a8&F#KN7A@E}b9fzPLM}+qjuhI#e2-G-E zU=A3;Ji$bk6FA~h*m=QR0M67_y3gIPaY<#vIq;vgXI{9ZvhJ*n+R&rE)jBv;$uXx9 z&jtEVR`lDdb7lbL*j}<*(ug-gt329Yf=|qd*;8kY`1Dj#PhK-#mTktVHcA?@Cy&T6 zahbzodcR1Fdoce-l1217}a2HSp8iq^`X7eL}Wy-Dg2{gBg?c8RSRt# ztK%x0B+OW9%lb^q{%cBpISu%5p!%zd>L>%2OqMj@|A1Dx0Y8OL%z)WbXASsFUus`o zBaT=>_cc?}ko}2=jxl%roib+s_qtQ=!)FXtRi*9ms%4GNKH6M+FV>a z5@??*3Y+pL7S|-JCCz&ow93uYWdQogQH6uqs^sDjU3|}aa9YKv3u}gbLD!L%?vrkD>vg=Dg5N-Zs#hxl``{x z(n@0*`vD~epAC{%(Y*tT#vJYO5weNERdl>^JI#7tSOknWJKg$=*es6_ct(58VEW4> zMfsAgA7)Yr`ye9O`dd)6J;~P7tq$QkOMowrY0e5<1aElUIVGvcX+zrUx|h)13Kc7Tnh2rbv5300(;OftPfOw6}o7cpIRI z#CWoIL7%$|I~v=?;Mo{65IUX~JG#h8lod$itYw2{7?pm!8A#)(sftewHL<4>s7b() zqN&H_*DDxYI;jL)%AA}>ziJ++?3s}luGjO6MoBLMnVWWDI|>>lU8~BrZtnz2O0QU? zoaV$_)BSSAcy3&@3yQ|zqPxi^0^W~TZb#{eYl|Mhws@F!4gr0Tq{58S*;hlolW}hM zFEbVrar(nh)QHoOS3~(Cb?Dk6p_UW^!uO_m*s{$=K#yX1KLYxiQ?)G_Q?^+M=n<%? zAOiX>6g4E>m~xy{v^2*g;NRv{hkzWz<{1+l8iz?d%eo;8MgXJ1jJj( zMnE&kCP)@M2nbs>yK)Jg=%UFrP;0voP-e{I@aK3COA7vYf}F%YC&2d-`^bI;*k@G8 z!#}?jfqi5JC9uz#KpMwBYw?L;ANJHa?6XSUTTEWdEoUVw{CwE$@=ESwJW$t3xmFF7 zfJe*iB{}br}E0RrMtsw({W#^8fe|n z5g=Il8t&T^2R=kc!(h#Qaw}HD!o!D={F+Y-tr<6%a= zT|=aduZN=Tk#T4SOUc&0ABPrg{KebjhJ@|QbY2@R;mnJ-UsYVd|6mI^?&57hYG1|m3YBJclIj?cRP*Y$f~GpUQWJ>RS_E+gx!4>zlW!+82swvX3w%&paC z#q91lr-C9Po%`nPO80QR(x~phYg4Ll=tpg+Uu^nm$8Fr- z1)5Fg6t;h4RD`p~7^A6hhOf=K>~PlB+qj>`rbOIvZsUH&p~B`UpHKV^W7Mv}>?B0o z`70D{k53HV#{EkVb)+>ay;;`is?BGOo^Ouv-^T6luG#|KnzAkMn;tezC8R8ntWw_4 zy(pqqaV<3B*o*`85^+QKO!jH^6@lt5N70GZ-&#=X#%*f~_d*oF|5x65fJafS|DVtk zB!C)3Ah@7NKoUYx5Ky{`2&jO9EiB1~-67cxyBms#f{1`F*4R<>ioIRM?zMtlua&E! zSg?1jSP=i;@0oUHc6N3)S2Fp3KY0*rYrguezi9B|N z?Tv7(jU^Ume3jdFp;^Tho~tOo^fJ>ga@&fRKmRAJ4e`}RTFmUad$I2W3+OV`EKM&9 zZCH~2I$awm+KjZpeMZne@2B5PJ4Zb1Gmf@JME7nuCn{1dK~>$p#?9Z=7|A0%5-}2S z)OazH>}{tP`$PseAQ0ktk2pt+ykEp+W4JcdU9K=k)tl%O*`l$|!S0UpSBosZ4z}cL^~j9=7y-#_LB5lZMDuy+GxV_vM8() zPruQmw$sLR$Fu8QMOX<4ccgOjH`H4 z46BJklAbo2l)2{bIy0!Hqz@2RyB6Wv1l$VQzn#ZYWmRrKpO{IN7tv8!3g{#}FPdu9 z=Ug->DeB|0I_euw5=aL#FE|&^73q2g?R!}p>W<+aFPm=l3{qHB>Wu0B&fhhtnrc*C z%_Ct{iKE6dsBwBi|zE5YY{1CNHufoN}ieR^f`-lww=Cotx;x9yibJ` ztePj^&AHf4KOyNqWjkq|m1H~dygY=g5>IbCwYk)kvdwmC%bz@1sOfB{T;x(`45o zT$|uvJF!$*-x|;-W>V!2bX2x%Coc=6YBp7)ElFmR^Kz(LOkpI^Ehb&NU@_gL4e)wf zOnL?lu$WFq)l`e=3?2!KNgOqz#iYN(z6?*oAkN45SD;=Gb|0KQi^-`@$q#m?yb5C? z-6u{ihy3L+VqLe~T~2jI+QzY%oZD@mLwC8wbekcDj4h^{kkpIC^pI;2Ddt5rbL;w@ znZ@)xi*>e`UUaQdW){=4LJC&R^Jp<`LQ-ip_qg4re%>anvyv<(o|lJ^RpRL_rf->E zld{cX`rekcRYtOu(^*VkBd2;=Our+kB;)K`OsZhbCDzSiGUpuSMheG1+B3443NEwu zoK?IjhE)e7!rJNS!EV?5T`eZHl=K!;f7c>ho8VwEu~b==8_*|aQssPf)Go4^9G3vq zVw#M$BwI|533Q9;Xe7}sCSAK=FS5zk+7J=QR7)m4Sr80 z{7VB%OB-MddU8+gPl#b##YojpTJZeJt)4AqA_} zd9;omKvHSt-lf)&)>%o`5zouR$13sk*3m0W?`$2tX3N?tBU#GntfQBaQ$4Mtcac<* zarUhvRj}rA>Si68^Nq5S!fB9owB1#_DTdWgLXw`WqZXH2HN)C{uGW!SN_y*P57#1G zo8Vv_u~b==8_*|aQe`f3&6ahPZb4KnqyCUel4X><1nO4N09>wHMY>kODvD{+sJ9C5%>OrMex`tfXpwNfXZ$R60u&kFpebsguhp93@RI zhW==Civ96aQxo-xMwck$JdMIlb^9eh(K%>LBs?z=jpIe=_=J%~Q22Vd_E0CjhT!*c zfWjvBM;96!kL#D%91j<2wbW-b>v)h2Ha3yp32$`OhiuO?Wm~T&I*pCwnu%uoZ3^bb zOa!CvX1<<@Jnm*5B0Z-wKNJu8%Kg=Wsxkgpz&9tbFebhaPrsUPp1-O#AihP7`y%Nb z`Ss7hY~=%)v{Gz9z85LnY)%ehZ96)p;c)}(dr8i%G>A7wV*@v!{DsMmMET=eaKmQaz z;GVT0k#nL{O`eq(OXtSf-WS&73TvX&Gm6|cWjo4Bw21~P0}E=ZLgk@&-753`MB%68 z#pQ8-bao(Kmk@xwksjM-ea^AtKhriAnpxW{Pa@izW-gxgn=o}w@2qSU-JiOr zq(RLQlF^`cEnU%`D$pl%eHn63q(4<)Q%`H6B2}eYsSb;;8Y= z@T`6IRyZm9H^Auj`Z-rI>zSXlPo(~at2SMyzQCNjD_zH#yOlo6NSjDBij~eUYLz8_ z!(2Dp|G{^6FEm7vu@kcvNxe8RSGX3D!d0PWZdpw-e4yYm7VGT9yu!6cvU@GP6Y~-w zh1Bz+_5Q`Oo?VZm<^q=3rA|z(vyz;cJfCv?PNa8YKEm|QPRvJbSzBc!OF5kr^C9Hq zW>C7w_*o>CWSo5`rYczLx+32b>G#!qpun7WlsJXcASdR>uHsEGtUeHu^yI|+!8LzZ zC#G6TdMD=Ju0^;u!NG~iQe{M8I%lK`KdhC)L zSUR8qCe;BJ-%g2Z<&u1xh3PNHut{^3X<;3KK9a|iZT=2E8+0!mCS(#m|Pw7MvCv}h}QBJ z_+C1vyTYr3wH@O?>$oJdi|6IBWtDzB;PR!!>_bvr8={z1j7VYZ0zZ za4@@As;tTl=o2%kG6K0~%k0W%QB`fPzfpWrtS8ONsT*KTt}+cUUEeSjjMC&(Zv#xv zpaBM0dsIy|z&h|q7+~V4@eHsrs?mZNR=hS=R*scpb|kv6UWV7e1{hxZIvHNJN+lUw z1&(zWmtml!_|-J9`k)Wwkz<>wT@9@LjkJkXjb~sb3CKRR?wSv)9AY#+V@v8_B=urR zO>iwD#T=<-Ze7bgyq5ArmZdJ{wm`|ruC> z+YIb#|FkyJCYCjx{UeFPK3VP>%V!^>*%@0tU69m^=d$4>CVOfrr z&j{CA$g6XD%V(HqxmCM7T0Y~ER9c^Rf#suhOOoZo^YU_Gm2G;<$ItZ6mQT4YYpY~r z*`~96%8*k%EuU&6l_Z;e%SRQgxm3DYKIUwqbf$3ZgE=G1XO*jXQw*TxLXw^=pUYhH zceQ-fQqo&KH@Ftz+5`v7ho#D@+<-nYlPb-SYql((G;5t|^K3wYNj6W?@}^rm8*#O6 z?dUoMYo~=Ki+Wo-dIk-!cHTrCRBLAwkA$@&jv8$3nB8L^ZM^5x_GG&&Xo%mPJ$l(;WIzv zt!+n5^^icKMJR^$)U8xnbVpbGgbrZG{*D~5?fW0BH-jsxykOFdG(JOq5Gog_ij@c% z_=vdbTzR69KHs@-qZktQ15SEy) zWYdFPj~(;MFOZ}fGE!Tm6hOX<>y*9Je<*0>S0H9-?x$0Op%~i${qxmCBlAKP*agnU zCpWsrAB{m5`ubu4?mi2hD*o_?D}49@1fMOy-+4kNwXr~j&tD#m#A2GLMjbs~7FUUH zYA}F3=xRYB6d6Q5r~*S`{q(q4o|zhhylcYV|kcIfnmFT5Bp(hm^|XFuTfX)Jz&2^_$j$iBc*|pp4J2pjY|KS14?# z+CnjeO61YjyDrhgX^tzgd?zQ@*Vy)v5Fs8ul^Nb8iU4@Iqtq|Zo- z?F8&?wZ88dt+D-3kT6e}ZJ6QOh7_N@oQ6bh_ceMq^W%xfh-;<#=38}AYmZs&X82tf zy*M^2JGVZStrivV^ij(*T=RGRsHIlQKWDNOr5u2C9`1+sbea(B#M3jumdf?$UQq+}mgf=VDgHdWPPviK*R-=tAkud#^)ZeC zQLJ^g<1LQ-RO9fYxy0ZxHhtx{S_L#)@jxS{dOYK(KHSLT$SfsL9yhFlhGk-^=#yHl z_4@(Sa!aw;Hs+)bDL-aPxn9pV%Acpy{6z98Q!xL_L@@e8a&It^+e31hf3b3?zF_!@ zCfA5(T&wtG-O0Uu#lWb|nU*=k&wcb2ow*7~U+OB=n>sus( znQs3^B~Qy<5UWFPZ)wAwrFk>O%xc|h*WwyvrTX^TS}vA0+_mC0o?c0t-htW-dATiz z*6GUfj6(+`mE3$D9jId7c?T2DBxN(F9a}3oA*vhglvgO#!U-)fA`H1(KFVbmJNhN* z6L}8TbW5XArjFPXn^Us$#L-##N+^iy1fzcm?{jgf`kB3OZam>Im(lFhYwY6VlZ+QBFGF8;xnuFX>mw_@1NgF;; zZ2K$p;gO5sVM?~IPnsv}k_|RVv<_6)1pTp4tnT7E)7I;wD_0-g)@!Ywk+M70RhqIa zIEWYUYN=|Lk(*RAhmq@W%`}eOhU@*-C2Mre-@4@L5~+#yGSd(EVQJKYqR>8lsSbG8 zEcFlXed1vn(H^tsa_sSm+*j2Z=k(^Lov+=FE6b#F3FCbT+Nd)AHfP5BGSUU@!+ZBI zk(=cpx%=jiQq4ovB=m*g=2Yi0AKYTG+Vb*1ELK@tC7esT^^li`-@=i&k1tLr@f{n8 z*G9uJ@fS1DFJlhk)e4v(rF<*>aO$cPp|W#=T|`Q=qs&u@Q!}XDOugKh?$tA|OJBhv zC0DM_f%U4680$rtj}OQoxinZ_v*~~``XEU}d1iZzNkx~0l*v1`Oj1v<97&^40wxuf zoKELkLqPDpYDPp`qbE%FkCk0tSG2!ObwAIu#92*E-OptrW5Ga;m5XJgXjGp*A~G@-ohzJM ztOD+>`t+fbVtl1|eHVLPzyB)thiQw7r&iW3T}th}G`b^BcO1GlM&AQbtd-%Ms7M{xt@W_A)0=5H^3_coZ}UiO z;t)rTvJE1b7$Ou{j~CL_P*xi+_Y^nmKi}Y*SU5aiXv-_tgOcle?Y&; zT5eTY_t@dLM%u*UMu{Do0=LHy3miphOgGNInq$AoweC`Jd#c=⁢xFWREHCCikaW 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 literal 678563 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

HenwntJ`Sb9=+Ndz*8l^# zixjSGz=6c(@IhAr9_BMpWsIfPELWhr8@d?#=&KlByS<9O#t#)B(NGi=hRw6leBOoUtS-3Hfy^%bQ068AXis?YQ zksPuqkRy=1jN}(c&YJ<`VkB7SqFa!>faGN)y)%JSkQ}ikkYka|-3rJ;B!!Ov*&50C zt$|EJ@_QtILh|Enfcy-}ceVxcFp}$AfZUAa%d>#oisZuWfLw;8`=dZkL2}q^AV(wF zwH3$$B%8MZ*$T<}bAW7&!D z0CF0V^-cxSjO4FK{(CDJoi~3KSuKC=YTwcLqL9nNAeFOO*a7f7n0S!4CGHp z{)*(Bn}A%1WX{b%c0#iKEkJfgvh}S%wnOsR?LeMFa>pG&?nZLwSAl#3$!G5bay63E zz6RtBBq!VjWEqmZ?gp|yl3l(IWImEDz5(PTNNz>)RV26F1LSK+j{GK&hD4NM1woCX&m(1LQMEc6$KG?nvH6@_Qs#eHX|VkX-X1kS`)R z^C2MTBI$S-NEec+-vhD{lD{GOCz9750rDo27rzhWr$|2gA3&}~a@u1+&Oma)4}dH~ zve)B4_D3@72_S7qraTE`LnQAb`ClY|dkV-uk-YXakT;P$_Cp{~A-UrjAa^6V;#nX= zNDh1s$Py%{J`dz{B*(u1q=;nC7lG`Dq~*szT9HhC3CIRW*82&NW+Z<_@((1xd>P0a zNM86Uke8AC+kpM`_-{6=|e#ddH{sspk>@5rqdY1Kd z$Kwa~azpE7{PjeG<3uTyC0gI$55x0;>JSXJnr&X<7l@L;h_j<_5XX}clIZB`hSR1H zgG0<=!d~M2l>n|U7&;6_PyNLK7>5B2ufTwT3ycSz`s*$jURPFCU}z{j}S8aQ@6*-Mkru v6mZ~F0)691U^C9LHYrvR8~scw_jYs-cH(Gj1rB`H?!+j87*O-bX50S*Pz;zM diff --git a/docs/build/html/.doctrees/api/warnings.doctree b/docs/build/html/.doctrees/api/warnings.doctree new file mode 100644 index 0000000000000000000000000000000000000000..a1550f58fc58c398e083e104c1cf726c83ec22db GIT binary patch literal 21936 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 literal 0 HcmV?d00001 diff --git a/docs/build/html/.doctrees/development.doctree b/docs/build/html/.doctrees/development.doctree index 897726017888f870c346956bfda8f16687eb7ce4..74403b2a5626604ff1263045ee43062b19479793 100644 GIT binary patch delta 54 zcmcbsep`jLfpuzt&_-5sMn>1kwv5tj?wKVXrAeC;7$x~9R|)K%yi>?!a;aePB~!guMaOE)h%s delta 217 zcmcbua#x+TfpzL7;f<{3jEwG+Z5gFG0*dmpQj<%HH^(tb@-u2oE*IEsCgze_mYS1a zkeixU!et8wQ!?0Nr(}rs;E#n(!gZm7(?va-L@TJ9Ikqdi z^Tys>`xNVSkHfyWm85rQz?&=o;5Q?P!Bgpr943# zL@cV2Vt38}Llp~^@+j+8ESu}@C>4v0&d_vsp$MAKgN7?cc~B~v=_*CLpxnL&yPe9$ zqA4Q+T4RitTf}*x5-lGsR1z^Vz^9o3bqp>QI~S~2P++PVmH`tNA{JL|<(6DNn>1p8 zkrvBZmGVH~F_8rrj9kSn8`^3bu|zhu%LHDn=Oc{SyxEn2HzzGVVe!)Wp*5vUDw+$e z&c<1>^Fv$1tHV&Z`(PqmZrKAG0c}^x{Z0rkhC=g3%7_*~tmEK3yd)eq_AENSYjJF8 ze8ou}OIC#AjP{~Mic)MXTla2ScEQrW$c&eA29bVrK$Xr_>g7C9OYmZwPP5fHm8 zZxjlVSSng57=_Bg@{n}200w3i2beQ6abq8Y9tUKkQ0nY7_wgFmKb$YHItZ^9^QBl3 zc#X5NK?mV<9BNfMn%@=A?#)z6<&nm|SgI5^Se*mf9F^sfW=6f(ciucO_OQ6o87-xX zkv!m!=^`4BgEW~K6N149s$;@n{2nNeWcSk9cnNUB)WfcgE@oqqYzIRC0H&BX`PJjp ztC2zi^dtxZWCzBx>8J^2oC@!xBb}h-Otxr5@(+u5A34H$4l(MadORz`uTD#7Z&kce}QRRjAZ z(vdggP;uJI!*>}*F0wb8&j3CdFQW>jT#j4Sxd?PdbB?Vmyq+>mjRVbb8w2vwX{KC| z6)emO2Kz>goSDjYF_*&5050NeG}jOFcVPWUXDSK>9{?qQ)}r}tz>ZL3-y8sYq^O&c zO9DZMrK6b~RQy7ulurTqK^e1{Gh@5DnJ%s4h}o6N<_*TnSnnk;NEg5oZVb$n(#$y? zERPXKk%AF}qe$Gyf&MlgRUU3#@66`Y(ISU#3p~SA4l-^RN1<8F`l7~xmDZVEVSZ^q zG1>vvEDzej{_;yhn4etG0iJ0WyuZmT6hZCmPN_UK9o=W9p>Xg?nJB9fk(8N%A0yKR z%(Rt{1`ZMtV5kEs7}QZ_EPlz@4QdCxaTcN3vY%t39dJ(zMy^sm3f#|-VyX}Ur(&xVr>6=2b&FjYKUq^xM4#gd8j1vTAIBD{Qds zXhd_;HyH)ja7iMvx=sAuaUOH#yeR}n2zG%67z|t~_vaqL0M!VPM*!Z5Xu&LiD@Xyu ziEJv)-hc{axmILK{wn$W742^UB4C->$}26pCcf!+{kOwCK+xoC==F!?PrjkH?+d@*icI@-PO zc(&2fHOY*El=_(^AUj|u$2`EY)ol$1V_Unvx!xr;dkT^K{hbm2V^ zVYY8FJK76o(O3Z9eizetyAsQ^gQI7KFrUoJ1pk(gIz=ACuR)_)jFfV5aOlu}@n(IZ zdV`syRE&XDg**j7UI&CoQ1!}!4m5F~`D`Ydf&v%-;LaFMNO)RiQ8UKtw_qk`fF}X7 z?_yPcEPv9y6ye${_j~;vSAuuuHw(FxS+sC*(7MJVoQM^O+C(_6#5G18h>sKR^YDOO zvO|P&|8S871AaL#_km38GlmdJCFB zCC%C%V964R-xFc#0Sh?{)ht9|J%n+LoQO+VyOz!sp`nF)z}sZ?mRS&OP7bUzO}d@U zq`G;~Xwv}hxg91-59N(C_!jF4W)Zmn_8fDI#ctkMu-mhxcNsk>09;z8#ACQfED_Cv z;|5;^tWK34O+bvo!Zv98Qf3<9%byr4J;B{aq_C%py*fs^QGj?g#_D=`RNUMXc4Ctd zI6jCsr6)xj#e=cR`Iimp)5i|WLf}TCIb)mAwRT^w6=Fj06mvtD4hg}(JoHQQnUJ^` z&KunKw=TReJn#53E}D7i{?@sdUD&>}y?y6G2(ah0x6hnCXYMJXg$qM7XNS@Tgs&m+ zETO&7S{NZ{8o`UlEn-9V4;iv>-n=29d7*7w%Y~5TapNIo&QK?qHWUrDfy)ZRQ|!T& z5bs6Pp-b7d{h?ws4^cCJAXLnT0Fj_L_NeomV0*t!IJA2E_K>ZxP_{Fa0Xo28)_y>| zEMzW(E?u)_^LDO{{h=KWM;D7?FAnWBiwVK0KuMgvy>N)5RlyH?u~ob>-!8^hE`Xy@ z48>B}j1fA`5+}@0nSiYjoExA_rcLool=BL4ZHUEwo!wlwDRYkz0#3QP%+64&rA50C zW<{VNc(gf)3(@&I>;XSnT(NV8aRbpdtqobgiamcnE??-28_$#84^`FWEOx82qcYoICP$wN`*R% zP>%I&01tp6UUV@LEr#}j9;_#afMnodN-6$KCe)RWcJQY;f*=n7a&yRra?oW2TZ7U0 zElxhs;bUTPo&CMahgjv|9~~3R8kKtC=&(6z6mH1@~LIA7W3;2SK1J z8T)cz)6QtBV9XCOU&APfr#3N1!we4goo^XN+;Oim#jItn#rrVxDXetcrK|>z0+gmt zpC4jAWKA}}6e;Hy}G4i1jFe$Eac5juY?nrFpv@~kGS=fcH1y`&Y`uy@%%<$YBI;aA1uA&-_U z-5QyA;XG)JxcJN{vUivpnl0B!4q}@Y6PR1a%I6eXg+)k616Jl2v*`!u*^p5+|X&Kofeuihe}=4ZpZ6vV8H<=Td*2>Xo3WC zz*U0x>EyK!8m3GrS%TUMelG;QsxA{keeoWrXsg(%R^dW6ZM5!TjVSy8tGtz$xn=E> zRkfh@$XZEe&5WpLqDDgm#S8%sd>e0yp+SY7j0wuRZM2>+KeS+xK))v?Wo*pFXAe+MiaM9}$nIx8~vC^L9 zzTpt0NkrF!_hj7Ep3_qi*QNffD8lZg#2}-^<8rIx#PZ#7s}m1gvo4kB<#s^+nB~SG zQlDZm3Ee`LcH;d6kj_dqCT_Q+0H=|FUJ7JvSrJxm`NRn8wZl22Sl9zeNEz_dV)>Lr zv6w5Iyl`PGo(U%ltkbY3AI=!Xg_&G>q4n&_B@2zh(uJV*1?hBZL5y(%4_8DgixHC~ z9bp$>r5sousBe2KB=_6rLV}2Azt}5r6P!Kdyv6+s+5Mex-+3Jx36}V>@@4SG64nE< zF4-w=%Vwajk@h7vTEO#qphNpwiRE|>mPgy?48Redse(5rIal2dwurKMQfIt@%pXa_=T4J2IBxNj|%-1M!i>FjA>@oxl>d0ny!9@TSjH;xv`FwV70pMVj z$#Y6F$}C-o>vooWB&$0-^pvv3liiDU8qNteS@KxA&j(DPBElesnFmGj6w3(reU|BG zuS|3=2S-`R+CUA3T3}{6vk@=IN7|P?AhRzj_#I{6kq|t{9>;;YY2VIdAxlz(Rt|t$ zg3>40H)8oLBypVqAEtgrvuN|ox-fv$mU*WwxP1EY7sJpPziTy=aHoGM1LG&?XZXo6b0cT+~e~0*d6m> zW}e7$MmhIdgrzHB5Vnwj;-}@hVIVpaVUD|$*$wWV4Oc*_9LCPAA>afNFr7~DY3Op5ygWAgD-Dky+rR^c1 zt#fas!7Lz3+8uQp=icP+K|m)WpraR-3i*W{W@cf+WOG6)auIBpkB#G5&yI4QwQs<1 zyGt09$wmlSHH7hPrbnnbe4vI!Ok9oLTsMy*`E}+^?FbWc;Jcw=1Euq!Y(Cfwft+=X zH+eAPmVuFgJrGdHm*p066bo|rh(6C8vvI)k0DcZHv3o2@oHqC+wMDov_uj$svCchv+6JV`iZJd7eGYgI-kzpB0n-8Yut39k2z;ONP$6f; zOsFuY4vkQ&PLKfr~iVJNTrSb%s9jF)C z6x0hCKj~y$+wt;En8J{-!crCsd*rag)VA_e`4!9WvcSEQ>5u!7mO?RpG6Q9_JUN=$ z8|^MIi1H*ei!Y*SrhgLwQbX45pvp-gI8KO+B^Ny$CpGhJ`Wi0}Pz@ zd!yaUj%xr@7oZM96wqyXai|UuMY7p@fDcOoMum+Ei#x!cRD$qdtd|e1q+0@e#dV)h zhilvd3!zuwiEwl9q17i_QRPG!6X z!fJlYZfy(QF#CYd0~*h-gX3qx*sg-p4g>kg{Fe7}1mbmQFPJ+W$!|l15fQUPSR2t= z?$3}8+8n?U4+qdOhmk=x387yny91Nj_=|u$02doLVD(b4(aEQZL0?GpZ(wMx0<4RB zR@~2mhzQT-aKsAL6wM-dWXMm5E+sH0uCr69!%)pdj}WGL2o>2k3Mq(s*^nWyFoLti zGe&9X;jljWXnx7=1;Lm;1o7bQy;pg9gS%MC>K~fyonwXoISMCQBQb2==;}i3fe*-5BhYMiJDF8H`V%HZY!pVP#>n9`@*^ewv zEU^zyOf0nzm$lhP(-PC|!x@R0_Tlox3j6S+gXI=0k;O_m`JjE{l*FmlAv6!!ERTRH z&b7p8iPP;TXD8;^hpQ87?8CK*b@t&|4m%qT*w@Z>jy5_+n-ZJt+ieaXTb!eLXMfN)phs%qdqp0&>MZ+8qSGY~podKEEdBx7jlaD~aj+sx{9JYO7g*$l89`sx&a{ zDQ0CS!tCk9jftE1-3Tg*cU&T_>gs&{1eog(H9dB+J_G%zGNRhlK8TH_^9*NV+ZYPUr9V}A3l+I(mwp^0sH7F=jdyR zr|pZMaV~z{A@mLB+Bcn}ZzaBMzw#aMkd_PmuEWOnoTKkM@BF|ydd4~WVd6*j%fC+i z#y z{$d~gHSst5@E?hP+K2zP3wOq07CWOV_A~#npGmTHHwTja`?B^Xd6az87fue^clz-= zqFGAzhm+(0_G4Wb$c|gsk40z@J09#_C=U}u0x&-sx~b6L$i-nUIW)S^H308%w76@7 znMF#iiBro%bKRvvu9$_4 zjPb`QOl4=s+GoeHvygRG9^t4#?_K>xsJDtZITt84{Ne9YNp6nn>&T z5uVHEqYTxca=3w(Yku-O0Q~ZCTVUiHf>a|UWtrHt6^Q=C;-cZ3%|gsbL0bl+I)#eO z*9zb!c@q3^Wt_~;PO;BUg#)3^)7bUX?dxa2fl%2>=ZRJ9i8I-cRiRe1<2BNSwQy{= zP|0=d#(L@QS@PWt?8e#B-Hq&clXPJ-JAR9F;XF9Dy-xCccH^zm-3!?9h0=v~cDz%% za1k6k??>Q72zaq`6qO(7fD=cS7<)3o-I4S2kQ~a1Q6C8E1>>+P$`PNBK{+&kL6$9tTW@-Vvso&~9An=QzlI5g~> zHw*$m!qSBCDMtxX%HMfPEC||ZQ%dH6^JIbjSb8n8-Y6MKexvYXih{OA^T z&6fFAcG*68pM2;2@|_RJcRncJ`H+0_Vfo}E^2tZx#3}S+@|};%C!df{J}IAk3Qin< z^lACzHu``L$({<9Au3uqlCzXruR&m^CgIr_SM@(nmiev|!JO8OQ%{{ayLwd+e$2OOHMa$ByQH%x*j<-F==N|3td*0vtP(e+nl~pDy_`ICChy$lm!m z`>}ZZ1spqud`Uj}C7f)0+J5d=?44h;AM3^6u;c%cF1!rK4y9M*li$lHugWK{!HL86 zALKi)!%6ZD_G6XzNBPk|^Aq9FN~MnSa51%tFK2=n2Ii~4!Vosu%DN(E7Jy4F4}@t% zY_v*VUOhrAj0!s;QOi~)2y&p1lCuVr>_>;O*PK%;>%9)s1FA1Wzb6CPG+u`LwAr~AEWn4nJVnDuEfW>etua$9 z^e+!(%)^ofZlv;1XfKUaHpfO7E7z7s@^NgIT(*?U)7&jAH_tag7-3+v)5fHxR1Qkd1N?yq>BG{Id?gI0WA0BtDV~rS-B8#A9%O(z&OX! z4rtuR%FbgGoW~>+yANLHJm`Y3iseJjBQ7nlr;Q?)*0s)q$2o=O6acx;U++9W(S4p_ z-9oebiq2hu0m5r@oe?1-b|4tB&ra2Gq`2EUgbaogU#3m7PbuGLr39QWn({kGY$7* z0=CD1i3BiT@Tl^5%hNhXAIeysl6RT*sbDS6(_QoLg zYi!V?vaxUZn5ws|(d3Q&mGZ%>vlpt_f?-*>oR|#xhN-~CKtZpvaTQF{w&n@3VJ@iK zV!11fhm7`IhgsUN9uY=KKqqX{xfrV(!6sI)xpFYN&h{=S_l2oS<>6xRF_q1yR+?gnS+P1HdvvS51U4@lMlIrPhQCSGz)xN96n#m2}R0*G!TAFbp=Qi*;&?~*ax&hmpzVaa%6I_#Ulb|Zjc zb}>7nR35~}Y(W}fN>3AZsO5LLeWMPo9q4Jn54C({MK`}%-RK``dFs?l_#LVBKh*O3 z4dSA=Z9mj9b<2DB!=8rnP)nZ+#pUYQ;84qpd&C_pAUV{s=r(b|8<`wxdF38)U5+&l zwLJDkewDkMLoILqeEfV6jXRn{E&uub1b)Vx&7qdR%$~^4n43A&l8=is=4uYL9CNcc zWA5fq%Y9FZGv;y*wVd{*IAd<-P|FRICow7|wwnr@HV*h<6OzkAVUjgl?JEK$ke+X~ z0<+4Ctlj6kI6&Qk2m3M4a|7Rms5SX7pb60!>}9kt9BzmILsaMNgk%LB?LLhP>;S@p zzQN_zI`2tMfcrv7eL*zK?JV$u87nsBSv4PYTVVI;IW?b_8&CK7Hu1dkyDFDk19iB4 z6Wgn(eJh{K37TM2I@#im1xvzaldQLpsW8u66#OOYHVl7NGjh}DCQ8Zo%)uLm0`*l}M7 ztFqa!QDYwWwYlnRwmo>9Z^u6F8)rL;5eF3YzCkcRu=kC@#**5h zey}-h64`Ycs)Xtbekv`y>n$4OTrR8Hplf;TA#e=#f426PkH!i9!-_< zBE2ZsOnw1wC7*;JU@>_={AKxvFT!7V?IH2!Ve#k7;?HCJPbv90{7pUqKTtYrEqf?^ z$XYjdDHr{HprBK9AI3%xg0I@TA+*ij;1K*GvyTw`Ma|M#v)V)HgU++}EtCuXy=K9E zdoFnB8Yw+0m;HCmvitR1_Mo+vtMzDmzyLj4_wTvjS?3ukXsh^oerw40mv6hZ;GHfu z&BN7bO|Ay?%+;_BQo`6%_;H$r5A3<{q35vifY5e6ARyylzGm4xt60D44csh-FXUoR z@)p~$9~2(wHc$X~AfC;v&&%jDVT2>ZI<_HSbZ+$Wm0Shq-~?BTKWoLG_2SP4{>O5H z77IL$TAzhU8`$oKp>?n)TGt+5AreD#snWQAw0>$5U;>yA}thMA zmzA<6D?DpopOrD3l^uK#&zFZ=^>`?ihroVrT~+ZI50*qQ!(tKT=TAM zlC_^n-UzbREXkWB*1RNn8^K(9lKW-mUz6NPGH)jaLYM;*4ue&BG5o=5oEY?Auor_K z40U4AgPC3odN9q4K@TQ>3ATT=61zN{6d~bI=w74@vDbs->6TN;UwB?J;sB>s_0cjM-PLDvK#6- zEM&pHSRM??^?^`y3D$gwNPCD_+rtCb#8Tlp%Y$9+M3E0Ltu_#emVMMBDBjB{Chveh zep+fx-c$3={Wb0+zf|i6S9y!I(!8$1N3hn2HAbS_;Bo)I1oAY!Tk3R57NY+Q=+Kmj zv|oAd3@f;TZ5a7zeAwwyhpPm$8p&?~FM_L|(775@*v0l55Gj3Yt#9RkMfn+r@{c*? z227o#Tlys^%MVYYuQkD|gz(z7HCwlAXxp*fW9Q)m8?$rrbw}hOK%zM&UV=8UB%NaH z7CL`OWA`UhwknC_bp;@g;*@Iofx`}tiB;gRhfZ4OdeCtSu+@kckkGM$tRt)gSd2%9 zEnYs8Q50GFE3FvuFhLSs1|8Xg%{ ze00!xMB*btrW`mvrdQzumaf_p@*^GHFgc_OBRA?}F*1fsxduiI@+e-}lduxeujoqCX(inN`iG)7emK)B^*h}o zMM}FyQspiB7~M{`5!RC}P%tV@9|$XQDQ(hf}_$;fPqk4vxBved(37toz$@h{eE3T->NgTP9$_xb?PS=usjtTasstSES3k+)Z zpg%)a6V@A?PVxq@n8L~wSfZ-U)~D&LBC+xbGUdRrGP5>TU{(>|L$3-fKhX!vkI8z% zg5`_`!D7p*qUDElUXf_|KACdhXqi(REwEWBe93{&rm6x=3w+yA)4TKs63vN+&ukDd zlDH~nj-s=R#LU0{`!J)nMl6Z7VcmJKf329HScR7p_3^TZZUAJ+LTrtyMOCp9rn8E~ z%JF2%f%}&Qihp4WgsDNcYk}o@?87;1k#iMlqWY-0h^#Pdvvd~C%hVQH#m|LwrjhtL zpG^6`0Y3${L#_{g-m8zFcas%%r10Yit>WhZooOU~t|n6s96!r@_CJL}7WOY^ANaLn z#_BBbm-LbJMY8I!NZO|9iG0LYG4%yH`$$ZEj!ZdlOda1dri$=QoQ%<3)uR26K8}7v zRu>jW>ojp>iL7Ghmvokq*!ek`a^TpR-y?Qluv=^~UIm_G25Wb^MgxiFbh_5-fya?q zMbFW6o{{JoMy4D%dU}qgVe1X{-A~xyuL?eA>ci&@vcj;wM>Cpsg;w!%DxGO0eoi7& z4jex{d!Je%P*xv4DYCw>@X_=>j?5~0Oghg<^mLLb2acX4J+@u2m5sr_xRp2IBe;qW z`hY%&ZY8S?3!*l?CahX?6-zhKSw~{&1~TQqvD9-6T_czHb$tvyMOGIULz*$PEwYN8 zC+I9AvGW+2a^Tom*rOlfpTdFfL9-o_s^Xx(>f`54vdXadIa|*M$zrP*dV|h35<{<% zDF=?BS-u#uCP=~daquDLYUIoqqTK-t0g2{xz*f?c;}urL%TzkENW4rUQw|(2{$pOS zO=_`J;Ctg$qh+f;S~io_g!MBGjCskTs#rOj&MFcs>&cV@$4aZ>Tb${+(!f_WVD{?+ z<`S~5uz*=jb1%N~s;JpZ=NE~ZBAIgFs8Oath6_>l)znMi1FF(+sc&xZGy2&1G+AR< z>};T6r;gMrf<8g#8i}Bfk|_s{pxKJwv6^@ZKh<96$NI?mAz4#cxyat z!d(uyoX#u~ttWEIy`AXRelvt$I$sl!f7;_axaIIlkc@LRh?!!OCL^a$x6d|DSbGp@~dzX9PG^uQ z2M(u&bsIk`ZCMLUC4DgE$tuHw=^X7QuUdK)N?AJhNGPSqlxsk#fpn6akrJ7P21o>$ zks8G|6ka9vSN2Im-KCG&JIJ=dVs@d5S?NO?VO28A=x)~OHac%eM1GP}?hRR|$%-DN ztc#p#dQRWgKcedsnQBtE3-Wv%tDcOC)qgpG)(wP3@Y4W^00ZIi47HwbeE5XJx99`)MzV#lKvnnM64qa=(LszYu-dr2OlKGgnBS5q z2M(C|wE&|=l~vH0GC~_V6M;l?dRsn=4p~fub2h5zDu~9>Sx16s44HD^AevVTMAeaI z6@)hELuegYTUhV2NyqzC3$6laHJx!JfL4+z*8orh@v$3Xiy*225&?$TBN>jxx9faj z>$mHp^$N0SuxRz!37R=P@pWY$RD0yIEbd0rm(e*x!m*oE?hVm2|4gE+1}UtR^UQbZ z8~S#-I+0^ZPxR^m}bQM zELlBRFQ9(>g!iy(c!4@8=4a?EBC+v3GUdRrF{ip&a8s`EVT+hy#LY}s^~{WcM{DDx zACPEHcw8gLTni^oKrD%?Ml^ls>>@Gqum3*G%up~>9THagl_mOkIe~5fWTWG=uDM>L zQ!T2Bl?8NGkyx2WrX09`sf`tDYHGD_xmX`7JIQLowm}VI#THe?$^~>*kyts8OgV6@ z%&O&AB-dQ!S>B_MmP2GkVbM}!@TyizWO)`zSQRhtqBD!c%T;8`HSp3vx7h7jiw;!- zB&vJX4UllT5Z}jcfP~A%o%~BrQSyhUl8lQ|hxp!mtq*k9>^ihI@L^v5t@Gilvzbn_ ztCZ)TZt#3__c?ME^RFNO?$@VJ+3$c!UjjSo8Rmzjy+#tt9SeC-#!?oC->3kp^(jOZ&WCL}ez8%L& z8gTlRRSnV1k=k9NX+Yv|bcvLTR-ReMq>eypV{A*5|5lPN2W%>+)OrYCGJ2s-oG zbi~N)sRF?{z>{YFq>Zc@Y`v}v0$U&z1RLoLAwh5!nQ{#fG|*7HZM|?a4Ull#`acLy zb>zP4IOMDyJGT0?D~I&)_b#$gu=qR9aYBh=F$epfv4A5iNusnZSJ8PvLhnjWxq%?z zu)CGft^&eEGi_u`MNg=3pT0@&rK{05b)vQ_b9ykTBavd-yXZV2O?wBKvf@>4<0Ot; z(=tiI091>N5i3Ugu<#P_rP;i^NY)Ovdb{gE{Hu4kS~3L_FVJ~IV&XY6<-jp9PQpYw zx-XJ9AZ=h2JicMXC~Z6p1rp7PIgjtjH^@>cSQtd-3yFmRWXgeKVWNbEj%aLGwzD(R z2|E>M^By>yq7R1^WaVJpL%1h6R0*aaVkw<9BqA1*DF=>-sS+ZXXXuW2wj+}V{1f`9 zFvtqRqGEARsPGX^K}H9iJtQ(BWXgdfW3q&dTsE6xaW)Gm*skUtZ*ikOF0Lo52aAgn zdcuVwnu3aJ=*%HeQ6^Ik92MiMQ2~u_0d|S?AmVX-L_A7X4HgmeQHZd`Qqb@)oiQXD z9wbu^91U_j5rgljLM|&|MB_%@>mgp($HS{+8v3U@mn(GUWJIN zKunG$ri|9^a7+Xe&FOITpJB#NQ1h4L=mjF}Jcdj;a64l&4IA_gy^gFMY}IFmUZfg& zHN8Njp;wYA2X1Jji{GPf=K@(d6gw|g?VO_*h_rK>OgV5nA0q{J_83mppw!3pZTu0k zVz4%D?J2CYg;H_wK{``N9K4TAIdB{tE8&3cQ)i`*BgIlKWmEy;d-{O*Hd#YhKrHGB z5Q=mvGQL6Q4vCDfktqj`3``>VU;2pn2U#;nMBLb?&ryBYzcOq0m#EhM8@*(twf{_} z9Jsa7>7RLHv_tthK%#k}{E4ciXVMEqT6!9pa^RLmrF72IxAG3MYLFG1*XO0GmCvCU zh_rGWnR4J(CM5c=(zo@MWCc-dy-cTQYZ$nJsbB8wF)@*-0TR`-#~L8vav|nCH$cMW;=AN|yp}qx`Rf0H+1)kg zQ`MYG)5x4_K3{#v+I=x2r;cjPRyajgK{%Q-BZWjZUyK;c!k$sTv-GXImab6W35Ke5-ErU=)>TAPtbHb(Ii$7E zAX8Rapi?=Cnzj6}!(x&L790%lNrz(8OnIw(3HZ{SX_zN#2kD8+?$BQ?PK0dxhRumQ=?&dNM`vp&=5a#$$WK?1Dbvlnom^?+M95_tI zdSH?^3WaEwcV5x|>7(L*$$G(}!X1FBg$i3Fr5X7vohc*?-Xv2F90tdEU|?4wGj3#x zW~XU*W6rt9XonZGfkbn96ia&QQG|V@Q@}BU&L0vSAu{E_!7;%D4r!{grzi3jeN=2G z>jvv5-1&#K{Ddr)0*9@1#*lE>Or~4|4h^J_+zgcH`8Ghp%|MOjPVdO|g+}pJ-K%ou zs!}nrR_PaCqmRZi*)&)*&hqn7syqq|57Ie8!tkAB$_fmRGyuli3Oh3z-zFkk6$TIM z!{9-(YOpYH*H}qTsg_g<81AR@g#^Rr$&{&JXe4o5KmR%0)|-lfm-R95Te3#57?@Vi z6$n`r%m0eb4bt+z;FNnq26UFkp5ZlX*R48t(~iiwZ5!LRoYxlFymtHcRqNM!0+2D| zw8PSoK%zNesrwBspSsTNTvJBH{=?~9BJDqfOj)V$~Az{Kws1C zu8J_F0TRJ=R~wrA%CnQ=id? z`=zbX?o>7!-;vF3isriv6%T#JYsW1ABI^f>2jAhkx}qtt_y?UiBrN_$rW`md#3qH1 z&e|3&8k@|tSyTbBKpznEfJAdTICX>ADxnl8%%QV|gu+ZR<-nmZ#;!)&jr<-Xuj1eW zeH@%eRtwfKxSNXkbaZ8j6cFs7^MnM!Ib_O#gJ3KN!D?ss4;2OP(nrBnWW8Wf;5#ns zE0O|(E9p!jVQ@K_a^Nr+#&x#CZ)ZV$^WRI>2iE+)(>gt(C}zKl&J5D*caSLuZuT*3 znIxO`>G;s99L7uf)_;+#7OeGshqn}o)cnN@bdHb^c#cfD1_T=DbGqGDFs}`?&?!`KUdbiRX>Ix%M^o$6DIg zo5izA9qqYp-tM%=v#~Z7IX_5NujS3$&riIMtTm*C%5ECKb|&Hj6n;WkY`IH&Zl<$^3;-%* z$`*5O(|a8!aij+}*F=la&1NATEyfalVE6`bMXPHH7`{f7cgi^rpB%LiJ7`{TL z95@(8@GcS*FpBa2NM{FW{6CN>2X1^Zb_Dt|YPJb8 zCu+NaX+VM&0AUf}rUVrPcqLL`a4elCBn&2#Dfbc>tc7^FCJfHehd~=zF}g5NBvN3o zk4G=WY z^>cfVq8rix2{%N|H`=yY*`dBiw)Z%6jj_i_Wpink*^oPskB|ZEk3J?(PaVjI8a2M# zfqa0II5HhbzJ10p7#D&BP)Df<*&2`Le%dU}m50xO43b-@Qazv7*WrOuHTV$cZ1gMi>6^ePw!q0%O_DIcYj~Ugz3rGod{*oLVOEa& zYUaL^r^8)B+B>bE-_DPk9Dr+pre#2`rR=*_ri!8 zHv)fWvipt!nP>RO25hGhGYkA{8!U5vjQarlsC+b+Gon^fU3!<@GBZUZZ;f+^jJm{- z`$2k^Sx;^gvLr76T_)Sv&qeI#V)oO)e&Xz>6Ml^34tREB-{iUQr!Dyw_&u0BkN=*} zf8Pqf8~Y?L;3pTt?@kz2+sQ8WPhJFn%4ao}A-CmL(&U?gtA-%t)_egWt(qU!;R4d+ z{p;2I+6muAmM!u2W7c^_Dwa(fp<*^<4M_a*ZMPOeFep)C(GUM@^E6LO{!S2)me}+6 z3ry6W{K7jLRj2D0-o{BBQNO^A==cQ~u7V}Jsg(EvHXrudT{2_4;9|bWYx`g}#Knhw z_~{56w34rcok2$ zp4=!2w+<{9#yH&FdjB3-tZCXFJj0GT)X8rbH>xEUvO60kQLX3(n+Xvqh>Fty373lr zjS6D9ysMAwZngtAi@8>Em3@B|h*rV;FqjCoTKrin{;U^&Ht;|G;X4z>-`hO|ZwZax zQl+k*%d)EZ7aS5dauN-AyGGiH`a3xseJ1ql+2HWjd^TQ+Rb__BYPCfDg(K=iWNjfW zQ+C(xiph6jCqoggmdWDEwc!JFuIi3%xTd|YQPVcikkz;Bv??uxt zp=8Q|17l7#Fj7(2%@owjwkV9Vgs;KBoaM=*t10)5L9z<(MQX{a_>xoT+#(^f zf=oGZ$SkaeOd94*M2g)xBjRpu8Hwie(QdT?%IHI97g=Rk=xo44rze>e2qoxTBOzpv zDF+UrdDRfgiMW&xFcsK3Er0a9UmrcUkhO(H&l)^>>WHfV=SDiiNZ?#grW`nMmh=Ri z7&KU2*?e~`1U;>fps$kEhDFfk#u4Nvw*sZd>6{~>^eCBf;81F<2_>Tt%bR?;mD+y& zMIS$ZBI^o^pEDc4PqnZLXkMqYiv-Q9WXgeqCR7VFY(-zBBkG+wHhrpgXX-d0(VWiI z$#k$dLMkAcLT3{Rl8I!>frI4ux*#cLVMsl)yA*|O;EUa!e$^Izylf(?3+r6gHi(xh zc@^kvpmU6b&N?#Xz@am{CUp1?`YW9j!(GDY3t5@CcSnWW!50Ge1pxZ#N zND)>6&A-T|Eh9nm4>IMzK~vMa@U2JGPV@=-a9PkaxHRBhBrz4B%%d}k1j-yT<-mb* zT&-rPnB_xFo;GNwK1wbis|ec$x!)e>aVXM`Rcsj*h@3~~5($wVWXgdZ8D)yMkH zJOxoOFY$)8hxDQHF0!hyP$3LR){<3$%vE%5k&wBPOt}VR+}Ub9PXMq;e8!m{Atu-~ zK*F73ac})87KeY5)kxd9Z8HkFY^LCa=o9)7eT-}xEJWQMhH82mdV(}qP zxq%sUhkcsWxN6&mW3b`8cW%{d`WAkLu1e(GDtB-39xZH%rr7y+bmowD{xzAh;&Wc& zB#zvKDko8A*9&)IV#N01)x!akj??ZXjRz9V=_Mf&bv=lx0A?(mStMXaktqibn2Cx9 zft?t|f?9cw^Ll-ZtRX80+e{$l-#Hj@q*GwAiq0Pr7N?Ub2M&uy{76wBBfH6(!eXTV z3^RU$I_WY)FA!<;U1Z9E8yyo(d{p1aA0lgpV&p}tk>5`*5NYIF$dm&&@)X74J9Cn& z=3IYA-_+kE>j!J<6MIg!J3ikLP=&_RbOw>o_$rxl;Lt$E0{_&<#ox)w!Qz7X`NgW8 z|3WViY3DzYDF<%nNs0?#IY4#MMQcdAV=xOyG^b;*nBV{`@l;q$r?ZEI#c^cHHDJ*| zvdPU?iA+TUBm&G=4O$0t*4UyzPu4vO`joeJKqv3q1wa>(O@ehg?!LE57Q+$7GOxSd z=R!I=NbH@@Dffo_)D&C%Fi()P9h@TmGeF+0Z{GuSg(9<5%WC_Yx&kUTznab>(&ld` zQ&#-V6`aJ8%T-PC(VaaQCFdT#2z+T){V$NUgRS~?;?O$cDZuy~ok1ip?j}zAf6y=1q%qYhu~r< zKzNMK7!nANkSPZagz?_Uf^Q$8Y*+NAJ{sO2s|JgPMc7!vl}&-fYjp0Aka&emIdDjf zbs>?@ru`D-q3PQFkEuYSIsFfmcd!LhJEW87j3J>go=mw06dK5HyD4&!ENy^9fGP43 zTgAR4447wDE$)7+J{I3XHVoD`x!;Oc66IAQDK2R{ohc*^w{pt8AzeP!s|26PobS-L z?%U{!M5f8ZwObxv!4w?N0b+WA-_y|h%1kQVaGtC6~ zXUY1(R{1((Cv^o>!0{P6i%4*MnoK!xa7?P!o!x*}&Eff(J~Vzp)(#dLb%yY3iKoUV zKc=&XgvAfZlxx7Ef#AZ8Pekj~0EqzOlcQI~isl}Jf2|=}%;r7G`f)R~z10{X(VSrU z`06H1`od7SS}MgwjimF1#Nu#Hxi`cpDY3b!;%8J)Hk&`%bk;*aEkXW~B({?W+(!i2th>|2L2HOrP8IyX55V9$N z=%RCn1Vo%nIdDLXt_DQg7LR{;pFSFHCTj(Y2BjBM4-Fug0)+~lH6#?SBU26>3S+CG zuw&b~Uf1w7eK0&p)(aL4%KF55VBn%DaQF(HIV2puOr{(-9L7|`;jL@8dtAex_0jN0 zvRbfcSV)Kt!%Q*-41b{Wh6Ka!$&_n=p@FW3+glNFY6Bz!?5(t{ipTRt!TYV&1v9k+ zmU%#;IlYt_b#Z7(qhN0iogXCjW^&5Cp?5OLvSpY}hKQuhj1kGgf655ndHUwvL02cT zhoYp+JdKVpub+U5#m}L$h_rYcnX=+-HgXb2u9xBijpE*{3XQ9PFU_vXm1ON;TOcAd z903(*Tux^Z35`q1lmmyxRNHGrMdhmFIPTR)$6aIvVbP)N{^aL4{AE-CatEDDBtUK> zQ|_ezacY-5&-6uofV@CfQ1bxd$fyA1IXag}fc%I|IdFg+=j%a=iM-(xd<>nX-NFn4 z63vM%mECT8^dXXz3P=Xf`9y-GFPU=SAUW0-B%Rq(UX4Ol=woClSwmPiqU_P%BSu^y z6^JaRvx$VrLNevv1CcHx+m(;z5@sxtH@eJhCZfz*H}oOWLDtY=g-8t{6^KOWY$74j zPNv+OArga+(|WRL*Xu*%8nT9(3=uA*0+BMEO(aAPk|_rckui2dlgk#^?xYGX9@WRi z!(_E!aZx|ZYNbD9$rLa=Naqa+hWp8s0|&z>8w@e{u8Z1=ys8g{m&r=OLSX?S(HVB- zQh@MVI%h~A{EAFDa3G9zfWY<$g>TU*ZeikV?T*PfAkmzTN&TTX%PsKjPi@f@IEHe;EWigw$Tej8hay|a^S{x;s(3xQG5Ev-;3$q~6W zFV(m9V!HB?)2x}bSE$xrNG}j+?fGQNf!F4q$Ba7kO&lTXh2pSJQcc`WFA!=gE`znwuWVK*TjGFS{NT&MsU(q>3Lg5!=%7H_{ z$)Bk+EtTZzxVhSq`4}Jpk@<~%`W)4V{Y&28zfYh2mDXg>Uu(g_gS&g54?K+&MN>*d znteE#a&I=f(zvhIH~UJmhDg@-$(x==FA-_&lgX3=w>EC?r|H}oz2HL`X{miEb% zK1nYTY3Z+!DfdQ8`=-SIrf=y#leI&#v`^0TkMt6emi_~oa^RMBa;CLr9m+Y=ne(*c z@M%DzIT>;ue)}X%kENH0H1}jO<-pDDbin0BDzb^s(Km4$SuLa*?UOX!NG}m-;jKESf2LX6ZkmkHY)NHo>BBR^6ptjy#r$-OuLUOXmoQzq>f)-mr_+RL7p- zsI7?_lk8v8xABW~jUq=_>(8LJCG(Y0vHJ^jE|GSBj!aqcJ3rzij@({WGhKkl!|*X9 zV$Y|l{zkxv>(Hr+QQ^lfgC^+d9{&ya5iy+owVBV@{f+x!@}J#dCb zs|I~<)Hm|=WW`{OTz|_4Cs1%?Q-^)8q4S1>LzzrDa5#){;o#pteOw<5kCN4b1w;KA z01g;x_D~qqv=CW@ovc=8Get8~g55~gM2k^R zkM*DWxcocWMp#@fMMSAS@>vjYd$50@bBM&}pE%{-(1TrA)864+G|$$I#~c(ys{1Ol z=4{Y>cvoUC?68?L@>M;hJN4~;J6Ts)yPw&Z>yX7&J5QgYvx@}H$H|lf2aQ(f^1MEF zo+YaciyiJWd}dQVLoX3&{_l|~2X6iuwS9(vUwYsI?MR~^kZ4Y{dRk-dqGsQ^51msa zRQ`3ipwd9c*zH@39#jJ)0_xr-5R>}zNM?Bmw?BOn zoi`*VmvPFyp+7xe@=CUi;S)eiF|fZc?5@>iM9fSa<^WWGZr9W|ekWbQNaLS{bWc5t zte_%BXBvr$i^-IgMr|i2apZc^v;E)$Ss1n>Fx#4~RN!Bh_vGSk0v zxC(3@p)-tx%|m3$fx~8rpQn-aSTJ^%j0{ZQ$du9@MqWYC8~O-(jjT2-g0|=&$WL+w zOs~*+M}p~hWXgeq$v5he!DMevte|LWSiA9>1SFc%DI-TcHAPn7GoH>g5XYJsQ_gSol_)GR*@+O4wMu9fYNE^ z3q|Nu?Saq{w#$H&NT->q)yvwekDVe}Z&>VXrM6lk11Ya_H z%7KGtITk!dA(l6D+&LAEecmOD=j#LMT(au0-e~*b08+K|3aGZx`A33k3z>4@pgPVE zRL~DIGhI9Z?diZ@tq-2JlU0NTPyMe_iEaU_6HW(SmQn%96?8t4Ai0c8IdG87^#h5~ z*=fXz<{pD}+kN5kIeoa?O;#2bE^Dd2#$R3qICs)HMgr${GUdR5bF3e5;IrE>J)Mni zd7R77_0jTEvWBo|ssBNCALk+osX*j;I-5v{JWHk=I7EDXOIJQy%0;62Vx*KYeRIjf zPS6gB2Lp-b1jJPih53tLS_qL3BEqa^N8H z4UB!&sbm0)`ViVpRu~pSZ9rJWEEo3bRpFZQM90d>@RdV zkRbaLnR4JDTS^3(Pl(;RSi6rl3rIAlk9N*sgq9_{0;uV9?va2xj!ZdlK>05@-WN@q z8CdnlX7)yu*(p>Wiwt zr9v^AW>Jc|NOtKRT~Su=F8Q z4je4LslOPw7T)%lo%YTs)%zJQ)5pvbvbL}uhMfAVA+Q3S6X+}>p|gNYIdJIsj*v&4 z#lY2wiRmNeVzQF3h#`-Vd*xJsvXjm!5-1mtDF+UekY9M~Y(h|tlWX;H@*c8|usAuD z8sd7yRA6$5&L|Ql?;=wU945ZKpnP<%x{cc-`Ve`DtRE~y$h{y(LN{hF~rqB;E<4uPdA z1V+(IL_%N$nR4I|Xn1bj8hz8RBCCs3`A8()6d0DgW1)UKtJEt#A4aSzRR4 zFIP>!i(Vqq^a(QMz)gQxc3t?8J`CPZRvifjD^wWVLN5^sgB!_|1BZd{v_`AnEq2=A zs|{gMb5}Os?HMNdroQo?CM%3&{F7AUf0bS$()f>)DF<$R-!;mr@w0L7ik-jf8~!h3 zWl;>j#OG7Lf1;O&H2mvi%7Gi+cSgKo_!>(^XD!u^_@@Jj=0*HVe7^d79KA%O`KOR6 z2X21Se2H!P=H5b95vjKOe9deVy+owBH;^d@Ztg~hpRUli{AFZqku2}?O{#8siAc-u zAyW?A^5jwKJM~R|J6TO6llvs}K1DAPY4VSgDF<$H-wdvIPw%TMS622{l3(cGr%&>E zeS<$sRuakJKIyw>=p`Zz{yj3~zzy!(gR8wrOE&(%W!jNkKOoV>NX{pL*N0vr()j=S z?=!w{An$8@pD9U8^v!<)-5AI(e6iI15}zdA0(yx^^Uotw4!rLBcHsRt^porT#rlTd zNmdrg>HDPZE})l)H2isF%7Gi+f00D}@3Or|-|C0Rnj%@@Px^K3o*50(g(>M38$toh5+b22q61_yE zxnCqx4&2Z_^fiIBX)TkmM75a=jbqB_iRl zj!ZdlIQS0YSMM_|Hv^aHo4lK>CX&g061{uqB_d5;AX5(9j287-PeFA-_`Ib_O#+unD&pZCiW za%i|y-{2RJm4t0TxWRpfiO!>!h&1>PGUdPx?mIl_yE(FK_e1)2e-~L-B)j{J6J13w z5oz};$&>@PyYD3aYPSXPHzz87GoPGdr z<$cBhhSEz!+IkcyI-f3%R<7PRKzeV5HHn;XgdVTJ7eN^5cz3{C8;Bv*?+YsH`S;?D;D z$0G3=I1ytQ%NDTsxd9S)J0$L%%t$2ffeUllg5B2Soxo3GY4Wr1XD6KAU*k^lOSNvi zRO`k)K(ah&RiR*ZWeo3bFUOyv-I-_w63yvM%&hB#Y;i2>xFbxn=nNszH=R>X-cdu* ztu@Vg*sVF)wq_WP>*G242Hr;3Cvq8R{Z_^j%uhna=3D4IB5l5jOj+?b8#sw0 z2abshHZ4mrb>D@CEuR96%jg^;fzeH- z{NDnMyY+!_Cs{dIVDOm3XW;O5dWlFwe~L^wa6_Y;ho9=3`gyW?NT&7~GJKX^BGS~) zkSPal>amWqcUD_ettlCNs)u3HC9==C7-wCN zaEhgGptFax^tEKlim!POCvoJuo8u)&bmrM7e0^rBJOxZ?b~c|Ns|H)+mmo3Wkxl`{ zV|4zIpm>B#IdD*fBv5ca5zWLS9{tG!UvKK8;|;Qou;{4&#VVeqV(o$O7>bw*OkSfi ziiF84WXgfV;z-|os2G=xsmb|F)NM05Hv^(Vl)An_AYfyg8} zn@EU^CsPg_BF9S*i8_jmz^>WXgeqXNEs`@!sJVEME@SUy2kQ**&0NveS5qjX-8VEGW4a^PT@=I>e3Q8VQS zl^^Ou<@;nMVWCq0+r7SiMV3Az5mJBouZxgs0TpQclg=U%8h&ESOqezbas)DnMI}?IAlD{P7#*;W{hsu7usbM{nBn1 z>Z9d+vXZb)1>NlU%c%h6Tso&npll;k4jd?QRyN8VbT+RnBsriDkE_Y5!NLQZmGwxc zfa2|R{*a)!f=sy=g2GT2n0-MX6rZc7nj8D}IjRr)m-L%#+Z=RQVk+pkyB?$d{2|eC zCz*2K=#bl%ST+w626Nd=oG(PP=hw+e`(Ntgy_=HoR4J?+?OGKJ^37K->W^Qt8^}r`8Qf>vifid5A`Si?GUdPxP99Tx zLf_<%k<~;pxzCOjkI+j*n*1R$KhXKfg&Y5oz(K$&>@PxE!R_ zoLv8JeKY@)tQwM;eX?tRr^szMQ08Pi0Nd?fditEi9_e>1LRz?rbuqUC)2u(ULw-!Tga3Hw>o99%+>nVemhx1 zBy0PmS+Ag%h_v=)WXgeCo3?`PbNcqao2(;}y?t`5chXBl+WU4g<-qMNH}bVsR{vbz z%0DG*hGb=*wCeNp5|LJZmP|QtD_h&O@CBp(dvpvtQ#+6w3?!Np$RW0CkwsI(xPf%m zkYMOXrd$II4Q#RD?$RN4YG{B&fV*^9TSHcTK4`5z4$mZ;1nX-MTSJ04mVwf1I&SLNZ`p+gZ)v9w8N4{7O6GG)cj#5jo~ zzC#CS&DdweN_@4nvhwuR<%egi)^_h9AQ4!%LKaO8?55ILLxN!vnR4J@uy%n2jrsR5 zx9US-Gg&Lx>WF!eOJ@>k_0NzgD?aDboWzmqYfg0F5sk5hU^PBY{R?1Av$y#(vU0Gs zzy8MuY-}jj7_a9ZdbBZ1SOOgV7iOm%=0wW?mkT8^yjXK=DUSeBC&g!L*Xp}^uR zqXLi<>0BZKvWQGMaDdEq08%tkMl737mooMzbZa4{OCKq5vZk;|slSbm-Tu@UR)I{E z&Mp!%7m+Ck4jE*WQqf1rb!6pWQNr?{D|{xwzn5Mj($McFQx4qFgvR45`o{h;SwSRY z`%HlU61_yEvA;;B9JsN^It@XsEa)HfZTx$(Ua&TB6#(VYGUclkbxB95V#h&23YGUdPxk55pYrElxCWc^^h0k^f!%7`=R zB_eHo2AOi;wr(W!FX>x7Pu3L4>OK?Uv-A>?R!@;B2X6JzPCM^E!1XbG3xAlb6|9Bp z4{+J7e9h0CeSppw5(u}FDc1l(1EW*!0GAl(Xn;h316)V1PME3q>MVS-BvUer-JS&I z3;JMuj%*n$7>}=)ld6`=GPgV2^&>i8NG$$+NycL zI_*%hFOXm6jufddQSnL5psndwr$wDq7qnC>Sl3=1Yr&m_yN z0O<2{u8{z`hfFze0L}3COgZ>28^lOHlgfUp51U_+)r5sj-4C>3Bvruj3p%ezu>6cn zIdHIOc$+cnwfkZtfkboqVm#IBvme56dWlHm4>({$c99yiXqpHIvm_bN!#%5tvIhs08{X0RRu3kg{`1rm$t>>(ks zkW4vnNXQL}rM0>jn#u6Om1dS3Ct4WjcdMSR5o%4jdLUC0N8#Q8OJ8Q#7MpMx@xCGa|8U+`DP)qxuke zn5-u(L{=gpQd?97E)UX~MZ)ENGUdSGvJ?ZCNZmH*Rek)tOjaBgKj-M;N0nUx)NkqB zBLVd*GUdPlB}XurF7d>(wfj8dfJAfpJZuifNj|Id$IweeT6`p#a^M!Hw>azcZN8eU zC#=WdHuqVJy^>xc(&nd;DF<%z!_aIL^g)m#D~<#LpGDefdWlF7B*~Nm2LUFf^$~q5 ze~_#hl9hcHWxtPJBGSq?lPL#o<%S1HzO8TiZ;;hRGQH2#+^^9~M4J9dGUdQcKT7Hx zn1x8xjCxi;|3lxveRb78vSvtD_L+!(DZNCbmG_Y;2X19KXH#o1Mz;7}`WC-~tR<4g zeP-O>MlTU*@lTQ|2X67PQiJY4!SV%t8$UjZDltVl{S?cC0xHNHizb ztos3qx*}RYaQh%5=u9F}I+RoH4f8L<^;8muk>7ka6EOh;MYGd1@}3Up>H0W0g|1@c z6wLbD=+uF_kI)J-R?yi-B4a6;vf{rMa}q~x7UuH05X$Deq8alN@iiNWZZh#`KCXT` zbr&$LIW;puRvosz+g`W-S`SNgq*p*?(D_G#s)I~9a8R9G7gV|IUih#{wlm`USqC{* zzC|BbHu-*N`dqa%k26{DTawuj)hVakBQB53TwNP@wfF zT?8bw9wt)`99pe)y;iL?wtvzG((7bhVS!ZlqbWFX)&AeBbas)Td6`T(aL^o<`02RK z+VRsAAkmyY8PE0lEXkipFA)iYab(JY!$7Aewn^Xm8^{{NdXRxIi)+ydJ`1nc(ThZy ze>ItM;O0ME0dKcH6!ws{M}vaTjJ^WBNF)?;WXio93iabNIY9lCJ`_Gq)*cNCJ`?>u zLN5{tg%6S`2M&eVbt5eQp@V1i&Hg>Irm$wOzo4LAD#a334JN-$XBG*VZ;&b1089fT z0q$UeNESChBEZ3fQESY+0iU4FW>&+Nqg~m&_u~!2+O(t9!9b!p(Q4hPOR8L!$=zXt zfppH0c0{Z>an#o{N>SwvcV z0hzMmf#z`%M{YR42O3+>-LZa4H8f(tmuANQVzPFy%@h$Dj(`d@cG6iyLgNB5gv zpk;9zC*hJBAQ52WG-ypWR!YN=rpHx%Kp&5{l1+lehAVYLpTKzuhH2a@}RY5x`ei917j+X zXik5n?u@6pA}a8hL}wBSkMU&6fy2Y~7!Ev?%^NoB1LJJ6W)82%@Cv6uVm+NbBqY|5 zDF+UTIcjxckWe=%kkhc2=woCrSyfn!tVV?#9*n5cDxfLS`9*?eH<@zapqcD~#!iYw zVt!e%PwNBa6J+&ZfwCM26jee693Q3ghy=%n$dm&I$3zz#b_~*)&8MTqf~Rx(Lw#s` zpR61#H0o}{URyo|7~i3Dhy=zr$&>>J2CZ9r)K={P_1|P2Veug*0QhX@@K1V?NQ3{K zOgV6aqnnAazO9c363yw12wVGX>d;Cr5^3vMWXgft8q>A7P~XhwlQl!D(moqFoJ%hf zY36NY%7L4?q3*%~eY;;xRu#?eKFhY>PA?K^_bbSh1GhUesQZGxr9Vej4$aa&OSkW) z7m2j=on*>^TN>(_E@JcQ)?#w(dTG~;lqGL zb3(JatF~3q)QMJu>8v5aFpx|+a4@(bTPFtzFy_>&mik+XLbBDC^6J*MYuX&7<2w<)XREcl|zKCWPBax~Pv;Hseq&ZjR zuVl?&>-!1F`tAs)R{S^V%pn2s2AOhi14Q1)BC_^ zSut2R@KK{hK1+lzp%;m?@?J9Kz^y!9j-_g)pgyZ_=g*K;gS9g{QgozKEB>eH+#wnBU{4*3k(Feqj$%?@O0^JVOOj7)i&KnXA-zQV90fz=M3~rJ_bW%?j8w>4!eXTEr*;v7Dp0wO&MFcr?$CUK zm+3_!ZT%%O<-lz{sj9X(9l@&f_aF65{Rgsku%`Zh^4>Tn#GU-uY)7oYabPtXV7iiW&{cysNTh?mh<}pdpf+gpWqC`z9DQg8KjS?ap zmbLa=E~h0My0vbPZqK;So{#T^Vaey??Yqy|X@>vbX;WFrv`% zLd0N3sVmv!DRNn%&(65fO!_?W|0nv)v8T^$90_Lb2}Zn{v!JKrDw*J)3QKmLI}Rba zBd^}E$sXt`9GmwY?_8Uxk zN{Dbc`+dsttzNUctk$iOwc9_~Q}K5&CR{2WXB@!B{)7-G)7{_T7BTtvD=B$8Om`2A z@vL}$B&y2gc1K-iJvTW*h#1V=#GGX!Xw$AKC?AR&$3*!cShA934v-?IZVEdyONU{v zQ*SpW{5$-sU2hw`Ecs$#o#l>=Rd9^Bt=@QzZlRkBO;+HBGHJ3Dmh7A+O4b+_H`$R6 zVY@vww!(4YQUl5w(lvz+9o#r39VTGO(~k~HC-M$^I=mH*3zrVTj6`#t&6{zROpxCQ zOP+opD{cO3_8@;1jtd5|<|dmj<0_dTe-W1K9AvEjpK-Z$|Nl2QMi}6l+id=Vt7HQH zCs?v`z@L_kgz}1xr`e-?vJf$t34rnFh{iXy%5Va18_!a7)T4i!pNi;{v0 zKa7WzxyE@80Cm<$1^Ex+W-^ig04!O_Lib4#Q&*5WJWG+yjj={^M18gA7s4>hTGUVB z@NiRs@$`_%Lxmha!EI!c<43S$=j1pc8#>P0Uk6`dO_T$Lh`|hJjSq2fy;VrFA8s#` zG<(C6|2|2x%$_uh;ZSk2OHjYk+~IgWu9AuSxv*sCxU+kb>+P{_!r_6io~^kfIzxM#-XdX+HJ2h(P|ER&AL~u4G)VSJJn5@tGr(-474n0y%-J?w@WhKnZ)r_ zA4~&~lJeA8#R)1^{ z@(~ocMFR`Z(F_^Jp(C{^vT|5O>$;A3e zuw>_0?;p1g{oM3Cdx#gnQQ zeTQmoF)3Zz61N^Sd)X})J$p8`VQBioM#ZfV@MMzO!VP1xaZE~{4wKZ=vtg)ANVu!% zwbSsX3uPPko9w}V10G}M#C5f)Oon=`aN~8j-Ar!$11wp|RIiaDrfxEOTwXXQ#5oXg zh^*Ng-{jHzQNAQhw4Ba<0S**5Z!9iD9qOw>n18{oWfJC}Vad)3b8a4CG+D=Zk}2c1|u z*g74}^akhW+jHnSaKyMAx(Mpo%uXv5dKPXrlR`JZlK-wLbdNoS-VH~LOQE0`sJRF1 zow!OS{BMILJBR-WC4=Ox27JdJ>~F&H;etIE$``SVYJu?UxQR@1{5ve!IXSEbx=+5w zdZ4?j5HXm6Zjc-_mxAqtt7PK;fBzrFKW}_-wmtr5;$SdqcLDyID;O%cN+$lNz>@zy z+J9c{wq}q2GvJVM`-=d7&Fu_V<0_f>Uja*Yj(^{(Xs@*A!pq_CVO-E$-0)IdC6fy; zh9x`aLWvUmN9aC%Je|LXW(b{Q2z%U9WK19AcDM_)qo@1Z&16L^#|#u>X);0QBz%T`%{zcIdTmM_+3_2{}@T z7|bNZxP?vQSO|Kuf8cQ3G$tbtk&>sw{((c(Kve3jUX$Jox!NA*m3T0jlZ}G>9^Zc=PhucxYQ}w zR>JXBA|wCON(U zOLk5U-bm#MduIFSfjgy3k z!AwBrn^(=0{vvi#og5#J8_6Wdv9M(41hE>NUTM#m%ixe<2|{xT#0Fd?6aOJtvUB{| z!-Sjdv3?;O9t>;EG0NxTDw$Y62bSy{>k@N_`|VM`7Y-DLy5hFdnJ4apD z!bN4g-r1Vz{~xu-`ulKrxL6x6e9{bZ0uR;B|2w#aOlo`+mh7AwVn>xSaMCZD>{YcM z8}1=Q3}$Rtu%jx^MU@;+#!Y0BV^>&m4mnD!c_hmwL8-ii2#3oi`vn|bAu6Sp2Zd5n zy;xyS%%w0k+@xi^bY1l;ggjX^S%h209`|uPy3AFS z<;9cL6rXebRroN9Tg>Fc2rOC2Ps38g)Ge!=U?$GECstGZB^8n`-YAT;Tu!+Y4iz_D z7;iY{daID;4%}WQX?DPpos;HNHH^$Vr@m;| z`pi^gS?hGf6CC6I(eCUuWq-1#%Lr5o}uQdhKy>HScJz)0M+sWs?0Zd*(a>2aL;{Rag&Y@>wC!!?@K<0(}LR z?3_TFxsvDK=&s-Ax?9b947{@tF_r_MESw7C5f zNS$1V73y4xo6MxnWw7MwNS(2ozm>i@B6id_T1~%~@~Yj&I6b5_X-}P7;AjnqI=K!j z)VUcqnMs`&!jhd+M>7FWFIeh(tB34)^B^25E^mUZ)SByu?#ER!alaRq>>T%!3)PR? zBmWp2EDU+g-7=5jDw)WCAC~MKdCg45uuj*IXvE7p{^C_#Uui z=YW?fmo2h~eIXnvtetD_kU0le$%K6#EZI5i+Q`6ILGfCrqqdo51;80<>YtBaYaFtBl+puKkxLa&;xXT{> zx5EL$(AQLS--4@TqW>mXvUBt`ef>nV*>>PS< zhxX3H)}y;8;2>d$YihcG#Z@v9|1&JvIpX0l`1G7ef7JPOd#q0tA_g;(XB>mqc&N_# zPQoo@Qsa17at<|098*qCItS-lONelI(mA}8Yopj+xj5ckxh#8vaf>}YJs2WxDq>t8 zs&OwQKyvPR6K)`romDA$8l8Jq!%-2(R=u&>_UiRLv6m_P#_(%xq_D})-yt!ENy6qf9qP-o_jiCAQMvpt#K2nUTzrZuI;L%Dt{M7k5VoJpiR zV9CyjbZ#z@bgk1cI{LCbrM?Joc%q=j1vsmt2jBYHRc6 zM%^PvwDZT_f3auRpWyg$*>y!Jc5yqWJzZ#b89C_O!_D%K_crF|@i~^bi7dPT6nH1OtOLk6y{F!@roK{{HVk|zt z*PaD;!-2zCpgDzc7p{`Yg15txowFdn3ourUziW^Dx8Ptw$j{Ln#CQZ($wdBPSn@PR zUMYd5H{b0(Vm+ALO^6uGU{ZGeb2J<6cg9sRk$>Xv5BXWSvy1qYO6DZa9DC4b;|MT! zJ)B=^1`)feZq7O#HY)RE6V*^%xnll^^;wqUexF446 zoCTK4bw9Ufz~gYxFa~Ijay*8sWHR7USh8~l^tV=h&=%|I#Q{RZAg33alOFrxDw%}X z3zqDh5Xa$&JmIPGOfhvXEUS>grafL0*VTBQI#!Y52;*GFmC41c|MNHi}5N%;3O&#_! z%GZSDmM22K3dfI|Q{XKi><}pQ`ZDeWlU`qhB|E3r+=5;y%1mCT-fm3DE0eq4wk~QAs_=akY`Y|_m&=S?l`y|BK0Wl|8vGhl9vX zSJ&F4tKv8)MB9ja!X(-{Sh91Xg*U_Ik6I_hW5W~T!GL;em=4rmV$Z1;!SUj9it%hL z(`AJ|H{nJz>GNDzvUB@PXZC%ou%OSMkSgunOlK=*QgsTzfvuha-oj0?ppqIk-wK zA5^{*f*qte7;E`!js0ViLi?h zF_^*UsSF|{ZYeaFfg8r8!QcM=Xb@!tp8?g0wzs*ljdb{D*%RRmJl@Q{fs+x^jww_) z4L6NRg_B{)&NBj`LZ>G#NTXDEracv|g`?8X&OuTkbWEYbRk&$PDqIdrc20$-g`I<+ z5WIHV8&-!3udrvs%izFp*>EPKhsgM*5aK1cbxcCM2$t-e5C?>WsJD8}uDHWa*~9f= zdpdj&4hxqKr!(k4JX6T<0o*nw8SaB6Pk%D})Se7Kfy2TjL$H#eIWztvTqP6ZAHb5G zV_Z-&IB?v0ez2bqF_`&5fUxFF_};imCc;mJB|AshJONy65AgYLOt2=bIpcjUu96Ax zd|0w`fTQtzx+apoC9G)=@pW)iFo-o98MojnnGk!hzZQ-P2C-(t z;_bLfCd9YFlBXBMnpyeh?IHdw92E>=%^t*0<0_dDe*%{59Ad_7`w#Xg{|*iegz`Mi z9>d?@Dw!z%3YP2~z<MTce2=jDQ*{&i|eK2 z>9E-U^bEF@XNhBDn;W|2-WS^={Q^9q%*CAr0MZ#B72KbPTgk-z*|20K2W^)krfw6! zF*k`#Z;C*nExcR_*u`taC6^)|`Ro;V}%B0G> zV9Cy@a&(p|GLMY4>f*Wp@pNFX-5^Z)p*>T+2M3AEl!Zt>QT|L`lKb zl}yyHg(W*j9UO4H#vbuk!9l_h*Bp>~1+J2b_{(6)&JjOc89B6DDO zKL&?~i}f66ybyV)9=mmxv^*PNL9DXx+U`A=ZU z&LKZEn+^2U^1~*q=MD!85rdgKoQ33q+_L$BxP44o><3GBP77eRaG^almcaqSl7MFK z*#;(f|AQf(WRmB9Vad+P6IHd+ z?NHvYbwgWRJL$W2o-kL# z;o^=>g2IPpv;GyhN+$M~!jh*Y_N>9l%k8m$DI6{gd(AHX7vn0K*uMal>>T?eGy_w8 z-Rnd4U_SuIhYR*xa3q>r`g%WZB9k2NgC*yXqr}`cnH~pIq7ot;PLKCq@6}uF;l)fBq}#e+j)Gf$16e|Xz^f^&!vF_;O?T2oFc;kd$(r{ShE8L~etS;a&5aAa+nKivAHdkV%aHh9x^E20o@dsbf8+JYI+x%!EXC2=g^(rH{o`GC`jS zOLh+WA(?ETuZCS_5A+5&Hr!k=8^{H@m9Qb)JSHjDz>;%FQKF2MRKkKPNC^=RD`9(V z=+?Tu&eH5FrnlO&aS{fF%f{nPY)m;6f}B*qZoy4rGVo?8c{)_U_DKRzQ7$%o$R5@Q z@fb2Ue;7~0XT4Iey&t!WiS50xWF@=YBSlPI?dqUZxQ4w>z1^7b&$yCm)#Jh@%WBnQ zaAdem+}PpdIHyqJQQSNxCB6?!c20={Q&Fo{JKc7*nwgCp(6uJSzCy%chMLArfvRij zJY+B2G$tALfF(O8gRzrXWY2?za7eg`A((P#P9C0vt7PIk50>m4UrzoXw}*KYjtmB~ z=D6Vqu96A!Ff4gm!5o)hGFkmjdzkNlBg2LH4BkjS*mvh2qg303O9{OhL6LNbI4GlK9H0cf@x+65e`cXDNZhJjg5JA zWhOGCXFc%z8w?MZlgt#AaxDZtDLecHH;&25KS{~cq3m#UG6qjVQR&F)l6+vHLnfam z+e3bW5HXm!hVgQxVm}r9XW^DI@jn`ttYoDlrHH93O&p~SV71z4HoD4`^m1XGWsPDZ z93pOJFy5A9^imzgti!EjQe-VG**Qgy)dp{Kqd8pN6uj1w8RNdlo+dZJVdByR&n9V4 zRjND}x0Feh8)3=LsdB28Djl!Zu5aI>3cg*IDogPFAPV9CyDb4o64+TQg&uakRe`s?kP z^IAAuT;>?BeLy@`$a6bxGm|{G!IGVm2kDkRZ_k&{!V%)~C0Ie$++Fx-TqP6kPr#C$ z!#yjv<>W0i{=pvf-@$R>f^K|Sq1aV*BK;fOR3=$|1xt2LmeL)|F*jHbNsbaC1~X>~ z5{2e|!y|B&OzaPZB|FEy+*tGyd*CmIW5rDt0q~lu4p-qSnZU1rB|8WHnB26fub@5K z9`fyQl(>+eS8Do^TSeQ78_Fa~2bP>eloBPdq>2_)OG=1vSVh}!qbD{Ww8qDKP2H84 z57^W5{V+CMdY)#Yr|MS-c~UofA8r|wkMEI^r$gQBWF-!jZWi(I8W2)L`=LGX-^0Vp ztf3hff&hmVMtmDLnaPN6z><{=^))GC>gs97sFC!xb-iZCe;2IT8{d?9L~hS**2C7P z2oZxBwi>583`Z5JJP9|INtIn-$AtQx^?kY%df?Gv8d>O|7Z0(-8^g~P<{S1y41 zl_;O4JXOeY7H%t(EN8%yos$L4E1T`PQir3&c~ipR^~*$KWt=NfM+4&5fuZ##J&g z{~#>cIp$?2CjV&<{V(8XVbE*tg8C`0k_r7!V9Cy*KU~d}`r_DO+pT952MZB{nNb+u zgUj_$?FkOVEo4$-KUi`OHA?A}CW*Dp%*7I_S-cf}y z{|DpBepU*W{P)V3Gwm5u85m=N`iSPX+*5Fs%v^CIEZI5orAMjHu*d#tI9%L*MPk1| zb2sW0xJoAWm%@^rV}F#cpU5kizuX@0m%<_9;;r6Tm)ASQ?x_`$7vttJx$y#6vU6^L z^N_mKV6sq^(FHCZ?v8p>?1@BW^SO~5|o$ybN7tyi5th{#ZzF( zIlL%Q+D@wDL0Pnf2#3}2{TGWDZEIu8!dH=%;`nNNPOgN(;bx!{^u=-2qY&++HohFU ziAlvJQu1`Djh~=GTZv!4-rN{#G)MgB;piFro;}`eJhsfbxVnd3<{$-cy_*UNTDYN1 z5{$u;m3-8YBBrh;e!Ph-4e^*@x3RgA*(LfGVWVYX{7rDAxXD3%`MQWKDK8bSyaBh9 z$(7f^lAUv9rim-c^2t~1S@I<~MqHMtEB{3-k^U+C_yTSrlOO*AOLoqWlT7^RG@j*E zukY1FLg~_nY5!_Zlt074;u0mNHg4#9sG|yF{)n5(WXylVlASYVmWeT~db_GD;Ggtt z>%QlBA!0C-CH3OOqO218sPN=i+)5@-X2O!4^W;nuPvr50)O~m=X)d!T%?3DV+zg|h zgeoG9-eHA7L%7LI2Cac5J7BCcqzMeLvyTE8?N@+4YF0}h4!R*J{%`5Y1o-Y z^-v8+B0yKOysYI zB|Asna^m=Edj`A`4jRS)%}KSF<0_d9cquH|IRkVFU!4@C6aL5TLH`IGCk%AW&dU$s zDw&`^084fb`jMJ?QM@}X^IpO)?cx3z93d{;XEK+%O%KWa2W}mc89#<4J7>lb8fNIX z%sohgowcm_D|>XB6nBL{`jPrvKwbLZV!`!E2ZS=up8%S3aNi`Q|!B{=Iz6|(H`Y( zcvPADaB|KZN{=Fxbq*@P_iz)Lz_($^O73Y%5mUDV=R`e2#%ki)`tjDVzx`%d-LQ3+ zu+nl5&fDQwanphNGFY;tl_iSCPlYdU!7XL-}mkvY-)h&^c@h6BbW z%@Rf*5@i>aG=Z}UbH0L`%Vf@%V9CyzqscV!g$cnOe_~tcNUKe^=j{AE>rC?m94jtq zxS1x$PlYdk#Vuv><X~!2)C%?`U2jN@YM%}B9*TnLme`_40Vn&JO9np8BWL2V;v zB%WS?+xPj_GmgE4h{22?gT$}dPPYfHlF5K4!;+o1|7_yVA5y1*UuX~fIdH77rmxvh zHxF0I1paJTvUA|EIl!nr;3II1Fu*k%>V|QZOu%cfWaoe%mMKT(EwkStT(c}#?|`Gj zg<5@vNK>$mJyWl@c{OeslM%0kB|B%tAsI&Km)Acd9JA!Zr{LId`EUxS7M;7a{&Czc zCL2BiOU_|KiFNU0X+2n7Eg>Qqh~9U&KR%nfMYg?sPL7R<)2GV9`rqt{_!k%!E)kE( zC1T=C2ywEm{wLfVCjWj9OIG+-fc%N05AHT&#!3ENNGFcIM_h)qWzOh5;;(CWjD95V z7eC7T#l7N-lY1`n>J9(FD+T$JZ?aB7CkPRPnP(iWMV|Pg06z=2h6()9Qu1`zP%$eV zf@nRk)$57}5XB=^x&^F__Asx*1Iye~p+CsS@=<|*Ep8DIcvu2-!!hpX+LIQF@zHbQESHwp7Bha=C0gT(Cx^c!!A9aI={BW@y-A=_Zd&KWY3 z1aLU)C8~{1rzegDXKzS)uRTHThGWDfh<>@M&_9JAci|Q?`SEsGvU7eMtB+s)PKoc@ zQ{-E4n79;~UpStq#7%&@sIcS_+(;%%9)=}5XUXA&B|-9#@yqrwyT8D?huKYt7|du> zf6b%GHH8&B4!^0&+knJ^xiXX#O zGO>OXmh2pBu%dL(3$4fd2M7^^8ShKP&(v&R+!t5LM0_t;vU9`_A~{jNj=9tx=0$L1 zxDETH;z@t*D&|7mDkc-ofhFfKp~MnovWgijX_OG*ZWU9EJ=%?}HUCxHAy3?+EB^M{ z%Cgq8?HRcpMu^Ku{Z5Nqze3=Xwau-#WlUCfV95$Ar+jVmkX6mD*WT>4y=L88miL&$ zyX*<^4mdb=gvj+vA;ep8%b0|Cvy?m?);v$m3rF(eLFy9w^p47}*+c(TJiyGV(qe7z z1o^7a;mf$SOgelKmaOE5&q)zew+4EAaV(W<`)9n!df56mI8xkXp?}7~MzzuSu@O}Mp8-aHqU?3_1qb8}52H5;lL_XK{xofIGHI{eGUMpOBFK#!JOLxPP zopb55TrPck**SAg$Q>{m_Bnsro-?0-L&fEc{wZm$n+jV# ziW|yg%R{ha=WHoIBL0m%Wqt+6i%XectBmHtr=R00nczPTOLh*v)v)%6o2_R=hYAsc znGpr}Yp#4c2v^C({{UFBbNurM8HI(ERrctwfCGlLe$91HOL3J<^cTUBouh9^{ZSb$ zXM@64d+>T#| zQbe5b_@76!fMpxYO5l}zYA2TOJiy1z(a&B9eO!9N<7>>T|3yss8! z)6idT5B)|sT3EZ+oPb(~t7JmI7MAQB`dPV!vb=MUFR};yCOA%9(C1M~AaDb>Q7_l}z+^h9x^k|Crn% zg8umIe0#{}z)|8hc>T3%MINfdgW0%+Oop5eOU_|PiF2^YQQF|7TnQ2EqqP0M7WTk2 zjM0-$;o(wKf3jQaQ;2wShW0w#DkdGbNXgUg$Yca>rIFqs-sx@^hYOSg zaId$A{k3?2`*viq&{u^Hx8v3_>2Mn?S;(N$>hokSh91jl*lU2wx`N=I8a=w1hrYs zeyy#zN+#+ZSh91}%Vdam*~9)0I8qqwnw?s2#Z@w4e={uEIqWmFLx^}?D|3hGH|zob z8XO}o;Aini53zr0VeYHAeN1+I8J6sv9rjb-U0!BA-kc#s3}(C;^bDF^eSd?Ynq-pT zFR*0iBAv+jg2Cu?>e!wq6` z@WZfVg@aRm@9q9W8y7DLo*9m==q5|I|7FjB|AfQBWxxqq253A|Nbn2XCMF4fDkV>c zh1;2GAfi`3o4xT(UYh`Y*vqYF90v;#gPC#Yw~rM1r@($7ZXpx){b0#T+uvJ?n7Rep zlQr>ES0~k#vFXd+n?4}#ams_|Jh z?bE?sd(vDFhl@*^Ma+IAN}sB$3Tv9Uu}s!n2TOL&nq%`>GwyY3{&H)LbVmPV&z66L z!^CBa{{2smiwa9#j~mHk$!lTB&RKGFP6)@wYU1)pg(LrF&yjzHgT&>C{+;P!2Ni~V z9ygK6kk7)BrzJz$-t|4N(`~g?hWxKRL;eR2Qr{VpaZq8%A8-?y4EY@_**QaWbDp@j zR#M1`lhz~I^ZU6^VR5x z2d;tysqo_x+(ITlE`}vL=f~liF1lU2LG4>!U{8(b!QtUjL;nW3$u)%)&&G{ovSK?d z**Pmp&wAfy&yx4R;o`C+SijR;((o=^B@_F1z>=L~56@k{XOH=};V@yCYi?)w2CkBc z`PX2{&N0`GBEu?|rgHw2S6GiCpCm*KW)vwK`B|D1_PgLJnSjrLB|8TkEIrJ%NBk@} zNKg|$OLMmV3|u7>@zY?*&Jou&aXL^=AE&R|1O7}nMi}6lOM-!(=G?|laFtBxe*{Z*4n4cRbMPyz2lWRE z5rZ7mYc}BThpS{_y*Dh`Io7&CeP%HwJ;qyRkN9FZNLcIEY_vZgSII>DTv)Pm#E;N) ziu#?_*V}{LgyX{n`*iMhl-zyR*WtD?S+NC{oWqI|o1~L{*1;yr5+d09towgWQfjB| zdapClYIZ!b=jGk@lzb-)4wsTeJ8ff+LbQ|Z)^EdYVp8#+q~z(a)Ao=g??i#9)LXq~ zmjL{Adw~BP4<_?Eq|*v=PR1_<=6}O2W5WEeuw*6Ud|rx}x}CMhY4{M1JgPabckFbl z^?39D;6QO(zy5*|o|6hw{ueis$&~+rB|B%zNtz%|)Vls_$)nVp=^O(i*wDvUW1HDXh2@ zH;&1Q^{`~;tl*76UTRN?7sIjPQX(i|X^s=W09VNb`gyQq=Rl{b+Ho7nt7<=B5BK}w z2yx*qs%op=sa5Uw;np#k@g7*Rb7qtrO8nTKBtL|M#U)9Q6Es_tzK5%1BL8hzvUB9w zLxO!?Wj)E*Q-~PMura_|vo+}{xJoA0Pl6>o$GXJS@;rOg7r=pnTKL(T{Yi6il}yyn zf+aggJyqC_`$c_WyI~LZW;i}vu!{=YS>MzizmD6+WW_UK$vLbjQI$>#+d)mUgb0U) zZ8`Ty-*Th9Na8K_#C#JB5to?x)laQoA@WI)`wh5dOj^E9N}diy?o<6zl`b6gPIt`) z*)Q2c{{=k2%)5kN`MwSI#2JF4#mzhUm)tNtRXDQ-x0T76 zi(tvqm@}jDuDm?XJl~!(&w-;gAkL_sDx7&1ZYz^BH^7peb7ppKFI5{JZgj=*YjH(V zl53O|-Fxi0^KLk5T<%|1{$)vK2Nj0wgqz4@ z$p8KQF~qhPB|B${RbA~P z_JsKm95OCpf-IpqAN>HXl8OKOVad+%FTbAiGkfs=1CAF4zUCb4k8zbu@P7zPb`E}i zSyV0jq^FxtdyVxxVt*lGF!P9@-D{4;?t`mjLcb?0**Wxf>v2o$32*@%Gpy}vPRX8! zt7H;j0W8@$0l?Bh%O3GDI7k@cnoZ*kTqP6n&9G$Wi05Z}^CH+A?4f@h94!ob&EDXD zz*RD#e+?|zIrPWm&IR@R2ftts`MeCkxzCJ{uQ^3Ny|S=$BF$bVdj>#D+<4Y;vP)(pXtowH_6Zkr3wmp9Ve1pS*HmCYA7+w}fL(4jhy#=4g)So{g(yvfxZu zvU3)IgNG4&#E0P^VTfyXSJiNpOvIl7OLmTU>FMeYd+c8ghYQ1Av&HI_xJoAWFNY;N z!~XW2XY4e?|L@uzqxbGQW5%RXUyr*_eSQ5?_SkC5b98fby89P zJ#G?{h`*JRr$a?u-up!2Q0e+G7d*&5>mRIVDn|G2ubRAudhwSM3bmDcsnG+sEWa50>nl8*<{Si(Ys8gjcP%hUqo;ciYqBE;vYB zdgNEl%?>IIc{^?*lOb<`B~M?5==LaL_V@h zn^?Gx*}9?Wwbko6cDuuREV8o@F__WoeBN}WqPnQC_q(Tq*n^6i~r|AhtR)z7Lu zQ?7x7)bE}r>!8ArD{&K<47m)J?3^L;6ddh&hP`%UYt6s1#h6wm?a6Wr94{_e@^3X{ z`>OEfX53mPZ(ayXcFvollyYh%|B{x6?5Xk~93n1N&Ss8QsCx=K?#B&evg2M@^0Z`! zS8sIuoTBtPkK423F*rnhX9salVaKDmflPLMAC~N#9fzs8L%YH7fY(}2a`qJ>1~bXY zzssBUFtKL}C-%Z^V{&2-Sh90Y==u}Vq|%l6MfSv42#1K9G33_5IhxxS&cRhO@ty}u zc8+)Xap$-__@i*VFz_|EFO1+Sncxq@lAVLEYwY2oygEF%(;n|T;1FSWYpz__fvaTV z{c2dUbG)CfcKCT4h(BkK_GjP#ana6ywU74sv2*Iypikk(F?sQESh90oXbPHn>(lA( z|M&JB`7InQE=PjyUvme?uW^-3IPwf0c2hNFWuZ_TY6D{+-fsF%Z%okOij?0E|~>BN4cJ@VV&U}4B>j*Rti zl}zN@uw>`RgDXyV*(3gTI7krUb2SHl-h!)SBK{^=vU9}c>zj1^tKa(nh&|R1!{Om# zU16>Q)9n#IRfrhiuzs%QDA-B3N+#mR!;+mNj_i%T#vbk~;Rs<3TvNEe z3|Gm7djl-lIo!DoT)*A<7JI~RhJ%D5uBq0)5Ld}W{Q0ot9K=hUzDo}91*f-4h;Vp- z?@*59A(Cih1e$t`aX)A#w6xLQu1^-(5J2rMe)$wk@qWm zxPOkvl=(^vb8At?Jq7f~aRZs4KL$%yveBbb#MB+$J1#d3RN`fq%%wDkzTSFTagY!( zm_a6UvwX~v*hzJ5=>XhFCQtT-B|GQI{Cu8-=MFM6Qti!nE9|MW6pkIYH(A50S;W*S z@LS0{i*U=Cd|C)gcFrex(FG}U#c_?dc%^5y9ed_Xz)|8dC;uj_0uL3AjN>*kIWh`M zcFqxXQ&Ykb@A{tC=~f&5$&1G3hSw&e);HU;<&AK>xNKo=rZ@Sj@a9h3S|)GqfF(QU zjk+2h$5LNP|FS(@z6ghjOBd!L;;f76c;<7siA;`s29}(|krGqrWELJwxk`v|I14`@ z9###tTXoMHZZt2oZxBY@cWzF{NBm64ngdC?*;ICdoJ*X5KS3;D(p! zXfC=q!yf6=@SrlM-uYK~$q`P1H1$t`{bbxiChRA`l9e1ZONyAfxwpLWPanUwS8uh4 z^M*Iq3PUZg&bbN>7q`F4zo4G$s=}JfabuaR*$7LXo~+^Q^L&{-YhD6}tN*OYb5&u@ zi*RF^thou6?3^{pm{`fx`laL#+Oy>YaG1DkDX8)pTvS+cA8sU*CGUkLJ7-B!4Niqn zy;me%nE8o4Pksakip!I8xC2zqAIGa-Ud!zN(Wp5#3FcTX7 z*d@k+u`_dnQ|tZ zDY0(~FK)xFWAfrwSh90o*yNPY+B4@F$y~QWKka z??+~X%kS**{tX-=F5a`*nIU#hT?+aYZXS~xKZhkd=Z1DFlUHR*PkoR2N9(D~5kkaZ zrZPcZ&>WmT6j#Z_{vcSgbL>kLJTA6JeH9!iZgvPz*BqT*fvaSqz7&@19CiL6al1X( zTjBU%U~3LfcW{+VuqR;2&cW8E_q_5=I=#Qc9{ab#;li-j9G`wOu9AuU8)3=Lv4`tT zU$e*jt8kbg%;#wiP=6U$$;AANuw>_$C$}S|hWh$_Uo+lhJ%IZg93U>*1-B!q&Z)!v zzu?9(dGRM$vU6T&b3s=gqt>s0o@URElZA)@4)5n_j!&O}t7Kw63zqC0b8H9JRrY{i z4#$X_4&=ywp62xQMqDKm@O7}{9KcKL$xOC&2K)I+h;X>AGr7bgNz>5=U9!FNHTINy z6^s&>a_k-`b}hs|Ibit;+&CsVUnV6_hi#t85pET1%@NCw*+c$eJgUrno&}rDa~)KG z{~&H66Zj9nl9jAo0mq$7?50{&do6Az zlPkBwlAUvhl@SaJ?eN>tU8!hBGHEg^zkm>+#`w;3}|x@pIA zcAPl+o?U0m*fMAI9`V<;J4Qc}_lqCp{o-En#mRk!YF%+*%q9LS;LB>=8mYy<+@6;& zg@NJna+ZF6n{g+EIjO(D7&nN?!56@iRSq8R=kDAx?1_Dc|7q)k_q~VW=e-pYe8`>z z55SS(lHg=53G_}WRCqsb7Ly9^lai;yQp_>hSja_~jyG0q*2X>3=>Vm zt7Jlc7A)C0hz|L8_49xGhxZj`C-|q{DVDT zUIPb>%aGl4wHcYEhSHf>F$vP&`NhpL);k{%wd#y%kgiup0^w;L=0x$a#k_Is&@+HGjaQv zkUt%ktmK@-q=>1T<{nD9kvCG^Ak4B{fg6H@!)^GdGH4MyruIQ=aKo5pS-QZ19?mR(r@VuPfjm@HXoq$i70vU`D3; zb=Ryr3i^BD1~Jj!1D1@U-~Wl{e)8t;WnR6}X|$RO0T$U4U?Ch8ZtFi@+xk_96bhV! zo5ZBRJSllPOhAuU;!x>yYu#SgtJa#s)pl>pQ;wmG+M_*!hnBhKdM*!by_X6FhH*QY z6sW&QxM=II>oGW|md)RU8^`3u8(_)Kd4UZpAGW8)SKt_NsS)%5n#;q!gsWr% z{smaFbHK|~v!1Yr{jYGOFxWNs9sC(r$%Ornuw>`3AFifI{c`E4@35W`oFqgHW=2q9 zRv2=ZOpnJ+V{+nHSh90YXa<8hQ>pY|@Jf4vTn5JqO9q-d3^w2@nZOUhl5>DBvCy5Y zl?TfuB}A~-$_KV$)~ff$b?fD~*%R$n7#l9pOeswirKM2 zXOoIUWjOpnUxxaqJ=723ab+%-=}*gZTvWh+5I2$u{{66IB@5jvMNHjVSvV5avSf2( ztkE1%7t4MwY_wb~dmN4wHz%0ZRSUgTxbhfoCzC6W!jheHC9GCzquB8GCp9)Vyf#@X zJLsL(R5?J17|cM{w60p@q{5VaaWk1r*$bBJoGC{c60>q%V5vPv7QrFnrW5@U#v=C= zb}YmVWU}KNSh90=9Bm3;Z+ufGhfLV>V;l|=mmm6Ttcx8~7&3~R$YjU}EZI3j!b!0< z33nRL@~YSOYNEU8(tR0kv?t1)aICmQF|DIA{8adI2W}~oFFRn#&iP`R>$K|aYS-J= zCF7DW+Ee9oaG1DMf#*80iwa9VgB!_Y$){k+&RJp_zlvlcc91GO`I9|Qeh&wV%M*C~ znsQQM%5QNqnN0aLEZI3z&M%TqVt{yR0WYM+*^yne;3-RPVL@ zkltT~KS$ygGx>8kEZI4KH2sk%rigvVts9zSt=e$4*KUyhXq`P}*1}=p<{55(q`IiE zWHoLilO-!*$h(qh%KcuKj)O+?zSh(U2vqhWZ_n7wO%S*c{^?=lPhn5B|GPeslpO*V;F2gB^F9Fp4YUDo5;orQ?OjBA69XPP_o zpMb%cWWxSeSh922O;g~UK4i8%>ZcDFb>O`X_uo_(SSIZezXc8whPdWV$eVGMOvGOZOLmU9rr;2F=W%s7 zy@Bu{d(0n%!-Qe3xp?V*TqP6pdtu4WF)z1B_P9OpkHN8mfM1|FKlUiDk_r6xVad*c zHx1%aCH{1CKj7WgL-&1!hyf1W7ibQT?S-pkqP_<#**WTVYZ8m>39t~38P@DIhlb9< zRWb=M50>nl0Gd8tt+=Nf{kT2mqi~oo%rz&5MsSr(%!gsg&M_~wL~y4)?sveU!f@9d z4%vaLWa9p6Sh926!;`}41=+ll!k@E8`!jHWxM-VB3TvHHPYQnuH;&1RkHeCk^CCP! zm=2x(1mW-PS@ByqJX}_oP7rEbQ#tW#+%zU9ehEv?;Y5j3V97zU;1p2_5e^TM?Il;U z*LdBUa_!=2cU#XsP8K2tGyBlr`A?k*F-{JUoq(IeB;YJ5c{&^*JBGxdG7&yySj}4= zy4)V+jd)m@=g0I<+%Y^W6m^Cbv#Sbg?#7K}vgR&WvUAo1I~58; zNeJ@;d%}Ddjue+LhJ8=PUMgJq7H%h#E04gEopU89k!7M7><7}Hd4KAAth=Gzg^0n7 zObz>P3tUuKvKwwBlO;RDlAW_8D6V8eD7R78Tf?;HnQzaJIdFiuiA4W=p01NkoKu)F z8#j;1jMHJs&Y2Nxl!=*PF0Xs`+}H$%h|3Mbxn+ZU3OlN}flPK>150+!jw3To%WID} znl*U_NZBiSn>{&hg(JizhyD?~0`C-VOyc%2xp50D**P~d^WQOX&$F1<#Mini{P=`D zKRyaaiOUbp{8#It!jXq?8<`w=5SHwmBf(-`oPHb4j@Yfy3-U+wK7~S*U)dAo=WwXF zL@}KAVYsQV<#F6lCR-kZB|B$JCZlNUP3hJCL+`Pk${Zv_3}z}L_w6pw?9M*`SILBY zUs$qp$f4oq3VXbl!Xe@&h5&EPzWhbFN+#Y5Vad+%K9ml*@>cje_DD~_!QmpUe>peD zF?A((95;-~hf!Fvb3T+BAiUY09dCp~#brm32Q=q3?!;9xalZqW>>T$@SFasfr@Q(u z+e7|EI7%4gngbi3!&NdN{|qd7xg7UgP(;N+#sLg(W+O94Q~2 z@Lub|{4612aD(}?&d{9FI2u>Ug!@QXvU9i(reh%eHocAZIIn|4!)@03chR+OsRO&U zxLHgttcE2!=R%n^?3?VV@mx4kTx$5^y0gyE9ND=MSILBZ8!Xv5?4>unyw@K4yWwzQ z*lSMf+=Z)TV*hqnvUBX=tq9+>$NXDxm@v#Wr*$5|RWdPu7?$iDb6{h^?(ef6;O!{Iis^Pu9AuN6a7NF#HRUV-+i$8x`YV!zWdP!ckA!Q+kM1caUF3BSWE7m%)BDF z*q&wQ*xW5OlDEPbCq9a7={4Q>z< z{$Ih8ox^`Pjh5^}Yn^JN)5b;2ZTGL50n*= z;P?KrB0~ILJ*D^^wradK;>}zk9?6(_dAl|-;k6?m$-&OY`-G$KT@j9tm5pG6ZiTmA$jyLr!(f6we!M%kpY+xET<^;i~mKBj8xO-U< zA%eF}DT0R$h4*~STo#^5=xAHwd40ms_pS)X1!W_c;5fIehy=&8%8CeaeC3qlc;L{+ z#Y<)`7MZj*rblq3PYC*c6(KlWHg*YuwXz}-1fNk>M2O%krWC=$B!a7&U9Y{_YkSSQ zr^oTOKH=zlSA^rOWh0p2I9XOig5xb^MT9usI;A)sAaRu2rt|=QtWN;?ZWRIe;j*Di z0Q_KC5ea}FC@UfWus10tto5q6%DyTF8|{V|?E6!czX|_W&ma9i|F45bp9ub%A;#0I zcN*Qv|Le)4JNtj_GP+CfkGuMR?L4|$@Y9om-@RCTZ_V;ur!D?Zh2dtSBCtdI4?LxR$F z-^^=;4=WE5!~cu?KQ8wFSnK~WB>wQE&Hg8@I!yf2HU1yZ@c($G|Hmf(k756h&EgMl z)OXDP?7RGby4(Nb9{-Q``G4Fe{_uK}`}&95JN^nm+uPJ@j15aOeD$}AFZ$-ZO4^b9 zYy-;Lxa-=E|s-?8K;-!cCu-_ch| z50jsKSCgN7pOc?_=i{GxlY5PfwKj>1f=}c^CG`CfP&vq*HO8l!QZ3sT|njPWluRqIMJGp14 zv1zQ)99g`nwbk2^{Jg{)YuzAz-c3HqBL2@)#X;h+T3enq7e78(-0d%CpKC|26@gzn zxlg0B-b;VxmdX99^(_Kb(Qi~YZLi8t3qBr5{xuTg6SZ1vinlDI?}$+JHcdXcwQ1C= zcYTJAKJ1fxMsM;d^)0pLh}ZGDG6YW!e@uU5_j;onm?~lweo=fc{72a?_KJQI?Az@B zOK)!bPisf_^#7cEiVWK&?Mo&^toH7D zq8uP*B|{>9;~nuYdq)4VxIH3%9^G4hbszbs4Cm;+;{V?=`IICYqVVxF@o(3Ppp1T0 zK$nWgZh{uxHfeYeqR|xs65kI$9bLQQ#1kiXov1b1J0_17w_NqcymMzxY`=8F(8fzD z^|6LXU!BS(QM>SWZ`5{7&I~?tTK-42%vswN417{Y@Mg^0F?p6>`S1%LOQp1#Ckmo; zIx`#1d^IQSm^?98L50fO5$GG8FWjFzfBD*FLzk>tyK%!zwt$(nuE@}vdRuHU#D!{ux_hi!|Zkl3>*_3KVKQ|6R0r9-S(K2aO-ujBBd(3CWV9~DI*v1e(= ztF`M}EUlT(4opT}WXsup!#y@H^-RceO_+R+$w@xx52e$=yr9^_N*y*iA+ID;>4gP0Fw}shLlEV`esflS{b)bA7#0K23i!SrG-c|#PA|~Lpan+!m}#= zZS?$)u05LEof(^TemS!u#l)_QW4k7LV#p(2wiPdDmp5&3Inz?QiFGUe1h#6$U`IiU3(Vh}BA~vhM}#T2-WS9YF<#3S4{dM@8!hu zQq#l|lS}5BYJ$at}L=`G6doUHrluvDtn50T%6$$ON@#HT?udi0GSDGkjwQ3)+ z--~~r&@h}U^wp26`sRmXC-LW6zjKbD$S)u!LZXcz#@3Xu$QlpTK5Bp5Uqw#n^E<|Z zKH9I^N9?~k?4Sl?{g5q-verem%T8ieZYR;LZSn^P{&tfcQNdAJ$CyZeD%~+G@E6G! z2VXDl4N_7>KTuITPW`^32#)-bX@8k1?Hk3AEU%Pl(~hbpE?5imgCf?dWe1kK z7MA)@x>3&a8)dM^i`N62bOtqTcN+5XH;g9gOqV_t10&R z?U;O8wlEU>dpcJfC%6ABmA}yK*O9*vnc=WF15Z#oWD~`6$7|cfjy%yg#9s4wi@f!UdaZ_3K)jH&-`{m5f#! z(iu-K_4ZY$XrgwZ@8kArx)chjjyIC!s8+=j_2*9bmve+b`0F>2^3w}qofS@0&y&9u zaCAg5A5wb?M{OvWs9aDNyB1pG)h%9a*lT0H7GX?9Q?(R-$k$yO!)Fj-RxMIUJCjJW ziHHz3n+Tg9WzuwR*7I^^CO@B00BIzd=sVZ1&V^a4+U<#>whYB_mvBabN<}!)T{=IB zsGUV5*)>5S?rb8ie6tdw<`7Y~xk(6|O9YncwuF>?Qg->41tobi7xu6h%(8)R?^=m&YoMFXjD7mbauDu z`3jO|pYv_fjm4=o=fjnZbfS8JR45AT-I}<^4pSWGxje;0Hc`7swo=*P<%iO(F-KZ9 z4-~qcQ9<-yD1X`ZuJ8FTp2ZqVm=RA!V<8;^bVaX;Saa66*Xj62$>Y&Wjxd6IoCtG1 zTnVKTRp&=O%i{+A`_&-Z;@$9hT2%$afO)C$3+8X!m*;6tNhT`ylXH;86OF~a?v~|# z1KTknAW%a*TL zeCfp-tCy}_z4nsJ*H+go->_lvh0C=;C7K9};zfWwrIj2#B*bUyiYa*#lR4c<1{9>n z`kCEXRWS-~(*qU7%5;s3#6>8RVu@$Qwn@G|Q_R1`6%gI+BK;TZ(lySfMe^3Rx+_|} z=5R<1lQjC#G(nDtqz%=!kF{#U8(Xc5YwZy)6spUg#&4u$9~6CZz1W3%abvvE4W*h8 z&3ra3?|?|&2Cu!EsjX@6PrIg?`T)+wONR;)GK$*wD0fK^t9GQse~m^yG0zamLF(B$^C#4#^fHZm6}J zeob-5ZO_KX0+7(HXCG z>syK>>OPy6xUaO)|5PmLXuWOe&!i;;4Nd&kKVX+~F(w>!QTd=MYq{7g%#x*iFfA(} zuTQvVwVFxfkJEdX{hXBK$>YL;7yda`@mFxFRvs4?Kl#Un#b5q$;q)oLkd(>rSWv|i z*BYk|`5l#EkMfDY56v0Bq2SP$X2hJ8kxrc1-^EA#LUB=&e&hY(sL+bx+V)PhwYhqO z=UrFrdfQUvt|CFCH;k7Ti@sG+G!lcB%2D5NqfSme6ba1^apSR8(HDb3rmv1zaj`g6 z*{zB%`{O)uRzUDwPJ)vmLXlt+oOtJ6(YGo&dWmrx$Nih1*ho1OY}T!sbG#77w~weLrmaX!6Qx~09hQt5znf4r z5`!*`ew}2%k`|o{Gb~X_Op06NSZ$NITGKjr;4Lz%n3xwwOmJQ_NsF!?k65CTn6xYc zQCv%6!Krv6&SrY3j~H`tVvL_1WMiePCPm^)cKJDaiE(E~*EFp6Iul|ANi;v@;)kqx zVoVrMJhH!w$ApnQqV3$em_l;~g3-5$=kfHoP^nm)6ncp2)$zbNI!Vv$JhY}1=fLP| z$$&krmzZ{byLN*-I?qTnkysL#;z4QjwMwLl7|`F?h?0N2=q0BDcBl(+@v4^;w+tJ| zN3Lf_@@EyM=jfX`LwRf1glF**ob>EGKYef~D3NtZ=`LPPE^Z&8BEo`GSBMeSGBKFu zrGR*TuV{9H)xH>=S}qSlo7iA zU|wW`X{Zy)BL2ta_G14%o!8Ng550E7kZQE5*$NYNs60qIdRCP^It%FYzazCY>tgEEY>9TfJ3HLEW0%*_KD3lmszAj~75gL{q=5WJHoU zE?m5H1gePo^Hwarctd&Z*&JcgE;SM53)Wsz+HV7%*?3ph zUP9EKyK()c!w8g{XN=b3QU~WE4`61|h zOlGj2`fVi?MdUB```oIy6Vt1TRU3UxLL-AvIh&O!kgze4CSuGAVsCegf1j>)aH8>*kR@Aw)O@~@ql*}{ zoP20=tJf}PPqw^WXiuz)nls|HM#MWBTN-t-pL;|s-peasVYE2r=v5V&Qy0skQ)G^> zikNfGL`!UN@^@gDu)&x<1HxBQ@`>X4;@aEbGG5sA_{v0G)(+Li(uvZbj3XAWO1W$7 zry{+6)h<+^SFN3Ez%`&9vy8UL0=GzG&K{tp=RFINGG=PD-PFwzE>g?HxhhenYYGG;W6Mxt+sV?3ch$uNu*CVGAUN8UXA<#9 zF0m=Q=&b#QDA6XvL#mRP)~7fLQq87$y}v&D@@aa%AkMw%qd_KqWD~q`<`qR=t?|n4 zdLFaML}HTFS!1^neY~P;HW!4=#@{>csOcl1f_mh1hpRO09+k}Rh+l1bp`yA@SEG4GPp6A^NOAIX-H5)#Gi=JcEv7Jav(Gk}{_seAUK|1Rf9L~C(RN>83yJLd^oNtYU$FX95Z(Cs z3TAY3Y#@d{L-(P~nHDS3#up=77@e_)IIu$G193oAzca0%;~|}vafv}i#^2u)=_LjY zd7C%;XNR|XeyWN-Vim*eDVqYfDq0JOk;}zGshA;YxAPT9CqXl=m1=^Ps3qnMjkH_6 z32|DaTkZL89rmGhqcPK3K#fc{6}fY-xL~S=fP@bwI8(3=4hkI zwSpMCZbGax_c^ffV^hpgh28{W<|WzBScelGuj>pTCT^B@V8=BFf0L8AaV8iLrvq$l z`BmV=2(XJdbdBMQeQ191vk**{6k0=!U*m17jf-8I?PNj4sy~3sI*NK?-U?av6k||t zY}m>!bYPs)OAK1t>1_&1vGIjOJY2|-DSqmK_uWdQl$f%**O{n?FV!mrNopzLgufT(ES|) zEg|{p=;n`sjCp-EbT^1jjdic@tD)ON23{TVRnl!E1DX%|is*)tA$8(exHY<(Y*$J>+gNhbQyLKso&Q^S2z3G^ZDXwBIx7#hA*5p`vFbJd_}b34{WOH ztD=p60EJ9n32pBEUK{l_(01PMVY<+8Hf`j6D?$6BX`}A{B9gCzw(h>K0{JRv(;nALO^f~C)#U4-S#hA- zl6-YEC-!H`?#rbKuRn!3UoOpbi{b5x(duEc6FGh#fm!a;ZBguRwNLmtmuB6{;!dYA z()7gcj-b9NuIbJ%po=Ze$L9YwmPK;dl3J*NTWXFBN}obEhBEv@MO8!$Srq?1JRV@K z9_h?5?(bI22-Wo42p>e6zWWklUo1`B=d(wmQLF+AjeFfKtzp3x<7FLDxMC$FPIH;< zFVYwB`)cdV5}x*B9YZc zOj<790u{GWn6DJp`$?cNj`w`4q`&$*8OMCMFjJ3j53*D7+4BL!54-(so zR1-rlN`1QR)jhFmEVyXB44TH(9<6~yrOB{Xdw8l1OH>lWR;D60E*_n-Fw3~Uqm5Te zAu(#P*qgf5+g|f`r59hx5{o9(H%`3bulP?{rZo{W)-=ZbW?0)Q;!@ir?l%s1o)&Mq ziRBZMj4RUdS1Jar#JrUv^|abeZ@b?nxm(R+HN-M5bXtYPsPh9piM{28OLKZtnAtq7 zMrVMy%x5YL2-FY*R_ae-mdQX&So8{sQLBbq;)$cKyvj$^5;`K2izVl+1skaK2*s~7 z8;2N`9F4@RkS*oG@<)ht+C7lI%2z|@-F?iPzHmC(?rS&Zi>LGKjQFHyD8o@-Je^lt zrvP6hol^HP)%n6R^Xg0=P%;Yh=q$F6X+W4fkIt_8*_?gp$|TEf9PEpvtulCFGUpD~ zoWWvd=4QOgDb7?m>jnMp%6$)MLg?3!-Iq+WLI36_zHFKbZ0CNyMB4i2BeP^VgNomDvQJMcwa~#$|9gIC3~VdC7Q^hH1&58lF>#gx|aS$!67g_Jxj;JS41bo8b$rc za=s!uPo9ESt_da}Gc9zzt|GL|7+b~QHVY)uNQ+;exno8+EwUE(zOY0n$(p96 z;N&aW>unU(#L!ha{jNDzB%`VH1lF|Tk+LsGBQa}XD#w>G#Z*R0nUc~%)w7eCJ`zmz zDJ?|(s_+-tuDMJkn4sinBxYSedbl#in67S5!9w&96IP3vT4TH#3|r;qkL?qT+w>FJ zq(PaE&?aB0V;j5to#CeRZ`U#t6rgrF?F6T|Yq1%{$Zn8z5n=?{+O%Ik)z2WA6!fX4K z<;ReYeHW(EHrJtaH|a~HgWP`RdtW*o%`%sol3*r-EmNI8`Mh?VwPb0p(-pfZ+H2*7 z0!zuA+uS0IsU&WaPdFgPw%xY4HXwOB-i(^b?lg|ZB8NeUsCZ=TA?7}#)gGxe8_x>v zIuKlI4%gbla;d97cCR;84NP|D8%7+cO|)(hwf@%Ts;=zaA0I9)>x0oY>V~mA?$`~Z zZN!b>GHb?`0#kd+PB=}=3nn=^v(JH3-cO2j33O0NVK?!F#2IwPI~DCgs-=T2ag$ux zB_$JtWB@JI(y`b@%=x_`(Iowkae!`+pzV?7Eo+FK$Noy>((sl&ZZ~8a`zS(5>s!2P z?b1uutXg}aF<&S$NRUlibd_&bB8Ak9OD^4b;U!aPMx>CKQCSx5isuI2bYv-#MKoNP zQ(Q2IKe8&_yPFOvM5@XCjj2K_F==6Iv$(maA+C%s+>sK=CGeYS3DFlSLerHADf3~RBBpz%BL|Y8 z_&zI2iGfRoqXfm^hN&bSeIbcW zsD>EPzosmEDLR4gOQ@w>I*qrbxD-jJ?0u)L)Iq1TeE?iarPJE}q#h}l&S=>iJR+uL z$FHV&ZSAKCK-Jof-XhNo|DN7az|^0YV&U!{-f$ zT>>wI_|~NRU{mcU`u zTZtRWPzBL@b|i6y?0dP*^CU*|3?ve57mYW>sbYEecrt2Zb@!op>Go>cGeNzo=+qL! zmJGLUXpXgN!_{7UtgJzt!BF6b$RUY3V#q4ZvEQ=xm=@zQ0n%tCX7wdLvfYRQEPI4Oj1vfFsuL1dmqTVRmv4V< z5T_S=qU#N?DY_rz1VaW%%OfzY>x|dN#;W4LN$RaJ-sbbPOw#R}?&nQ^sbbVk%-pc4 z*AbUycRCqMSsT*RI*FmC7qQY`suXCS0#hYL>0D(=-0%uodfJt2A8R6N`g=K}=|Rv( zx=QCz=kQu%+F;&LF#QefNc;5V{u^RqtGl=!jn@oknVMlFj4Ac*|7b%cV$@_J5(^0 zgfm~wY2y8&zjTsLdzjmjGj=99#I!9r^CfL2sjLbg8|9`D)6!TZi?op?@uLiW>L@Z{VMdbu zVq_*!O^n+V8mEb7c3f{9Q)D$0lP@b_GQ%L^h>jMi0ZMt}ZE2A*qR`;ft_61nr;H#5 zUt0Ii?pD*lq&`~SUenIaEUh#LCsQ^|iMcZE(%Q`mZtW)PPPR)iZ7#}wH>YbESUZq@ z(?X6;R|<~ul#sgU3pxxbe0i>^&pl#m|OwA!V7GraFmUMDZq5|dVn zBMsta+W4rIMaWFoD62MQ^b(`iYz~%1#N}_nx(IW?kw-bxaU<0-opNH{+KHe%QjZVs zTiS;;39WWw;F@6G+c*2L`011r^EOTdil@D)FXxmQ z*X3mci*_!Zrjx;Sd9B%24V@eIeGDR9p|isQ_0v)lO+16>(WDxhdHOimmC|YI@h8)a zbMi`WicF@{G!NC0UgG>f`bIIbS{x6omdSAyZ}(tv(NL95EEp0KL~pFNy?T95^!{>B zQ(*~H6-g#L#gkf9KqYGiG4jgPs1tbpD>u05DfpTa?pAW`A!c6_u4MV6DiPs+$Jum6 zRG#Zm4MA%XF@8vlSf>LqvSv^t>(j%?tQo|}Yno!1+S=;1#{?h5z*Ul=f6c8F4NN8x zo=Rtdk*}npC-)}8%7+dC%Z9IDW~6_TwVqUhGoQ+kqLbj zVM{~Y8`T!skw0Ts<4XFUtIN27CN0+i_M`l3NlkE(-FelPChn*&~<8(i3|#z{7gwYmU`)gXuut> z)JP{r1MDrOHab6=x|AxF)9KR+WcsAxxu}T+Z%-H3S=DcA*94dA+QZ7AdqL(@=Yai3 zN(E_e>*AU)r#4BQOvxmDTXEetS59=8N_4}-%z9sEDS3vYV~ms>{+#97FyhFA3q_6mA8SbZ2p(ETuCkiP!q4gQdi1Ay*iKvlAQ(R*y zW;la&ikBWHi(#->fQTLY)D~GIAqg|lNp0* zAa!L*GLr1m=umqQ8C$BML+nAPDXEfQV|`7uPHxLOo5k_-HW$h zO}&qlM3UM3;AxP;^ShxD>EVWPtD4jlKK|hgCrTHLH-?ABF5og+jhmnYttsh5?L4`d zRz|7uuvVZnmQ7SH@U@AJN8aYfHuFeHN+F#Y!_$;>joMC69L^q?+CVx{d!Fy8Cr&pq zE(q5U%5+0k@bL;&K$M>&x15VoUGZQ@jkW2hf2cYwzJH2kLZY*DizX?h(OGzT(o11< zR&CR8r8qjEv1uJr938j>;>xjJilc)POE&uwGtbMP&FpFde#RvT(`9NQId!YIbHqIm z&8|1RMr^Z13Jj*}ATlCJJ6QHCF@)aipYAA5u^G$K-HPc6+l=}O(MXJ0B`)+E?$!B+ zHw+dTi=6a(B0*)<60=sy_>8r}S9N>shPhXu(nSFopdfW5& zs)>aT&W1IrfEZ>x=t9327?#ycj9a#Cd~AwYMKls)`Wz{lBIuyIj|7p@>7bf@c}Aw8 zWoJ3Ya~fHQ+pTfAlZ8aGpY2mRN(c4K3pBEB#wpiyfkx&_+Ch7tSSvlFqk}$WSt*&0 z6y}GH4fQsSh0lI-CmqJ2YQTq-R6>OH<+dLyLP-iTy-lckS;;ej8d`40UtbN)Gl3Yo zT9!7#6P88Q4b{BN3ZHSgLHTx2!w7W~tJde)&glSCK=>r}(6KA`pqUb) zq*7o!Xr_Emn`h2mFAv--j$SBd-s)!>QBsKn!z=6ID<@&?Ure>gRW|-62_u|THi6Q# z(T#qs!mxsvy;^-{spz~E)kq9Ay#hnOR?+GurY#X8-&VWnZ7)3YLq!vdO#7MX*D7gs z{WnB56FMgwBxR&JI%i|w7fj=l9p9Mttl4b+`>vu@oVVOp15n7Z=En8y+!M6W5T z$yX{VEyUmXyzBB4NeP~&0a)^R@jifhS$^p#OIFg^i){d^aMoHeIB}RYWuJAlTU7tkwdTIF%1y%WRqAdFTRi` zPY&sFOn2wz3D8{5b4e#@^@T&xJh{ZMrG|CLJOSwh;9Ef=wqCsvhuKGGAWo+!Q=uT& zO4SfzXuqJ9ogpo2t;IXTjPsewjznaeE;6$QaN9SpTUimC#xkbNgssh>~<= z+CG~1ZEeb$w=w&GDt9dE3N!mX3ei z-r776Lc1(z1HibXU*ROux1tJ3B&9)Ku4W*GzX+Z#`zFb&)X`kU))iHO9b|!C-^I zJd6-vWP~tpF#ha|zmNN2V`DHj7@G^%Tyrm&$BoEyBF~AFzsx*!s@mv}U2Rv@?-v;v z85tQFnJH?^n3Z6&)R!4MIs;ewptd7-F>nthHk==O;`f>Mf@!VJ1D?bfF*G`lQt~*k zqm|4Ph4yTmpA}uuH~;XdQ%A4dr@hU+&f88Gr}k0n%JI=Fl24tLD1W&7#LDRSk!v4e zl*ek@+g)DHwD#!2#L;17Ynp!ky5l3~H6Z%)8~{>G7t=yba}h`IMl27S8i7vU&+{Xx z2QRWJ(Q4iFf_2Ycxd&Sb9UH0TcW)FkMZXtIeZ zwBk5$PaEivG~hfjvCNRxxysp^Clh?G&Jl*6RPyMh=!2b{mgjdK_d5$iH%-%trkXM) zcOBpnQW>s+)ybyN%S=8XJF@lbB?XT8X(}>Z@{3dV-=a%%Xa+tj-)ZCCuy`fbpL? zKQXhRY_RpZe+Hw{pz4MGjO^JU>t)a^2e5%JtUFG?_6?0*cg)Ck4YCe@!fz^j#zP@} z^V!aIQa-%=IPeatV|cKd%AntvQXMhIozEJrqmiCtOd2 zWWHzR$R|ee;zE6&7dizRCC2&mb8|9+7Kh!dT{;-R^`#R_{T5Xd zpI}FN*_2T4cBZ+BH53TatW`NIN{CsEG;)oPy-_dRW;k*Tx?VfYdI%T_y^flp85?vR zWt{g~$iyaK&=UWnHIHT!uSIeD^1wS?-CzuB!`@&2UZ;jr(Od zyS<@C)56{!UDsD?5$l{+6dDVmM%?EtblP1`^_K!inaa65g2G-%=Z5}x)b7)oBNe2&)NBn)hshPKTUWO{#G4%CsUFZzDH|SE8es8Tq*R#^UJA+c58O~=u zG&Ky~+Mq*?13G5Rm(VPv+05#kJ~YL-L=nf>yeg2T3~^8S;FKG1PROyceZS0dU>Ua( zE=#)j)0IAOB^Jz|`hJ;-<)kiGt+rGiaSDYw#YE*4rs$Q4aGc zmRTANCz|v}RAMlNXca9j<5t2w)6EUNW-)x3Ld**&!{N2OpcG2rW!udZ)XV0>6mr7V zzE@5}uEbl~b_1U&q?@p_U2Y}ZsufN}LsQ5%;V2gQ6ulDhLdm6?uZNWPn`{(2%u2B3 z@>6>$*(S3)M6Sd;r=!d%x)g2#`kFMSX_ZJb9ttKd(rJ&`+p{6jiH})397CbAAK46% z#RF6HpkdG%keLM(23zMrW;*d2e7%&Jee7XK^vWjdf^4FkwhQzUXQrObv_P*t!ZmuK z_@%g8f5HO_rY^ewHFWt+#^Z_qC!ilKhIQ=CWlb9h(zgCETX^ zlDqX3cM3wMLJ{ZfIbYMXkS@Ox_Hsnnzy??&rwb^tb9%d~#O{_@o#N2F*1#kg0=tJ% z5uKAVUJ;9gN{fq5mXx3n#6-WS||W; z?rHIMs-;uPJD~w=+N%SflN^19PRBt@YOrVStD>8|+^b?qO zoVzgY(Oa(N>&G8P35EiQGK@E^ZPw26P8QW%K23W6*XW)<-^>MxGoW&3|uzJ0jZQNEiGlQy^m@^nb22}@>@p@0!xQfXJ z7&W**^Q0MOI?b6D>X3H2@n!&Z%vjTIu99OnusSx3)xEk3&5{SO?$!MPjM{QBRf+o+ z$WK$!AQDpvj&eRvdhS-xo?m{dra`zZoi$H>18z{LySDLxNJ$#3T1lr)7^m@%YRKa+Sfk!wP4CO`9dvsw1A zX`r59r|T&Ls3+E04G@MdJPlsnp@~jQJ2d$LbZBqoL6BdxmR>4){R~1=BS~MY~Jq#U=?T{W+7kd}v=$CU2vli@{Nxb}Z2<9*=!PcGQ+^jW!&8)9?l;)h$U1>J%dqG**DOYvfz@H? zOeYG1ucN@&ZnMuMv-rxJOM|Wf?KV46mc(SygnX$eOVE@zdS_$_nHOFF)YJhtri$8< zUxMZ2MR$Ey&g=zKN#o6Yqjt=>)Jiv7={m2Q52GfVZK042v`6DrSx5*a?t~)`idJfV zlV9TH=hPNuMyFmNZXT(rKCht%evn_V^&^`p++-4X{Y7&Yn|BW9Rn<4$2I@8!)ush`Yw7`0dvFHjXn z6|p>wO00J#vd32Qep$TJjrvKdBCv3;B?2U+*8OeI34Pac@}*T?Cy8XROiB-_7XwPbuuMvf`E+vW-=yPAksUO@Al|)Q^^-Y=ONr7Lbauv6{?t6M=c_6URB{}7 z7?oJGGci2q_qIE|QDt#Tc2t2$i9uE4a{g=<3i2kybdUK-m2mG;+rw2%*|}vJ`rW|V z{#{hcW=>02?xeCJ=r&kW6Q!*NE&FE~L7GPCSbr9whJn=){?w72!PHJ?7QvZ; z)t=@_C!CXYLv%q8GG10dBI?@mmo)Iv5V zOMV&YO&A-S$bRHs%w9}{7?`IKo3T@pph?O`y}45?kHf0;bFo?=l(o8=XdYH2+I*rl zyCRMZB9BO6hnW2+?LEt;M5#M#;%dTpYpIG|=kO_UC@olJ4W2c&TBmtfm1y&WiPqsB zkxF-3flZ0BQh90Qk?L%4?#g~d*Eac*07}5O%k)vrn7p;8MPm{gMLu)wn1D{N^5XZs zBVSjDXyASC;CG%)fY~}Y(@4G6o0V@c(0a8urGXekz22Lx=P(3%#W$Pr&%kfh1?#b! z@PS2SAxk({kQ=#Z-8Y+g$TUf>_+}8B7*xIBdkSbmg0X0fRaQ{~s9Z{|%t|U#wqU5q zC>&h6KL)F*m5JkT7gots*6&M$Vlnu8)$;1VM!+T~8m?Wq>Jpa*TXuxuP^`wqBj)qkvF~?JT?bVP`M!CK3cu;~yqk;LnVQ7dj=#(*r(=o4n7|?KMsL zPiIKig45F_*gHW2B^P{c1OAM>yq8^xITL*u3)j(M_-T2zaVU3j9|dMF;V(U&=_Iu z4@xhJIO{9c4KQh};$I1n3?dfAd@CXrv$27-NZHq!}0{?At+DAro_q0z5L6lupn?j;rt|1jB{Ok&1xjHZR;Sa z-hp{U=O;NK#`{+~1EmRm)hD@QUtQZCngnx-R?-CKo!n0{X%wLnDjP|1TYD9GCLKw_ zr9{aLH+Jc)qj#m8Newq+Q{t@I?lSRAxwkjNlEI_i&QG##gTzY6`I474IwVSCCA-hz zQlgwo9a54%5noxwn&6$=P7CB23ju^PQafU79Fq8#vvMD9jwpJy%}&FHOI@>9rssEnFSV6`H;Y_ z)|5jiw-U+Wlv;`8z7JO-Z!nEoru!vJC5d1TR6(dVos|Pc@n>Qch?*JUwu1Wl9HP;J zwA$_dV4GePO=qk~X2>ceUo==k5JaN{Ny`R3wQ_-B4kdzRgIYBslW6hqDbW^vU!7Dc z|4c27NDK2^sgyuzkw!9kMjlF3jaKI453CB(6nK;9gJseXXl8S3kEMG7Ur**!|;(oUewsh-df zMl?#0bKTyMX67+JL^qu@{vg|SikC}?bQbxYNlnDei8_#+-tG*j4k6?FQpzfdlPuhq zQorzIDQDMjrcpYCor!fCTph#CWCk_3I)t5iI1}dMg%_n`n{=v^vgieF(y8yl$Yo~J zm1&8NlV>|i8-hZJJTlXAValm6Vjq8_4w0vwsEn*OF#hHrri}cn_WRrPH1OL_7dC{+ z0qzZtk6xL4T+D_ipYA@fGCF?b+D91Yjg%!AQYxU&HE|u@$?f(|CqIVJbh59wv1&l6 zwk?OF{NR)7qY-Bw=$YkGRK*ut0hQn>%EuGR!yY&6O25BXimjM$&$DGvis-FFsz7h; zb>ByiG!qTe9rj9*6$e;ChTs(8o3d||?yzE+Q;~{+6v^8)iBWNDNN+UvOEs-{b{p~K zFctMXF?Fxiy;06Oi^cjOa)YYq-$)(UrmChr`sc75As!A2C!y$EJ9_@9Q=fl)?dy_% zeQoluuTTE<;pAUmo&4)-%)iFtqffauJbph7)|Y+s)T#F$AKjh|P5#@pU#0I{JT*T0 z)cw|IH~*!3cB!+dipGS6>Z_k}aG3kzBS#O3_h|2Rsjgx;cV)bH-BiaOA3Zoc*zNXi zQPOq4MF9_WDxK`@9UtAbdgWTDJ*xLcgTv!*AkqGU7Z>=ISd8Ypacw%?*Y44n};TT{EVr zHu#UCHmTsPJ8Cu+=)05ln$ylHqFsqb5$%gU9NjC}c^B3$+@i2Mol%pjinqt@QS-_n z9e-2Mi!QXym`(ycRHzLXwYi*T0mJk_PsFpEtg?3_3$Wb zEM79#2Rr7m?V_Ixn3iKAbBsz_FW1UXWmfA9Tp<$W7Co*TqJCk;^unCG1l|-5If8?6Neb zYSU=Y>J3|Mc0Ag$ztm;2sp8T$m(FX0&Tzap()eHQ;!p0`WbsSsRE_>Y7yax+da{#! z&b?`h54jZfJIPQ2q< z&4gqyEu-Deb9F|2PT`1bRooEIlyc54wb}a(a|b*{}Uu*WaT?RMo4rwIV=l^L|=xNQ7mi_l!bnNha+DT>i>E^$>`1jh;(eGXD?nun> zmz+fYL;8BoNME79I=8j4wz)d*{_MXqi!w>O<3a0XBFX>KF%!f5KU_gW7^YaP)4QRh z|NmT!7fTCvN27ygB8>XY|I{u1bnyMT^P8J%pw)lrwEDH-U(fNL3mxuK0=$_w0iA(o zBa58eIXUR0c&|r$0OqOaBI2tcqTR{!AnvzrH3uCsvuxREI_43GX7@EcXjfY8>;0=& zn^$Qa-XEw2KLi2oZh!}nMLTSw<(QH3O%T*p9(q6zc*ihRWjBclExKvTx(*}Xt0ADhI?y8@95}CGsM{zzLpR5!dntAo&x6A& ziPW5%qwztui(+K^EEn(r85^Bj?aqNp&ioa-o+s%iIoI=Q_v>@DwMKm~=nrax9jglS z+qW^D@;|ocGdA^edQ7|99Pai9qh^O8rK=3wI~mRylD4aSkOqjBSECkJ0Hj$+16YHA zQ5j8N8U4F5E-<9-G8+c?1T=VqqAAO-m_&7>)+ncCZ1uQUwTEZij*Hpm^$_GoU1YVJ985 zZlyn3q-$cf-Co!=nzBDhvCyy=`&w%q^2Xn0zrWNP>~vhn>ku-e{B_#uS?cb0M=n?o zg4rO(3ZB{RMrUxNGjNffgGk78NC?T%3r)E$)CfYM>A*m3>X6FV!c7Q)#&xn))%7^T z_c6{LSI0dgYTA7-67#&-8uaLtm-Y0|`&631zL1VZ`(dJ2~wT5^t?zP zhDf%COv}V}^1gl#s{898(95Nxsivm0m#@r8r}i)Bu;p9%x1O?_;ty@r&010;B7JUv zzKwxY3}aJEF`T*W*5R<(zuLUn>0ED)I=Ac!!ytc$X)}gDSe+0Q~W-Q7@(}gMe;myq<7Z6~Y zAAmH)i{fnwSkYeQiZpVR)yMZkkk6)H$~UVsY!A97Xm@q@F-TH8>Kt#BIcRaEWfKy{ zc7F_l+tg_378vkRe?<3~QCS{s;b;5zhUepu$EIS+^Oy*>*9JEB2}n_XkW1$$!;vdS z^M2^3AbRmAMZ6c>$lK`WXCVCKmbBNpLZzLa;qmj3Wb!s-2Sk;MehI?cpty7&Q)MZQ zbFKbgf!O68qI7OzqQ+YD83fY@{}OW8sK6_~T-m6U@v97`rW+fVMuF0sX!GXxTTr(6 z_z~H%x>ur#HTS!A=kMo)Zc}u#dBfqxUr~scKjWN)$1CY;fm{*Evz`- z{=SQ7V>kzKk;+;*lv7Rp14d9?Zqxf-0KUqglib#e{mvgvs6UY`2aLwkA46EX(vQol zhv%O_IDan}q?CHh@t~_T`lk@qmSaYwEE5F%Ib&z#69nG@G0TWJp!};d8t-B_J-+Q~*O6~6i4NJQ z&K8{7y^N#Aq)jtMV1N_8AGXmy$hBO#5m|J-FM+^*hgJlJDtwu%Lc8CTwmnyWt;XFe z=%?4_J}EWeHq++*Y_3LY_Zyu?k9x3`+lep}>Zh>;O8LbmeOJUHZ1^FHX)eh6=S77+gqM6`7({vkKlrq#6D{O2HE z(9fh2n#VP0x7QKz=G2f*MD#ugS;lx%J<8aVT#V|aZ>)??_p*>XlXsqtOLAhG5kxQJ zFhs-sf!R{;xT=0X#177nY46d(#Rqx>L5txh8p{kSLOW*hl@PX!<>JNL-()-;+yz67 zwBcyg_N^|I-G@LUDmi$Roi#FH#ouKRHH`)PSTJah+ZYjh>f;qQ1Q>rI@X??Difbqr^)dQvH zfSh&q4>PFht_y{&1fWtElMnPWGu5Z0OpbPc8fv#uiH%Mg?rn$2egcveQ-I}~X1ew! z&7ZW%svPDg-41bX6fM&s_HK;)>i6ed@Di5DJtG&-C|Q4z;Z#4LE2nuuqezp%X)>l6 zd8b1~$7q#u{3Ar;EUruH-BOVy@hqK|LeL6c=Z1D5NpSJP}w+(rMD@@P|S`8*)g6^0vg5Z-jVrS4F zAJDehs5$1FFo3Cj@l1H~29Vvkm!CtIAWz8v$9B2Hlk5vRLv|Ii6>9)uCg8A%3s+{) zfLz67evB(|tn3fWE~H}kAY_()k)BnRMnemn_k|)Y-E)1(`^19irPa zoF$ELIKGnH;*|H_-v^;ftoc=_H69+co5REXD}3WxvEJ;XkYZ9tnw)oKds$T#9y z$S~<3ZBrYJg1T4Jdup7JehU&!>ao-Lhr)y6#@bU5zgY27ZqA`#z6k#z2tTPE!Mcg> zfzT!LQp%2Sisz8Ab^a~5y#k`K?y%YF>Lu=n8MRp0J!zCjxCaADcNMU|4q@B#7$wIm zN>KfvtBQw1-qTzn)X^d6k1&SHQv@YTA?8}?|M7Uhf5xazS|XS|bCA=lp$d|I65Qdd|;);K5Kh z15YfUm1D2SYVP%E(ZFGSu?FZbpuGlXJIFNXv^%s)rCYg*wS~`zZK=eNT=wrU+y)tf z(;RFA-BY=TT5t;D2Yq^mPf3;=ox>LA_?%GVJ_sC)^)le@J{wW%1_|A|LRD^QZpB&b zd^#j4tDW@nGqxm8Uhi&*Uvl&&whHF{7fz2#+wsMS;?JP9m(&H`Gg99F0VuUS&L8x# zd{HW`Ce4mKP0~XezcggC>l2OdeGn1^ccn9n!4u3Y8B&KU@#)IAUNptL-bIVg_}Kwg z)5tT7G2sN$AEYxr*^-loc?;B9+(ZeqbF0&)D}c#!I&SB4A!=NAgo=CO?XK?PQ$3-f zet4IQ73_z?C5NUT&N7DThhXfTLeMmyTVI2T`3s@mf}xi{^R;-C3dPy}O^6%JRSIq* za%Vu^|6sr*+~c%(gPFF^hdjZxgYeKPCUcjhcfk?pHi&pT<_b} zZbOow;R*>h-1jh`b|FE-6*OeHS6!@7^};;w`)0e@${TkXO4)BH=~h6ROLmm=$yeVD z`(;p{p?&NkSGrf8Crbv78#8<@B%7{bKCUl;T$_OvT(MzZB^FUi+&cL&)D18Stq4YR1*0E;OYTLDAs*1{X54K=h2ezs)FW+=W&y8Ax#p zlq3vn?tTKQH56;*n97W_AA$s-wQi2UXKo*#2Gr+(ehGq>RE6xxhIUGS1rmfR-*T$( zkBpy(u%T>j4wiDC-F<$flmlg6P9GkCLcotficku_3I_y)GH6~EDBdoXG8f?1@liz`?TUA*P`Zp

>sOI$wo`~yfF3UEWV;#o-j7L#ae3_6uiPa(b)_d+u8Qbr3Y<;wM zlGj2zNxxS>&`?R5D=&kFC%R9AETQe0j77!-USq!uB8Ot;3|aI|j{{I`n?6!?8sdf~ zK8uTk@Ygb+b~T};uSG*{2}eQRtT$-HEBnxQ9g4>?NV`U{4`$K;+PZ zryzT51Ma<$Ahh5q5MV=ihGDh0DC6i;bs$@4x`@S-+<9B5n>zXp+F2OuL4JjClqH1f zQSvZzba&U@UX$ELu0kJYXrF^x4OO!%qATMe)ie$1Z92sTleE_%RY=*23U^=6Rd&d4 zDMZwHBNs1pysFMc?+eAV4>uV^^;}RU!IZ#l@NXs ziJg6zuYiyt2b)QZ`}v3w^)L;^_Zb}O-?nATH!?_GckQVL#eI~)f*I$ z=DG*8G^7BRswJpoLiyA0hAIqs>LR!=-}Uz(awrfjB9}?k{awfs3Kxqk*bx3c<7z_) zrC5ug$Q-`cg$%8p8tF+F)m`7u7|ISpT_q56_S6jbzq_;W6HtkvfWRW-t#N1j{YN1~ zDEhVxxPN}!Rc0vqwrHqhJ~ zH6Pjk3CTkFAcqW(z<3B0cT%|;xB+)lbKes8i)RW3BrfcGoUFubkHp;2gjqa zH3Opb9I@o!G11lxh|Kkqbnu!>X4C3S_Y&@BAyIr<%XwbU7UMc2PdfMHVbLtHlZ6X8N6x#mM|Y3I>!&{i)w~>BAn>$_cx+2T=OaE02}4yK z$&f&V$?+?5`28@{$ghK(@tGHJ(n$0x^LTbV?GVp5L7qxF?9l-1)5{urw7yI3Lhu;M zcS6pkDuz;u@4Fyhc;)IbOw`6eFMc~@zEq{9S>CRd4UPcyML#LvVySUbX!08qJ&W2r7=h}^-+)xpm{aD==+&3d^z>_xdeZ4O-?P}8 z{A=dX-Xy-@@v9O!mEUwJJ|ko;^i*QMr%dj*8A17uVD`WOq}9~UUe8}Z#Rd~>3EqBp zdz;P~I)KmraT3l+6@>EeYYCtU;T^bB5UzxLW>|jQ=C_lVu|MiTkZ7;M5TeKKt&Tn)f zgAOK@)Phz?zCDk{dCP!}p{aZ-j#A`kRY?HsmpxP##0LF)i z%<=bKJm>V7!J}6zT6=O_#j&nGU>Idxj#I@b_VgI12jGq9FZejJEN5LAgZHFo?ttjd zFpr@-d8NA`F19X5wV6`*nMk~Qem^8|qQjWr{Wf?Z>|TiNOg}MfbGJe+d~=J(Ujm8B zHo_#vwterEz6@eJ`BqOO@aTI5W9rf8BwIazXz+cS3-=l@7w{82H27d%^fW`Lfrovr zLSTpLVRG@r3CeAUQ9urQ61Aw9NaKVLgw!8#t zZ;zgyaOR<9Mo`1yG#XF~opzTaR_FI?&hMc!%Ku($zCRw(MQXGiij3t7Cm|c0*}ZHuJ(~L@yy3}rLy`&A z7V&?74{}UsW5VJ0g?}H?OlD)@>Hfzd!(=@YorQi5lE5XPx7!2m{ih+kli~@EMC|H+ zf|0eWhjXV_Y81x&q6-S=k36UZZz@jy=M1D=e$>bXhmP%L^8nrQeTZss{u|V*bKIe* zSIiNK`TsNIayCh;a=G#Ue}RNf-rY+`5z<~OeeY+R;uzI4{|GH1HdzHr{HD6& ze>f;`6uT%Ayo3DUL;sW{b7C0ingOmm8e9u~1Tw(1EMQ32@OHL@>y8&g3K+)wDfZzh zyq7{~n0@d-n zi|lx=LU5QV2H@%bhByOs61)KkB4%W@0nKO$LPpHULSi#oWXy@o$O0lWT6f{R29Tfe z;QX@1V9Jx@a8c$J8+(EqjI2F@canzkB7g897qpZ=5GSMJ%?~q}@&_ofAaE(Ov%uKwzMYXPn4N`1 zX7_zAs8d8L8s8kyEy4?F_Dk8@4>F3fH*b8PK;}janVsN=YlQy?YP2LlnOWzzA%SM;`5V(`D_>eE6Rrbjd!XcZ|lA z>S!L=%?Fp@ze0kN+8%U<2mRhQ-yG>k{(nJWZ+NAZvTZj`g2MkgG}B#=_G^74P6V1HF+CDYfUbp-5CxhRL@x4)HRH>uZPp}3t>CFvnS?*Hg-2e zE;o*COCk}>eUPJ^6S5r0{vL4q02W!=K3E&{+nvrf6|5=CdysL|Jnao!jcPNPbfyOL z+zM>8H!{SygXEGZ&vxxAr=utn1AH!|2oE4fJ9t{X2%){%nWBQi6YJX{cxmmInOe_6 ziqfhX1SZ!ygmzAts#X=p;_A zLQYt)1#Bd1S?i`7mUba_S*K#L@s!_YaBYWWhr2~a_SkoE;fCBAZD;mItGtw0C~lGr z7(>~hb0U`A#d@-42-GW$9UvHHKp}6~NqR zw@bH9dX7GP15}=KxkqA1Ik7x``)l1MdWoeVQxu{s0fn;mVzF}7jy z*Lc(We|I2YPRLA@vLE5d@of$WOc^^M$$`^QP3b2X*%@Qd_qpg)HepI@eTAhz1i@ih zb^zR8QS~v155sU5KTw18afn+|?vYuV1uN%%2I9l;#FZQSnjd3G?Q7r~-Ni#g=cin> zfYqj1Ovh?}o>7#qfiqtsQVt|b!@wNoFG1}E1_XqrsvLL(>5m|KU_d~0&*JNkAvm09 z0$On<%0GdyFrEy-nx{5Zkou<(I4}^PGW=z?e+BU;wGvow`{xjP(th+5+J4F>kk^EJ zxB-P5#}+&@^#aIKQa|CkvpXO(EaP;WkPevpW6yjqYofGg&f_7^e7}nZBS6z<%T&zec;%Ncg7V5RR#yOXvR&Y<(_Vo6 zT>`n)<}1zV!ZV*kegY!Htc;dl;^H`&_b^V^KVXovdlpbo++t|g0Dj+%B6 zN^!Fgp%^{2hO|!WD^*=bfW>5P2(Z`c-q2myLy*`WNKI|Z`Rvg@hZ^KL05ZPze){YC zj~}`A0s8l~5As*;TJCStNy&O|L{Daa1AX)t&!>;x^3hYLcAwaN!kE#uA28qkg;S@} zPuJC_FZ@Zy%0B%j_30Z5pMF$*I$!woXVs_gDSY~C>eIvQ)4yby|4@DU!NRBiQ+@hl z*{6TSzkTwD^X+}$leR_A`&9bBU#vbolYMHg@cLHu=`R&NeZ|M}$fKXN$mX|vRY|7j zHYqXHr1_Lxg8g)S?N>?Ci>Jm%&mRm&$J~oAqc*+&IQ#o>w9S7%x{Ff5JN*N8pF{dX z`n{vu_F7ju|&qtzP%Jg>HM4sP}7*uN>XJy_bCH+W$fL zNB1nGmp1S(hG{Q6klts#*EB56@t}MBjZd9=-YNdy`w6~1rdtuYgd~lJk9SWUy{I{# z{MD9CnJ!&ni@2S$ljMbuSB~y$Cf+!`p@^G9f6Fc|BCp!wzrDCM9`y;I&Rh5TbRSk~ zZ%6mY-|0xuaCl6{b+7z|tbx1@|LLA~(?os4!~H8XZLA#K-!^IG;X#Xz`BTW&zJC1q z#M@@MxFPn7_q7iWs9AIq0NtU)8SmH8x9CqA?#28k{c+e1CStm% zj&kO=c)T9Hgw$%TX)~jP4!DfCJL!X$=?}Q?jo|#*gZi_5DqZJobo%6#`jcdxo%{Ud z`g49iIHN55IFX37Jm@AOy;T30TF;TLk=Fgl3VVB^z9ILf*(*p4pJu1_Zii%k`azKTjj^w#Vike{AlF~${xV13V2^w4CBJAK-y_#vO8@8D%jh3RPnRbf({OzBxpB9B-PoE# zY-t`MU>4v(D}XG0NDeH<#qwgHHW%(=Oa&Mp-A(<}xz+BNNyzm4%dAZFo@b9Phuoyd zlXARJIg1lY<;50_yuA1g@>TW0pg(~0=cc63z=fZ@h1qNw&Yj=fT=O&6sxs$bg)?jO zg^kq}+8H4u@H1C#vjZ;tFR^W2r!gMt?)j>%R=~phP>$Cqy>1N=4aD=+$&2VB!HcW} zp;o`EDzOC>zO2QY{r+;RceqZ)R#e0^!ehR2i(Pb);5D|zcGM5&{yGNw!vR6EVF~c{sSq^`w31_eZAu4Oa0T)fY8fij}T_DD6ox*2g5sD)i$WeK; ztS2r%=Y2#UuSCMwQ4M66ovVO)aK|-}p|T!a^i&VyqdO=}NEQhk&1DnT+MvTB`gW?q z*-p|9xO7YAwnMy?`@(_>-~HAMq)rJo^xakGi40X3vlec2hJ2+LB&^&*3o3k>3v6w- z==Gz)aPBN+s%pu9K=P%kt;GxhN!S&itR#v-BzdXrby^hf&eiB2tP`k=dSzv3XyMKr zkKtzdh`ZZnA)o*krV^llFH*cpYk!3{kVxdpLOS{Sdb);5C<|wq`|X`zk;q zGG&28va+6Yd^wo7D#tSpxQLOhWm7Ry&A=g4*_&EWq0Qz;OUoz4JicRw(?+(w7$(!k zaL&4Vpzz8qwxDT?lRN^wjWXz78PkRr2MO7fQs|z!EB)<5*aMZP6wDyqaoSpL@q4?p z-le$?3bR^u(0WNko=^A7LkmIG_dAq{--fDLnUyfYA<|?MPEnfi zfOaf_30IzQAc4q{jUx%osC3)-d?-Zah}%UENIN*Iw*xNxp!ZXogsq=m_ZD3w$mTFBWG+z;rKmiIVFr-|Sb@(aPHzPU z*=0^={kfKJ5mK31Bm0@#odMp5n3_337Us76wBw-M;^X|t`66y;D!5!Ko3coLsqFl+6#xezGFDbo5!L?*3&i8!+n;gFS=&rb6o zhM2j0mQ3V(ZFGdNJHcLVYu25dQi*Jz9hFTo6+m^*%vw0%66vzUvu~XEmI9R%&p{%Q z%ip8%8DeHVTA&iyviV^>NrumrnYSv>4_*?HCyV9etLZ?7^Hk+n&H)$xEUK2T6ch&x zyK+?Rp%7WJsLHN++k1UacD!;_Rm2wdye5*Y{9KoVnbhyY{+L1&kV0h1@|{*%BMY6^ z^~8IX^PP}D{%_Kd}F7BQ!bUueiX3qW+Nf@aWgFy zfK9JF5+H%dk)ngG3@%mj9ElbASaEGj%R3K^ErE8AwH}Fz}q4U+aJ@Qp)_>&z&~`R)&`&vnX*D~R3bU&4?)+f&afdKkt)*^{I<8lDr+i0BQm|t z#w7O3xf0GfdZ40d^G{%qKRdO)ylf)j*|3C(gQg`XAF!hG-sS-xroY}fq|=FM5fu)m zo|~!Y<;0LSy`fB-2Ik&Y&tm@bPC)vMP~?nQ2XFN@Wv}JLtwXVigkYrSE$SpkI^Yqh zBK=DXA5M~_77L@R+4gUdP~?0^*bep2nm42Y}s?<8@&H!BeINNzlv5ACW_Ro8e6P*2B8j;B!E=4SIXFIf_ZTIKxJ-XTf%365`G)gA&Jy}ApMn1a2kp=rw{&mCR=Y&*E_Mpif84uw_m? zmxUQc(lXwaHZMKJktg6?Q!IYrts zy>6tXU7%eo>k0IFo>3$%qu2e`^-gfAJORCGPLbAK2e>|WpRP6Q9_)33mN4}?pbW1_ zU1oMa=pVqre*&|+p%U3%Kak9c-^S?&F11Mmqf< z9X_y&Phh0y8AZ}EV<-DvvwOAaDM~+qvE%ZJ)Ft(sUT65fP`{Q@B+YVA{*g33NG|A| zWwt!dHi?9RIHYox%rBv^r4o+$9@D2N1A0JP3y0?P`)64HJ?@^hmr(nNwU1AYi*s~fZ`;8u7*NPVIm1~>| z(88Tn_Si3YrkKi=JqlQOL7UALwI|c&1UltTJes|wo==2jm675XlYd{MC$@7J^@Ay* za%E(YNVIgH^|XOH*>_g;tAZ(PcUv}JUh8dDsSKd-++%sXb)IjpN~G&Mvr~rts=>;q z3=7qQS*yHNf|XmPs{^xs@>Stg?k81!_afU*>HmQqsq#fT7F6sa8->YR1zhUF8BBhN z!H!2LL*-EzBoeu@eZu7HMkeDH!ctYP5(?0WOj*V<`7-BGCDKV;R;Wm*a>g=BCh}#G zxBHV}BA|^{fLpB`*T&gILZrcQughnL6Zr3!|rM#9hoZcGpqXvA7_w(s`G&tlQo6tiu&e4k(IyX9d zyp*8F7AV7dmG*@V&0X~InRH5obWcrAXYr11pHKIcxJCR7z%B*9U3&1$clqQ5XQC2q zDoE0)`ft{({sYVLvMcn;#dSJaaHc;vLk~d6f5PTZuy!hRufP^rjvhLj@}FKEoL=eo z&d7hi%k;>De4d$9XbudYx!E6Fzq;4QSMy9z=3EpGavVK)mi~TvKH)xnNw`^ScU>9p zQ2ybdKk(cuJwb8tcIU>U+(2`&8+F8^59h&;?m9c(IlZ1zG53A#))_8&>t1Es@$3vt zu!<`vqlkWV-+b-#e4fvkZ+my#yM9J|J+zhybWoH*gCD(g-u$7?mt%FdNgGK?m$8sL z+x`86y)OGCD8&Q|hN2W1@X?*~*?(~R@6PuaM-Q?M8uRE6e*15J^YHY! zF+B;Ic&s*E*wNoV!$Td4F~O0LV)JvzB!c;`)4+q=n~D&c=_j~3#7L2U;h_M3bZ;uk z`SfPNq&pH}spj+w-ZYtD#ftTiKp)+mvOi;(%ut|mm%YO?S38|;Z*kECx23wqP{2QW z;9O^Py3VAh7lo7sxr=7C-sp_~jDK}o$Ri)!RcD^l=V>+@8Y6uE)z)*+_$F9s&?w%g zP-JxYD1kltFe4tlV$lTWy%DvvHoQ(F|7m`RoTkf!H}`TA2;LqqKUd2OQ1sAB`hFAZ z^G*gh<2R}5o+Sr-bSGEgozBeZc7E}XUZ{ZzonVz?tT@Gb^kD%#dU+#(H&Msw{?&pr zz24~@oT10(_#HN&)9Ovm0UzCYky&bn#f)Cga-9kJkLsgWK_A_{L`dsos{z=v8SbX{3}4@#)o667D?v0w3^(Zz?}#ljqLJF{t3G4A7Mi$wC&(Qan`bbOUa+w`e{sWD{R7D@ zcf6ua`yO*naJfN|bHrElDT1R1Hsp`mx80vfGd|esx3;k`)!nR%e{_E)%T~(ChIadK ze83A<=z}H*4Kr7e0#bLU$Vaztr2mfz?-(V|n&Bo_PZe3%qdU@vViLFV09Eex$eGZ5 zC#OVUTdVgxAUJx!yba2%r)%lM9>xxDPj>Wi<148<1$^{jK|Z>FUZUpHTc&;>QN-O8 zvnJUAUuJ32DMzw%k3OuRj~?9ESTe~04q!7%>isd<8zm0uEklzw^d|7;Ci5(Tw$~(2{eOJA?F%Q66XyW?#%t$SAs* zAe@4r#9w-ve<+VYheC#(GZg8yY5IY~veK9s(8WDDU=r`4_2f^dDe7acWNN3ER+F)D ze4ol)58RGvNU*)$#W@bnSoJ**Lrk#j%0UtD?VO)tRHk`RF_i+%Zh}q9 zA|4S2QgbgzUVcVh{rd8L=-9@n!>3N0Q~@2SJbivlr8C3d{<7~d4ZTMND6o|ics>P2 zO+@=KFHXLsw-ZoHC-8Ov(y(h1?%2D{S0$x^Xy001!Fep=3+G4fGvCfFx)AvUn?waT z;x8=X#$$R${2^(Lc^UY?yx%?7AM8B(IK9}L{Aczo@a^rV_FL^i-%Ps?%&#_U8<$t+ zo9F5)_4V53>Uw4#N4F(Ufgc}z>f>{7dUNj4Ux(+>_8E@rIsHx(_Ws_(?Ky-jq5j?U z;r#0Q>egmsrJfO9`#1lbp8Wl{^p7KJk0q&cXhQN3kt}X)ZmrjwwX++mOIw@uW@CA6 zb$t^u+K{ItqYql>AI#COtgLR3@l0cbNFk>kc$0Bv zm_qpSjL_Opb7OOL4bs~AV=~$zG9X`DZ>(%m(^uwM(X%8kA`AH|vX*bHH0DdmFb zCXJ#c+|9NkZ?d+#*djnq^_Lo(=Sl0e&H8eE1sixp)fbV4oX4>37O3t?$8Zi!NM1xF z=W83yh1L0uP3qutkjMsOB^6sh6fz#MrvJ_^)g$g{(h-Ybh4zI+yIkKqzq$Y$_k`EE zW2Y-ndH9w3#%6ss@B$_9Yz8a!OG~TsKC_?H4033BlGU}%#&Y95o@Pu+l0y@cJEG%Cto|2Z>tYm1h{+ca&!LKXDLux@pyl` z$o46iZgS2T^I*d9a^g5&d!{aJTcJTu|JA@vj0U*6i9Tc@e;JXBZpk;yUu@PF7whwQ zrn9wdzP3_c{BXCsvzu!$1{Zqr3C-o&h1K<-5l2_8v@EBL9l6wF zhE8=>4Xs&MPOPmB1ud+vW(}{dG$`poD~o3R8Cp3t&#u>2=Fc~m>WjFeZMD3wqxbtX zkop7K{>y7SNFxHB4hXc~ICmaPWDf_PgjYfln(MX3 z2F@MXvgj$L5DF3GRUSd=lw-mPhn3jct(>vUH`h}R5#_UxDD`LO>$FIssqcJkWnsy) zQnE(^rqd1}6XD>vYS1jPzU9x&%xGLG8W9K@@rA8roT8eM5hwUT5te+}&l!o3;EM>K zhHQrZwqD=ZTE-*EUd26~t>j4J!gvSMEQLu(L>M@*Nobn&J;~x34eX2~CJF_2t2l0+ zohT`Xh~l%Ct(8lS6&!)hu8V|3gzgFAPPyk3o)j&G2=W@F4Nm_jsZ?(+-ac$Nomz@aA{Ix_>-D92ZG)2X6xrdNQRO(c z04=Qd=U6xD>x~+wjjqLfLA%fjw(x#B@jgRKlht(&otl*5A&PRurWHv zw5iB^F5S$F;fo;mnlG9)ck_JxS-8-*HR8UW_q9G#55vs;VJ+6t{kS64P0 z=eAb2aMsgSQ2ThVjIUnp3~ZAjuF&3{&?c0ynbAxxq7yu!xi3%CT*pbZXu`|SWFUp? zfs`z!$Y|mO@+nlIOx3u!y1rb)W?D&&f+sY0CM{ds^5l-AX-U+g1WhRJ$tZmNWGhJ~ zF+gTPy|k$G36hhQdP$>7+wM);Mzeln-IoA~?kOM@W{3r<<=V4NV#9gRN>mx5P~DNV z$`i^&cY9EK7)#(&o8vSZ^bgTiB-z{>-Of$zk`hFrN$rmM#k;3e$?hzm5WOf-SNeCK zjYo6TNNsscp-Vl(232e<;l)WM&mee0ld6w5mlr$>=1S_bfI^h2Fa7&W)tAQaN5B`2)-ood|tHDuooHbk;S0^)@O>=4(_v zffTY=tR2o%{IayPda21_vx!!lwM(@Io)DvPo0Dk{;ENDsE+oY2%F<;j2gAJ4_Cnqa zQm81(U@Fr zRkoWPuO=}t*)#xPh4kfsbiTi*p4rHlqbreij5);?`j-j)MrSlW*rY4m=4lz>X?Jw_ zh1nfwA%9TFn>E@pJLq@$@{S?w=;$H@Qx||;;`!Rz#uk+it<*dzwW`D#Scpm83v|Z= zA9HEyZ-9s}x<|z~O!DEG%+NgGLVtgbK2Ta2weJA2zzXFHiL&3O)LgDmHCHzp4co{j z2K`(E1xxTL?nv=zmmZpqJ?rKR<1vMS6PC0UK8h->Q1}n69oBEPI|qCg-W=$r+b^2) zdo6XeB69=L992iaY(Y?fKpIK&HC5W3Z=P*z;s_+VLA=`jY5t>7^uRtRVmJm<`WeAp67q*r>xr=D53rH-U5YcE&h_;qC8*59AI=1iV zM31;~kV5zBwL?CMG@ygt^iR5?Q>mm?xOZ_p;bDgB1+iFPL4VwxO3Ka-UFI^Zw2;$6e071ZYvfClT69PVsyCXQ;oB9n zF;GMlGFnL{AJLUO4Sf-QrrYR39C2Adp`zedQ6-Isjf=-)pm8aozzQv`Hx%t9dh4-1 z7k+nW^rjv z-%l>4%=y3^CZOuNlm-~GO6&j<3)8U*u&`zwdEU2o675KGpM?V~R)Gnq zkY$SHzf--hC+ixWxFU=xve0I2^fE@<7%o$26|SUiD!>CIwS(4J_8m~T5WBm zH+R43>}5KQe$iJ)7v)Va<<8~}1Ppi|J1O2gFyMXjN%7`^g_l-BWVY!D4ZHPdY5;XG z1Q&9;Gl8!gfDY*KSjbt(94A16Ov8k>2`|+yZ_s4oEgg<#?;H*dDQx5gsE%yCc9}LL zSI%vohYgCZk{vRIC|s{%u8rhy4;#uxx*bZx!&5_M@4NG@cy#V4gf2o*jqni&ZSkU#Zbe+K_ZDs|O5KU1AWhmhL z1xXKnotPj6d=ccdqmlLc1*(AJWu-Za21kXxHnWm(It+ecwpMsyM+s!AfL!!s^QRNW zVGv;`fNj>c7AWoNEpUnku*kP6P$7FMk)5rdqoc8DnS?p`hzCV9Owc)Vj4Q-EAQR$w zDmrOUacy&hy5D!dNOV9#ZWmhUsWikx{}?p9=x%-~e!><3*#2?*A8RhteLA?nH)?X_ z#1IA%hW3*@!pJv45I*64QiMQ6;i>p6Eov^N2UD>rmY5xLM{XTNA>*0&>{erGft)iH ze&ak_2`;toT|g8r3Q^T3&HA%zw5S7$jV=I+Q-8h*DXg&4MsahVw!)Tc8y6v2G{IUV z%g}^_TQ*PU0amuwnj2edd<~SR-Y@F6^2e4TsN&?~(KR|)T3=dftZg)~sYJb2->f&Y zc%Q3(i?~8d+bg+`m)ABgH%(LpRU7qL0p>ikkW=toB=^;7L{~X6Y6C39pw*jOzS_~L zTb)7+IjtwNRxi>`I299+{uZa8LdYJ-n!w7c=N7eSPQcHXUg)KV#}sr4rqEIC zJ0<_mZsDSt=#^7Ncbh^9ItPaf^))K%ru)cn^?P*t+NH?wgok}PEeT3Qh0#=eAtV8) zLdt%IKX$`5FiS>V9N=|~mNa?=+h zNwXOF93Ed4kQqsksZN8CH|s0UK)Iu(TSX%jEWtODb9s9q=eY<_E#&J03rMTacn5EgGv;6x9Bo# z%)}fSns88AWwWtSTUyz|mK|Ntpgr&mu}DLf09#U>#vp2%g~mD0_F+|;6j9UANfA%7 zrz%Z~sA)FVYV+7DSEWf2H4UxBX55+-QD}I?G&Y{~cTUt3cuY+og^2d(h^T4C4OU#V zbi6n=b8y1KuA2UwjVKUyL@UYwPX;JVJbMz;iYNaaojn1G!4iC)Jv}GJD$JgYB*?6z zCAuw?qE9}tQElYYD{EAYm5W&vqEK-pZ7x5BBojx{DU_h|lE?fhwB-{Wj>RxWBMO)4 zj+q5B`7$jkvY@NX)~OnKDR`||G^e!R8Vq+^*{uWsR$9ZxOJ~Z@H}OcE*mwm?@Ol19 z{)X$CqH#=dbXYKl!DGPH7#K_#*fSd1wFYj)#PfWH=5TD*w%`z{#$nKegZEtNd^d!j zc+b@U2{Jnpx{mW~eZA=|F^xLg;_y>|!es2VzC6E%Bd(~u0uqBI_(n$!ypuV(ju=Rg z>6jzkhht7LH0hrE=GKO1%^x4$`oc{FE2Qigh15$Jo!E<|;{`||dwoi_oSbr@3n*9U zns>@a&_8K@q&9~$%Fo8u$54(^Y$766!W!Z6kHX?@&QQD@lZf`2sc01DG)83)Qgq7i1%Pvqc)g`FP# znMzD9(m&2Zw;CAB<}}SVo#}Y=CcSXeznMEtqhW=QTa~=A;JX_*ntE`Ox;Z?d;n|Ki ztNBPeY*W--zzypRQiwR*p_`hLyJ`bBFhvt|9=-yy(6UQhuP?7sVVOU*8%TtXhumkh z)}eEHboF~K@YSfAk8jdz`gc5{ljD_sKOfH}7hMXVP;o*z{e+e&u=AoOQXH~*Jiy~~ z4OMxRhu{&G@_YAgqC~xZPj`~(3cYW`8DmRC?H*!3hhmX*O49onEqtnr7B{pUu@m-iPDT&9%j)+PRJ9S-J<1 zZ|Q)h7u|e!P0z)Z#&IoU{!=P-n5Qu3tp7ERXo*UgzCa*yaOskj!_-s;g@_hZ281Y} ziv&CkiUet~Ayj`Llt^9`^HW<`;bebjIU7`{7i@I2f-}IZ!G)hr$>sPdz0J4!@SVg| z0n(s=!1FNGS}Xz&34&QfqP#}TRr-{kq~`)W$0euGNC8~<^HyNKa<1Z05Wfm6tZ;JO zoLGVRFuNNQT41zTA;O)97a8*2hicHN2xs=*C&Lxid~Y|FsYH+On(|Ul(c1-Z;pfe9 z(L7~em#LDQDxW-8>_x*3zuGmnu;*L9L~jzE*yt~SL;h8IQsAV#&yofg{=D{=Yb&*L zl>S~IM+J?33hirbVb6~``NpMs?V>LC zpWdpkcs41gV9juaH6Klx(!cP~o+6qmqKgE1-)8QcJ1O5%02h9)02J$z7b$}xL{EnJ z4b8~|U3Qvf5c}b7b ztghl>k7#-YrjP`%KtgdmoGB`k7(h+Jh1oMDNdSd}b9|e0Q^uC>D$;5>z6?@`%u>0z zxU}lIwmQ1*_jF8(C^WpgOx3WS7hR(k<{>e7LXlV)M-(&dmjqBqIDxlGJJ~DeyhPE7 z$(f zWa^tZqn29SSX6+*#KU20#k*lYag~E$2|mx4{OCP)!_gc$xE)8}gn`G}vw?(v)F^Sn z-$DuxTYqc6+3M2Wna~`flfN5ZXLv=H9&Osrk|n__vfQNB%#tO+6Bh0nYT>Zc!`E6y zdmkz+ffEkiW4&^hMfRog|)7WE36#PP(ezw zJ?PMV(6EJ3XW$gHCJ8N&r{9iE;Q|griTh!PCj&zpy0o6 zc}#mcZ)#A5F^zyIY=+*WT6|*AgdvR`x_lotCaD%X2w;InTqekrRpSvr;o%BP>PN>j z0>TOvmIzsx)5tjJYpX@Z8DxR0*V$=}x;JoqRE;Zx6fRC7QM*0H9zApg{dnGgr+Pc+ z59v{`nYJZ^l(wXCo_~(07Qv=?!on*u(pY#-sIVf_n8KEhU~$#J(5sCs0TiCJpEAb` zn5x-a1}R*rr;YjeYMxf13S;VNeLlUKr&Ye3^*4OZWFaVrxepzB1^p>VX${*1eL!ay z=u&#fRKX^4fWniuiFo`khg54*1}R(|^N$FDKKE~?<)GdyA8o}s^9 zp&T?Msn9bPPB_w*FbB?*R%=O$CoE}8_+|SUwj_ZQjFKZA z9e>|PcYWPZC66dfJX4szW0h5yDFjUzIDRmHqf|9-t-!9S5I<;4$TmCyHiIc_qCL;} ztf)Ok69%4>sHIoCJ$hl*^H^AgIY~hZS2}*K4mz{+1PPpQq?S!~&>D^K2&!h;7Ezc| z&82_uL$j-pty?y^_2vJ6tV(y>EN|6TDtd|YkpSVV_uwA&`6j7K`58CrQds5AV8Z==@t$>0n>~5-AK>{Znyuzd5I_S1{+x`86)&M)u3M;%K zsxYRuK<;M7e$*lgQ)=Pq-)HGZGf3e|t$~XDpzEn-4F*jZQqME$U+?rFN2wH0uCALp zC8KiLW_5?|AqthPs2j0N9!uCV~RQQacQ{}-*y}rP=lzB?A zqRlJR(v1p`LU$Xz#o)UNIBE=T$*7|(Pv|MXUao+5_yQAe)& z%0U!e-X~;>wZ_tx=Nf=$QxTU16so(0it29HVVk11fp`)$A)(hD=?a?-a<3gKV5Xan z=W>5wt$NhC5C!j(|^*=&Liq6^&)g3K`@zEBbg`B3cl>A(0wAMFO z)sQ$^Bk3W|!wM;l&6Kn;jI=kp5$2)Qz(P!uTuQv26#m1eMrUmgr^OVytYvqfkj&y>8`KOrS+;5_l+s8bsZTKwo?dIAx)IXbUjA)pomc8q0}hcz z**ZO+;=e|DI$O`6g<18yyfF{L%jtSvfQ6Nvw;f?#b;swakhLYS!kCWfVZ@8Y=L@3D zUDe91P?*A(wvaxv?geNyn%`rCa_KCju<`7aNRoaOvf^lkW02G$3pcHZ5^lezjAj5K zW5GkFmO6|r0pigd(y1XUctu(Pq%HG%#CXgM*$SR89skre^8x92p@RzvN{tD}Vl=Gu zoMm0;wENqg`mo(Pz>cpPtA-U;+mGxI13^@^e$0akBL~K2bYvgmm#(6#M`))CRX9~E z1M^z-RthL&Oy)8;iB)G5P+_Fn`%JI#*|SuH=$I~Rw}37D*2iYk+RS`x1}SX3PB&I` zftFTKv(an-G@k^{VOg)d&k9)*IETeM_f~6*Gw04Prb+EUdLtTI45>D^J)+CDbH?ES zOVcQjE_~(>q@y{r63m4;gO+L;JsXj^Sr?j1G^7o)=fI`ybo*I>d~3!34tMlabqRip zFCx&KqD9!KFX20%qwXM1pI~F^&S-J3wS$wC(^6Y(p{DpN*J}D$wsO#$(9slWq~UpZ z5rC#RCBQ~!?hCx|9NWMOep2bEkAFM9IMURxWqA z2;bQ*CZ!Lophc@rELA z*Jr7vBC52GVtV_LuX)i$V1N#_jvq)1*iCe2itABy%kqfQGB%mk!Eh{Gev^rg4O#~< zPM*^R2E3FY=JcfRmYnLmd0^pXpPROqK3?b~Hs?8z79AztCKs@Uo!wBzzS7#q3#X{% zhIkWHVa)X}$rQ@(Po-xIEWBojCf(mKH8^lyiMj-DLj_d$a++-npP_1Pe0fE6&017p zWRI8jrOzdl7^9vcqZ~r652>`_WX4J!SX!7HEA;V+jg1Tt-mbyJWg~nYkWD`UoW0#PT^=TuDOYPA5 zEIzaN2ra6RvOi!_e`-8h+W~Z0NR0E^&yet0x=_Ex=V-TK^9oejMcGY5$#EHZs2fzv z22~l2q(SQxrVw)2&TZrm>EDnny361pGk8LjYuO^5-VvBYfLXbQcA5T?SaBT0Izb_kDY~Rj4vR zp`s!uZdJQ^mWmFCiEpZB_EYEL&v}g)5zd+ResJuRjRcN;H=Q zZAHThD_y>p*lMFkmz8qqW@|6$Tin=aUK(=)@Q?&nIUuT;S^^6$5^!4HjMt03{>`5G zm})(sSw+iwVDk&O!kf;`?dDRye|>ylyaQw{6?8b`MxhEPZObKX<&{?4EyYtK$SnbE z;ZMW5c5}V6(;ZS~4mP;dgyu9jgA_K~v+|K&$JKhafD3qIj=w6e!WCZYLpDZq^YH$9 zr{%j}u9^?gupZV+15Sa$ew~I@U=eG#JqpaNm05GJ!kUIiZ8}mg2w8BcaN4opJg6|f zT1M=%%S-dSt-*TdYJA*AYo?)}@-m1lbf9CNj^1`Djl6om5Oj2_eZ5Wv-JTo$qG1i4 z-aOpx?(F6x8!v%~@o+$lOWo1#h4KCYw7-p5jot*}WJDsC8GZY7q~;bCcFnV*=>I}F z;)$i?$66~zVBs}UO2X@3OO{w|83>oMu%gVh(tI+_R)VjUd0=TJ@7*WgZ*tj3P`}ZQ zOg=zP>U0~cp@rMbBZ-Fj3k&@*?b_hAQM77@wa}Z<-_nY;V-B^N~xw(Trg7J)MUYK9h_wAJD=WvPC_5h|Pcsml?0Z z)$m-@8I21fbOu)#jo&tm4N^&iE@G!6Tidk7K$?M#U5Po$5If=!Nlg4{C0RS9ZS!70 zj_5oVlS4Cz6q$8#sEP;jRMwTk3LkGG8D&%0+p4%_6>4dMDr}i8`!di|*|Gr@E)&n2 z{-i(C>AxG$oTBqxsBsopIE^8FD6bilA!-L98H)HKK{ED40^ht99eXiqHFs%F z-yYr6oNB`^v3F@F9T)M;&{2DjwKRps`Xz&eRz7uG4X|*U=-O1t#5USWB#JNek^{x_NkJdSg^92TXu=)#^vpoYCpO2^5XXapMMO>u=Wr{DT5&!ux?9&bUv00!*T656PPeBDpX&hHD^yxES%i<*x^y>nTY7cv%FjY9pAKZ=M> zE-}^=TBxZU-%>Bo%|}gBvcI~7?~jW5fB<^|Jt)BW)vfhvPN<9k3AzYCiA`4n%Z>T< z)s6c6>Izmw^aal{awrlJhoV~~&dQeOb=zo2S5A@yKPW^%9WxO^@Pk5ZzNfLWxC(7! zCPE0l2th%9)*bbw&6*h?3$@D|P=;ts5bBKryom4_P=uWEU{RiqEqh9dqG?1VdL9vI zCFwvcO?35BN*c=`g5*bwNr{rrrIV@bx?%rJVhQkm$r6unUVTq!ceGQo5XO^E{-DrpF_+ zDY6jL7P=z7T(9BzE4oUH@Fu`QoA2e##_|bH-Uala04FkeTLJu&xBW`aXTi>&X7a`) zqK~{g%6;=hCT|BnD1=O|U>!S+Pqab^eozRRTu({}!51MY1I@!Sux^N!g5mKfh(bgQ zuZ+kayhm4-A+|!`PHSgFDKi1I^k{_B_LrNk!LML>6LNLDM}Gqn4-~ z*iLjk3tE|n6e^yxvcLPgvC5p~;0h`CqxsP2d}C{7{is2OjuIerw1!^iXbj1GT97Ti zvIPbE8dc~hpO$<;>-yYT0Z1EQXHa8v$ zgh&M#lkzFx6Cq82h13ifHYQT~s@yM$0vEwa#ZuTo7E9mw5JZ`y%vjk^T` z$udF?q|k9Xh`vczi-y?ZGl|2NM-(!42lU0YLI2jFH?bD2mELx^a)3g`y+_}pger8XsKLXw(BVOIpSs)A`0K!q|LX?&fP{|Uef zBP|CgRGi;6W|30Kjy7mtJVbOYQCc9dLQA)Jr?j4(r0Dw>$QafB5r-4pG74eX9Yg;S zJ@W)uES|K59LQP=%CgB8;)9k9{qT$6>C$xWFE2uFmxr z`%gig0~Ts=)Fv*1om$0Fr)WYVK80f!$Wg_oBw#`z?O5&%c5oKAN;^_CArZSYf99pv zM(4T5V1ugolLD%c(uS$AOA41ERdmA?cuIpM1kyVzzUxh@^iBdM6w-#ZKCW%A(guSi z1ZlY4q(26{MTKxXk0@l~4JjU7=v-}$_i*h)6>pe_6gsiG>@%NNs$z8oR3VkAg+89? z)MD|3DAzhB3iMvZ*5y%!R7~D`OJEg~*LMVp0=IfM`Njb_bgKk87Ejv3xh@WJwhlOB z1$m-(9s(C3a7CJAl{PaPffE|>0NZ8 zPu0BG@j05xYEB`Ah(;%?IdHjgH1Fe6u3!pPs?y}obhfb79rERHv+YqAUFgZHW-Y~+ zDo3*l;ieL(kWuu)WVAq_KK8!m65T=Y@#S%al1fxk%JZ$>_FiY3m=j+HH5@$)8Q^va zLY6tlbd6l@}d9b{)9Y6vRf?_4^gq1#RQ1l15fH@ld`ShNl3SDY;EBww4znLCZ zcxAIg_##5u;?*`i-8tysZI{X|&QOIeogmietWU+Yich;Kq!6WU)BM$Qfo)~CX+ec7 z4dZB+VrS6W-}EhCD~E9kSV;eW=H9J2k|jA48$QS+u69M4Nv~_WD_+FCu+}(pb~w_D z42?@4%s~Sn3h160nQd8hApz8Mp%PPV@)@xwB6u#Ug08vdj7 zn(>S|5^SP|!vJ0C>HgyauW%KI(#sy+8i~LhBnpQ(S3BG6U*sIQPl$_JduuELTK;u zj9g?OF+yb&r#_1A#g$RQB&rav{2#xpmJ8)ba&f#$k%=~RtN0_;Yy~qHcPj}$BSNO7 z2N8krNraGsqm&u#i%YdJE>VWrwYx*mD1;Z!t~=mFj)CR#d^I~-{9(V`RJTu?UY7vz z&RGeSNHKgODgF=M_$dZ5bA;;Nht~onI;&{k;($I8KF#e z0w?mw$?$bLJh~yqi(XE~$OC0{GcO;4l}F5d%{{lBf%s>oRFgryIpvAStry`H~LG9W-nIaqy$eQ z&{%s@!RChT&|_^2wM**i=K~M$p@2@PL`q&foqx`$X>MB(8aIaQ(80?_oB9D-R_v-p zbP*)c;hHkK63h?--O*~5b7C_nN_vXmBmxbAAj0hiUT+ZfH8-Klv;mN)sN)cop{scp zO@=gvCVCwDXzPMIEJ!C`ga~C0ePWeCL??P2`qCe$BZ1k<2e7Au0h*r3&)0BO!+McB zw_H|4)CkA|a0;gp0y7}kQYVLMv*ok;Gc*xnxFq55>+yWQl^wmT<{@Acb?kJGI`cSW zKc`F3i5{oov2?CSeuUf1#cp0U4_5F=grwD>>yOpy4KxuatqxyDYjwsZ>ZH~2^LVWu zqZ577>hOb6TRp`m5uk94Ys>D~{h7RL#oTL*!!IXf2^`VD?ilyym~U#YrL{~2r+~lkj8q8r*U}8X`f`KBTqQa6eOqo;D3?ac1E%>aXh4v(weuNiW#6V#t z@B(iKmxv*Ocf_u;L{bULnhCr>nqZ2AR39IbkT8i5lGw9VJ>Siarn8f)yEhl7qE&4L z5hUsnZA{{WSyk^cP5!cr`g2dl~Wop2+j7fq4LrcpAUE zTfeB5EAzVsQQ?xU*M}>zUrR69f_=Cm8$zDv>dU?)1{DOj)I$%#=B(-gmlvYp1^-ik zCaa?7<4-b_w&x3!ghxD($9tZ$`4;ZNr~01|7439LqDx_k_1{XYxEV;_`eII>Bm>W4 z`Us!oK!0*ph7gA@ZHhh8_9sd429da6s>WQoWf*h0Nz@ei8dTzp^-~k;V*NZKaW$R< zlDw_f)n*PGfklIsc~S~Xte8bm3pNFF!F%m7U1`Jylo&DpBgPBpG)qxOJO5Mo0wl5F ze5GN7Nf^B0`%$^6$(}c8lo2lRVpiSo>gz~$R;_UcOya}rh4|pH3el!^PN9%FKw^sh z6h2VOCiqOTpGL49Rv%$+Ym7{ymSwCdEV06Y6K_>G_al;-r+6PElR7lwaGp~CL$!uE zD2*W3&riDmsIFU}j>2np+k~zxOY{f-Vl1a0sIU*~Bi9NB$!vZRy$$M(?gp?v%n=pCA)M6E&=svCF}V#d=-u=I-_evCo++{5i*K!IKDy_OO7k zs<(UP%vvw)BWR+=e6{ItxOSmbyX|By6KV*TNE3f=Zp)FE2YdN@j7{V%V>kJ<5aD|o zyMZQZoWe)O{^?7&CrH-ZTp`SRT8vHtV6GVn@UFh!E1Mq7ZBco0LMCENr-@k0R_xqe zcd;a6i6a_(zIZ1-?&2>)?~daae&&bj+~Qh9?nXPlw-(6;@(sqK5IT9EZq`Cq1b7d7RO=1weUz{D=_x>rP6EKOgSW?UdFTqa$BM(4 zSr2$zZ1*oO^(LAG#gHizT!EwB!cxf8KoS$o9YKK8wMt~p=wy`$k$50f0nho?|GB)H zZB}n&stA(&$e;ipFeDiPjD)B|XRsEA1GAbS zF{LR6=>*;F$NBaNO^3-341%IJnBDCOK)7Pkfh0QcbAO-}%QTdLm1wwpPUC(Tl_+7P zZGX({=`aU+iDOw3T{6?u<^)FJZbK6}B();Ba%#w|lpI7KA02`rMHGNMLvVLevXGeZJe-xvDSwGQrW?Z7>NRNW)lX!D1%a8_CqGZQv zDDiq(QPo==f*}7v^8V?Yq!6z}ebHYrtp662k($1Lz6EVyT&)4_W z*UT!rIR#z2{UbcPNdSom2Or3=;b6tX^3j;x*zp*UW(x-u(@OBf537<9|1sQkpxmf# z&u|QK!X{>zLPpGIn@T>(WRJK8uSX_UoYt|u@f!rYi>0zb#7?jeAa4jr2J~u{0a62f zE1p?ET^a%~IWyCrf!&U#cDpzDBtaT$pxAQduJRYv?;UF*c;Zi69TpfyYjwg_nMZ4NV9vC<|Eh+Y z-mMJVq!d9uj@kr4N5a`zlK5;vb^QUy*Rrn}oW;`_m z{j)=e2Q~?rs4=|`2ZRGPto9VT|&fp{f)^kz;aEr#--Q_XvdJ=^&gRLP%NLt!+g?T{on7m9BmvC-iNYCYqi@ik-i2Ac$sS{;6Lej@7L zx77nOk-H(brTvfE?OpbSA>Za6I7j_%uAJEFOYMP)T5`7H9&R{W(!(Wlt52%+)j54$ z%>~z1OZx>_wY?9@Xfm!I!;|S@GXgxe6HLV3RHMmMvP6&%ys{te`@;^wwtBsufl>{P!BN}*X)cKz_ z=$m_T1b;{ddUAyusEBWr8;43p?y6tI2rpZ@uO``MrT4FB)Ujn!_*Q;BwOmgE zB}(*uumWD>a&dL}RvfYH9^J7j;}H>hzawg{TM=Bv_I`n>0VFC+DLj={SF}?KiN~Q4 zNn^Mz{P8b-KAhnQPbB)~55p269ueUn<;{lw5P9rDO0t`WBN`|SL^Mb1`zshr;JOw0 zu&h}aSZRz2GLd77!8&@u1V6M>42{)85*@6bw&)V61ZH!cXO&}4&`F38%4SE~OE~lO zxq9=uQ?_jtgt9g&k#cv(VPhueJZ0UT0Er4V3I`)kw>p=(b6zxTgGgko*PY()%k&~Z znM&#Tc zZ{>SQ%-YdGB6xTbL$-n{LVqiy^xS>k*US5BWfion`!tB8D-F$kDj3}WC{!@uM}CQ^ zPX$9^YE>|3+&uk?Tgt^wQ!;K69GQ-WF5Id>--H3AWax?^yL8!`;>ze4lIX|_@tQb2 zu$FjXgs6}yp|uBD99wC`KskK;5n8Pzj58qV73L4_j#8vj=?dl#El{F_H3wvIU#;}Q zT;N)DI~*#R;1V%+2e?;IANEWAlOTx>wj(!sHc5fdkmdm^MaKq{2owEw@OrU492e^s zASF6VL@u zruRR42riR29+2g&bAm~1D-Z+n)_WWUcwgGv4g@&0{udW zG3D$nY+{EwB z@;$+=%VSy#o7f}E;%rRp!R40qki->P_WgXdSL);C@q$2!4^DZ#n{T#H@Kn|f>`TN8 zX#Io)=MngLgs81~`0?3e#)EU7gyezkqKP~(KgddA)_| zZ32=5W-PKC8Rs`oLuT#4k`M*S0u#7cmgy5z7_$vyPMxxXwD3s^7t_5Xxixs4(7|oG znwuUF(;ZmXO*`l$L1c&M1(b{o<#rJ8NeWmnpw>u!MXe@8Mf1&VwLL@zk_77L@2cn7 zG2FLR%Wr;~^RDOWx!$}+Z4luR4cu6RG>~eG@yOiSA#pe`B7hxBNZ^m=3Fb2w>Lmt` zMiembM+!(>;SD{w0b9Ev-JXdE21`+iGPKUSfm?_0hz1iK(ClXZCF2M72q~x)K@u5E zQUjUVSY{DhYAm2i+l#d#eFeWL)rufVD;)Q|31Jvk`;wh3$~J5;iH?kz;VLsC0TNMg zddRFsaQYOLC}9m5O$i_OFDKQ<{UbiMCFjFtkyCP%4logWhk+aVv5#M^<YZVfj%*8mk?wcgOFf}(6=T;>-Wp*OQv{Z7OuTrKLbh<_glzBi|M~}Y)6Y} z$D94bgL2`Goe?@Hl{<#l1@Q8SgV7KI5WFscPt`^ffZ$00->Im5a2xoWqv@$gZjo0dQ8r4hX#)pPgJj?(4lASL|df?}IG{5(6iq)}d8% zvABI=GDRdRteSc%K1V7HfA&PQbwsuUN`%hA+<{zdfb5~v1EMwp#gRn-CSukUiKnL* zXQEq`YRaHQ=#nxgkhVSkfRtHOFxevShImIatyc17hzAVuB98|oeK2)#C%NIy#o0L= zQ55ZGcFW9Z?lwFzqa__PUQ;5n+Lm;GKXR1_k7&>}n?I)RAa{J*HC4U{n20g%HN>zP z1)>ffFqaK%S94YB1e(ZktZ&F^I1oaBJzY_G36&@lL;H`~*_$4Qj(~|6<9nm4pG0SE zZ5I|)o!jUnLeq=Tmv3KRa=r&omMU<4b9*70^k9#L((X6+H~?F^LY>WPL0G znebCaTYKg#dvFVxs4=;1sNIbxVwz+pw<>D@B|=Wg%9C4}D@krSIe|aUn6orFiBL&1 zPEMdIa#Alcwf55FBn2j77k?qGu5k|uyvYF9B1{*xk|3CA_H#{8anehFmcWw$&VTtA za5E}vGhs~Rx4MT`LBof>iD~fcp ze0<8tG&OgbGkZY$kJmjlR?aF8gtKGhZl%CVcZE{naS z+yJV!IlhTWNEkQZkkfg)K!shG#4g?(APF;&7=P8V$?4Zcy5hOkn^po?(<57dq;M#Mm3;L>~3%Fbu5UvH}I{y8Jc^#G03V#$k> z?@&XD6S0su-R^z;3VFaL6Z(ee-YH2=7`Pd!{-Qh0Fv7$nB#h)Yck3_9b*6I<(@+Tu zi6b@CZW~mqkRV;F+`xn7*^zPxtE40(%%69x zGTqfLu(uDMP=~86btk?XAlyh)Bp6PT_B*(6`g{xTOMj~50;^dgO0REgBN7=-8yp!@ ziBlAF1BOK8(TD_VUXJ8$4f`)-8na+5(GVUH!K}-_i!nR;xUE;fDXL`7y4v@3cR+~{ z%tzl!3*j0U;t4d$RcWUAG#bPs8kpRXHrwVnnot=qCwCedqY@>!Mxg9b4prz{U9RU)yoS9W*1ht0wPgCIVtD`AL$G) zRF?zo`TBY_UsT#skXc<;SYue7ROt_WN#kw-<7cX=WoNS%kk>eYC(WT2kP30JeOf-q zj%C)e^8AEM)R0@H)bHkStmf;x{c5*-S;+@0%vnlagf;_-0#)gjC^;d_s<1_qVBlabpLU;nJX_r^>j1FCVD6dq^7^!?5j*%H*0@++sEi6LMOWarj}j3 zXP|YkM9Rs4dmu&ZTBU<#KqM+o2F}-T`;;69}@wV{ceGyUu^RGR5CXqPa10J)TqL5UEqR}AJ= z1{w22uwqh#BN8?vA4(QluT(1rB|`4v`Z!kF#ajay57yD(A}CinSVyR&9rr&PQ3Sry z{zs5R#%;$Vh(K4`b__~{tle$>X0BZRTB;pE5*ZIb@$e+*S2_U2utdt!d2P5Woo6TG z9E=B7xXmE5k=yLt_we_*_?EztHqZg0Ki9YanCtB-S9kA^Cu~mU3+-i&bP`(wNV-9E z^i)_mMggqVnz*>jX;SLCNK%-^?ai(9h;F@CnZ#3#m1Y?-c%3urczC6cIGx; zjF&RGS`#eAlvX#}OfeoYq0dieXH$H6S#(D8cJDR|VG#pNxqtz7rB<8G{$+QySnM|& zr2uWl-8Pv3OT6Ak?(6->72FhB&)_JIc5R0_&xA)0@oI7?;YZOdAqFKf$O4co(^%$+sc{h|QF+Jr?v9S{y;O9NQpfLt6L~P|Zlili zu~8dPA`3pU+w5xjD6yG1>Na(dMAWq2uHMT`JzCFW5|!`QpV@gmN2oE~$KO|w zHy%xo&(B3KG3QRTLx@6Sf=ERB-9G?Em$L&+^k`Tw zmwr`ssipyusIU`wDm+3h+SJUv7VtMa+Icvl!I70|;12%z3T`x!OKN6MUo9W1#p^;a zDUwFu#17l$BzC|18vcrMgMhh}??6Ek9+C+|Uu2Q}dV$OCVguM?mDT`swudVouvt%_ zg+DslJjzFl%<8Jz{KVd%lkPCNjfC(=^F+<<_^WA7phU?%8hylny{uKG%^s~Pok9~m zl(ahciTbw{;N^gBp*K$e%RVa1y z_Mi-)M2X2RhY=-^nYo2O87;YVj#^7~WiJ|L6|VcNt?`qK$kPUp0F- zU(X+_`xEV;iaCDNPKPdc2b=_mMlbx$hid)_&Iiij((E~3;BRlL2brFsi5tqCWb^vv z^<=)AmpQR!@CK9!VgFSigsRigPPq=>Od=H{H<(1nwhf=A`sCMK*w2#^GEpa*swJ)- zntDv4OEkq#B##jPduSRX6E#i>e8)Xm%1M`53(`!Bctpd&2x?Bx%C;Xf7%5ByNo1V4 z4tF0%#^3>c>rvjB>e2|9#GbvSFj6g|Sp6#GZ!+OX3D0}mq8N`(QR6r*Y zcx=!0s?xE&!6Z5!+ry_3#`YF6QR6bFAKT#vnUvh@N=k+pp%P_cT%Y6!IZO}ZdQ75= z!-ZRlRI^}nT+m$@DLpRHwzZUdO+PK8QMJVSj>FhZ^&*Fr z(jmeF5)r39H_OG-asB)P+r>mfnqf={CO|AQXNy3Z&K9|^s*k3W z_SN*s6ppH3OR31SKo14i0J zjHtRMxPVz;IY5etfrNm;AQ9rGf@N*xK#Tc~%mE@a_#^-no31z2alL+6KDw)$&*8d? zIZT87ABipU_tw25ctgevc1Z#zuL$I6NFLY~mHzPh6)vD&XQVMNW;sBbl!Rn~cz-ir zKUSIUVa|M(?i!bR!*)m@i3(QwU>^f6c=@*@{J)9TH|IX6Z$u}-inK6(k3k#35-l2b zzn&efU)6`3OvA#~`qwA8Y%kI@h9oMO-9=QVUqzFeV_KFBL5U6mYeILnnk$?6%tE5U z8IXw>Qih0Fr!^-lS=tsUJeh=~Y9pFimrUmINHa+8h(u{Vb0(|P#BB$2A12Z*X!gGx zTg!mKJ5gbsu+TdrP%RLVpVx~N@mK|uKhIyVqtt)K~b_emd z%pH1XB&7CaPGRqCBa`-!^0c%EVqJN&+H5M%@FYUF0pK^8w5xvuMEE2GOhC~N(upAB29Gm zA4k$T0Vnz}NRU)Q0$(^t5F!zUK_U@CU@IIX5?G>yL1J3{0c&xYMARH4x`}8Dl;|Ki zqc7T#W-~d{$&!Q35DtK9U%^sMMl~}WYy$?Tf^AgN4O)*s)oWPG67xZ`^>T~>mMEdH z5>xKr<|28C$gFVWNdqv^CZ?_T${Ii~(|S}Qgs9W#*&LD=dWIQwGHN!sL>e0xK2BFl zWznyXaT%CseUJ2hdj{_%i%w+r$c&;Ml<1&R(U=y$%GE>jsxdW50%v1Ev85s*Tg-BODpShsZz7KUMpe zGr7UdZ9Emd6BAvmC1I0lm@ng82!hM+_uCze%^WAggV~`%B1<|Mh6=}V zw|>!X4YPx|L_>gNL(G?Uu(pgto_~{04CQ8{!Ik;@_{xzEC=sHYI6^qNnPW5ub(t|n zB}()YM+uj5)}O14nr6q7NmE>+4Vo?&eyhn$^A~enM{n=sWOnznz_K zHl_D6i|g|#Eb#?3k&hyx=t5=@Aj`?n#EWq)=n1dWiIk=f3LnvIeEYCB_g9pe--!chFfj^8Nj$$L2U0nOHHRdOfe?+bzwV$~iv7 zBqmt%gL3|Uv1=+<*|MFP1MF~45_d`koA|Nh(c;gPugo4}&=WMVceOu)tZQ%9f~vokhp^N{N*Ck9X#(L&-B0DdMTvFSMOyb_TY1n#D^m+ z*b*ienOzt5?5J(Z2#=U>Wc5tH@h6PsnV-2Lz7@C_k=S4hE3(1cm^jPbtaFrRr0Y<2 zVTl)WGT?a4eIpk_jBqgk}pg%AC*a0V+{E+heLhJp@E2JW?un$cGIq z)MvWdw|hu}sIX}rt(-0CXD}zZ{oVQcq0ZDk%_Q$0rm4H-bChqTn4}t%#^Voq8Pv?y z^Ng)>DAGP{s`)+UvaokTEsL6S>C`a=P|_6AnfNO#idV{`h6l}rIFXf5i4@LhcRwHF zRp82o1~ZM*_4OJx;3NVhlCcPUH**?Yf)twsfW8_F0P$Xob>=Xo^EybP zgVJG(PCb)jM)NFXdLjo#krwUQX8tU%!5lOVl^qOJ4Y;Ilt1H0|&QC-G_vlIilqlhh zLrYh;Z}epYJxb1b%=O@`r4w`#qUF~h;@x_IcRngNAoTF-6k8GCqMCoMM(S88HVM$` zSlaBYN5@KLW{}^;t$ta3l{>OIHtB8cF-bp|jKzeQ!E9gG3#gol{%y{NblwD-=v(?u zzs%*G<~{WFm_!JZ6|XPm*q8u_YMNPwq$VR0S)&~!zUNrkxRAFa6=@e^5@8dUXY<7$ z_RCE*Q(rJHipwonqHRXtWXap9)NrYx-n1%a5GO8C14Q*T^Zia^00&*?L zvp!XFjk0KHNI<)k_b$O2m@)<>$|g+A`0MQRe5G70QWPcxXrgcO%2@^F;n~imwPMdL z$}3Y;BIVxuu&FZcRMvYVOd@0-euO1w@S}`{%Y3+nD-&<=U7#)8_b(c_oH)WIVsS0;{pv1DVM*vLp6;Sw?XIDFjfX6x!pu8GThybDeA9L09q ztslfh$1aOv5hfAxfQTRcpeQny4Tv$QOzB6cfhh@;D4Th~3_QXAFCz{5uDQ{pRL*YP3^UR@3+ELp9Chf2zG^9UP zrS|~lIXx~>CVJ|ZIQG=Db(bUdLDbXVTA6wE!Sv4db&dioX^Nd9BE4Jh;J@UJ6Q;H~ z+6I`2VFB4~LCCm~?Xu~ntOSpEFwEf3tYOLyY${o6kV1cTjM*J$W&*pD_!yG(OW4#? zq2+ApQBWL!y>6MEJ@%L+sz!)i&2p!n3N>pWi4DWF(@a~5FgJUP4VElIU~1+#uC+d9 z?wJrtJRE7#cm(gz5@K|j-58SC8jqM#`w3)a9?>8YS7Sf*)JU2A(vu??{Ndt9+)4If zzJpacc~#IhAb>=fR~s@`3cu<3y6t&grhrByq?3`Wm*^BjcIa?x#PNLbBxgQFbP*)c z;mGMsh~IK;W(Rq}k_l*=5^n_HOTq=$FQH69i4sRl)DmCiQfkPy`*-ytIHJL#si&!* z;XK1!zgFE`64*&>2`Z7o)=?&P2TWi-G<~V$NsqZJT_aABi5x>1X{>UZo6HnW4@gw8 zp7;gdcz6R>PRe@(OZ99a6FGI0@YvLm`rvPg&!(V6NpUB9)yCG6KoCO`9cHuGl5gP! zAh7D2*W3D2CEsmeCecEBwqc1D=U;(V-L7LNv)#@DeCa+N@>KYs-|tl7sSHRuVIeK( zbhcluUjKd%PgOrGE4`3rZj+HMDxs4Qn92kpGH1E$>_RjxAre{SJpR+0*OTf&oU#`> zPXbG{6mOvk{CBldSrTtss6^V)b&6XVhu1a05^dB`R4ofTipL`&ob?6ALC00e?BbH> zI*dt#k!I6X>EjY|2l04Bgf+>a8UFJG9>P_#VRQVb-NnzXBo$mHMJ8$r=I}hw8SKc| zE0vg%U>-vf9cKHess27sNn+f3n1>?F`4+Oc9ngt=pd`XXh@=sPZ|LVPl!{y>;hO=8 zii`(Oc-+g|W=f0~(1?Vxnd#m2_0`SoboSx&=%<_0GkG(X>5XXqmM;p(L{2^KZv6#k zX`(GlVo8HXL}W@gu@GrWOc~IK1a^AeL5;t@uTEgO=)Q6%PiMz&=aa~3Ud%4lJ2Mm{ z$iEi_ftYZ*2D!9-*EiN}4F^h-@Q_HdZQM`grPHBoLlh(kT-PpG5Pn4`JcRk*^>CIU z7E>JPrrTOhdj}MUSV$b$^dnmbl7Nl8-fZ3;f4JKO5)wxC8K@|ouE+Hmq98$JpMhVI z`9}1ah=s(F8wq|mej_mn3B$3*1(y)?k{BRZr%$X=c}OJoo6b*%_Zx|V1Yy5v{feT1 zV3|IhTVXN98Oe=X;t&go!*1OA;W%zAlaMg7&w#s+5o=;mh=K%>eFlC-<{QyxA{G)y zZY22O_>IIQBn;aI);rf*d}YPwSTx8FY#W7z#Q6`+VA=g)riV{^WD`2kAwp$bXjq|$ zh=k%nqN{-JNPPwgm4`%9eF@x7>+^kLb4ws%A#qe+f*+DK1@9iP*&-qmN^Lgy?RRN5 z<{^=wbP^I&cTgHGbl>2?5^;KE?n~VJ*&5GRWoY95Kib@Wns;}5_A9W)u6o$Z55AeN zJsEOHG$a#jM@@xpE;1Cn#oXU!2|`yc5__jL;6ksZ^6qrs)*$G>z5nZf?6TLJXXQTN z-s}OIG>5~VsokAB9!-zW&qZG}k46}#kKsuM*gP-DaQviP@M+fe4-vtm=OutEcje{w zK_u|#BmtDK1RKD`MPe(MN9ztTfdeOg9!5eua{qujiyZ06C%r4xJ?6d^K*54{&Ts?HA_e@k5$}8AuXX6AGR=``b6ay*-_s z9Niv?W-vG9X#ym`0`Jeq;*Eg?-XF%|je&_5s{dr?qnDRTDGiy+;i`=Zl=yhmnfXt! z%i*MwNB-hbrv**iJleyV1UJ|~Fw(+I@o3-1CU%Z5@C)ot&-0fIe{p>2qKgvvS@iu# z6131s0v>Nb$_qFRx&GUX0L9}?2b}n0@7un6b3Dzk_wc?1nz%Xt1@T}{dFXbha1Zwj zT!N%JVsZYPp&^;#-oI6cx*okhfD&I6)sNh#fVh@Fyy~eE`uqTp$ktkM1$V(kEh2!&CV}xPj4$QoXOW&pPt9cwh9O-WCIsmasLa(XxJinJZg!%pGL9o`gz_T;H1=`)|0H z)ygZ)1z$^m4hhK<1^Ud}Qssf3K#31_n6bq(ua=lw1v45GEOEwt2~r14qv0XpY9sF+ z?$MW8;KU#ICG}Oq9(^f&(-1cJkcHLhuesMuwXTOG%_8sd6;m-fm3t3?5+CfpY;<$` zee~*|xot{UF-9ilC_(W;g~^zxaCw5#!Y1}8YJ^|FUZ?B%BTNA@Mey>dp^=b0(X`b6 z^lS=ye&_p@ykDh!TG~M;2|5;OB*U+T{^c2K3{1SR<3Ei_zC@7emp>IJ?aa>| zpXBKDh<3R^v_;<@(Ip{yIycsu!DI-D;$8#C--T?CgFLjO<;Sy^! z?>$?tWcMnc_j*W?OIiNx!-bH<6;({|?LKu)y}V+=u*4b7>-{@4VrMO%*Apo5@m64W z@tqGK_n8fyzb;Op@lvuDK1mUc)c7kBQb-reN9q`uc;lYh@V*yK-lM0+$iy6tNGRA( z;9n4^@NlHaUOpmq&`E-p%`;8j&*lV7ye*qwZQzWSGA8x2d4o*MEsZm48~rpUVB&4{ zG5ce4ZH9pLsX^qKRRDuui$PxQTg&Jbqkx=qrQElB?C;n0Qa;34o{@P-f$OL9OL;}MoXbNJS2SmRcl4Xt@sCG0v-d|A zcc)^Lmd{z+;KUENCs8i1-9lrY@>jF?HIzMCKOaU-=jt0~2pFW4W2WtdzG! z%V#VEN_^3%24{uFn3XXsaYnlpU`M_h*UNV+G^oTFTeaG1`>}dhHGmRdl$GBs7f)e_ zgy^;9S$Tp?%u(Oe-KV^7225g$dWrk8TCSD5%*uO73{1RHOvs;?D31vduE2UbU#{T1 zkaF)xIctO~vC`31(UW?xGA^-3e)Qqy{8k>O%l#-|5?j=s?(BtH94gl_!X;K0hqk-< zN4OsNXm<)PAc=N0ht2dQhP!nOlIUCt6ux1_9U^y~AekdaoxtqJS zesZ?lY~e*l<%tcmNMZ;Op_34oPy53%`SFiATvAlcA z+>mNW(BU8(bi4o#s*dCZj7;QiZWpX^x<<#p-MpT!7dOg9ccu^2tsBG|=kK7C2!Dx* zIEer+oxyW^f7n;s-7&bcv%~rNzWOS5MDs9!(k7=F8WPJL#v`%5E@s!8>gA@|%$Hl- znq23VyaLbVFu4bX-ak1UMywsbW5HdOhB*mXcZRO_5{*_es zh$}`fY%{T?Ov^mr`?7*4It$747luq1a3k+h6v}j;ZxJfckW`kXE+8=yg&NdSo`qy` zNoa63C^kGlL+dN0VKX~Z`*{pZ#PL{jQLi8U4&lY_z51@98D~}iBe;uzPC~dPfuOzn z+4)BmhELfn0P4xdM>Lq^3z`s-e zp_+e!V86YrkKsMfkN6;=D9~@Mb*V1^w5c8hiA*|@@vplw`cVTa%N4vbeh-2!)P2V9 zEeTbZ4FYOhBwjpFg}(xU5|RrX+TBQ{t}mIg<)U$pi)8zouIbM491M)4U^I9mWxc5G zZ>whr`16f?#_a#?YriZZ3Hn#MpsQCFRrJBzp(IS1NVGUg;e$bNDh5V+cxV=Hix34e zxAVLJ3><9T3cW&LFaS1ZRA#50f}|2b+b|4^Mb$W66%m$ocEU2p1LwNNXXAFLKr zW=b|0iTEEC5h1pMtfqi>0|+Qlk$A2i5(b@oW^GPn)$kSJ60O@ZOSE`r?$LI;d|bbW zqajdyzMac=Nto`OUdY;H?e13IE&~Y@_bWH)4z7O+Zwtwx$P^^guLK4X1g7`z!CC7K zY$9LHaJ&;clR3S|zs^0n14(p{ZbjeD_G`VLn9Fr4CBqUe6mTQj%cGmO@@8?fR-D)|Bt=&S5SW)7RD48X(-W=(iutP;J)Y|1>VgC$N_ z^=xzM?<$%pqedw!eNej1Uj!%e{}IWxW!ay9Tln`lgp6Gb{{#yh z`|au1MfIXqHOvi;V&)*j6F&|7_B~usgXQQ2{QqaMmCRIK_QM30_`H5Qm;aovA8L`%OdMK< z1f~d(sDf&^_yVK6ypn20#x4`%b%=0zc`fJQ=D^Y}yZL2KLL@2-AD}IqMsrke>dmJ9 zQps~Vb0bHNl97ozv>e_Yw}CuLRZx)4{#&1=KCqH4K=;zpE@ORz+X*$01D-_>bY8=(z^Lt;g7hUsPN3|F(rh%vSp5E*qV3Dwl<_Z3O z4IUBUT;=?7=(!3Z5(`EqIGS_&+v`)&WTyLVcbokJ z-%E`1fCiChoHF`WER#i^c+uuAVnI(khf3E{Ptv~C(_%QH!BL9;TuIcvb(Bg0i3;lk z`~?py!LSTPJh83J()AK-6S=nxOw@1`u|#={F-#n#G)!raCx@fZYIob)zh# znw?D^-w2UdFp0Z9f_rAq?k+B7?@w>0=U12FP+*pI<}b_nM<|)NO%##u2=K&?ARBEP3m5Hb8|BKlEKXcBm>;X)Rn<4 zj;Ml|n{5viBw`_H(7T~#etan}nHPFDArcEtE%6Z>SCJLl+1%zKPE8`rHkAv>15*V| zqQd;*X1`X0`?pU08!RHgq<0E?8pxbNZQiWq$>AqPB{r;r;-62?e)!zx{DGy}P-&dV8dt7c{r|cTU)==%gYp zagYS()1!;ayLV!+GK*k3bpxw$UjHaR&eW6B!4fBW5$g%dsps#GcgqLsiK#@0hTz^ zwgnG9y*WP?we8im4KVShcD}xWrx}jkT*zZqFFQxj#GTrC3Q4of+sn=YR_44tzg2YY z#Tj5_&b#aDG5jgO5-04yj{46bf!WN^bG@iTKyu)ull$=uyxtfe%sqNpFd+$rhN3J=~m?>H>7&Nd}y)kp)^t5;9?P=C4c80w?}B zzTHBqFv{2!0TXW=W8m``V^;$!bAmyJ@9(!)0hTyZ`!-=-Xxkp+$L&=EOuVUmM~SDm zSDAQvdo@ZtZD2`Htm?d<8+%2~1+96qS2V>VCY%ZXhW5${?PpHtE0?zsEUU&8`7M7UcG@O+in$_JGWBmM(evO>YE9;yShBTy@CqD zTihyhemT9pfiea>^>{KneGmVfRPvtIJ8RwcxrVi&8ecIbH#~riw=O{Hc61JVko-~A ziM-F%H2xA08u}QJiJ+u>w0?zn8kk4 z3^J@1VMe`SDB)6oloIYp|EYTYQg80Jy1HfoB%^Lbz?#DaY`Pd3BMdGGTpXnf@+lZb z?6rf70+)?tM3D!&!G(b8FA8zDet~;4j80&t-}88K+k$0Z2;DBGe4ZEXDlcbL&S4Iu zqhQuG+;t{8)DidEgmY{OjOJ`_Yn|yqQZFGWU$l5{W0#R z!)p;I^1RGUK?Np)WU~Jg$lOsAI2F2D!M^z2@^N49x6|DQ?(Nu4U|#jCmi)|Hp*}k3 zNZkw-%LLIiD-&F8@hp!reNaJbM5nu)zcP z>qJ$3NM=?W?{KF4WTKC`<_-!)?HHaF=U5Ye*Hs^uox|%*wW{V&+Es0CR+1I912Ah0 zrLWM`Q@A7qQ^qq_=gpOSOMN|MU>RW7a**M+jv5_Q5CeRv(PMCvT#GcrlC!(V!j0hW zF}$h!b|bI353BpXgI0%40!N$89Ilm{&R~fOma8VXabS*rCbqpAooE5?(pnMDHhhPN<-v)6h#qmUl6XCQ=d%@NQf@WHo9qAQCnU zrk;&i{H7E`f_`pF`(9{Li<6!SP7j8TUO*0GnVue{QTd_b-cPZ;kO`tlK8b5Tc59y+-mdP8+y^ znbVKyPEL{2E^3RMt?@hrEYQ*Ot*b9D@Xqguj3H1FBY4kAwQ|8qu6Z65s5;@otK-4h zx?y-|ap!a%lD+9U{?^sg?E*^A6L=h`-VCXFjLxbzF*^RN<}GDv$I#3iQk8AEyf&!4 zsqlTf8NBUN;P92S|H5Lb4u*MY8u1%E1F~;UbZ+ba@ ze4nd|nCrM=z>dI~TG09ZL|?)lkhuxoC|7oZQf_Du%i1QKeo~^Wf|hf7SmuPwO4zIX zM@j;;WcQ%bLnn%(9TR+(p$Vp)-ze%2E0y*Y+859o%=WEDH?5 zh+83Cv$;u`JVPntNhe_t2#)DNCE9l(x0yNd+zMAbwy@cv5N=!FvKw~H9YY6@w`yT9 z*02QFZ_X}`-cBdDw_ofXW_2hpLc_o|fPmPN;O_GH7VhfOg)mQtA0R{^VL6hva1rG6 z;!Kyp42iZ3Qy|dztDSoaVm$sp!2FPGMeP8e!|@JX1oHr*VFKo0DImrqQcSDWgD!zt z4>u)1d}fDe%Ivt0?OA>)&P=ZJyvb&^B=#WZ)`=vXksXuu^sA<8&xi*a#n9tYU^Q{(XZZBaCP;4esn2o;TV~H8FuO_~wZfLUEgxne@4;||A%-InFZIq`6uksF~=Rp%X!5f%vXm6!P7oSYY# zGeMVgCl8CIz}%APxWwsv2mV9N*3E)=hBxt_HtV*6Js|5!j{k$PVv7d#C^Cp?mw7&9 z0VurKkYciFF#^J?#BifPT$hzw)Qo^ofkUL2wGGY8m|X;B*x7@7Evm1(Nq`VlF6UbhjX05GWfGc3nW38nB88v~uneqBOoO%b z)qJ~+$^tkoQ|GQ`e}zn@^Bi}Jft5sd+!X-Na(|fb7Ef@H4B0=zoepA`GMCnHk3rOR zQ*7qNI2FEaetrQ{X15A8s~;Y=XdI!AX(uQmvqxuQtWBiE3wecTAU-&89`Vt|Vz?TZ zQ`R1lG-U$=D~u%yR+t1(lpc^5GodaoJpB$Yb*%Q!@@0qv^5Y7T%)bJ66J2aTcG$fv zu)}Mg8+@tcd+0CQ-%Id4EPz28?e8}YD*k3?0szqpC#^k$utC%Fz!9Vk#jr0vmd%#( zm2CF3S)h&Zxp(0V3$?`R5sZAW>18`nbT!L=i!Nyd%bZvxCryE`VlO1Vv#)Pce#JY@0yAwqY;=ipfY2m<@@;t=Lti%BEd2z)*nzyNYhTAUv{sP z2YB9CouZg~Pld)LWafk|JZ;X+c8AemEf0dj&~{aYRpOCVB`3OqhuNQTb3PhKjQS-y z5-OV(=bPA^^ac3fac6n`Y8XaJ-5SQ#y57w{&a_?O!?03UX;@uv8PTv<%K*bJW^W)T z-9o1P1RIG~^F?*)w(-J!!}6XJ^GyPDh($WKXe8XsA)8u+t+kWvZrXz^-VwoXTV={% zai-L_FONeA4plAWqpCFY7%qkU;jOP;RL6Y`v8dU|A`C5dwAmb3^5 zZ^<@c(~|zfC@mSF*{lue`Qy6YSaHGJEg{B*7@C>k7B3&0;F;u2^$d%@^Of(uhUVsm zI9Z4e3yTsa91D2tw=0V7XTu93+2kN^=q*aeF(jKbqKs&hjv!%6=!MKleI$ zCU*B2-6G#QLx?Unq~#7(shGv5Q@E&av76Lz-d8?;Y0g>UHSyP{<>OO4ZB=Mk7}q??uRs_SPmBuV zNb}b?C@9i=Sni&Fy?=h0{2u;Clxb>R@9_;5A~v?ve>_Asz4^u!?mrzSoZ6h@O6R82 z?!6bd9O4*T7@vMo?hrnOGu>gj;x@=W;YNuffRj z2Y8bnvO9VA$H4S1nf2PAgT_Z&FQDe)<;IWES^J0{a@o~*^f5ZqyCUTJVfi>a#&s~P zZo_|wA==C=mhdDGEP^6HJdQCs)4HzhKESe#K4CQzi5w*$Gof2HAVPSAP3JUcD+VWk zGcB7Jq(NGJ!^xn$E;VrKob3Ro?0x zMHp8qldSSxrEvKbNs(AXOmfWh&S)0Tz%AmcW+J`X7(HNq)IwJbSSkmN-levX(EOFe%LZz)%&|u%yHa>XZ zvC!N4Q|tXAQ4lj#gjkGlZl~MR?s@g+i-}8+Bo6i%A3pFmu+u9(CM)l&G6QK&ij;w6 z@WTtqfD@+s>S4ZL?PhvXXXYA~Aj#~>hmcr;@5Ss>^^{pY$v3RVDKDPj0Go@B*PAyv z&*3v!(ieHvCB0#ZT?xwd5OhPhjThW(hh0xp+8ie=_i_a6;;DmqcIc^p1a24@GIOQg zHV1gtI(0J7EbBZhuTM(Q$qqgra=<1IJ-kLNtUNcl9aj6XOBGi?_Bs=|!qp*jZfsQ9o9=%;Y z)2SBaw5C}NyayQAmL8pKNr9OYhTHU0xR6P9O>?-lh+FGTP`GK>PmXR+XYMAxtBaF~ zoYtB(lMH`?&jt`h`0?uQW=s(fpGAN%plgM9=f^i!)6?UtOU)Qp*5vdMV?;D85EQc{ zfiCZEPZg_}^Nqt~K?XyNtVsqD!!sCS-2U$T^6Y9%Yj_4017@P!D5n>WktWRF_i@%nn3#x#f_bSRly62&9&?(0kZ}TsEDA1iqg-&2 zGKTcYz4C@rAE#|`upm%GX>8K^(d4P#%h~-XlEl%iEy?q8z2C{3gGP}B>Tar4o}n)D zBu?~35hZ7qE!?EPmQR+BA`6u3RkQ5Bw=g-+eTA(7->-@OQa20q>9cxuulDIa;jYz5 z0u^^{cy3s0EfVViWE1W5N0v*CJY&iQ8v-qRW#Z77lEM4qretbV8dI`#7%|Mz=(GVFj3ss^$V1Z?Dja$90M%u3+C2G|Y@+au(Y#C;}Q z7{?k44qs3RX{5mE9%Qge0&7mL@AYYJKxSGf^Ch(Jt}btXREW);eFm|^W@@OVC)B?^ zJ9s_|Hi@U#(Jx1u zUbh$wF-DtSH)7XWSDNXfb+&O{w-hvS6hdFMUJn5Pe`g#(PUqcEgG zr5|40+s*UNYpyE@&B~~0qw=3;>%}D_cng|&v0dFq*Raz&^j|q^DQVXjnK@xGAm#LF z@7T0hm5&9Qgq(J4UT0#s-EVfj1$Um~b*>9}!fh`>2)6{nb+rvP+ZfYQ_W_obqI(1< z&+cgoaT;r1w#tQtcCMH+g2!k5 zF+V2#1GlRBc+Bsr=Z~-oj7={#d_QK7F6$haN76aZj8CwPr!%5!Iy>gkbWWLFEDhfM zVKaYufreJ8?GZBP+yS1o#+eX#H*tS)GRSqZ??x|2*MaFVti!QtcrWESJbkR4DzkG0 zz?n4L7F(!nZ_G8}mp@gn2BDo%cL*7j`OvrEhu53>>#N)F@C^Q?-F#wRwsha&Y=D^( zb6fb`d%T9&P|`dZ+9ix(nG=IFaxSYcFgQ@UC!Y+plc0{42`;l@=YiiwyQg~I;oDU= z!e(B0XVLNI4&9m;d(94}Yo?Q=Qi}2r$Af_%d#|)tg-{LQ`}40x1hOb<^h?hKU~7mssZ~0!m)8F74jrnFe~YI zIi8nVUIgjSLwTgvM?YBFpNS&Lb^W5Ibmlph`|c17c-%byI`}@4$XRM{3QF^lA~T%! z<_Y!78SognT0uFHQQ3Cn3QQfP)9uRr?}}fxAwk6N%qa? zY+M?7_?y}ZhN7f-O++a-=um{XqdK)NrrY*$`I0e!l>!bnGfl0M&#I*dB&M-GC6?_y zAT6cYDQ%`B4aiOL0=Ne+K?F>0SQ>YUOtx%E38F*Q)(ZwjF?AV)EOJ;hq7mr}TaS_1 zppnD!XJyPBkXF`LGx31LlpRj-*&^9{N^%^8W1~{Yy<5At(k7U$4CXrll-VfNCN|@J zwi18saN>?ZjPZ9bxN%CE%=}*kHE|Ef%C(5(DdCVre(_OpjS?ac$Qn`N=mZqlQY+77xWxc`uvQAio!QB93$F&eo_<|a@IF|*o@lQ~nY)PKFM5bAFS|<&ta1>c z;eO}dD%5XkFBYNAz#>3IMH$a3c=2`evfIFGTIDakY8G(l%n3dfb86eR%na{9Iv5%w zI*8iJW5h%8kxA>#^L&Tydc|DO(BRoB|Ygw_$n;o4#o%-8)k%? z_~*+lzEnKPa2NZp*Op0GZ-^Q!#e2ir=9+ol+V7bb=D9I#M(5!;lO}!-R}N`Mfrg`m zOdZvPiu~!<#rgW7wnButjaaiVQ?QXkN8(Swt_6!hiGx$c#Cq5mlo^iHI)g7iS8Fi2 zj~v#pU|#R18eO7c`@_L!U6@DwyJAcmOPtUuu;aF|%;e*ID_6qJeR-NqVt6)%#I5GZ z-+^1bzGq-=Sd&8+h>e14Maz2b$xfb%jUt6^3>ZYdpE1Hv zat+r?!{`kU-R)*u*y9V&=He}&8+mP}ICTg#+!kSO1KV*QH}mIPT;9q)Yi%y2YYq`H zFgsLi&>^F5lg!)J!*avbB`xkN_iS!nfAbEY1N8SiY=saYA}a(*GPW2)j{oc}ax-5) zR`=6a*b(~mqF&5#x*Y^s)T>$j@BmIKc90vZHlrCwr(`SrS5vxbeGjjc{P85T?S~R( z8g*3r!9@?~@4Bh;jz6kwaBqhp+aJqnVU)P3ws6POqWUo3tnvQ;%uLd}(p2pPDF=JL zB7>Jm?1;n55GEOIJHTxhi%+vv^|_LV%;5zIDLx3YgQue>`BGT%I2qu%4MKIQq17h1 z!!d?B0x{|{+uKo96El4I4Zsi&|b7NtQ75 zNCM*o=nP(s#7sUPKz~y@I9jx9voHWze?f1{e?c;;ZTuZ%{BM3Zvg~+BzWCqAYV~#! z`M2LBv)Y^gh03dX!*`SSm)~OFZ9Wvt#&wEli|yZ)NiFZE{C;Bp{M*D3P#Hv4k zKZ(Q4-v>FjXpqmPiVNt>z#|oGS;K^%Kj{b82jvZG6%ntVR}D%W(pDhGyb5$**SgBZ z)!`VPjU8rJ@yEl{mg^p|s!=tjW4Yk&-`;d|}~P@m#kdVbzu& zU&2tZ2(Ed^B(k`i+2P>u@?R1=u@rGI%I9f!JsnTxWC`I`*r+AtU+a^#v84+OXkg(V z=j;1bbq_@WWAjzW(unW@SF4JmwK}Uo7Hfo(N=!V`m9HzMfgk)TOmU$MW6N8 zyS@|u%Urq9X>fkHeYdOsbpLSyYgBF%TxR3c(nD;G1b70HxPDQ}{*kY`qbRiEGtNy|h24eT&HWUMG&)CYsMIN0Vq%?hU-;6m>0 z{88R~)JOmJMFiZ~fmn60Az5jNPS$GkIZb)TN=Vq`)U}h(xn=ypC7|G&NC0~&jJ4q6 zZLaCk_$fTmRl`d#VX1M`P47aQLn70Gvi;ta7%#N9xbCEFQBktL)HU2${!i@viY znPKQVOOoj?qe!BAO1AHOFIgy&$_*id$l{5zJt)XBeh+HPBJ`jj%h-O~mLwFU;=UXt z$qh53G>~qTvAa;)C_)zsMj5{gwPlHh;6nzV;?-aD08hYOCX^-kQ!c;{${gx45wn%> z4oXi(-z;|(p9`JTAAc`a{ff7Xen<(}@|gNS1#EV-_``m=scxS()%LNj>wJwb6nq7P>>L{{(r0@Iou`p`m}s}YS9udGoqg*jE}4O<9t5taP!2L&QxK9u)m+{_Fep8Z$8bf#*?zsi7jq^L@GqjZ&7#YudRSEpcl%A6e?;(X@fP=` zYv$3o5uUlp?Czr0LT+_)1CY|{T?Uqda=)7j-tpLul=~&%61O|2 zG)~?b&IWmK=BDHX7E0kvDNf3Dr!#NU5z<}8WloBr{7p^rhoZz8H}-9&JX)>1Enusj z=IQ1XBdahou3p*o6k)*}w|GC4ZUXa_2$|cVvf6k)EvW7JG*yS8!$Z?Ofl&$It1Z)IMThbr6p{14u zFuR+$wWW*C{5ZDI_wzMOv#S1%pGJx_44l{mDUUXZl{ zp))s*?J@W99Nsh4$jkOybl{mi_Cb^lACJO|BNXNP`CvrA65z-l3+Mt6UWlj3P*!IZ zDOifQC*UaLJV3qftEUeHd}dGlkJyza7@8Yr<&ANG+xy=Fy-@W3o-RlXtbEb|=(E=N zgR^(k4;^5!le>S<9)S9J1~x#_2l)q@2}Y10>4PA_*nKdjU_0ni40@MP?Cg!AECsmZ z8Kl|nIq|dm$;bV}Lj@Q5$TLjyzE_vAH#58lmj{batHNfgYetC5WI*2tfUA11+ z_hYIDxopCR8~){j%n;ha{ogU$h<1d+OUwkzadNyILaP>+x(9s-u9iElt1r0xDh>rh z&{2ay?r{M;6ZwKe^G@mqoEfM6EFf}6Yg5S?<{(t$^j9y{+ASBU+w{#Dm7p1+vT87j zIcKCVSN{4dmDQ|3W>`HobHi-TaYIli`XB51)8xsWG?FhGF)MQde+!=lfZWXq;1&*p z=2#Pyql~!;P@s;GnU(@+^ii#o3`RIp z93FC>&Q7lG-dw=DoUae~Ct~Qct&4v(ibyFodl5RX|F%7;_jsFgj@GQVIf*;80h(F= zj97EeN86E5(y{e`G&-!)&;9x7*Eu|qE_;u;bS~<~u&iCfi6?-ARX>Z(SjNe)%!$#! z>4_i7Wp{G)D`#zcEe>gp^%^G3Kc6UDP|F(9L9&94%Xlie4aZ=T=V5~|CFc8Kc=P?B znC}Or3zRFRGYxINh$%7OuZB0@uN3qBYH;)EOhcP5V#2K6b>6%6ORoExkD7^rF@UlO z;SGqCPVT}3v9**_J69jN$Q4`4X&r1Jww7|L>-V9H9Hph4=Kce*K~dfi63qOTHm1_i*``ln2?n~=GQ(=mXcSfl%(_DHxX~30 zNtgTQk5$glb_qfwZqS(>i^gPW3L*I4qCeYnM~yjb#U(rAJcn4{&vVM!RVIZJU|CDp zCXn!{b;x1p;;sX7gh|zdYS-ef(}1(8afoU@>leigN!_UJ9qG2l_zlYf6*h%%rB)et z49;pdJvaWW3`Rrp;!MJMGCc7CTkDlly7>g1^Nn_d0!UV{abYCN?Zh2`3$w&Vsg=Hs zerT%9iHHHHoCWKDsMb)A4GCJ|L}FXT1+qh-5ltj?@7w%;+z0@MVJ! zu8G~y%tjUF#67W=4!hlOU+C=U{@y*z2%{Jz;w$xyKs);mh*8JraNw{?|-DE5Bu=21itog;;)7#n6<>l4w(e3%w<#d7% z$P4k;PRey5S`;h?jz820_@m>CtLfd%sV0NDEh1xx2%hO9Ef5Ae+2_Q9V%G(u|a-`58t3YG&S zZ`=~^u1@Y?Sw!gueZmm7gGXm}EJHNxupw)`uHm2`1jelE1EvttK z=15lWOkZ&-8Cm_OFP8r1j;y@nF#%fuCzO#4@7(<&ngPtyCV74j&fJ*c5jUniYCdjH zWCM)gb4l70k2c7dOUwr&#R^=cCRWD&em`Hi9nh-EeF80L7L%~S;}~5eDan8#&^>!NbTT zYll9g6{yKHY>9ZpOn#!-Vgwmlo#H*5uB~}#XOh@#R^AF!_KEPw+LB9zcabl3+Gixp#y;}JMbHhAa;#PPW$z{F3J0=MpeM@irSz9>luP)fU)r*RKzmv)STH?Fd>WKA=UNLoW#@p~L;;1!RY zf&K{g(V7g?n(N@na9@bryUpjQ5Avdfio@MRu~qW($s%jBQ3Zszzr@B&1yn=9sIvXd zL9+evY{wbZ>DOJ9PpqpikX8(uO(X>DUQh!Ftp^hb|8KBfixv^t%__a(>Jd0|a~=zy z$I4?HXy%1&M?q)*4}HWmH+L!OdR%7Y(aC>-GZwG`!BW{Qy=B>B4wi&NZ&wm)Fu1ZN ziwDco9x*wm^io-tIqoHiM`xQr&BN2qV)momZZny~|IF0bRhm$>X;>5`itxu%+Nyc#H1xeW&_#KGVm0!C4<_Nhn7GNDHqk}3d*@TpD@d)OSxPV zE9z*hnBry0EmV#miri1UC@VCM*iS|f1ePAW#gZ@*1kraojv$HLX}u(>yN)1-9PgbR zAuq`K?d1URJ|bi9l>>hC(`yZbD5NKGE)G1;~R@M4ZDTRz93Z|}X6ewQ!%pTJwW zGwr485u`|41*Q0kJ=?uqq55d=R*87nAUIs4twN$y@Gt6SyK#iUVo4$lJY$^ew)PsV z?I1wG)<~lU7z_nao$EFtOEUr z!K%&Qu|IT)Q3neU04Or{M*&8)e?s4}KhlqD|Aaq{jovt;4;D5a(!Gc*> z4%HxI4i=Ii>0rUX(4DjQV8JA84;P>O&HeAH-4iUb<<1P7Q{ZQZ5mzI+*i7zhko;pu{406fijc6WJNf?>M##P=`9@T9*GLB5WysIcI39;>waNgAiu(L zcC#=NVY2yJT=+Lct%l$N6M7l8xBC~ks#zs7FN49q*;dShvStt~9Gg$5hLGG5O7#=!g3KJth9(ak<6F z7XzQF+7MiD63*#{nc(^D>AT5Nw4xabQOK4j5+o}Ip*JN{RU4jfdj7jpy{DD(A*!Gs zq(^Qf!&P0;o+UjSb0R=xI_h%agRb2mY_LG?8_$b@=e?GyekGkesF57?qOQl^bS;PC zY`hd|IIAT*n}`psi>+AXH35~IvBNiPujueaZsYY^)o_?pxRPoZ^@t9px77wScCAm8 zgfkDywxrNWWUjvms*S*GFw97;rDbD4**QNmV?PUha!Qa7+?Y6Gtasv4EV zlK{$1MI+C2_>qSonT+}vebIF*ae6{!zK(M8>}eRXM!8Xj9Vpky!%q01=jA1CVzLeD zlpVInlq1A`pmV6~Cs6mifL@7jMS4C+F7>VIMefq!?C7YPbQnGgD~*mrjyD9#CWVQx zH|g>pG9k>IaHCOL!Ey?S0#6O2nrgx#9zbLsSi8EY*N^V0CaCyqDkzCg?w60toxC~A zynuTJXpv@ZY-Wa~(=PM+yHG<(UZAcX;p)E6@&=Q!)IM2m7xT^iCe;X=9&3m2~@*qb}FlV>2^mPT&goaMi`t0=o4AXi?#;;YOjl{IZ z4nhK9=cy`;3Z4&W(ud4p`)LzpcVOeol*=tco_EFi*UA3zmd&Izk zz-f$}Ah}i;L7FhogFjrl0rt)7uG)q-i$zZ;81YhYwnP~5($5q9;mrZ5xgW-AuV)`o z{jv3yZT|9#zBD#B55Jhw&fqCUowjWF^|;*1SUd#9pp~avlhS-MN9=C__@DmyXFvOs zpW*-gp6d5F0rBK_`7yanR}ad%a$E~^`p7j5VX9wdTrQ`JN6J*c?8rO}A@|d}^>+EV zuI{lpb53i%-ynKWjLyx;V@CYllEB;zVoHDvECmnQZ7JT(x1ZFZ%iMf$kQhk8qQD+H zlnwfFEJ{|4{?xg3fQW@1n>Ab-^!)c zVl^Eu`<1|n*SCtp%ut+h2M&5}mG{(#qNL;mThp8Yl#;e59c|KVB<@2RhvGO;-L02+ z0yo?xq54uu4apfYhG&OtoxlfCFx1JhIPwj3Gj|fZO6gG3nK;p^0qo(L!t7n0tClQL1Way!8oP-MyM?IUAZ#?coNq6~+N7#o zNz7$fR*)&L>+KSkLkFfLSf-?m`+WPmYE!FpCDSzznNYo(zq~*?l0DmC`sT9-;fyyy zWj?SbeSz~gxX)$ssd^P1#woI&Xo2Jxlc6n;pff*Y4AcVf3x6Jep7(llwMq4Y7Q;bOXqBK5 zq=2%nW{b?BmJtMjODYvX4EMaWj$R$wH0_RRN~AT@Xc9phmA6r*$wm_jQYjJ&u9f(y zdR2!Gvoxf(ln3U%1G!X-Qw|-&F~SThWi-6fEcF|@ww)1nNQ(Tj-b1rTUBNen7Y}dM z_g8{xqi4C-i9GB9un;8KgC&v;GnzcnnBpa8Ni^G(2hkP-TO}IXTfdpe_8371NRz2$ zFp-3JZpA#ZJa=`dtTSwBBR&W|8l5@sc-B&71ZB1;@?5y<_!RZZBaeq=#;8qUmoF-B zgr4$@F~MgEqKq~9g`)cRM58!j>m(%HRu1Mp6ktP6jK^l_Ebzunm?Yb;T|aYPOw49{%21H72}C~Q-^t;Oi~HpSf79GDR9S< z!eO3*kvI^KNni^J8VzcIN7zVnctm^RnhXC;9H;G4x6oEGK9ghG-X_1VpXWAPEc785cwn1i2Tq{X9^}a9^CET49C^PPA?(}+= z^-Db#XYXFSZ0nV3)^5NMRlv+J^KfxY_7=NZAS)M8x%Ik)a)23(klHS*URm3DNY<@I zB`Y=zRS0ZQ4j47C#rUje2yF4k$J5*7mstfCmtN{Ty%5Zx9DwotSBF{J34!cT|P%`QU-;VHEC z!0XfA98FIr&#G^l+xeg&!PiyaBnlQG^-TBu?(FRJCL=^&OE3wGfpbpwOc-*G>-BE= zxUctgEOqz#A{S=uIj3Qhn2aUDnwBOJ1Wqw@j3f$Haa2(@_sR)@k%Yk|0{g;l^XNzW zis%@V8^H}6?sjmxKzo9JQ8d22O3=C^JWvucv*HT4R}o#cxsqFDHh1~r->mQB;mYY0 zqcc0}jNhlH7iYukOvudY@)0Lh_Ui8g=CY!y$+crC*S1m6LIDbwkm>tVx?i0TA zhYwf7Un{h%`@50DHn7Zwt=Rmr{(6AjiU)9ED>9c}5gmjKmk}B=iVoY!16+rX@7c%~ z1=uk_RkNXB+hUF+i16(GOl;C&`El@T_~B$BjK=spz%J)h_D&qt0uh5^gXkB!s|_sy z=0>6wbO#(-1S|kFB7_Vz;{|qQQ*DEGZVKm%I?U?(H3RbEEVZq%Ztnq!lRoFIfmhyU ztlgu}HTdlBn02%iM}F1j!?NRiNMP43KP)}24mR|Dq3MvAV=tLHP-!4bNw^u3=%4;b zZ;KJ+z@%TZh~6qA2$BSXTbPCAx`bU!RvQGNxfyWnp;6zlsuRG$IB{y@IdfM&*i#!> zMTaRVXkPqa76G3#jIGNb{(t7)tvQnAI1{97&BWU|q)1(6C9SPYGrCZ>l1OnR4tHPB zXy6=(eE|XVIV5LyYYT-0Q0zigu`b;Wna#t#^HKUwYqtMj_s{I-k?HA?neO3*tjOlb zX3jb6to}ZC4-XFykDKI(e6ggFp!(|`25GpjQuM4-;_4>LADAg|-*zk&`GHW<@_yBh zL6{#@9y^|_X5-ZIel`h2>5~t|6qAAMN>{j|v~*LZEWJX_7W*pNVU=NnikeUqm!Dm( zim9n@-vp@%FKWxE-TcL911VJ9Kb8cxqx;)7^{&;_Fmm|6sU5!clYJdOyF`*YwWS0`6CI*&v@4Ot9iN8h!G0_ZPYJ2+$x931rTMAA~3L zQjPByN=@>BExb|!qM{)=of>ibR%IGRLup(5ab;nXvG267h87)VK7dut=gVn1CBQ2D zbW`1SqU=NKJ2{FeL?^+<8y?r5#SRfkas#dH4Bm2G)@yD9Wn z#Rip(PP^8MjTI$E!Ku{XI;dbHSFkM}I4ri~-<0M4+7R#pFF5VvaF^K}P8h}GzUNDq zFx;@RS-nB@NI2cFqW!&ZHs9@r6_NHUG<)pv#bmZA_K0z>GPqnsCf?Q@ktm8pKN}?+ zZ7_-G$dqj*JEjdLP&d#XUliD#xY(oJ`~!fss^-`fvq{6@3agHpBB>HB_ZyQ5k9DI6 ztqw@T$)q`WWGCC7h7+loc!fTP&E2IpVPyOV)k6NxoIN~=X=*pxeec(bf%s>mDgJA6 zZEOe_MxwMlsXTBXc|xV4k)6_Ein6s5y=)+9!U~TejqS?=3DX^OPd-eG6>WIC;emwe`p=8mVxJ5+hdeb^%75w~;kmv=vCxlL z{05{Mc&w?_7Ta{ax&BdNnm3SXx>L{d$BSaKd)UW$&NGZL4LUJWcT(5*VJZj>C{=fM z(3Hv!Mgt0^H{qT$sa$f^bY2tIKl~U?Sd;B9RbnM&lg#m@?&d|>vFEPaJ zQ_RaT&5PNj0X0)aQYGT~a58m=-&poU>kTK8)_7O<>*f1BlFB?%30u1H&j14^Yugjg!O1qT#L>wiC=74v;s zFppyin>3(iD*0Wi{eELIB?jc-WYS_nWGCCBh7+mVbo;Jy__v<kvVk$9Hw`zE~ zU9NBs>Kc#qF85iZdXr&t+~pJryUXp}U#EKE(DHS+pD6O#z4E^c@$ADLLyJeJEO*=D z!}tvEluzFlI76zgU%4kBW?0pT)<7GW;!JdRR`^6@29)f-M|TV6BEX0ZTd+cjn~?Y$&ipRFuQr&goJDto zx7zqoqPI*DLN5TW}RXtY)0pHs$aw|KIkVD+}*2Ib1||gh=V8{ zTHPfxlA^~|q~$p(ozRUUhL){!R0vuX+4I>uY+JYbfV;!rpes?uqFp}SYjW|4F;C~q z$<_!ceT^9~MLBG;u8fHf%QbYL-5`ePQN=w(U|2MQcA0hCW@VP1dA2y8Po@Q3o?xi# zp2Ra$7G%*_=hYP+me&rlhw|zXkgZ{d+?>4FFkbm|#T)sb)z0qL=yW?r4AS0dIrMfP zLJnLh(6q;k&Hd~afkp4-?opMrDN1m$g2}EMATv8=>rLHXPH>3h!^_=#J6p{kEgQJ& zplKU4NyHYeG`dX&k_Ly!TDEbl;vU#@tWv>?JrWY=mdGvvPMtSx@Oo|eMBjX=3PP{f zqPNPbYn+i4hsK(^o-f}Qrn>HlqI6>iY|+@_)|LJ^-2bRfX!3I7Bv;es7X{r?jVs(N zH*;_NOWVE17u%;~(CwdJhR!H(G2|Fjf{O)Ac3u4g$DlTQC(2#!uD9z6jtUzi@PSc| z;YI(11iA&XOMoM@&3#(YpYo^au*Kn`(Fs#}{7yH`$y570@rE=%ZPWl#;8CP`H zICX9FaZ1fxUQ|~zvA&cHD{5llp>i!dy?5U>H{2=C>zh2fA#?DE3Hd2^Bl7e$A;XFZ zC9WoC4Sma!t?5FCO}FJxZ2HU~6Prx_>RjClaeXI$HL$dw%Bov6Bdd%d>3qNM7}8F) zyL`Hex%ec0a?))zW#692xYCjur>^A?oL9?dlT9(Y#y`}c-Pf`uu4pL{pkmY?&&fq6 zxv|U}tfuUn8w;|isq^a1nUh!Y*2Lta@7iu-*3n|pRm;MJdB$tHfs5Z8!LqNiVC{~- zH*|?t{ibV#D6NKI8vS{=aB;NM>D)`FOuFtpjwL6adZU+;&8O(y*@nhgfr^TVq)j?Q zzdUS6Xi7HRca&eb3RF>!>2fO9VXM7`+3XEJy{y?Gq>gYoKD|7jZ0|=a{6p;s|Kx2Q z+u+4<=?4rbRzy_^G&jo~4w;X)%W-)RD69Yvej-Dsw^ z|C3$6L=(TGcy&2`cqEsfKCG~LbgeI@y1BIB@-=jlQy)w-aw6AcJr|{-)HxJ}?h=MPAV3kYSTbri@L8rDh|V%*HaeP`UXI_@Lug{y?weKC;9}Dk&%&{_4=0uN?=Eq$7g58qL90eu?!f|6g{)TyxUk*OX-6P%Jz8_RODi8?U>1;8XV^WD7FuK>c z3C?_WTTCCPitCV7YkV;;4yS4YlIoWaPgTjtKIzmrN8^PV8Wp+6>LPaCCz+R9@n(}Sf!{)SB zJCxYMjE%BgX7kwtKR?}x zDZ*e**_I(;2CFG@o1r-%R6T-x%1lQ3$AuDInxGj5;e<$P?WC(eZ;33tO`R*=fpl(j zH$$-F^9QILJlRya^z)%qZgDp=T_j$`+^pid6@-W4VYz-(vz;Z*UGouen)6Dm1?Qre z7y7*ixhNxVzAvV4pY3jMDd9Cjs(aY=y8QdHHe0D9*rII|N9M(3{c^IH+!Z&pO~T}N zGj0e@-Lb>pA~1#cvY5QZOShP@1)zR0{XIa|c;ii#f*C}F$kUdq$LEvn1TPkD^rv6k zzGXE)g)FR*uQBUpt=|EVk5rOZ?CLn$Zr7s;{xLR(F1MOww0DIr+R7Z6iS;RYHbPu- z`?~b~itsWlBsluI$9vNHmK>tBbnd1Qy6&0DW$F&{&)cXQO+Jd!-%1VN_X>|<UmU@YTjvBx~*or zWApV+cWg9ROL!rsVsP1qD`NaTRn1(4v^G)^u8YE`Rk|CojAY{!kfNJ(mCugH=%7|z z$t?ljO*gyMYKh}a?cuHj7E0+X_;QBYX<1&w1s8gG%`KiJsUrdrK{`wj;R;6`>1ruM z0CxiE2vETby@W*2hp!g3n`kAe1GLaef&tn$izKldB$C7xxKPWa<+EZ@U`G-j1r6iA zIpn)jMWgdJ@kIiu={A31M6BHOQa%y-km6zm6W5#RS>EA75JlPsWuC2uv)uGiuPdG4 z^U3Dk%<ggv zuqLz&i&9F|g!QSwp6fMI5y)%YgFQKD55>s`O^oTNi2GtcVNpfk?~ zhiDy#{19?0A#~l{q$A;Ts2{Yay)t2dbX7&G_&_;oq3-~4ha97-Qo|dHSKPPriLoS~ zkyuK!wN#^bv*Nwl!7}njIjwU*<^T_;xvki^(WU5{F<7r%JZgF^gy(r*2I_fTa3#b`j#tr76N1 z4@AxN)IGZtv;|mgk-fsYdq3NL?b430rkik>H`-_*ab$-^%WErf674mRM2+$9>Ty+s zh%ue(JF^am8H_DGrxC39vk@V)5=)AO`CXW14U=M3=%TTV2TZJo=Dty~LntX$^=YrZ z*f+~*aER98VvQddEuEPhm)loSsX_kbYdfT-R}*oG`+YP9`>?LziW+)PHFh zXDD&-u0vCteeKhCowL%qrV-0XPTc;DVUzqKNOc<`p#Gzd;%;@@_6!_R<0S)`a1+(5 z<@W4hg_ZOIB{x)iRbuyg+XQiwK*W&1bapxZ?AR=MxpQv2=o)~9Q8pf*(YpsmVcX@a zrsvJm&Sl3UT;Yo}BtG*nZ$3sTWRN6ZOpp@m%Lne*<|qkh(Nk8-nbq73GBB@c;;g(f zn>^c`E$~XoVp@!>^u^t5Yjhof7DLOZCSON0NT7DwoXoMxxY}kqpKP$Z*T~rV6En1^ zETQ>q!(XujWIcOV=ofe7B&U-gRma}YEiguO?7PBw7C=Q;p?gs*?r;Z$9*q0am7qc= ziCX#PbDRK%X>TW(zS*_czV;Okkw5~6d^MELNh@}K8N%GC=N&~xp|u1REoCnNhC)NV zzIy?HC`3|iI;Ydzi5oro9wiF6LMVo;2=&1x6Ppa*C7a$mGLgyHeNm*G#GN)7PEw(Y zExUxeF|!d$#(7b!tlC-MjFTWmHyJ%HX4CuQ<-=;S?*CeeFx%mp=34M#_k;wx?XycDvz(TYb{k}uLB_YsVt!k$ zD;mW=cMf3q9s`T%Wo41pvp>elVuweBk+K*4Xt+JC6}k{hIAvmexNyU%Y4@N`itwEp zWU>)T`c`Q;Xq~OWAzI6fr11kI%jsKZYhe52y5TdEOR@#&!aAF^ul0ZyCtT6D;nRUK zyH9(Bx@og%C^^X`&K4V9)Hf#~NHL~l<>)sCQ{Su{h(aVf(Rzcy)K@2h6e{sa`t#JA ze(oB#5%y|aA(iB={%DuFGV)63`2wd}mg{h85=Ra7RU~(O4S&78aZZp$Us-&Wujzx% z`M4#min!mtr~RTst1TmWM7TzWKBYB-hYez8W4mtwIgQ=i9VP>g?kSvghoWc zMxcf$viGnCR2#+Jc2oa#I*wfDEIOBngAUvH$py|&)0+S_nkvk{c-KwWf87?QViHlX zZ|i(r94{BQv%4`Z8lK@5_6gRX%Rd^?{mbE_D$-9qk!C=|Ez*P@nI}OglKn+nvh&C7 z{c^FFT(2|871N1Sm_uAl7Iy{rCeV{w zn!r9|keR;i;$;gM{VFpzY6Fq#6>}r8N>OG0rNl=ckZ?Y+ehNTuIdY<8whVx-9Hl}rKVLc zAV%FYGjTP|nexs|gi#lVatX)G#20lw@Y&9pi4J=dr0vR>oyy7FbT{Rrt?{B7s7pt! zhKrQ9=H#wM=?1qsROKXY_;01O-eGdGDy^LAIytGUtRS{@q7&t0R@&I^PC1DqmG^M# zp2U6bn=io*JawTIpV92t;BF zlx=Nk%sxJdDAoMF)hx-L|B>Xtt*dDd?K#tI5DYAP4Ie_ z$6|a@xT;6SAJfLp%3h^TO?G{*m6f*&h%s*&g;I8RcO-ajR@M5&_*K{Mijj;$`Q@nk zy&{J>I^-8Z=?2M>VPFZWecIFI!^33J^E61xAxeDlg@#L(A1jwkNN|u1A`%g!;R?|& z5<^jbA*u>YNk2->9ebA8N@UTR!+v?eb)xu@iLaWGR|?wm#Y}WnExo40zGtPDo{6kV zx=XUE2b*D}XH6#pmqz5QAv9u1oN}F<)YVKl5-U}D$jPi&+jgg%#5{CI*4`Me{^g`a z&$%pqg#!?4-esew3vQ*QyUnJ7D{h5FFaGkXct6?{zfyaTyZ^!_1gy}N3hoNrR=^sn zd~N~?K?92H>46#%u23S}%BST5*IQaA5Z#tckp|>6tA6S*Co9}G)^$6<#SA0;fR4K_ zI<0Jg7IhJwy2SPY{=DQ3r&{iC>Rea(Ag3Z+(HFJYNME9~mCZ;S`!YY;pg+p)PAC%1 zTOo_K8m(^PthBL_A=Bl2hC5DX-&X_1As)rpqOi`a_ustCaSvv>40p~;Tn+?f1U;Q> zwj=#nBX{IU_!Ys5jXQ+8N97~L6s+#EB+B@+ldJLB)yd0|-i6$a;f|^`zUXX=pez5e zM7TWr#fjl%SwtXwu>!KXWtz0I@I z#(@kn4HiNfTNKur^M}wba~wkXtKnRSgiwYSmE(w(h%1LgG=fbK>K>Jk5F4%Po_n@1 zjOxx65guxcnh0e!vy2(Ym4+V{~5Iuxc%0-oM^8;e6#06ND`U(0q+ zX8@WgQngTs;0c@k=O_C@Gk8;)IlIH_spHFH`{m?qv0I(qjBfRP7VeFY#fNDT9{Smg z>O=Egcu^AD5JMJ%NdC*+W{XJ#>gJmf&T`{EXSLn@gea8Wg`NIq6JF?P2HX9fI7pP0 zohFScd!dg8ABVi}4fvZU*d5y-O3kY~*RIv3c8?UQl&ukvR{MgHQ3Kn8}hVI+v% z7lxuUnl29=OReaTFlz|w@2IW)hG%D+1>FBRzm z@9AveY3tTtLJ&A5E%u2`?f4;%d&MmM0Vx44md3@^Mij8z|a!bX!G{8Du>cV9!2 zni+&XQu_n0IxFyx>GDROr@M}p=BDeic#)Pe)KcrSO=<6h&TdUM#arPEwP=h_q;rDV z^>Bw7@Io9se7&1)>s8WvCy_qMbf@^+P~nZ7TSXTMaE<}Hv2_WSy1!+YffDAH4AmNw zZUooi9V3+BVgo9382p9_a!Ww#-x(` zx9HP5LX9X~RC|L#zg%PUfFESsgW8*R-;01vQYXapCv8L+SoP``XN%h=ji_S=J;;%R)S8R(>f_krNS7hl(trA?g@$^p2eM0xs(enVa#a&7QH@CNyk10eB z%r9a&F!-FV@%~myhP^6ax)m5+_*<=yADlf;ksr|d0b7`HyH!i`aNQOj>p)YaL~u_B z*lj=}P)nC2B1_8~UKEpe#jxHGQ-~ahudz+2*f0z7stLH8P1%NMlp2u4HCaDwQ}%ab zUW)cZl*P4tpVE-c<6?U9VTz)+o?*EYJDWR#7lUJJ8LJ-sW@J3AoLhpH@h{&`Rs$KI zphfe#Ynq$EFx=jnOqjNh8LdgHrT$91d=od2VO)F&2QI**DrfT<8civtP&9J zaCQL3cC_x5hKw878u_|>M{JO26k}`Ln*kMXU<-LY0F4_zNL)hF&+ZL$p|4Z$K#!z< z`gTKaCDT9DFx;QL1{ZeeYxua{ju*xI@irvwREbde`}MUpyoew}QTsQe+ub5#5;AV% ziwx4=x0}s)in$o3LDoTvevwXqE!r{`4nSK13oVMVRa_^bC=i*Xy%O9p!wMxTG7%+0 zkjdy)57gnE7=bE;(yi#zj2qQHv*J$aO9j3P!Yl*HLsMDEGd|i}mTBYjurY=ITkG!$ep1rFK;>g4eW*A4Y% zD9eGuMO}@Akpq8t7*_OXJA?yHey(KNO#jL* z0p*064HDk=(PT(CL3SA^G1csl^2F>ya6fptTr9WC#cVoS7n|K&kKt}a-9n#M46lL3 z1!*2iir1emCht?UZiGwG0$Z4=6i3YG#rpP`?#DqLI-##S^Hzu>XyL6=nV8qn*&R#L z)D5k%xE-{nf27p?XYVMj!bzB-CuRO*U;2lmpu1XWkTo=;QIeipeuh~sFXQPumfZAP zJGtA!7Cp(LHSg!e8qY$g(c4XW(yW9mq&R6Jq~~i?F%8xObq&x$+puv-yVdibyu1`8 z$i^=xbJR%3^xtnsH_Hdyd7#?b?J*BHUa@|R!c!Yvbf&1-{yJLqy;S-M#FSHah|N+> zPL(M{Ma*wdBXMa5_gH++xgDV`NZ8NB(4Pq|L?H&@kMxq1&`SU-MQ}+B;HOwA!Yt z)A{+5YS0o>>`8&Y$!6?J&csKfIP-Z;6U^xA=^&<(e;%w<*)z zT#Vu}%&50vF1|X%(2_q+imS@G=WW#<*jVcS7B}8Gg>Rk4-C3y85TLYJZNGZAyuMYv zpZyp##h0_ax_q@q@~6x}jA2E?I;dP$K}9!czfN9ZCfIayW@4*D80%*3>(9hj_X4`? z$GG#WUoRj)u_7g@IJrgV2ELqZr}vmo()roz&{cXxFFKJ{A1-WR3oq$Myj20TXE5n< z1w5glW~*t+WJPyMzn2?atyG0-B7uy?;jCe1L{;;EM>c(HlP*Z7k34YxD-ZNWjtVvtm)KXVW7pVU2J! zsCdw$U7xWe#ujEC!{V=YWY5P-i-+W96)(+lu){~!wokSoxT34V`S!iBeQ`ie>K5uC zl8cjSbER#!)RUe)UM=4ii&QD!tqdw%8B^~FU98OGSM&R5OERcx=OmYo6bolNbWU#0 zexdmD8LkdC+u5%SqV-z2N(Cxr<~WTH<&%*nU7tA3sKQ5^TPmkI-OcBZKiy5{v)frw zZf-Hj-Lo0=H@muaDMS*gH&v2Ummitz{`62~FJXm|(;`@<{PgVcd2wrAZPnAMB50wG z96I`L`&Lfwj@n@#lWFWe*S(mG%Zchrs3`u6O`O-*U(sB&iNQE5hh zfmwBD23B>voG)>`68@pa=AJqdsLf`2P!_hR$B<>8<8p*h)tS!q?7~gume;>55YC%b z7C3Hfva!&quZxITk8ql$V|GlmVv7dYMf zXp{A6w*V2D_ZC1A6=k`oZyW zc@P3GOryIj^y45ey-i8l78;XFEP&#W`KwW3Yy=%jnE#j(CULFwZ$zGQ_*4hK--tYL zqRmpDi4G+X=1#WrgkwM-)jWFdLPm2^^(^zW^+l%M6>)i8Ed2Cl@Ge%;>?@3M7(JK& zw1v_8JAPH&Cu1FsKhM`(?Mr4%k&p+Vdzl`TQKXVdnoRFyuo5PCYq~a9U&MHw&q#qt z1i}d%rQ6p6*&Tm4k@R5;rm!gBlbxPV>DN;KGqgScWC_TBRO=Nr&tFbeP`XrP)`Q0eXK*80r13Uky0Is!U=ZQ=|a{QcEOzgl+wBxUR1e ziH)S|Yrh+)>uXdZlHSJ=cMZAibOM?><5|V=56zoC(K37MnSihsq*R7-a3y?2yDrWqN{0 zMt>VnB=PUA?9Rw`dBC*DA`@Gs1arbcUcpK-5lk|-t`h0)cSz=DaEVxdQBMVopC&rt zpn{qG5M4Gk;$?LDl1XgkiZpybY>Q;NJAU}_+`T3fTj7qkYKqzNtNOR8S!TwrSo4W& zW>>^-KU!C0E)mP@iu}`$(-oOb1jCYB)t2GbXnDvT_CYYZa7-?T+2 zmv7!&o&E?dwk>XV^AWDi*z9nxqFVC)sW<940(JRBxWC#%INXxITZKjho`W3&K)CmZ9PH?ul zA0=csG$51=DG|b35UD324i=$$ZNj!fDZ-FeXo(;-fiHtQmiOf!T^^sE*%vFG9T*A& zRp5~3=(wf)2&0zXO@@#|X1HC0ytjMo5TanSbhD=hiH`3lIGU#)Vs^K*I{maJkaoe9 zzm^aQa||FzCu9U+FN)O~x0wA>9kR1XK@6Tbf)qoWqbZ2)9C#1Uw1#`_@jlK00x^aj zJV=IwE%J*Yv#Q_{>*~#q-8JF{y^+v+56oT$VHz=u%no#UHs-RAyMowLBF{oFl-hxY zl1C<;x`h(%Gn7dB`19uY@`v^~m?gdth4_vhs$8;Z%iYtqo-{AJ2QJ6NE$u* z*U}_fY9N6mQy72$+0U;|#?Ozgjz*QK)v)hgNoBQDL?F!*@&90Gej!l#e>gP15C}hZ zD8DIdRpX=83dzW5HJ%r@`o<6U7^`Xe5?g3-q_jo5#@$ClvYDT}l6&x?6V<=(UE z27@Rb`CDm|N(5W|+!9D$j4P$XJQq1JWujH%shzHOjit#Uc95`$Ur=Cvn5-%}@Lwyd zEY^DzZ?o(rNy;JvNFpN_q%D`Q@s?aQOGxb9KSY!UjTl8n^R6g%sdoTD8h+9cHtDYe zNYXILi^+Dj`2HRpr}u;sc8^J-1cel4jE&G5GEnqve)&+F=XmM(@9!N`Vr_0sjc!8tl zY9PMbigpt~ZzuH0F3sAHXNN^eFk<(t!=Y1fqJ|4fq#H3uKp~F&LD~#cuFDWH1m4 zvBY0C0zo;M*n1>+)pxZ9BS95@VlI&i2TLV9)e~HE_J2r>V00mG_$Pl(dPZJ;UHSJL zqa2i%ywNjQ`6@b@_V2w!1wUwVNGmk*>E@4;Z83x_Q6BqjH=EytR2H+Gmw2TV&0@`W z`is(L5wk?jdHngw@lVEQudYrmUY$HQi&6cP*d~FW*r_>Fl&A z@9Y%DXs8N|)is+2ZT}u2;KChMJC2tRs|oJ5Fl#LCZ7{aNCA82+nK0AZWrmEr(ST6# z(&cnA4Y4X{HE|wJF5JuXrYgZ5FBj9v)^?8mS#*gk#%Q=? zAhlg1A8Rx&L7*+(nAnUqVU1F?xqB&7!WT+(Q8=0?)zqo>&dD9s9ci*c<*vyT+pBQv zEv{)*RX-r)HW5)FneQSO)T#}AXm<3|z%ckW5oYuIF~-vX4s zS!`QummjrJ;vt#dY%+Hy955sku6Sf4@DZcE_aGZ*Bkl!GJN#rLZ4AUjnhHGGSR+;4 zMK$+2Ei=**v@~fH;L9z=@S;TJy8p;hq6=|kVkWlh)cI&57p`c{8BRV@+9T9V2R!|oLI8m(6W~qeOYN&yv>GWCJ;*xUM{-yd- zTf&#t>E!u=-V7Ld$)hz2kl=YX8mm)XDrHCv&Y1=1WGSTpX1C5v-x+l(dczqq zvv+!MVCRVJc*3D+K!Zy>LT(GGvZ==J(j|m}MCx?jrbr2A9Y~;Pe@i(EGzBu9cOY>( zBVAaS&?7K>vz^FY#c zrpE}f|D0;1LuZMEFV3R%=zq53NnY~K^f>5lMU%YTo#_N|*Rf=px|{3JX;;i7Ezy}C z$3IIs#4zG$y+rI|_Ss>C=}eCswy_*$7+JIq`=eC*WboVQasaKvCax#QORjZTkQ)&* zFSpiV_qT=?+`}Eaecxh@*8_5hrxmfBz3(`K_4XJp_?fK<23EJ57oL;_y(9v~Z! z>`<|YIii_L_h*z1TFugbSnu+PIMJ}){aLaj4kJ&Lp`TvjXv(`{jiVvvMTz}AB|;Z# zM4cu2j?2q8*jJ_Q9Ly|0v~imT1{$nw<)8IlX|AzF^{6;ne@!W#l{}gnozCX-(JlTl zp5kDTYV-cv^9fv3j<%}@*2HF$T$Isf^+35X@0ZNQ7@d0vjH$Sri?h+3xJ2t_w#M7% zGvmF~Ls;p_T)v_ik9_k;jtivi$6IpoHQEwk7)`=3iB7a?TvpE&qeA05xl$=)(_P};f;Hz#kauLfS*lXEi1BM#d;K95yDIaZ=;+^7vZ8_7r;fI?Ri34f>(m%my6G=CV zN)w7W_A#|Vgo&yXU16-d$_J4os*IB)rSGI(IOty>7JO-yIQZ4{U!?dC$b5xB1W@(= zV)V}Jmznva0ukBgCx}RxyFH(5C!@rTY5nUmEfO(AR1|6bX7m<9sTuLd6~mk{4%CE-evNE~q75uWx1x6o{}7kp8VU#9>ZZF^B{$?Jvu_1oJN$k$NS# zaJM={`PnU+92OfJBqB;HN;iIGE}#t}Nh?b6HA?nsL;rFmwF%>kDJ%iZ+pKa65DgTc zom`DyoV@z%>ht8ZpnsH8NdYJ6dja@MoUae3-_n4Fd2E$)kx zqvt z^d-cKk!{`nUR0wCcjUwM*QC~2*`wj-Lb{OEdHW}U0xp_INvM2Is-BlWZuQI6e72?7 zyrKV4`&9p0-bFwc#p8Zl5?cn(#~C+t$(hP>hT$zHp;({jS^cwJJe}QI35c?M{+M*G z!MIl;x218vyem$r6ZgNV6ps`Vyf|0v)#W!V0I%j7W9wQ*=Get5=ET}oMq)+flyhff zj)$v)@+{nQN^{xV0VH5c8#gQ+XjA$g(3xAjahIA+@A(E^^WxwBg|rKS*VUHqqotl{ zW+sov>4@CEVm32>)aGUUP7YT6Q=`^c6=i_wp(-0=)TjJ`DjRE5CJwCg*`nBt-WCNt zAf~S=_RmIyL7Y3vhU9Z{z{<-Xo1LFnHSbI9pMzd9wrC!O@A_+EA4XR0s8X+=ulNC~GrW+;ZO&gu+sXA@zs@l$cWm~WdmytjzGxmz_`bY2 zyE?H;Mg7OK04$VI)v=_s%Nf}?J8GKcqHL5MHQ!C(m<(fg7HtI+9*TkGUD|gh7gnO8NRO5^0VHpAY+7L3vN86JRDB1Kcy3Q8(>-XD- z`G1;@Xwzu}H_3UsTTInvcB`O!a)w;LArIOY3wHWMCl_n*>xz|5nvJn^dh%hro`mCO zs>1FZhxWcJMsC21t;2$xDnUVV{ANY4188O|gpCp{E1b^Oo9*ekD9{$F8QfhvPD|7T z(i&k#63ao0N!ZC{m$BSRLrRFo5|+w6E#`A8`f-?F`kl$-~fg@ANln?_26{R0LS){VkvBVK{Fa z|8_pTz%1FBkL2j}&1#qaC$6HTcJHcQwR(1Xovmjd+KSFd=Vj zJNaTxxAG26t%eplLHZHwtvVUZFnw!o%E%X3RK?M^KSq21O_Wjd7)r0$oi8`9(Z`Q) zP9vR4yz;ifIAN|uCRxosk|h(3!6XZpyS4gAOAR{>8BD71_Ju2znWPLR*Z24Eusu?k z!Q|V=&yoqwV3NhNU8`?;>Ca%og%>Ryce9hD!Nl6DHB+h6V3O_A5B5l`29xh^_vokT zv}-8QcHjH;J|Wjk6NZxO*ZcGVdk`N?tnfaQ(=}5m-C%78iuM7}zhX!{r~navI+StqN%9JWx(@RG!K3Z?v$(LjY##@|PTfeNK*5l$Ag zDsZ)aJX=gJid*xp8MjV~Q;E3dV$@w2XfcQ-;<$K%^{4Sg@vB|2*-~y5>gQ*)PaE$d z7kVY@r#+`SHkZg2E-I>G_Q{9o_#AryFN*bKwxL(`)^L}pKL0-VgsOAvjb^JZ)&4Rq zv8PHcwGJp#+@U@@9)B_0%(mr8(lAd|#c}UWx|?oxtJQL?c~gr-w@&LvBUDS~*9gWR zQJi@C7miV_)&*9gPS+?J(E<@UIb7SS(z;C+{;J|Z7MB<*?snR*UraXJSwb|o+dW0J zKqj(zR(pXuV?wm7RwFKvEUp0JMB2jx+>?$&U;k2dDtC{W87>7}$m2@;i{;`DueLv| zuxkDVE!tcAINgXn2a@7J9RiUfu8f7Booy;fEFs)ue<>kqbX|g%%bOh*v@yPYcJ^X) zH`5QLyQd!?0*qpa2EK?8H%8+pqY_E=hwM_s)7LWKj*sWXWc_6^d5dv;^J;lq1-%V9 zDTZcMuAh6u)qCKrkr#Bwb%#|97U#;hhWvQVpq|PTI z{zEhqszk&Xf|U)bBZgcg+=UU6#Iad|cEwB$Y&NZk8HaBB_oMCOO3#=E7f|uav(1~u z40#oH^JYaC2tRKzx{;!9&cY;)`84osr2d z{Tjz~ka%tjB*~j%i~pRyJzp=k<;`-VEmGC3-sWF=Vj6pEJWi4Hhf(K={}uvsTTX~M zeQS51HyLE@vWlcXezK%=L*aOGbE6+CA6nixEIF1x3ngbHMTTp zxY-|0MH}0$5cS4Ko6YQQ@kO!TU<1b0I?nsWE^sv>~tRD{~6Sfh3fpEH9 z(`<1}*;AM|n)|HX?Sq6P4%EVy=E3I7);AnwFw(VLoH)SH=G^X9#)k4-q=*v{=_xjY zh8quzV`%QNQq#PQEGEX}En}25$SRq8aHohQ5_&{lv%IeNh)2snosIjBGL5&2;B6gcLO$=nAMXznso_xU6 z*y464VlH=p7XjeaECAiu^!nMqoE%@_=&*BEzD7C z<14lG3gfowX70wE6mO%gaZaK(bxCTOc@WOC&2wborhWT!mcU|MZ2Dq7F$FFAFohhm zgxSACF}{#TEz2LRzLb*|Av)5T94e`Ce`7Ns$fgdv&9AvA0&?EWHCp{ zk}?O&F=(soEyl2|(iQ_@V0?6Qa}Kw}n;gfK$|7M>y~528n-zu@tTX@;;nufNt`kEo zT;co{ah4~dOs*e#Rf)}GG$X6vgaV`1_}OkYzbUKriCeFKv3fXsv49~T1 zUQTc+9)7PMxN@0VO;$rDnBJ+*k%8$O(CPTa$e%Yqg%Ul^r zak*fV^yI@S9oa}5+r3=SGj_!yHpif2$YCBJ$uERyj3v$wJ>XUxwMXTb!!!o!SZh5K z$S(wvUcE)E8<_HofXxg|5%zFRcY)J$&A=g!*)c;UgXxwZNdVgwatqK2#H9r+H^@zo z<=v(eRMYC@Xy8^AJTE9o#0`*}>r$A0kX;1J5Xs<_T?)$(wm)VU0VO82Ei8}BF2FY- z!1I&ii<46$19C5<)iaJS|U>(}cj{b1#}#OG6rqh(VM8Q{2itKOx^8;h5`Ya;F>Fo!>RP zsGtfPHSFmP_PtT#qI8dzO-~10k7{u?v4uFO+59-V?Ri(oo|F`fJ}VZ*dNw_p&n97$ ztnNqdq>I+4?`Ml`TziP2MNgVw#$WJ=%j}M>weNGI>i)D8=CL?%gdzm~|2w-H;ntCL z7mlz+SA|qBOyne`3<1*M#a49G#TLu_<$sK4`in*GIEuBD#%B5$U3A4|0P%-sOZ3+F z#f?kv-n){bXBH8IYEGX|HuukVx7gxEH@T{w^HwP8gZi80m zcmM)%X=HJ^1Gu7Ag(-Sb=5_Wee}-3L3eP9Rb2+~H`T0rTR1#V5Zo1v!Rp6+tDoi2z zc0@!GL-h!^8|=pwj8~mr>Bpm|$K{C_(TUQYGpw`BCUewgPCj6PVz$M0BRzh*RZ05W zu?Zt&;iQs;aMHUo2r{(DQ?B)>>bh&pCbQs+1QcYN643whrFi9acaoyBWMxu`Kwl++ zHY5E3hky21b(caD@1r(XRjzRMUT)cunimsCUjG|4r-W+ zAlo!oYn(&KOGA)CLuN}aY5b$t@-43?G#y{h7Y@UxUWAqBXv!pgE!CIZIZR6{i$gTU zgQ&J75;p=#!va#`O)!D#;0#yycmCRa&dX~`W0TS_@(h& zlsl)ItY(vI%u~WP(KY&}=jq#`jM*flvBpg)gqzWu93ck(oJkigiI5MVVENa7^;h z)TWzM;PkFgh~89fX?&uXjHzmQ#gf|a?%7p}$BqEZvZo;Wa5Rh{p>xK@Vp*Mb`H0el ztqAExa*u)T*+?~&w3KR~`gc^~(3@*Ok+7G(>%}5cxccfC+iAj4J(XP<^f~1vb9{i!1kZ*Xi>Z$&*{HZYIm7g4QCw|5rSGX z;iCOov+16+n*Zk2+41Y=C*#l0KKp!p`R3x{^=C(T+F`0c{^j0cP+g)QHLFe_dQ$W9 zZ_X}{Uc7qq(qeZP32gQX*`_`J{AeIrAPX(dh(y|A$^Y!-(F=>%Egh!xt+0i(&QRlRjV;u1AjIc^#@h!oiAYzk1G3OI4L#g| zclEk6;57|BROr8Yoe2F`uZIf#6|xwbreI%8_B+Dl?uI~xEK1d5SRo|y#$QIbuGCm% z&%#HGi$5zj!y2V3cV?-VRw_`@EHEWEdh}(|c6$6Qxwh7qslB*Hn<8(g^CcFvX^*@b z>z{apu7ne_Q32(4i6gRf#hT9GF3&bM=mj*5U^Ovbp+1a&Mrz1Dp5h`WJRMp7i~a;R z*o|(C%L3dHvike=-E1a>Xi8^}OhGoQLO(A!gd~(RkR-*2Vv74ziz%C<)JpXucj};8 zq|G4K`2F$uVBf}QOL=>(5=5%IWMYrM*JMMHiZ1CD*$Vuxaky7hZJUGTYZHoms_oi8 zAJlejGLh|ngza93^$yww`W%-Aop0B)9-$h^z5k5wJ_AOiPr3pA# zj>n9`ML<;;Yak0Fb=68BFn)nMn9XkEYU+>zJjH94)wA+aptzztnK(2Z6ez;&PEpgw z$fE0a+MN1EAU7=S$M$Woji=+A+3hVh4d3cjZnx?@#mVV8t_c_KsW3&Y--(E@^ZkA} zrcXLKDwfsqJ;qJFiTbesQDw=iOM|6yg4KF?liLXhQ`D)P zAQ0ttf+o}NmQL`i-4f62&fejsmxX=|pr3COuBb(U7!F^PZH%p4Ik>)6a&2}Gc2o6p zJV1&{l}iwf-B5?~?0)^*(;tUe{@?!Xd%wmM zd0b3i7Fb@q(UVPgZbouryymFahGZ^iRi4T?UoVXZ3tX)_R1HLC!XXe!q>t9?Ni|HX zHgtzb%AzL(BC2(8nUl1md_B=-Zhe6GqLT~_Jm$epmSee8P$^})&801LN03Z}Z65WX zp5hvQ)r9V1LXxb6WkS?T8-#S-^-qe&_sg~6m@mCu)-HLIf(1b_uNI{F3&q^-Y&0oE z6P^XY;`edcBUPjK+ALoK#w57D6?1--#E)s^UzVf%1Alsu9vu!w zV-jj4{Am2;WIMg5L(JyIe(vt7u0m~8CPfvOZu`Oc+Bb_C{WX?K>0oY|r8Cm$(9BJ7 ztxVGsr0({-R$|=2WVWx-7dj-R`iR?;)y<&{$Q%?d@WQus%-$VTvB#PIG78(#;8P5DjTD~=oaUR51!7^XyZNU&>%B^^!TR%u?*Ow zceyx4+s1EbyIv-`fFC25>t!6j1dU11)$mkBaW%s;L&rzwXKEjCt$G6pTtOAZ$`+_b zM?c9@PDY3?&x-7Ybd}>i|wNPhZz0l+lk8Q2I~}OiOPg=D^gRce227R z3CeWnhg3a0#53v2a`DUK>XnSG0E!vO z>3lg!S<;=6+!BD8vVq5H5f8l`mS{1bhX5j;7>{}2_&o7RP`T|zS8K*4-YzN=;*2#D zwwqLO6nAr|P25Ij0kHPm6u@>GH%s!^Th0Sx;~}eZb>{L4dt%jI@1_>b9mj1%))Toj zt^`Rm>OXliy*n(&)+>(@R)b-S)eAiHq-x@JI&B(06>UZc%bcn)=`#u^O#GvbZ})lg0~q^x_?(F$wxC9(P&cX4zCZ&-I5+jjavJ zd>BMu77s_|qSe1!6*?lw1`(BEGZWR2F;Up;VG+6Y`S#9+mjcHm)JpuPT?5HMmV`ac74nHx+-VK_qH)fSDB6bG+PP>a42f?$K#RjS7gNk#xV>k=LcV zvTMCgS8ic48?5*G5>KJs-A@)b^I|>LTgx5p8~d6%h|GqX2!}4kCEU?b8;Kc@DNtZ4 z|L6$M{7vc*r8bm%jJzEwbY!MRyudl`#DMI!8aYPi*mi^&F8j_ehoF$sDuk=Pl98}qsx z6h!2lJp3YiICPd9|%%|kQ?>XA-)aFobZ+mv2?tp#GcBws+ruew3+9`XiS2v zW4zsL3?;jn+%qDi@(K!#A#H3p__}Qn=ltMG?a>$0s+KC#>&^t;ym}P+BZaz$Oo-N_lx| zK<4=d=)*+F*k1Hho5gU<@wMA^VfRM2$G7YyV2uAechh&X4GLJ{429Jx-3s6`go6=mA!sczc@WS+0$hI*62O?F!jTVvJeIH!{h zy~bknPZ6u||8O4KZ0M(UxfUWbeWUzyljf-bK89nC?^M^mIzhxuCR%Nxpfcmv*0?Fq zY@Vm~5dmZTZ{lH(`{~2Vqc|Z| zX88mYF1ke5s7nhsDr;qtj8SV}>(J*yc07LI$d)NIr4AW2lA4 z%Ap7rpN<+$9>x?Jm{V~MG4c^Vm1a(C;S zYxokHxv?Di4A;NEE)TPt9_AK3yGghL%%mt_KU*&6wnMuE={5d3_tpj&Q{aZMXQ8ln zPUr7N*SF((f}`5iJ=xT;s}0XG;GT`vj~e-rDu;W_%afx;!Lp#NUZ3VWL$9`N@9q$w zpfEwajqK0o41%|8->e)>0+PBtG+qg_gr(nuW3O1o@N0qRF%5)g(=uB3+-P~25Zo9QW znU1t8Pukhqxk-?DR<8`D%!P#fTtv8T7= zTU;lFx7fzjQ#5KYzwnk`x{p))JS-G8?00``K2q&&*xyH#5}gGIXXL_Klx=&z|CFm) zvH4?2=0ciMZZaEi`>rd~C>DzKac=b5l&^2-T1az-!z^s0!v#>NsNH1kRX zzA4_>o^VhE7G!1>ZEtoDt1+UX9{3N^HiBkei30V9xn-b~lf~G~j9tDJ^X&wiu&W*VYUpz_niO{vo!Rk72D2mA!}hUl z@i4|t?d6RXe_tOm2$Mr~NLUt$d-2ccRd~Gz929R93YJ59VA$WXDT7|-nNW3Ov9ymy~8%GrogHfhIb$%P4?+7dJ+YH>f;L@5gjOweE-qjRGnO%Od?$ z`56S;{@cI*%~yWwEA)TbiNk|Bti@RG(3K9mTp?c0{x#etn|Mj~pbo2Xu$g3#!jZ_k zu{m2mC{2u@nO72}748!%Y~q6wr5Kx;rHh2Gh?6uiQe)IXU8IT5?9xT3Q%pnD=6UJ> zT|^~eStM0oVVl|*tFy>vtbFaDRK1PQ5=35rfIXjG-^_Zhnx@9^RfNsVR534yOfF+6 zNxHivkYue2P|O(lUHLHJ*nAZ5Fu!Y{Gket5kJAYX2WW1yKz3MLx9~Ly=#fHlO-vE= z;^2W2H1S!2P<9RFA?yjn0HDQvcR4N9jWWbSb}SyLPQAWv_AGxwj=k$m%Zwi<7iyY;ky$FDbA zyhOUt8{b`DN_BIKhb4;IgX-VuI>=$|(ZXj5r1ysk{J5~I9|w&!O>}0L-jDAX)G-qs zU{sH>nOXcWoQf)EDf#`d0nXgA{IjDqsKvY4dbxP8u6;dd`KLp`GRVAwesa5B{wp@W zmEl)UE)SYlXdEnwEXB~TqAHb=W*xK?(}HJyDFV_Ds#@WEd3R@Q%R8tDs8FyRlJDb3 zYt)Jm9?>1bwoCm~!a-AFm4s!Hav7GaukrYm+A|I+m({?`iJe?ko=uB!m}`alaXKXa z^pNV5LBsM$grFbN%y_xbyT(ByRRf&4Wn6f_CO@F9OSEpLHp4;VLK~kYkP_L4l9637zRm0Eo8lE@W-aF##A;Kz^NbW_ z11547ebt$mB zeS501m3T~p^%A}**Wz(Ez6=Wtx8e9`!{o-tKyEK{IIaz`^hGy#6)O6F1NqmT@1(<1L z2cxgQST2h3o2z4Wh&jZ;n&3>241=yNKEvwo#*Pv0X}|8x#W5n2k%>#PHGQ`EToYq3 zZtcrffSDGveEy1OM{HKVcxbW;E|XFhs&xHgGT$ZkY`R^@RyIavV$?~A7!oBK)IBVA z0|*KEEkLHKoCn7aJ|xWA!+ByvCd2%M#JDKl!FL@0anlmrq+M(#r?@2K(%Q=0$c;-$ zZh>ZM3J^jax41&?28bki49@gO$cR3CN;s51-U6iQPz^|?LuN#Db|-Z+qni#<1;!NU zASd(rY_*vs^l_bbGoMYPozyKv=7KsWc-PKW$L)yS28#fh2JU(CVLCp-B<21Aml#Y> zsC?9K2q`{Hi*k}B&831fIU-&7zQJ^vCTBLc+bvD*7IvE&mtD-RabfEa)GchL##lyL z(}6PlyR?{Ua5o-UO1Gey7*(qd@n`GhPJg1&os{myUg5I{mAgHo`xCMHc=p=1yBm;9 z{x*1N(H`H=<~MY*u-I&Djopf%#jU`z0I0+T0hWses&9xaN7vY{R@~T9yz=T$rW6JT zi&A+!3S*ThwhX~G9Xnj$zM{>*c4%_2C@9i4n*uozVg ze2x?SMft9Cs$cYuff_!GfRYhe;^g(It-ZTx)6!m0nXYoclWK!*O5NTL*a2s9q~1YS zSs}4?c2}oNojd4EPYD~DIyua`Wh|3dV41Ko_9@ojPd?zCiA3D%ZR`#>lUHGvzQ0;- zPjToW5%7A4T?L*6s5)185(uOF`4X2J+U?!Db7}Z2LX}*d?&#QI%GY}*S1srkF>atJ z>kDXpeb-5E;ubU$qohebo=TFa@3ksK#d0Qf%JdW3!+#U8OHRTrVfP#=gW_5pfboXpny-FouA*y`j6<)Tp z_3oXIM6gU)jmXelw!q^{(?sw)fVzpz)RhaO77#XzrqajWF4zHQ@~ZxJf#c^` zptT#lcm1u2%(UFnC2dOO{^o9BGj-MJF1O27xUKChEPSHpt0_(IPN(6s2vzu{pQPD) zhu;=76IaR9f=-a};@o2jb+`UZ>N zDc;@zv;oYdRR9e;C~Rx@4xlkEQ&w}Yl#adUUNtC_RsLLVT}@Qqd;4<}nQ5zN_KRY@ zd_JT5ic?da-qB2fX8~Yj6y}j^*&9aOjW*p4BMnHV!dBf-fw!65i##zcog+nw{2rD>dL03Etr*DBICRiK#|c9gF-#+~qPnv^CDuqq)gXI8a5kTAe9A-qyFG|v&c z14LTI5|=3(Muj^Mp<{q$LJShDWAgr2H>_xPuy&D|7GC=~y+B7jksOy!%Bi}#9g+T~ zbV3D`DUsxMzK*Z0tAbp89o`C=$=mvx-gJn*O;>8`OBZnsqi=-F`eN~{Tu2<3alKp$ z&`+GXrk;f*R%v7%nW@ohs~?=7O+g7u`uczeGtCO5j#ue?oObP_z4WIrYr z4(A^&;pi4WwMpDb-F_mK_kh{zXNAdxsHPF&i^(HO#v@Aa z#<+#6ycAMpc2~N(%mz4%fR)ZjgwVV=_@4MaS4SxGfk7%&`e)-unW5LI~^bW)Dz*g`E(5_)<$MxidXo2 zNW8*dZw8SHj44n~csW_w4DQkJZu}KICPA)(KU`tsMEN$zW`wJ>@lwcmv%AJD5wCox zPUK$jxy6zSUd0myT^5!ITjsmJ#pPaiTYcK-cBnl>VR)7S{kkhd+9K}G{XN8p7+4aF z{n*%r7vE^=oVE1Qf@MO~=jF?-`DTb4MYK{#2bf7Qk&|!cgxO6v(wxmXGlnanT;ASV z6&N>eq)8cB)s$R9?Oq3JTH-Qgq-p-T58F_XnYMH!>~;KNR=l^PnCnOnVZ-D*fJDJ0 z{8QnB} z>oS+n7O~lF4<}Z7ZfOwlx<1PzS{;*ZDafoZ)|$$XwlBM@7G%M=>eB#ZBJ$y|UpM&h zn4a2E8`PaLJOq@e*K|;slAI{|IGy8GYn9WTFr+vuSSFyH^EyLcf zivbKk%WpUHrSTlV zL4I4ovT1R=G;Y)Ib@YHsNwK`EUw-RW8B;FY#%D25caO#32bR@t>kfA*0R)+;W3L`x z!ssIsQf2P%)iE#=$2yna?K(q$og2tZP2oRy_aWh5?ZFiw6QQi}YDXD=IXG-ai|g^^ z8t*;ez6RCAu6K229tnJw0+#On>PB~OcYxnR0D?|(8}~}*;3jD1Mk%GEH$5n2z7mn=r_ z%qdIUOaC%q7dTYZlFGc`i^IKz4b{ zhjCa6T+Q_xdw-tKWF0z|@jssJKje@&-uxfwfR3t3VpC#m37qnt(EdsbN5A82gM8tBXdf)n^^gd=`iBg`8k}uu0 zu1AE7o-I5q)n6pqZ@b0?jEMpFO}=>0pkmol^&(@2RuFuaLYpJl<8g*L zLTemGIjUp-XjoL-z`bn1Z-$6~?Vz>B8n>OT-x<$TW@rt;XDPIZ$>XtNiVX3J(OCk` z4l?>GGGwrW;IkCk2-+BG6+tqLpbZL^MH@k_Q9Q#4+8DjD$ncsj$i?Q6)P>#dDWT>q zxgAJW6${z?EwNY6t$=rTZnRO`gt+bIklT3`^&&(j!=gfvBb;|j(79W@6uJf`6XHlx zAhc_)Kk_nBg{oC>#Zl+im*ca=YPbCyHv*}NovRUYvd8<`U35O7iOCuvTI0h7Hfz(% zU3@wz+!<%g;N0n?N^LT*Ak>!Ezr;PEqvbU{s5UiHT6fIWmW{i}OiLZ4rloO4HFvN5 z4{cng#3Ir8Z2ERyJPVh_+P>tD&8q-&9bjZxRRL#e>m+XZi;vGqM6=Au8%r02)N2EuYW7~!J*s& z&fKU$h~BMtzi&6`H?-WEq+^K`9m|KzMdXX0T2`#%?n89siQ$>Q(SzxPfcNO$p*^_6 z!ICs0*=~FLBils}jbsrzvtt(|&O&2%_crlvhP%eE?e}THG9iYk_Re3W$$R8+ZB!;i zrV~Edqm%o>LN{rQ5t#_%KCY_9-4j#nl|Q~XIl4MggRh(MkUPsD*u`W*48QX6`N`$g z#p|D|jP6Dsi?Ie}O1KM7nG|@<>&CXHPuJNH-U4MhB#@WIuQ0<%r2M`)J8Vr%Cc}aR zKJ4f|G2S4s`Bm7ljrM;~4eMr*o%w!}fh9q3QhtXF1xb!7$I~ae34E49w+E!yVg*9q zX_dtu!oZTC%&*AHON9x$JiW}n2hV;|t&3G*v{qKBn1`i8nMTvW@?dvJ*~f#+{=pLH z-pdC8lwhC5dl^411zT$v#h6TnV=cJC!j8-CEg9IUFXN6tF+N7p zOL}X_W^gZRX}whx!!Zj+wM)7jds+rzo6Id}X<3N^&BVw|=<9AXD%R`q!{$y6weGe% zH5qLKGbf5@{0aBFn-99WrGg}Bjm)graaXa@4J@jfegdXVnj5IhMiB|s%juTm()f9? znVLs#{HBgOsfEq_n2u`vx3gkyoa=Wd99v%mhG!{g3{xas;EecqQ>7hhOZb~t zd|_HFEE5idsWRcJB2^T3n!1Nwnme1j5}Z=An9gya1Q9sffJUokyOcjN_jUUtX0knE zbe4fKt)>ib7Q}xOeylcyKV~MSXyUUR6ySGs()Y?LAG%|e8gnB|rb1ojD%`9=A)^?T z7bU2g?iGn79B8OaiUE>ts~o>P`k6}gPhQEJZrzQjYOD^y*{gg6gvA6HqrwF9*<||G zZY8(Kt6gr`#$`%4Mffy6K6>#&)yiEdXihI+|E+&vlw!&cS#cBDShxxn4w!$3)~36raW~mX=&mmj^7@Z|RCe@MPp}c=U6~WJOT@h+{mO-<^BAmEU zMaWwOFd(9jbeU%*>tE#wxIWs_D?yE`gc1tFd{w_+X7o zWM;-uuBLzA6n3Qd=ksY7ud$h(Qn*I%x+!#XyJ@h~xdJY;c04@HbjIPXQzcC})Waim zM*{15jXV+rbe5pw>9hq%?P7;|dI`+Dow1ER^Zg%+@edu_VtAIJ>vcwEbFkMDF0*#> zn%nZxA3d-gn%4+8^LJv5egDRxF{X9u>y=+e|N$wLo;`$#p!lnRqsPvyaYCRY3@4+Zwbu2 zoxU~OjPHh-Emg?O-0?D6z%!GzL%mGEnZMK0_=(=Z4sGcYn0Yn5*9+XvsIX77xj4{JTB9XfsnTxRWfnpxIA)YF>l8XavH z#e3Ds4%If`n%ZJHdYFDy0yA%C*1euh@2ATLY`oJGl|yIU4SbfO)4MQm4K{Mu*v#IE zE!8h{CqFc{2srb1JZ@v;EQfkrz-87>W{&eR(>ZRrG|CQ#X67+G%h0j>c0CDO)YJ}l zsO1Hm`8zgvhrR#HwOIu?)CMs;%YdWV&Ad&1G)_#E{I%uu++1N{i8?WXngmy%kGB(j zW5uB{p@Gj*bYjB$$rfcH{nD31N8B2l**l*3zL>nF+q4JqOaW(p993(21^*=B5>G#> zmZo4?XkiM@RNer!GWVUh3sYNwL`$%3NT#C|min7{hnBnOX0ersOjc#`&^Ij&6AepYprAjR&saKSA7p^QN1(iwbb|it!QGx28*uBmKofW^x3)@yUEXTWw}~WOWs6?H`WNnB!~U zIGxOmn|*)i?eL;o10#hhBnHRE+3GDW(`4>Gik8XBr@cxzrXlCUBZUQ~xkvNaWMd8x zZu`&xagWV)QBYHmnU|b{o_E9Prkmx%>|e19d$}+*b;(0HjX6xnR zp;&CQksHWNjxh`8)Hg^8Y|1C@{AuDb5e8&@pnW@d`SP9J^W2S=E#r1DnGh$o#%H+W z6uT^MOl!K=Yq!}NfJ}wy#`pzp$(dqkf&;zZoL+`EqA^06%zF(@QHM<8vmjWjZ3=R^ zy_qdd8QcM?rF}z&2%70BO1xTLBEXuIPmK~W9Md2L0nHoS14C5LXX{XQ(61SEi#{zC zRa_?iY9L9jInUK22 z>lOC(;!z*7wVv8Nnt)72+9vlZlb3K=LQ}VA+sbRDpRTUbKP#TnoX_|)&oT3 zeKjaEQHZE+yTHFxGS}&2(Ewy3%%Azs@suL2T~oQ-(Z=FpOs1pZt@>@)(!ZGK zTXWnBfkh~&8f9u3vp;2x%9K&-VOFGCw0G+TKqey3uPm{+ndxVc-P(s`$`X;OBApOC z^Xe1;nJ97*dRcY3FmA@}-ClyqloaGED{Ss3MzO^$NmzEQAeoGYFeXEF0FztQm~JdF z=@^s=QJ1R;ch_ZUSLbx2vdJ0YGA$XE*7)Ydhtcf8m>s);g%Ko*@t>5K8XFo|k17YS zm6*&%ouR-32soUFyQ|dpbKM1_KO!uyzJg$X{_O%&BS zxJ*h}&wcSB@j$1W3sZ?=8jYqA9J7!!ZZOYC+R^QDie61nru)_ye3ZGO{)eie>L70X z3R`Bw6q|KxqcYuh&{*LWZk&^wZOye4SHI?S+zKcYep-JsOYZIfXOK1aN$h_8wds$` z%Im-Vw}1QIuhERh2r1|eYf8rTDCVl!ZN?TTs|nvcgF%nO)n95Ox?I#CoziU#8gbFH zmgO6{Dwmu6cVF;iv=&MEwrVaCMr)CT3ZlNdq=zPq#w5Rsz7T2}tMD@W>DoGz>~^zT z`m0e7>!LE}SI4*O<-ZyUoqKsg%ikG_!N0~`N^KVRn$4e~y%xBl@$@=l{Yt*WU*nwpgzjcItA8V=^+I)%TGWlAl zLWga+vuixwlb5cA%5V- z`|W2qulE+?=-F%ArafGy11p5<<=bL$K3gRku@7MzmI=T4EZi|^YnRCDOpC^lO!P^- zdZe~pB3m_?q7|vS@BjKc$M>`O4enc;;%RJKv&0TZi%$V&{r&)><^nY~^o67Ale5#bh?nnf}{CZ}awWoDM7#M*8B?HQeSml)g=LrvE(=>;hMRZ*8R$yO?}q$Jk8$ z-RIavTHxw2GV1}$g2xo!=H-c$T0NYo1IvWJ6D@7o zx+Ugcrf#xiR^c+`*V98*B8@k>WDI1IZ`CCBP}O7PZ=*8Zw@)!cIQf8G7m0A!qun~N zO!yu8f+d90g-O)CfRF_E1iY%vT zf!1VUnVYU|Msw=(=pJM(P$v6oDyvCUAuOG0I41b!*~1D$q1{wHl8Xi;6Mb6#Y34R+ zfil_eoZ-DGT>6+!?0W>QE-q7kgFbz*?U<-}n~fDAG7U7tO8k1aN@g#;G;8BB<#*0D zNA*&ztzeHxq5w1L*YM(i&DCQl6+EW+4*uwRIa%M-CRKBU9(pOjO#00icvWDxvQ_KR z-x`oL(aYjtxlY)y2T=o(iGH_y3D+NL5_=Y`9-u-q@z-CWN@5$bN16};GRb$L*FN6g zV?@)Cnf7<_5wVST6xdq!Fscg8#9w`VX_NIBaB4Uv`1Cbuop>tqy-m|&_-uhP*&m)4 zSTbDPX-T`X1t9SjlI5WZ0v6)i=f(PAwxK0@Tjw6BUk8>6zgx|#8*xEVw};Pa$V`j< zy*NO*I4zI+J7aHRgRyC93!Vk|)x{NF zn#Iu`9YjNB+E3|Ynz2XdYk@M^H!mNN04EaC9^-!ll8HVo|Fkx;5@`Bp6{N30nG9NO zu(!o_$zEDTkWBQAipZMc^+@MqM5g)L)#Tb%rbn79cuesL-5lp5JRCl-S$jkb4Y^Gls&fg;_NQ$i zGwmmpOtzjqT&9W1RKH*SF>U}|Y-q=~&6zj`ZKVtbIFo;?`d)__C3f`~cG{>+_f6XP zoZ{*cyc&>9^o{U-o^8n(Lqs|YasIK(5#Q6&D=QW}(K!h(sP`Wo;j-G{O)@PITdRDA$E4;GL1k^&5 zh<``_DmQC{>st*D7UU23N5>P)9Om=XqFmyxgSHR_uW(d59xN6XhjfiC5nDl|`juf&Neg!Y;-cHtQz`gT!-y`-{^d>Im}!r!2NqTv+cCllKh5C`2sG zciA#O-4(myNt=KoXXzeM@ywp>R$dN-NPC)ZfSGh_9C-9Khn-8DhT!u=i# z*UZ6{K>CCjX35j!U=hA~eRDl}c5{uxJo*AyVs9AtPJ#&0yMe_F-?~N>X)~S8Mz*>4 z82f9KlBtEsWWQVgOd?d@rGOf$$ruAO?H^(O0{@zIOKe9>$``m*NB0= z{$C0{3-Ld-fAnQhyuFzu)(sL5rg7WWn5q~}1{UOxXc$^!HxSCCqkr9OZ$`hsKWu9x zUL>o_G5dak6N-CEyCEOm# zL|)f|t^N-`dMenK@f1!L@lO<(W}H)``*~LBnshAK4;8^?wA@>6 zD6Tv(+6;V-lmBX_et&t7D>>7N z_tPTA{svdrSz^=;bv+7!m@Ap8#MW{g)Ij1iZ(UNO1anVtSncpN6+yD z&hW{OsSs8T?Qw*v<1zC{T8X2%+C(CiOI&oQIcl}XPan`I!*(&Yodl+EqhUt zVTkmSwudb4JRko*^V&^gW&8cPE$pSUu)JTYES7Mr*q~$a{^yo>VS*73#VMR8 zQcG)lY`A8$vV9C_=Kf>;^&7nELYFxre)3wbD!?Ag01Vj>K*eV%{-}6>&Sh(&)J^-V zaE{*YB6|$I4a6Wx<4;-~EXem7KRTZO|HQp(mm9~CE$aDp*NiQR?>F_dBtHb%@{DKf zIp^HfYLZslY?5X-C6DHTK?8+uhyV&k0VG>@oqsSN&-uSMGP8D8W>rL1Gz!poEsJb+ z*4{fK-+bG7D2)`*S$q13Zia;Jsmc`1=@gCER>Y&&U=2Qu> ziXFI!rzuv&4AHkDFsC=6PBD{+0GsM!3dpz@edW@aIY**D{&V}RAp(`8gfuBRE$fJF z$q8v7=jTyI%0mnjSmC#Szfb#M6oHij^(9J8aflKzG)>jQ385cHFwsYkv-#=jEFn^{ z-igp#M8gzXe_lL%E*7V<#Q z2hpd8gQZ)?B0pS z6p#_uoH9+=y)lKmaS4u&+7nZL@W`66qrLEZbU7ETELEUJj*zKN6f zWj;DT$`;hi()oU(2@X0BNA0wb`_ovi*+e0MCj1xqq@`U|729wTIMXOaI>_rq2zHOh z$TMBpax$2&zMl9EVX?10>26NwlzAaIo?br5F}FOJd+~{q?>@auGV&tH5pubL&L3nB zoMeQ^yL9m_H^XSr+c&`upJ%5O+#IUOfCPR@@?Gi3-ZttaRgwkLA_HtPT`} zm+5KUe6i~N!TuqSs0y=|NVXt3R8ao7{AIbd!3>#-EhvVp!~@NBO0uBm1x?nT(Vza7 z14F3TTmTxf$3lbq$|*f}b7tDd{`oNFx~jO>;GrBd2MpSGPQRZldS4Dkf1p22xEOY^ zuDFF_aU5R*5oEW__|Y3qC&pQiIE~}@x-ctomQ~@t7y?@I@E>XnP;oa*L(Xw?a$F$i zPB*h)g(%JpLd=GcCJD6M3%{$9Jt0b!I?_K*B8awCWLNSM&yFB+u`SxpRl=&!4{QbO%WnC1w|J= zs*rrw!>`K4=!@r%Sq+NY`ym>m!5*Yqc-Y}a_=Rb{$9ZnT&$0p(bBPeHAt1tsf}7zd zG}9`pN5+?fB3ML-*N_ksK*Rm;o97h5#XOTz3|&PPlqfc&Lez#5js|+7evLu}Eb@6_ z!it&d$zMb1+OIW9pymBA7j((8ijQK(7>X6cx8P&*S@HYNKc{W+qPMV7BzpPs^z+|* zj%iT{+%S*81XXv!k6+AR&grTOd5f;{q2QdW*qjI<89g-)D2e*GQi;7+O93V9Jztuw zv#qIXA187_S=q8E^wA{yjxIbr&Qn*-)CTf+fsOpX1st3VvurVPPLD z`7aRzL|ma)0_>9I;BfER-}eS45-D3Mio;z%+5F>&2v=a0=e*rm>vP{&6Zvt27Xk(rI2(mY6xfTD;e6L9jdAihIeSEG@+;?vu6e||lf(uGFR z13=LLD@d2`6a%Bh#B>r%&3VN+=e+7R%azM+NDRsiM)f zvxM`CV$oY-Sh^SwG;dA6pACACzdhWOi&sNrP#jGS4@5sP=hi3rn?!~b?FJy03O|&} z!F1dI`x`ohqgSH#r}XZmoIS-H8Hh100}l;X@WmthFqTZN=*0mQkw>^-^*JXewe|4q z&{aKYkf?R0b|O)M0y@^w^JSe*)*?$*C9FHgxurf|HjW3q~3 zB2iC#{f^m(+m@b~2zsu~v(<9gqoH9rY&o=3v||Tm%^~1|_a1Gq((z1@_4Z~blhbv+ zF4|md6`Ktn)JpI_@f479!>6PDv^Einzy=;J7EuQW{av5lannkFOxH{jQBf3g5sw*b zU>P9fs{hC(lbeX5SMyk$fD#$Rw|rtp+%g4Hbm<hl1kiDLF&Vz3+14}rhg`Ud30{fh$Qe{nUJWUezT%3$ zMIxa;*mYjHYiV|a(woeRZq0)_i>E0d%VQ1cQzpvuKFm?BzH(;p%k(alZR9J(RSx3l4rSNPf7;CTw z9Ejec<+cqPn{d?rU+r1)C?#8r39=s-*_1qU6I6;NUx{IfV!Vom0s@h z5gur+7Ve*qD9X6)QN(=;MMqj*Gs(B1$o`GQXd(=@YU&x~VkK!f~pF*&7`ZSP=3 zF+&s4(G=rViR5z3pn~$UqgDsPcE7RnOrf70<1wEAhXQr(X$J4fXp&~MgD@j$#Z}V=6f)Zu{JILkFY5! zD^RQh0NSuR!@w$`fa8;eac3yXhqc(_fi6lI20@8C@C!?cSiQz_7|J@906bhSdPl|0~pa)DI z5mc9ozfLEs>^Hrjk7e47W&|yPoDG|(V7wMGo|qRu#e&oH+!AYm4CbGJS!UE&m18Us z!E_x=CcwfeJrbL^o2Ho*ag=pvmU}rSzjishUARMNaQm{gfhA~aCR1-(wl!oh--5-N zQH!b1n%6nveDjF+?+%h;c zyj^Ojp4wz;w`M_Eqpk43^kXoI-Lql~BeE>zuGUXpDLLq^2|DIY^cI?WQ_E3|iCo!w zLqfix>mJ4_Y*>9~g}n`!lPg8?#rOt(AMop*N}hU*(5JkZ=L)+dWH z^x{5M;jI0YXobgN0P48YBoK2u`0mJm(#`Z9rZj!^bAtggZUr)Mr1)krSqlE3iap){ zux^h!0YqF{4Nm6d*nZx7V*dMN!21#^YQ6`u)c&Um7L>Q>>eJY4Z10^E`E7(#H?3t1 zIuv{e6PYwm*Q;VOqWje}=FD51Tokv80UcRC$pcmI;?s*LQtS-_Hc}*VKn-<(uD?i6 za}+ZU07d)(Dj0p+KWgmQGgF;S+kO)q{Jsqyt;oMN@#@;9Z7{+G>pL*d@gULc6{`^7 zL}so)!FR`o{wW<|dvyK49+*AI<`ZFj)fk%EjvL>T;E-@5N`(+a0==f6<>^CUP~UZ- zn`v#UeHurx!&zZE+uK);Bnl|GvdUkQ(ZA1n$L23`|EDnkpd3Gb3V}g;W0lXQ#!LM8 z>EYuxPh3S1Rlt?Z0yfw$t>+Uu2d3I`^m4K=1;lPnDrQw4$P)XXDp*jyzh2t>W@a5q zw;*UoZN7rTplo%8*I)$fWVBO3*7fLXdyP+AC@ZdiMQBYe0X_s=i$0;dX|gR8?obg} zlfQxo{olSGyh{0H|F-?i(;`@|5DNtFyv|Nemig-YG6ih}nQ?zMdSx)>A1B3Ub|8+j2Wh?bON7S!Sd9sa5(Vqh^=5Bz4{|?fBMW-l( zNa3k}}B+zpO-_fxTZs4(|P>e!= zs!0fN!RqT??XZbu-n8yDu)%%_LVX}}mRGTC1W=UY02PeB)_t?2`|}U-Azu7si8rlv zO>pqvHA3x0gC%)pzadv?dgX=wOPycNkHCr@%f-1v@|l+jpu?7XoGcS1D9XJ>LWvD_ z+vgO6H@&01zieghW3YVgo50|G-&nu=HC0M-^~q1os;VWdtReykfa@Y87AUg4P^GBy zvP#YfmAw#Wm8dONB+z5$C#9ZeHuPwfhS^t9&QCZYb#y4WOwnxY#x`A0`8E+EN3rY! zk}VYc5W)(ahMw&Yx^X&Ka9)L=$Mj-vmddGO+yz#Y(-;`MHz}>VpWP$U1A7r%?tK)i zxe5>L0z4G_?e}I&LGEr8t2v9{=mIPd-1|PCXOsCj@0ByE<8RIBfj`%0Dzaj3=RqBB zngUYp`>(#G4-QBZH9!pSLXWT5rS+(>7J;J_v;MCiFV25YuJvxs@qhmJ|M~R4u7pbv z+VYswB#^E83h$i^T}65Kh=qn>F4umWpM1yiDqMG3cr7w$Z1c&&!W*-;Q22Hzlz0Zn_@EYlq&M`z#`~|y z+md#OSvi|j)i}}#%LG~P1S7ZHYb(}@b(=JCSxQ>7oU!@tNa=7v`Igx`u(K06kBZe{ zJ&$!%(Ea4;kt3tY$()Z}syJJ#v(-RB_748t%nQYFcLQ@aaY1>h{;Mz8B2-K`r92`p z1PoH2PugvkCw(3AS>ZM)UsJ3+aar4evcd)Bl_QGLdO+S7)+wMzJAP}vo7!L^#X^Jl zy5HrX=^Nby=}#%oLgiH~*Xji;p^NnScwA)sN!=Fcfe!ksp*~bTwo)rLF;aQ2ut9w} zq)r%pgE5*zW@%v#W~$VY7RaD|C)8vntgMkYXi`mFP`*uGwG;{Y;hV{d-p&>x7%G z3==fnVN)I*KRX7A^?(IhZpR;%s=wZQ{Nf=iMX?Tw5oIYQ36%UY{w`F~ z|K{NMtNx?CKRxXK;qlWi_Z}ay+6L|J5iv)LHjWl*KaG({?d!pEM3+-(uVw6h=+kmm zSWo}^c9e>gPOq|b$ixf!RzzcGR5B{pCKgp-aA#t*&f3WpTPqPcg9=t_ZR+^jNiS;cCMYc`^clq;?BaaXor{zEY(aM}B;zT(nxLgI(1h4frR3ciwSX6q=jS2P+;^L!CE`8o+y+=ohcf5TqEr6FcHm{TwpVYR7QR+VbZ zUgw~E-nxwml6=LsxhTlbj!r$@MXLU2orrLLk&44xDaiMQ2Wc&K%Y{HVJF}Z5gt%KLqZ7Julnq`k@(I1%b+R})pRZ>p z8DE%+%_;+EOD};8_G^taCcr0KjTG}knc1O&^-7JEMl`e-AcR&o-lhXrpvr{-jVCGC(?hY7|TwVaM=jnL)5QOatC3+8%W&n7E=K<yr{N!-Qk>{Yg&F{Z`^L%lU-Z8G z_6u_(ke-VppA2*Kn2*^UE7t4=&h<_bE|}ltnCDqGD*BW8Lg=&=v(2P}2tTQ0Z7%hU z`Xjo}z}lj#k_aD4-YISJi29MnIPnxLg+Y3DxM)|WUWL4%iCa~A#p{2XA4Ym>et}$cwo8$rWri|n<_BHx}w1r zVS@23Fj4@v*@9mVE6&3jWPk&YFRA64d_!0ZZc#8@FuJR~*hI1;hlffF#6RZ`i325J1RvBi{KT(vg<&6B_1g!51KLEoqt2 ztIkx;+2>{@ZkEJl$Xy9u;2&nw=__ey?#^Gqga2|Y(EP+!gG6Vc%)5gI@6|f*yb$*3 z67C3UW(N-LTA7=jOR@cRw|NB*{#$Y0?G^)^RG9HFamz?)fQSJquGCbJODI1hOt`UY z`5iWx>-Jw}*$(Uc*u#VWZk+R%uk-ozJlXOShqp=-)JdSF)()n0Z*g$Kw!rS~0N~)R zwSBP-bZ`6dC{(L?=9jywc_lV-YzN+|x1ZbRl6mgL%@JjhdvvhdL9b$830j2VdreZ&jM@;8gLoQ9|bjtvY#qiio2j za>Ht@KB9syvY$KIrHlW)@5y z^-pJm;!NzG#=Ff)#eG51-{mK^O|YZDjzw485dAw{MVgLg{gbtMGt#wZX-xR*ZjH{$ zKvt9u+F(?L$81>bxIxGK5U(5?{Kw>ko{3d|$DJx80@+ZG&<25Cz;j&@+YojSpN9Sj|ZMz{mg#TJ6Jg3_!)4@Wl?~~mskLV#? zY4d_ykB0IfwPTxy>=3RTTj}77x|mbmYjDTIRK*R^%6^5yQ=HNeMJwl1!MSk9{Yp&$ z=6FjMgx7|U6^TZR!zmKkEv6C!*=QOt+i6624v!wjZ8c; zD_rm0;FiMVhAi&ij zI{5zl3s#}VhqjvUyWJFiucJu^Y44__<$^!bH(N7ZAk30MR?=d$F}dXZ;CEuNk`B^n zXRWp=6lB7t)8&9vm}G8`?AeMRbOwvk~uDjdQTR0 zN~g&qeoWW6LDwrtOEH2C!V=apodsKlJFu4Hf~Z8zl6$Zn)U1*WvYKPSx3sCeUzPw} zAKHKV^x@Oye7E*uOKr-J{bG5{kH`U>hY6#&eA@Q?z ziP7CPW_KvtYHf|I6H#A4a&*b!oq?>Cvs4Y)RLu>AwZN4wVhpW{Lc0K%TK96OLb0s@js^Y06QO|D~t_ z>ZuX)UmjFh=}q|cy=nyF(UYR<)X+-ZIgb{8@cPWSkF$+hwL8l*sP%##nrR8dBmUWj zS`sX)h(aUbCY4sC&_}cT`FL_l9%SSh)!Vl}&}N$X;mfB_A3xlC(my)hJAQb?T2v8c zD8h$0B_l*qCoYLRdboeQ|D2y7t2}K2;1+eB3bM$vj2g+Cm2tW@rZa#4nl8PI9i_^% ztb&9dnFC75->>@2J_p@9JRpZ3A^5J!->(8}=%_J3MPv_`Ca0*SazOpA_GoZG3Hc{i z@?9z_B(@4C{F5su%nD4fg+;H}i&wn|6AFD`rb5}&#C#Jj<0t}|3<=D!@~B|FVG?@Q zd`%H?{<@~ef!JItLVNJMAugD&hs;?q98h>%x);k5E5h-x#33wrZ->0*;s;ro4kZWV zL& zRK4w!v#g~PcPx^YZh}L@!6d(n2x!GagLb$1H4 zo!dHU#cIQ8_x5by@A9aYe@#wvdDMZq0_K51d}SE@-u%GRYHTdhmarhbS(5HQGLgi4 zCzDkw4}xkCo^ts37`)UPwU7m9)t7tf6(M=I&QHNWneRlrf@#7vjte_ikzHtVrD@PvTr;G81u?nr=&J~31WDNsOR6^v*t&dZu$4fphhF?@0*7~o~@Sj=FzFu&sM_C8X*TR z3&@t_LQFTxb|RnxhX8cOl}H+DjRjc#%{pTS8}z>HpP5kJv`RLI0Sq^2WmxD^vpD5F&OoZ>Ccn=O|PI` znuXnV;+tS1%!BU&9I~7BC|DrrdMU~I7t?dC6#PWmdDGN}ri=zMs4vk~^=vhnW#-Ph z`48`)rr0jMal|7_p%Kugk4PB)@{|KBdWD?g*hy-$2TL{g4E4B#Rd^M@8Y|+yGHlI}T z6tKf>Z@(&?YcG6>D0b>SqEsRtA0n#xy%F(!KF@mV)sS7-Y(BG%p+S9hlnp1d!4#g4 zy@yhZ(5#+IESGT>IKeB_zV5tX)w@~GFZsDmC?Y#w+L}HnmFEf^`M%cRpAKdVwx~6| zev;fFi_Bv&#&K8X5*f^mI!3<=%M@GDy7y7=z<%GnFu@@}g4eBcq zwK-xIh!qtqK@4Ef-iT-s)K{QZ)UO0}2oCz&5xps;KHUHq%nCt)V(dyNsNqAzEvj8B zI?(Ao$cM+~Px{$x@C#3@Yv$1ij48?1co>uPn64fclB3pywhE^~Ixc?tc0fApij`H}gb-{0`V1Ip+1Kq&Z4 zhldy#nZJh$Z{|YJtxsvu8?4MD&J?78t$CWG60X_{3{c_+hcKP#5Cs{V4h|eVH2AJC zOk_I3g&<aiVsmHFXq`By46Mn@$k(svuz?dZa;6oKmq7zs7mrc)kpZ0Pd$_` z#4BFE1-3#Kh@k5|e9P%tNu#=Er;@A0G70p2n9Zotn&9!|OtdmDgV;Y$^3i!e>A$0h zKovtOP1O>gq(ZDI$!; z$O>(a49Y%s-@CfF%uXpj{PMiFHyY8-J`I8NXTPA%m#uCm?Hw(P9*At`h0vd|P!LLS z?HA-o-WQjX+0L}a)R0@YVIhB`oO(z8VHZXC3Dy$rMg=J(mffHraZO<;L~9OqX3dHg zGJnZtw=DRt+znwVjKIylY!h~+!X zKbW!7PDkZoe)}C}gB2qA@zN!a=Y!0?;r7Q%ju=w;>C@rC;lr<82*0up%m&{Hp?kJJ zeG=I(EP68k?-cFWA)4N?B3dVKu9M`@>3` z2xQ?`Y!`P#=h@SYT`I8pr(5spk_sTc+#R6!M#bPXGrnAt>0$XpYT~Wl9RPAL{^6f^ zGAJuov25aOF`+j~*8B*q-iZQqo3x5eqm4X@1~Ur6#+LHdwN-4;cF$EuWbRN=nE$G+ zdnWSlVD+0XJ_9;qx&|SH-RFf>)@8;kMW9KCdJ$z6V~e!PxIdJ%iV@Pv2D-?nli@k} zT)G0F=Xp){(jPDL8Skj2-t{bzgOW^hL0CDnD-+wc{LG0QmP-KANPP-_<4s+#qP!#{ zM3$2!M&y~>aZf$HtZo)6jdemuEO$W}iS#nNiKCe~3{@Wqs1(-tAh7IE7=i26_@CHr z?$6o|MWxHpK+av);L9(cl~s;{dx;Al#qID2v)L3HED&=i`mju94%dr}chOaxdPR_; z7Eb~x??vC0Qd+x-1h%a0z`J`|9Mt++E0=U}fzqmCGCuF0X5>LdEBjI3^>zG~t$L~4 zRNc%mI?4voS%oO9x2My;bE-+@}8hW`>M6px>^Dp3E zh4-Tr7e+;Hz=F2Q_XG1_$Sj+kP-8K*fbXF;%Qu4!0adx1J!-mN;Uq|2_nVb_6FR1U zM3;BIG}l?^F#+XlY_2me**E%U#eoSyM!SM>S7;__YsgSTGi z?XP9ScdYXvdRl>K`mHF4ZC|%RVb&tXhI|j$Q9+0f8(c?;m8DMy!}K?vUNPSR8dv@v z8r=8C%Yl8Py6Dks*YBN3u-us-o1!@cmu6O)DuP0M_R)jD4 zM9XjI^T6Qr`J)hx{P9bd{5eo?T|)lKO%I_c6Z5Oq3vHz7iIE-kNm#Ubx@X z#hN85*sj2u_TTL;DBlbd3*J_fM%ZA!7BlAy(|CC9#Mq}&7Q@w5K% z9-@Oi%(H#rmfxQ3m}ek^^_{@dbPG%{^hU#cW#|$ZoMFu};RUGU7I-_> ztNxhp;~|h((rYSqj1L7@0tHoA6NY`GPQ5aEg$?GghS{TtozyTOgEeeb zVMr4u#~oW$hz|C!CpG8G>2N6>d(s*KG+ehOp6An|NB(c-0Y39006&^0YP=uHOc`4= zH=6k$WAFsK(Zdd;+hBL#V87kW`^)V7HJwfI`A?L9I{y^`R9v%D@d-^4Cxe2v?~VC| zE=RGJjU(m=(4f9i`+ZIu4wJb+uCRZSyaEUPof^G$z_ia?3lbCskdzP;K*p__jP=~S z%0dUtd>5qHL`;eZ;UVGj>GzXG?+^5!N3@U9GYeq04Jgi%Es||~93}{_)P8BA@v)4F zMJ?*Q$ml>pS<9n4CuKU?4taE#AiQ)oD9%V^&-^LBpPX0|A%`AlHJg6uf2dHwc=c>H z81}w8+}rP+OmlkKr^{Pu7RweSj|$Rj)vrgBQ@Ri@vnE!XKC31NHP#3gv~N|kVo@rN z(79a3#rTm~LG*^x30>LheRX{Nj4r0k>CPUl37nNhBP$$MLTs076&Z~1Zuq^?Mj3`rFU6$i18gY5IE1jQtOgGheHeZkDH>%bYx3%Rl}*`(u5jrLq0_2DE+~61{5(>Y za_CV6mk4pwvOEzq-3`BuG)X~$6kE9=W?GLWffl(gkm_h7bKpFI&Y-E(y>&tFcm?*>cq=r(_|XY^8_DYYOE z8q{h3Z*?LFdOsvN&UH`*;UHty@&uMps7MAC$Ga9V(<>}|Y`P@%5 z>_DrR7IQ-8$4Qwcz{i9hndHm!-*zA}V1z`Wrcvmp359lG$KtKlG*1LUw|Se1vp9u^ zdkryB&*HhAAcd|0(Q7YEmEWoq$I@bzMZV;#_;#gO7Dy>)yuNLeU4fBeW7f!3`rB<* z={g_e2^D%d9)9ubU;U0Px2;xaPXs|i*GX~h>0E%-v(>H>Jdksz)*8y&m5RWw$;M&M6eD&u#}fK&L(u~F|-x`3%204Ik2#tkjb~f@{@VCqG^H< z!(p3ku)zm;v?Z0m#7T>I~2`(d4YoR*-DR(m@T; zdaJuHpX3j6Azst2tsV30fS^J(EC#;My~zfs5fsEM0AYJt;XFdHGh?(E6cAXnu39?k*vM?upZff*L+OZ?g*TMNTAMA3= zLS%%*pVq2R{K1$6i<YeE_mvuWeNgyTMRq?43q1Si%LO8^OM3$ji+=3rIW zG2L1ViijZTW|WPxQHuks;+cX7Pc%!s4an9La|eY2h4OnzTdOA(3oODmWNbGv&1Y*3 z85|IDD>7wSG;&X?xMLClie*#V%wqc!zr(~BWNZD2CxJyiw;7;N()632je2WO|Npus z2aK-<^U;+4xeQjdPxlb`eSSrp@sOr6(?xip_}3wnpxAj?^vkHzYuW*VhHwjEb!(S(7uHRF9uYT`|6F5lx;#ylg%$koJ2EsVq0=pP(iYB^ z%Y12aY2qf!v5?MoBbj4|`hQed*?mu4xQRm8ALq;2fZzN2ZkPJ&{K$c(o_NOxW+2u7zLtd07}bRRKO8uh&uG#zk~b6-q(y#+9noSiAJb3^(42^o=m)p`eqd(Zy9_w4!8T;-u0Oa^{SH zU#}?c#Q>2ZkKv)=9#wYodNSoOI2rcLw(w)x8>h9kxB;!$1F1kuAxVyQE#jSQ}OxqFH51SXHf5H0th@#y0)1%5P;; zW6DS7G3F&*f)!j(6|syfXwj4nCRp&N)yI{t!+f-!W=G`3+#6EE5;|VR&7BHdRK{>Y z+b^omS#5M9u20w92Ik~|9hVgI{E9-OFlL0#HXE8_RUu;h)@=wbXlt{fOW!vaUibyw z)@>LwLMPikg1RA&yW43W4JPPnD_eKFn5}(VFI#YFwb5ypbO^k4ZQz2o-&GBZZMziT zY-W3zevu89!!zHI`RxzI4rxWGX~`*m}r-$v#HLDn% z6p%pAJweaQ*P>k%J_rC!*#!(xB3Y)OX9nort#GGhOO^>ppyvZ*;>-1z;xw9=*hO#e z$-nd|(D(7dA6`fy<`wr^fE=4AK?6;<@nxvV>0#@QW_NJR7PaYgRmxA^y{NI2nmP|ze9oO+q zsN=~4wr(iGE&)wcV4%Ux*39P*_jvYg)Jz8sezsN|7&GUofy)T8@v5g+9B7lxtTzfIe_$vCadck!FG#isoegAN70Hdbk} z*|v_a`2iRKJ2CY z^c@@mb4`;61?gLq&Yb%kJe7kE+W;48wg`=(5yyayXyR`F9m-8-j4Q=0*tz>CUcU-r$1P>wi8$w<$ z>H2AZb+*jcr+mmE&3szYQA3A}_a=+-CSdR2*{i?b8;$6Mv7pgtbMN{{Pm zp#M>#fuj4oBD(E8HJAU{rl2|H@B$KgDiWx9pI0+ky!vgQyoVQpAkFMbBPim5rgsHR zMc+L*!kS2Ng}H)Fm}pY5K+lKOhhgDTN@`m#t+xpu{!8Oeq_R@X1YJ_u8Bex+A--X^ zwXzF&py>nARx^6;hhB&fp7%Ubj4(=51w>FK^a50Zi{<2%D-Q_Lj z-risZY4(ye^&AvX@>5>Pl49jkV440RpU}N$K2nv&e@`Q+!3Ayicx^r&0kc5V+&a)` z@*L1|JJxbwtTLuGd~d>EH`45Cq=du-P*EGkT#l_GP1gkHWC$-2`#WTGi8KzodZKy zjS0GHvpb}oCkE!Ov%3ZdwAAJ?K{_+5N{)D4=P@D|va?xCvrYwN@!0puDNPG`UZ5mX7i zz;0*2p{AA@aG123neMjiDjrx#uIDCv?CwrG!rX^U&=rp^Vd@>v%tb0F6D(GnFEi!X zahBkP)tI0w-ktWTv31M{>bN`Ipn#HiUhb1Mc8nQG9p~jT7qkf@aWTy4HTwyF4AXI+ z#fz#)phg(=ipiT*KBjBAyVx171P0?*P4Ov0J$ZWF)bSJ{K?b|UrwG4&@Q8Y2s#rH-c? zzLLj8P$l%8HgUQ-bzMQA0P9pxcKf>`pZETF^z_Mt%se3X(7bd)F7DGgzd~1B8?}hm z?I?u}0XNx1qkPEjRy=6;Eoz~+$RNMNlABu(LiQDxs9X2}4hekzX9a(+rF;G@a+;hj zf9=Tl78&F>rupe9T`TE5ra$Sj$!KCDIP<$^ih2h)TlMfm16yK0bB|W>Iq%3`VT1i@ zP2ZG!ZTWiu`|ULzSX{G!ii@A0>XduAf!Zups*&{;O*o!2#; zg@JTxQs9tqi})w^zZZZ^DG+`^lJHHy>W!2HW?8`i=6d*O*b$5 zqrqyxT19b$)FvmQfSk+TI_8GAd|O;`37FvzFa<(!r0zgi8>MH1$@CtU;=?NgS z3J?O?D@JL6+1iI6YRJgyjafF!m*=l0+3ViWhSQpyuJbiN7gMymVl`TwFS7DYVi6ql z*TNL^#$$q9(dK0G02y0=CVWu;pLEUwVY5uDb}!x<&sPZT#$zS z5xozPkHTu@=>qfr+t!spUrEcjnI8sa_*Q9v(L@=Ob;t$Q#b#q z!-9|6NXa**pgaO$!no~(zy%|91SMnn?gO96#0b~USs{b9%BLA~cacxvHW`a-I^G2% zaKZTgY(loR}C_~JkWH%`n1wiP_UZG8&Qzr2)jZR z1%)I~bFccYQe!P9ih0sL^j4svn1BOX*wXUpXukhyhox2Hfu?upHSk5x{wEQ?=zl0o zVsM-_8i*i!%e7MK>IT!P&^}bXKtaz_Of!1AXhv^HI8ytfOoa@}D;4E@Zr0~gPmtJe zlzSgf8eoI@dY#$C=oB)Y*n?7&10MXBJimL$OQ2TSyFRoa-xV@g->F!qgF?!0Vv5q9 z-ywj(`L^dAO@=EWpBs&6$R}{YSXJaLkJ+BkO$ESL<#0?Z;a%hqxL~YmPx)xq7RPL4 zvO)%Hl~0VV%(-Ewk_0XoFZ;S<{H$qrRxoa2*4JKR18DG8IW-Ua2&A2I3fv~6d5LEi zjKFO&(%MgImx}cfwJ`%w>*#?Aw)b60j!hKFW$(~dvhsyR_ZxmXuQ=_EfP>K{Nd;N& zTKBKTG9Oa>GIR9y%>A`DSg+1rW_+Yzg@0`w*6A`qn^Ig*b-(^ORE-9-FT@Au(O9a+ zpA-cuXnIf5l)ag(%t1LjJ5u=6)^U@nDl+K0TmK%mGJOfFN#WU0$4qK+M9_1m{w?$@ zgzFEQ>Hb9u&hkKwSZW2GH`1v-f5f`&Qme?I>lbw^4fFXtv$5)XkIUnaUKwkUEyNSW zoL6JDBrnwdTBDZcJro9JILzoklRvUQ+o9$fJCy&juDm>gEPCdM?9iQfCJjB@lIS!s z^nOv-OWRL$Ii~M+oq9*+C-bVcsUtn?q%yOR*B4hEGqEi`PQr^pPCma#PKq;rGj#QX zXTvH%9(syAj1KKlMUR4_vJJKPp|TJOK@K#ffDgq1;|D8+Sji@N5DyQ2@H{vr$iw}4 zwptE*k%gMdpYEzH+z?YN1fvIM<4_!7_X8K z^9hA(?Cq29!Zdr+o6H8hi&0{`!yC86ay5+w7I|sF;%8Z1c^xo#?;^j??X&BHDZTYE z&r@zhn)b!zn2C@8m`mP98D(8exuv^!|vO~TDQ1$Ai;zG z9iPDOhB3^E@^5GMz~Fq_b7DJ;q1EB-h17q5q5P4r&v84a<)d?R11$gzPzR6z&lo&bDv=Qym=iA2m`u{$}rAj{3*{^6cS*eoBkN*WY9F zT399syXQYHr5_zXef}`1NZ}piL0LsL3QQ9#NypMlaUCLLc_68nf43OpEV zjS?EvcYW%By1)O`!~H)!e9qQZg`=s*6ctnq5OUprR0+K0vhcCN&4bT-kmFBjRI2M_1epV@agdAH`9SC4q!cO(jIuko&5H~DOP7;Gx1KyFmv*kTF=o@uzE_MQ) z>s$#9>W0b9u|M0?I-A@fgZQ1i=slP$AI?|H^PafiR=k5mIIe?f;IUNZl#9*ZhExs@ zRQE_tLH_8YK1~J(GyHuy$?0(%{^&+iovJLRz#-y>5kZ~{eY&_#8_x9iJ}tn6qlbj2 zm~X-XJqrus+X8W4cxzNsrPACM8T5CW^e2-gZ8J%E*EA-PKY)gS`w0P(4K#C$b`6mo zZZR^ZFU5Vh#G(uBfWYAx0miH**{n8XWX#|GOyw-zRP>{agB(?r1gBAJdo~$L$ zamDtMETBOEF-*yir-M_z!guO!OIQ#yO>JC=<9DZ~23$}xrG6?r(bK8aEoh2VIKl2l zYCsdDlR1Cyz7weh1?lx>{U)CheqN^Vq?aqTLj^5UlV`i>!%A2XGkus%v6DWmLIypP z?>QZh@OKJ3wcrvK#7sFarQWksIXhI)+F5EmlUrtX_p-kdP9!ckOHF`71Y`82I7jJZ z^b!`tjL}8jPDYQ<8yQ-$ukJ(}ud|q*dcBKI(}KdpW@IXFj8FT<4CbEVdL}FbE;cd= zxS%#>j+2;!PJS@Hn3-8r&|Wg@K$^1lp3$GZ$$ZQY5eh~C*?ACt2vEUz!~br*%)2qwj^xjfVni=3@*|XDnFTbSyo3h#HKg|3;{JhRvI{Vt+989v zX>;l|r7#(tZ4PX(--J}3Zczo79IQZGz(_@zGcFHz#Z?VDNtZ^hza1!WT z<4S07H*4H7&o|x@O`F{z%ghvrf%nYnT-O~kn46{Tu1oEvw1ExwTQHKZ>n?@RlPh*n z0LWMN3LOgWEhfX46h+{f{lkVnB8cG`O_9jkkF|ngeOZD!5orPlxl$7{mfqM^Op+4x z4i==B7AE9}8PHxFJm`s$95j>wa(Tv26>LRGv3auP>YSV;Ot*XS8wc1jGWSVW#=*jE zCXj!79T%LxSe(<1{@KEWi+FZEJea>4Oed6E`uLC*Ts?O#`k?>S-qBZVk^g(UFJVC8 zOmGoO2>mob;e;L^96mfc-aCB8s{D5ADg!=9{H#Udizltt>~CFXofKlPEzXD2lVxw; z+zq1$G89dN26EPTihaTotSnv@7{r$%Vza5lk}CERL{bL|!YdIWy#AOYT}@kdMr-C1 zupqq}k-F>L{4_-|`4=qT*DvONqv_&^VWFnzr>^0v5Tv z9F=IXrXH2$)U0r%T2!Kf@@7f-sO-+u%~UhtY!Wlrphq3{NyNswSskw7g0_)sioHE3 z&gXov&5pUQut9&lZgezlrpM6CI1?rZvPg}VwtZ?KgSt`HVl(bo)^SU27#po_`#Advzmyaq|WWfFr2lDC%`MctwW zKrfq*r0}c1Yd0Ff*zvOg2cpaVH|7S_=`vsQxl+VfXmACHJe|1=`-bhE2PLHA>y zJIRK>-N1%X(AvNA6ia?`^$!~`7%1eSstN_2H_mw<{!OX^;6U^a<>VP1YG%uMPd-yr zw4tCP)bK!cEugY>POb@xnGC}hf`ar?os^#=D!L+xkN`nu+7&WSD|utoEmZUdBIp8x zwgv3o$e}8pp`=q4;^GSNMJgIIX_oW zOp0V;;DVJJPQXgtG(5yDTB={2`Vne178k5>&uM-uPu4p1 zoB=er8@67p>Bc8pxw_iAME1N%x1uaSys=7E-$`-CURMto-lB_V_*{mv+c`0Fq zoUX;X)QPl&1*xx0ws%N1)(uNF#s%$dR}?wjfj_b}Fkk*DJC~b};y|@R3_1&*04nZQ z--Ie`Q|1?-imP`OWFo%`hMT|^JsEL1;wpwxL~g|s@CQ?2Pn%}A0&Q3t{DmWO4WpiiffUId^wWqv}R5u&{w$N z{irxwuO`#paz?#I)*HOaC-jz2aXzEQ_mVDdt|-hb-?S8A8cXbQJksz$*54IVx^;$MXWLdD*{Kogx1f<-tX+?*vmBD_(|R#azCdPj%H&w8UgEBcxF zCw3&z40|PS?nkz|{;Oh2 zYzylmN9=fc`{#NXmB8AkZEz7UU z3fWI|2-~rxzz2b%Eh(&3{+i|iGzcYI&sJ^8l0xdwrD88@aNlkn+FOHcssG0|OP%9{ zP_fVpTTPSZ+-jlM`5^GVWJ&k$to1Z&hW5Uvtc~D-pbyi6`r=Tcnf_c*RY?YE?@H3l z{q|gVHdPUpKZ51E!O~cs2$FslefxlpkWMLNP~7?Tmg4S};^s+2&=i-ZypYV-KfKJ6 z5;Eg%<@k(t;6~({cQ|=-Fz=mAsrK~qdEcH&vJInqx6;C?66&6~=&!7Ne&w`vp><9O z{WPjRwcOE}H*NYQZq58#=WaU52$A=SztSdA_8W?+>|bl3hf;ELd?0KdDdJfI)U}y3 z1C+dvj{+r=d4EL?&;`OzGG2Jk6m}{FNNVaVQ1k((sK}>o%U1TY`STVe)oGyVKBH+# zGn6rzh@KZ_o2KUUt;IwU1+=`&Xjx@%R!K3M)2|jWF$dJV$El$Q=%!|Kom}<#-arwD z6Sz|KS;ZvKa}(d~ua^bAvTnWb#6TH}+vdQFbu_@ie+%hLehQXZKF7jV5`}9T06766 zIuzW-2c-fERykZw?0yL=L9;8(Rt;x^2p$^hrC=QRsWJ-@JUW&_01p1T4Wfp`bY~rH z5Wz#kjaoTSqG7%kTr)J=s)<6Vu)*$oEa!&owDj#}l(=8EX^$mQD71(dmbRxQzPog( zD5gF4(#n?yPkUWXu?fhv$tEIlel2EO&>bA<;)TZNif8nwVExpv9vwa2r)%k7XUoZW zGPHxID<|5knvBh5ZeiC{vwR4J=!l^07aDCddP9!hC}g`U&8F@}a<%aey_G;uSl?;482x#Zpp| z3i|HX^wAT4)BLn=7F42{G`*~#sR1wPpc(#Twx0E=mKStFz}lvRjt0D_V=~{VjygPa z+^&@iJ?hb4QN)fe&%6s|5>C~bBs-r{2 zom&2j`J|5s{j3c%Ga$hRF*X#`dngj*-dUmT6pEg~is;ZYG~g3D+!n>obj0w`Q7@5l z9w0kpcPNn<8w%=uQ<;ixwev&0=D1&|5)m}`uaV@ zULg!h8jmQJ5}07TRWcr#hj{6X{A^H^BLJIK#YGMS7)}&8WU$-$HBBavMp*JG+;AjT zg9x?{Yk74eU4J?mXJ+HNe>M@;Tblh4A=f+y6rsG4e=!j42IU=Nf)OKb_*>~{V1p62 z0SjKcwlO7bk2ok)rkyUcb?l;R8wM4u7~M+N@{kErR+fE((M>{!3g5J0<%_XXz8w`+fSCTQB2tqXDdPSTR;y55hvWPTy-JV4( z17zIcEkePDgx4!H>sysUN(uJNI|9j1$p-M}|0y#I`E$QBIMsL&(Rv87; zc7I`;sAgqjZ(WzuUiWtf8}z>@>A`BesSnIGFuL7qw_eTkh}IX==UT?9GC_p#NJ0htv@K%T^1!N9^hPMaIXR8}HD>5jP}%+$vd)iSnO26kD=F z=Fb_KzN*vusj9^Mp2=vdQblIS{V*lh{f^hE@jTKuF|X58Lf{7}f!6lCK8@?i2KvAV zc~?o^nt~J@xj$UZWqV1@uA~D&Kg8gI_Hs-sp2%w!EFx+AbjAC{`h=Xs=@CwPyPTXm zv(Yp6liR8p&iGY}=KQMyc3H1}mWW`7kJ6%O;l2>u`ZNb$l@5h2a6#IqX=%%h?#0Z- zV?&Ma=!N8ke2~~;Ju^pH@|P{PZar}6rAeDIyO3tNAnm=dU@2_)G+X($Kn^m(n_n8A z+eCr#JdpHpN>W(zjI+jH6a&r$goSL7_d!Y?N}iFXc$PdsZnV+5&A_CUCDpL)%ZlpP zwIEN=C}{m$u2h;WA-U{AaMrXZw%kQ)sl zs5y)X%^6pl2*5+Ybxy#9-z(5;$13;@I_TN_OO0Vm`Hxz_{UHDJp273u7tao!JbKz2 zy?!Ky0Me|6WjnAer9IZ4{#V%Lhe^+lRwFz8VP|~Zx_p5Lg_M$XFqdXM+m%%EKvFnE ztgC-2&&0aT5G5jr3Wvrp?R2q+cS0Z2W*l39-G;^_8{~yUWB9@AqqF?=Hxv~!f6Yqk zHU^1IkaaI;fyeH0%)>W}$&xNHOA~#K6SCX@ITDBot9mURbsM{>>H?2K5;}8ctmxMI zYLdXClO%QD+m;md<6(zTQ@`qX<4RqVJQ3{lAw|`&uQ&CM&Sxk2^w_-QbW9K4_x7GV zd3wBeeDL%M+vGI;6rkN)6hEbiAnU#;Yya`y(Gjaivpo+DX+pNh!)b^ z8PVyfXdvlbQPSbl2QMB!WDTV0lXQYW0y%OmI{ueu5BqzM5BB&n+g>dSi6HA!(MmS; zv%TkghYyb*KIgS*#yg$48f*~waa!Qld(RK{z7$GRv$DT{yow9rJ}J(NUO$_;8y?xb zZ=Ue%1wW_G95g*C!I$k&$pdBgSY?aU6+z9yAgQN9hl;zbiY48`px&HqfSLtrQiKPG zh7VW`;Z=&SX?l_S235~ zLj3`eXHdZJi)*|$ni3=eXnDKRB1caAy<(@SNnMMYcsXQx)fc@T6`}VHl5dXA)O7A! zLLz6j<(0oApRE3Ca{kTwrl`fe+l#im1Ugjwq{{W_g!g*>r;V&@(ZFKcw^KuIj%R(k zwK~dYlke@B>sH#g49;knoX&Hq&e{CcWSP%RAkZyp;J~5bQe|xlxJW0UJh8^>vRTDE zBG>|})A?ZET&kwio&IQYIuTyBy=brMtj>W$!?iHSbVh0JDhm%eYmSt-TnDIN4chX= z-WAUHGo;Phas>&#pj_uU1s7TIgVtu{>JhjKLV|=2|o* zr1uggE4nd8XZdgVj$yMgRw96wAouIl_@CsVZ?oJ7m|zUr3(b5_@`A5Oo3$5@2sT>b zVJ2nfQ2kLh9;~M;>i=n^m1b0$5Q5E;7Vx2@Y(e>8R{t3J6# zv9uZw^SD;A$Y8IRuNmSc>JH`WVZqz5vT%mfp&rk|gQJF(DJaQ~tQ;UCw+$;(nq62K zu;9H~t6NKoImFjyjkmZ^tx8aEmh&}V>*#$*x|_+?<%`eP8mM5k{e@i_*o~3F^fafT z@Qe>~e$oDd#Rapqag}07!F|SKHoF(KaT64rwcOf-C(@LB^V|lwV7BeH5;mC)wln_J zA;D+I`QVpx-n17T=WB>yvvs%noqdIOy`8$tpn|oQ$GPC~zIh%kBG_tmr^sk?Y6o>E zzy-6NC02HzATe8-BR4R?c*pdAW^rjd1(VA@y$kNvuWS?5c#eeKpok3xv>6{Lz`W56 zhb;?f)d5PdN#vDC98hFOLZ8|=Qs(1?MJ_tu5Rk!c_pz%qelx*EyRd=finDymFSakb zkFDZ?GTV>)g$`}5o0xoTCAnxn-UJmn#fTbRIODiDw*7~aQYQx&9XnWDDgDUreap1CbcQ>V;c49=H><@p2h3AI6cd!h) zYsF9IRv^m)K|eJ|Ft3+`1qphy`iA~OE6?5u#qfFArw#Pe{%d+_i{DyMMD+9Er79Jb zMjA~(&(0TT^u#(l?bxQYkP6a1@)--QHd^M3e)TdMt4!f_?6GB|HJBib>K9{U+QTJ3 zgg*If^5#<2uM$@l6|q3j&sag@32iKpHv%0@8SeyhHpMIZmv)y7ParGf=^*h#k8m6` z0g7k1no!heav+!7CKQf{9$FSxCxWc|{@YNN*^)8ON%H1W?8bOhSy8|NF?_wE$OgmA zY=d-I2%^5qav~N8`o!lWw9YcKiQ5{X;++f+FYDsSAn#-UeJGEv1Qg~$BfHZlRx5>* zrbn06Fd8={AE*$cis1 zIQzs7f8sl#nr#+5n&DjIWOyjJ(@Zia7ewlR=KQIJra0O}1Pst|tEq!#psR_{*=S0m zO@+sYh8vZJWBW0^YECYx8{gck;9R}*f@VJ=L9Mke}aUR&lP_>s_;_)NS)0fg6R_^qAO3iiRokJw7sM92Q#nj zjp;o)zI2C*EYuC_L_)0 zg{64)bN&ogGbJuTo$=BPP;y67GRpZbS~Dru=&<-uabHqlb^-*0C_;MxHE9q~K#ORR zS-~$>wq+5E->QP%KwyW?ZK<&MP;u9shG!>(;mh75)5ee1vl;E^Qfx)3nrceLW4dzj zKXMdM@}8iC_SVSHUQ(mDZCv4|)C4q8^nUeaB-|uLonj_-3g4LuxJ?pxpy}P}(@2xq zkQWzPn$1yPMkz%V3-sI(^cdZ2E!OmMDlLuyI_@QO2;IvQ#dx4rVmP2hvWZweTeC^L z9R9en$uTnW@Xau@&&Txo^md4O3%bu1lV*Prn7vw+Nt3}!pSG!UcWVTFnqBpa>8t3V zu+4t+++6kjf$ZnWpzhZ#_AAy48*LVslmwxgSXDV&R8JF#F6tONV0!8VT zws3sV*i!${H}dnZZI^Gr27T%Btwvv__HDU*D=ujJurfbW_b^Xklxfb3FHrNq1YNATDuB^oG7TMBJ@_m%<^bbXL4K?*)EcwuV}i7!xqB@t8wvuwt&W-Eg2FS^XK zMILCnTv=*$(jSYPABo-TWj4;1#yQ|~B+$Z@6`;TS=koL4@6MnGO?gmI!k;$OV?U|I{$I1C#M!S2XlSCZ6 z61<&58=}%X^PQE{IiMt}yGK5i=;GA1?$#-wBN{EMM84v%4XNvB$?~KXJ(!HgiE`SS zqL2rQ;Nu7sWR4!Hv=*nV8*j*id; zvcxU*w!D>~;6j}lPnN~XO&JBw4t1sm4(_+heA@6I(os~xkEboG6)qTI+1WA|a@oPM zB`CO1XUwUbK-Qto02OSPN?ZPQJ(%Km%+g|`ofOybLu9btE?EoH-3c+sK%xR9_6}9_fCl;9205JoW=r~4snTm4SzM-h14Q_B8P81FA5pkg8U_)d zg+HR*Ooo6D8K?_kGFWVDb%6tifNN!ORB6Q5$TYsV&2p#%gBX>t`u$6auqa%L+pH2c zp+Wv`nd@V!b$ipvpfG=-8jx&=iM}Y&5@ZU9xhIH8)C0|gy;&4>DIkE5j|3s~&n=y# zX06<=r^W+W_XSz@SxsS})NBv73-Sz*ax;+f^GwD@job4#!ckn&!`5+=Cqa`4K&J}u38H7hK>SiG2+19C8`98*^GR*YG4DD62^q8WE`d%W2LmP_@3GX)~Oy+d7*mu^T%g1~*(QNFeN~TEyLFni! z)#!Ja0dBL7z6lNTu%oAXalEFNH(N*g%{zLY0%B^F6k-zQ=u}DT_>d9SkkJELpqhbi zO;=T?S^s5rE_EcE*AR&Wf<6eUEYg~g;rX1lM-qxOCx?8U6^g3P`!-zw%NjE`!hFV82OV`#Texg zn^vgdL&T^4lR!j~FIVQr!)$eykBS$C6fHpEdg<{+Njw__-uD2Zz%@M&vQN%ZyrmSg zUymxw3OFFz=;8`zOOGu|YBIG7dqR7h&z$QEZ>y~di!-!8Dmxrn@y5gI@A)@L=!PH`8Rv1#>{Y|vJ<01I$v3Y9K3n%SDLC#G;} ziu22qX`LpehB}3*T*J1eCZK_u_v3t6(LR}6t1dDLu|}5+ROf=Osspv3SGweybdl9^ zyQW$ls+MQ59${3u$oST(#c;qb?=s~zv#TPyr8^admWxb@l4@cmXyVGsz$6rHt*k;G z=;3U%%vNi9CC;Afu(PzS*(hd$rfQO84SZ<&pn@Wz^)p&|2rq^zu2aReL26_X5fuF* z{?^4oqjj~F_Tb^8y%&#<`^N`|51+m`W-a!gTNqi=tpE2{Kl+;=ng99f|FiYd21~Ka zh2FloialQ)=lRhY?GPYtiv34cvS!0CBya`||0PWc+un&}esz5O4BAHg&YEJ2J%Vfs ztCK*=t?0Wd)tH}{Yi6OLJyJpp1!UY8WTf7+&~y@7EuII0?g@fu7rqdpp=riptsc-o z&TT;s{WDvWH3N)Ri{*fjyOEF=&mX&*3%$(Ao#HSi!faNV1`EWzUw&xLA!x-yK}(D5 zD+=#CrH#o2Jzg%n@vNDWJL3R2)P#TI$RO;OHDRV*?dSQ+N%m}+n`KPCqzeY-=kGQT zGF9W?G`8?UF8U*6?RjZW@yP>yRR<)eE~bH)cWe1Vs_~j8!Sp+}zAGG}Yp^Ln6%|BD z7COs?b=7t)0_>s31zJRdnpl&jYqws~io)d?*y+dQQ)cO~w=B2Ef)WMF^c5 zbgJ#ebP!h+U$G$1rmQy@QKbAa#iE^3M=H#kx)z^A1yLXPY&BE*2?aAEYW6fzRX)K6 zY1PQsOlo`MpmhXw7`I<1(~#BG9hR)-4Gw=JnP z?8!N8`m&b&XT?&{*t4>12nZ@yj@57aLVtDfa;#y3@Jf}pp?P|e-tqV=o4>?W5W$|7 zF#rYSeTK4sHYuI>_yZ=*0UTpp&mQ4J$PG@&G=I(JU*RBb;cDeuDX_qxey5@yPqL}- zB#$DdEyoE&ko}}0JInZoxPP}+Cm=fVkcmbgcp~VDY(B5c6mNn{z4Z*^JCTIwyH#keRVMFkc99^QiY)S`6&|QB` zZQn_h6iMmhy9UinH_pu@oUQK*lGp zi&JvU9rw=MZdeg*joICCx}Y-RAG1&#-g)@dZ2F=9p^Xdbey;c;wSH18I6Z?>pr?bz zpLqm1SBZs`Vu|MoloG+FQ)ouje(Ig@ttyP!pfFv|ZpzfExl5n-qnXX^t;}zYI!#Sa4oN%Kdycqr*vh&u=wg&8yfj0anBs1B3THq^=4M`4FhF;504E2hQ(B_HCWNC|D3 zP~^?Q^vJwX${R=FdjM!zPn`#z9?KnfSQm| zQNS8}ZCR{Orjy|T@3g&@+EOv3l@#aniq~wHN-72@xdBU-4Y;=&oIa8IYQ-WOa8bcD zu)%%@$qnV`3GM71(xd70Zp`WGjIA1q9cVyC3Rrxo@HQ|4dIKLYh*hwu4I0=yyL~^- zq~*^yI zY_NX-#ihd_webTJ(Puq0;V6-v*H>{Ov8g~FfmWlRz7imc^Qf#Sus z3S3zg8@$l@vkEG#i$QvNPL$UF!cO~m2Sv_uL$7T+3uDD)(W5)4gH`XL`EQF&70&L9 za|h=ebPEd<*}V!eE#7EghDXI-gPz5VslTn+e= z+|dr^Bf+UhaURiPv=kw9ey-5DpHJ7b`IGhRL^zO8^w$@a8goMJX9~5C>Alv3R>dy= zMYV>EQ2O(fQrm>nrLWlKSIex^L8I-tr8;Uq+Lvbf3WwN>$#YClmMrH|SxcSVW;rvA zQ2LA3at><;(+eqHi@ca6Lq4edB&E{Dmg$QRASlk5)e0l7i>Mr2kIQxMby#j z!~D+I4%9g=sOzOlmV$H9%YCCDmN`3{Rh%cQ3z(yX)?cNx78GQI?s&ATRm^PFYI#!V zHM?!g#jrP=PRv=^m*mPu@5zg+JH?I17!dO>i32*!`9qNA(ZEE68k_%${j*}m6@xNb z8a&YRZv1JG?ucUM3tNGT5hI38D*_WVnYn3TBibKWR$R~i*3B*0_ID{$~%L3-jppbLt<{pb6v%@up*fT~khxL^%S+x~V( zr5$5~{T_rO&%{pK>J&anoYg8$=mE;+zQ)k5WF?&zZB2<|kd;t~gjLpeXZdW6=&U4W zfRg(#q%R$pF6A7o@Z|t1UpzGmXt{;2poOM$S>IecVJ)IKK?NWyBS43OMqQktku`_l-MI;3hqZ+6HI<1SK@sgKmi)Q(ZT?mmQ5(9DtnHhHW5e%gK*5y`toj_3BCr5 z8HsS7Y?uI3l3BOksD)_|7|2CZIU;=wucs*D)0m&|sAveB!X3LwDb*>7m)%IsshcHM+Gv%2ALpf5P@twk9%a6$q3 zW(s-Q(y_7w*}-xyu8$V%hmhf00HE?}n~F+?&BcsNNtaM{XSHzJ2Esw%`EQzSy;4#2 z@8}QOo6`Fh?4VuJBOuHWz~5rg7W(wR|8)2Gm-d34|L6aF|9`)ru77gRGpOrG=JZr5 z-#ZH&cKv8k>xWGaMjeuLXyUcFz{Az?dhSlWunH;YpLr4~2B^FoQTf%rIqhbY_>}xa zfpKPe!~h`i5<}v!TMNfd3-+THaIo@0;Z=^p>EcQ$gl&-mH&w#IL4e5j=JU%FU1v!z zI?d*v(yW92IHR38x9Mz7r5-!^k{0vHdRbBhS+796?m2~Ep!eP2`;gvm?881eb_EIj zK)TGXg#~iY&CL-db?Sz$c3$ZBZCFJW%-d{Kqn_P{c$@`AKFM4QT&;N)m6Nhe1- zk2Ezc1_!iWt1cF^4?ntfyFONQp#5;V&=*r*)8&D}<ZQUf8j(hB91eL7J1i_e+l$+CL| z%3*cVm61XGyG|HGoQ4#;3yE#`lHQ39&`CAK0=b_^F%pQ0`l5gs&&{*laWs8JK%n)G({<8}+C#{_uOKpa zlC!NC;(*lq?o*bOo=a?2kJR2J>6!R~Jys5+fL{v|RKM?}uvGOupEApWZ5>X20m~2# z1b^-XWC*sZ$MlcISpL?uxZ&CY25s3cX~)xXE_#>o>@vUsDX|albYVHT8?6sVK%n)O z)Wm+0#k6O^!38HbYkM9AghVGymn*>6@he@UIpG)y#Ga}4`|2^RYUux^3xCd^jnUj= zPumhdFfy!S+CqW&Vu)yW*@4=a95E=V#-z)mbspAJzM zly~GWRVuhYQh>BFdA#N%Ty8P|&&UK`WJ8py7~h5<6o}7<8ok^%8~I-4g1nue)j%$A zBl}UmtGpO%xc%+NixpADm+Xe28nHl)`l%vCk0FVBSo`$MV;TG1pcuShVz2w?v+%w@)|x64<57X@OZmeHM0*d=-!2Das1=~okRJ&X?AxS zx_audT2h@;_on&Bn*Nb(l#)E3L3w{?gj$N{As18L)(`(klvCtl$|`jK<7hcW24(6N zrg=UhPrp*zqAqBo6x;qqcBzHEuVlhNS@9yg+B!BNycG}l=hE7%=a1RS7kQ+v${Xnb zf6s#-)KhBul##k9Ph z4y(akMZ2x&)?2!OK{!BGvcLjQ)~&w;59Hou$&mrlx>S~3!D;<7S~mp*y;nne_x9D6 zo-m>vlJbgiNusAyX)Peoi8_NXrH3W8m3%H{7Dll(84&~{TZ@aMkFkzp6kC(ViV=wV_y-RxYV%{iTR>d*zht6^S{ zGtMio3lucJBhsWTyYwF6qNep(o@B{V!FeQONKo{?F0GX6z($*F?-=gua)6-sGBikW z_fp@>lidwhvcPGzrv4KLIt&D8yws+FZEQ>uyJT^*fCUgTBxtYi>XP4iJQ4{YfW&KU zO_(Bc+I7GhN=Zt;KpPNEi%g;)fveFL2o6@1mR-2BEkQm*9e|8$?Fo`9rh^BOPEgQ%Gu5dNDdZVn!TxEOSzeJXFwk;=3o7DEs;z%Velclq;3A`e*t5`= zPLxnsEG_nw>`)aQQzRVFZc=J~RS(e#Q{q9B(pWmcpN{J-As3uTfn~J&zCqTa0sBl0 zD>}Y{!~I>jvD14Iz@O?<2DC|cwIzSVKe2VjAY>N0DDsXyOA7@Ga2>&xP-k$Kbc)Bl z`o+57lKpJf_{_lumJNdiS}r|gX)P++hRl!91!rN>MFiGDynDuw)X70( zfQEAimWFB?wnffJl4Tee@c>VC;11HT493wxfB_n5S5cw8m@GacO3LWLLx6;vY1oD^ z3swbPrQjC40`uhIKrZbqD)+MH^NHj1765>Ni>s}6)Vw!nNhX>t*;Lf+K@uF$aglXE z2b38u1&_28G?C&05D;+=E{s&3<~oi;ed|o z?WTha_V9W;=>Vs7NwY2!O|9~il{113el{RsffOwiC#2$R6Qi1c89LQ-oMI?Ya`y2* zPxXnOb=vHXe4^xxHu_qNiq>Ny>A-d|vHA7#B&0^pFijEK2nVv81Q=xMwrr$vMldb{ zYuUhcF4E!BIdpL@a7KucgLe>Mk?8%aX2n0*BrOO>kC;x&~uBIacLEW z(pqnh-{8f|JR%6XSmVnR?Jl6#yv1|DXJnS?X;CFB8pvY#fOocSe^zne7&FHV0}lZb z&aGP#^fBAF&hRc7d@UW&ZXR^E-c-BmhOV&4-NtZ+gH-`j+yV>)XgD|T%VZ+nGki>r z1rR`j(S?gnhYdD477hY5+)VkdezMzad!p5Hbv-kGe&dW#Q5uVzf;oa`(=b8n%5M_{z-f%lot$?qRXBjOoJm3#w* zIN*}D(m@%pT0kRF{6gJmmYYC{jOb0PBQ09U3L1}53?jVl0WYkX~`milG|oxDE*f9eyS+9+Ukv#wP@LAEF{accr;M+ zu1K3V3X1{w8KYP?C4-WuvfNiff@4f776nw?gf40@HN4ZpX>PaY8Ou1G>Pg{1&h3?m z$kAA=Mi6PtKVwMiBo;z}RMP9L9nmQg8fuSgK4cxG*R_#ADRG##VAohXio@ivK#T8j z50y_~z2%r@Zc#vmZ!}#<^hskjT7U#fym9M-YCPc$X-wk|p+M>bWd85c{XP3;L3fgZBGfw3oDBEx)KzPenR`2IU{*C>za_3#P8ZM_<(xbQ4%m zeY;K7=OlG7&vxfCMhG%BbLb|@VRQgk%nnNF~8ZXCd=~Oi_Hb}c&pAzYPO_#sYjnTrHqrtmAOK?Hf4}FXQ++PVRb!UW| z<)&%SK+J7N5-ujyhRE**Wqk4(^C!U`cqq_{-7EWe5j!+$+@P%L&cWi|66#y$^YV`tV-i#RJ|YXO%se*Bs3C@ARO_f$tn=B=>n+ zU|>MU4^i|AS#vth=)&+79c*QL>98Rx1poz?eYs~#kijgj>*YzfU+aw6iBSiG0V2;~ z`UoNquj|1p{xSt49pK(s5yQRRXDbpo!z6_DLRH5Y229*?;cry}%umJSQ(tE!p!it| zj|4()vrJN~J6k_^vrHZl1l{a8DXzw(hf0a|Kr`Lrypf(Y8$5e1#Rlmg!`iz(6nE8~ zbG;9nHz`8~VM)u%#s9IiEMkMS)R{D4*2#|DnJf|rxjaOoe4{~WL3eN-LPi5I7btN> z$QZw^wdfR9%?BzJ4>ALu& zXyDb>kG7`C^#c^}a09s3&w_3Spl1`=PBwf)R15(IF3szIc9YX=E1fY?*>%me6V%K{*6x67!a^@^nbq1EJE^iZW|RS-EE~Pal6T?b zvH=j-xH)U68#Uo&H8Xt9+J*s>WZX5%qx)(fbs70sTN8)z@UNG zcQFans$JHX6&*kK2f(u-%Nc8bIZMxgf@K^ns9E*0zBpa6RyI3wOgs#j#I|hr?FsqTk!(2t0gHGZKn2vnBxz-Gq#1390v_?`YL_g?U(t4V z)?`N-&k`W8iF>#$luml5>)`?**s;386qsQ(uC4$CHgVr3^T{448L4kaFks?RY})gw zBC9RA=6Z1=&&OKP8H;N<$Jc@aqj2WV|f4q7V*sA6hQ2gF`SWR{yZMI#a>92z0o*B00g@@&QOKp zv7d27BgGkQEO3hZ8&1m4b!I|%4C zq6*LmcjSZUGggl}brK+fPaK0d!s;a_Rx=~TAPErIB>f(3q}a$B8mr$kXyC=zu^I@a zn~KM@V}}DSOpEzJnQ_)*wwMP38^+hDLV_`m>1zN3CQ1L!o{Ac)e|r$HaN9FY|2_&2 z>721WF59cMd|=0M^TBOP*ReC(n@5V9TToz>#1@{>fu1D(~$fq1gvjCK1! zY_#<}_;+X}KH8AepYjK}lMU18FG7X>++rJ3q5R2)Ggd(Y*+=>IP$Yea$T_A%|5+w*<2;E7BnO{+%|3*2Yo0wU($cdt_km_{Vy5N|M3>}CDe!JG< z4IP7OZKMMA#a6A&K}ojC1rK}5Rfb$3Kjn}cx*9=xAmML&_>`p+2rSpObkWgD_oYVFf!T5^FL=~X_y)K{-oBG6ntX|?Wff3@4uZZFX% z^{Hn|E|C8M_Cv=%guP{d-NSaQG@!U%N&l{=<9d|iZKqG~NW}v8+pc!PC6a&Dr*29X z5L|>vD?ngb7|vHW8XEyhBD=|*1l^Onw(v#r)=WtV|S;JI;4L(MVYVS9O>aV-@K zTxX;7g7RLTv-QzxAQ5P;mio6~LdEp>KDA860ynOu7!UQXWjsG~eM8g9IJG`~Ba(^w znW#@?(DaV$*~QMxY*_O-JL==)0@<`^SVEtoXMxXdQAR9q(;6>pwK3;5?_mej*vkcS zT4S3S8N0?#EO1S(!Km&EfuIwT|7S0Jbzz3o>erN*zyO<3jhztZ zKG^hZODX`L^MH$Lw>nnq)i-=CKkg2$B+yVYfPCk zl{7*D_e22K?D!qU1rA9>(=q`T)~%t?fi=@1bu&T%7qs277Viri&~}gtz-PQNsZSgp zu8!Ai6$?C%q);yxph4H5TOR1h=&`!sXTAfvMkpD;fqKntR%~4ds25TJ7})CNO7J-Y zY}LpF*wel()y|Xanx7FDj9yYxI4!0#jLS zDWv3k{s2>fQ~(C8N9!MJTIgYob3p4ku>$1ox|#w~i{&8?i`8lZNF$boT&}K!G{7Lm zTCptTx_Ky!!Gj>JSQe62u7o-IAV@2gg*>i~LJ&6y(u!pvPZY=T`|1ZlTCso(T)6n2 z+5i_GKcf~nx%F441MhSOI5{g6bqnD{D;)x7gaR(`scX7Pe8uOi2KZD+1>m!Oc-mBS zP+VOb%leywwR35Z3IsE-JG$h2bzBKI3Jib^1Oql0jCaERy#a%<773`JCCyf&9f^SLl({5j1uJ{0_;BiN(F=N>x_~CRp88~DEJctYS^=>_ZV|QW!8MUr>>(Zds z)l&cK!*Bh`x77c+wWFxA^eE7QpD_>c@A|DFB^H$peBfS;(FgcID->{{Zsj<3h;EZW zHmu(iL(1L=Mg4-g-9GS9OkQ-r+%A+1;83xL-CBt9hA7rbWdWxc&GvST1YppTas>xi zYEr+TCG{^VH_VTo16neajCzK^YH3`~N(=!GBm+29u-KqO6l{b7F37zc9#*?WC3w35 zxfd@Npg|pNY|V7d0d=%O0T)DII{H$VJh8FDfKVt94A`KS@+@IMEt5Gy0QU{;$>Fy= z41lvjQ9JGGXy<)Ct=!Ai#Zm$I=PLT5pX79M!HQEm=JFB&^lb|yrdkUYv{{@u&1&m| zWGK@Ede#RLQ6D{dJj{Fwl!59sc?@L&%$h}*_+;REnnfrTfPZFMON^Qdw#0Ca6=yZ| ztmZItsYj+ty=FCmNYv*~O?{+HX2Dh>t~yZ`(;B!O`SmpLBU%>a1HJWlVj{4o$BUDI)$@kBkxT1bQ= z(m~i^7Ubg?tX@G_Bs77`&vARg1wsL*CkuyJoS3m>L@tasg_)v&%{` zcs;wb6A38W1?0R>&n}SUd~6q>8^@$|%br~T64UyKd7i%YiE}(Q&=rmjD-meVrD)=Y+yZYP z0ve$rrg)Ro5KJSK#XL|8j$ThMl*LqcSB{S9g#zC zDl5LmT5$cJ6CQifJQS$;!I&wpl*}rt|6nYlfROj@LeX7y#c!+V@7=RVAm*c}dvx?A zu`4Og>>ou*AfV&ToGCelnaePsIa6MR7$cjxhyp@>pb?5n7S-RQ z=YT-#yUv*irLX08A_}erb<$&3)qw?a*+!heS245<3JAUK>Jt^+nYkWoQU#A7I-waQ zIS5dB&3%(gc{ z9XT#Y9JR5$M4-Ls(aeJq_C|TOeg!L&3}zx1$WEg<#6B8z^4drZUDmN4ukGljI3o{8 zuI=j0?)Z4fhx1lq3I*7QfV$qIHnwV)slIIg93&EY5k^=T<54@gg;M(P)_ zn-wHzTXpgRf#tME$$zO*eY6L0!13DK*J71=X%F&%^p-kqKKr%0Fo2%wT0N+5HQPf& zsddVs>VIM_q{Lw=xyEaCB7n?m5}BQ}#8Ge+sFs-}Vx)t_+Y*U=^^mUh-<|m5c_pJ+ zr%D0{(0Ny+qwcA@pd(4bX~>dzyPHr5B2v=kLpDqnGgH^KkyzGj22o-`KMLh{Hp!K61t;2Qmkgh;KR*&laUU(|1;1N^}!P<97t_22)Kj@-JYr2d2 zqFV6tf|5yjk@gh901EV4y)mqmeiV$gv_ZX*fdHLnm9`d#*)8>-nOgo7OugW&nib`m zt|gWSt>ykT1QcQcss{$5^y}?{cAwD^fNHJQX6a?TT(!R_$aEVGhSknsfX+KsTTD?} z%9QM_pG+3A&@f5y9SX7#Ad}G#4HGw@ACCe`j0Jt7ZFf&6 zBb4sgo;%orQVh^xG=!qQZJ8DuY(Z@lP+}|yg(tM21Oj9-`tfZ$rG7jLD7|ER*xe&- zUD$l7^DVR&w&JHP1qZ;bys&FAvH`EdQR<1UBH|>i;2D+@3PwI?ye?@$-rD!iz1%Qc z&tSFsWu6GN8{3nAH3kVS9GZv;{Fb&=sDM+vuXzZ8Sa_Cz9EFTPzzPR}H=-u6By}0t z7z!tA$&h1=fk6Nj9SSuUU)77_Y|-djy7|@bOuwYt9O$)_?V|pGmKCcFjR|W%?zLnC z`9-A!|0_+?^<5i0dZtSjq6hN9;F*Ad+g{H2#?1D=5^yIPxYYdXH7T5K7NHpQx>{{- zSG(D^emGxTuhzUx5OAS^-PhrkrM#j16y3MIp%p3CUzRKd2VzA!5e^u!Ek%zqsVNul zzQ<}Q4+1Xa#@pICHZ;Rv^-|=&yg*Se76B|?;aHq@YJUSuqbPDOpaBT*pahTq>Nk6u zVAacySL9ST&4YS=Z0OApzGIgxG6kYrdJ(a}EVAOTG+hcrLoa_*-B2rLalnYC6kb== z#bWjmolvKdik^AtyN&d`2?!X4=?*|Nx z27X7XMt!?ZXZ~R{x*{rwey5A5e2nuyr(&6$@cgSTij<3;Q%_o6(W88NBLqEQEj(_q zor<%>0eWtCJJmGan#d%U&a7EKIbOHRB7-oc^jshF7Oan=ilCk=l$1xw(88U;OhYUC_gA5-MgTcV||Vs&WPX-E(x=hBj5ORI)vx&5yx zG-uF2E2FpkqiU1rEr0~UjLnfNJgxb-e-fJm9;nfVD5*(l>)n=8jclv_`xLF}07341 zGC4JH2byMP0@V~06Ic-C#u3{w)E7`X!*bklguw(w3df{|))Y-+&zt>x+Z)Jm<@nmxN}lb`zw-7hTMWPEiN^+~RGCy96JA=NyA?6_s)PeTb7U+E42)BS=-vo7o4#q`RQqydJ?WQ+jB?cUPDRI%Q zVS4x7jaH0TKhL>D=38vrAq8;%NeOrArF1o9J>SrN4_4>R4H!vG0{khhvAtYf5j}b= zjWS&7FO(@#e^IlEgW0RXk}jJrdg0Ks{}&k!^weBTC~sFz`LU*Gf*nZi;O4PFjP~>e zpGOs;&8V!tiuUmYLOVEV7|>DSkf0|jcR}NHUGb(@He2wryIDCjkjpe8k-J1o4CrKrCwokQnc0jyJXs)6 zitX#m>S1JJT~mPJ_LW5h$v93+KapB;c$~%}ffOAfpfi>9xZ0jJiK>Gv!Vb}b`!i?_ z@A!B}OLXXeEx77lWiW)3BnBat_#5fR;p(6qAyP%xdF^cxSIf)r2aRN?_hi#o0 z!?ZuKEmr2SAX%o9AVE8{WtO2uyC~;U#<=J#uahYgau}dOdlcPgzM+(nv5G0$9_R#S zcxV8Spe>5}n@zQ)d-#+aH;UtT`WNh3ZToR@p^S78pnbzB0qV@cI8tyHu?yb{2R!Qk zfbxAR^`{JraXi?)yPxO^1%S67%`Bu1?4Uy z&ml<@ux%k8d>gAR3;;C2wgn~K*)BO&TWI-U0RJ7e#e-^n5-u7qI?`2O5P-<>_*c4@ zT{6s(csK~~fX5E?p$gIRwlIAuA6vCdsh0*I;KH?yDkd=*Q76$P>d8g3Z%#)Fyk~O6 zn+duz=XMjhsQD8f@gSY$%iP>j0BFPlFQ_4{i8c?}{x__KRxS`%x(rdqiGhK6ARp@L)?SHXLVh2?P6G6Kw61F z)3qc-m5b8h#+C+LVYENDmYmoWS5N)-GxHz8ta{+K!~*w4rCs{}qyV1_%Gfj8tgKuh zzqK&)>Cep}zt0=3aP=SiFKjcHM7!ZUy%Pg;Ua@rMw?3v@63jUUO0AF==XFsKYFde= zhZ!QQbWnJip^&+It{~X#U;yDD@P__gpNrvX=gU&quv5|}L}`SyC{6IOTUA3i4I_~KItuE+@I@=dYR3FMS zh8X@!gpea~K{sUbW87FIECNWp%xL1GIUXC{07?Rxu;P*`0Fk3{y;?47KHwgU1|UG= zMMfJ`hBu3niARYp3_y;8S`A?>b1Vu502E$fw2(XXRx(zUD8gZY$Quk1iht)P+LE(7 z@=q9)9e2sRv_uzLJ_vBuk!z5#tixe|2RQ|y($o@ zmqK#9j=ye^Qqs*cyf9lzzyET<6wfXK6!h-o&pk#E80RZF7%wiaTs0DZm% zx~1iP)=S(fSntWf8o>a5t_3XNmc&yzTrC%{X?>5!eIv{tht(H?0i4!X{mzFB!|H40 z0+y+-l=>N5-zeepOx(T~_pf;GQt%wIl@#_RYs^NfP*?TiBz1Ly0i3k$MWe2hV*Ajb zwuM~4KAotzdBkECJn5Oyuo4Qu#6vBv$%V0ygFKWKD}mCUSYEfoK#f>{Cf!EgCDia& zaS!S?PB4HGG+6^*toO%;rXZ}AKOW+cz2qEp-SFo;heK=0fJU^6T9Z4c-3KTBz;j6& zQydSJrCZSePpq0Q!<=H=wPFF9v@`um_fo9+0b!7`y<|Wq-illmshu^jLEZ{-0h`pg zUR*beYoRL-s>X9j--W&nV{-HEo{Z2wn-1BUuj8r{2mOs zfNi($rg}6{`&!8|G^J-Jg0_+Y-B$J_6BSZ+G*M|AmQdZHhNZ-!t_kS1c;osYP%Bmd zT`dS_Kq>s0BC7I|W$1c;oCw-V26Spx+ru|g2GbJiUf6B4wmonwWgG4eUQt(0P zrf z;h^qi#R4>G+pT(&qT*xPK|`Yx4B#a7pe}XU)U;ELHRnO8hd?yIu`p!2+m>)?-x=*N z;S>KQ`#Z$UM)UJNl8;-_TdmtL%iT|RvB_$IdlmUTUz$Sf~ z9vs+L52pwbyktNp>NW+WN)NK~Ks3M;BgQ~amnS8D27=6Z4`~7b>%_`8&}DnO7hh;Ay>&w2&=r_#IYnCpiZ# zjUB_GwPZjiwoNx&P7;Gbt_&-Akzuxdy3ld~o3=5f@Wm@fhbh`g26U=uDj;;KVKugL zGqA#X$Y59{7qE%1&ILn*e6(3jL}Ps##j>JM~+Pu*HlNt@~m_EkH1 zdM54u){+ha&!lkf$`EKlfXb`xtB{H@0X9l1*ly)S%0vJF8ZWzV91YsHL03ug zp;|#6#R(KhIPsvsXhN9-JsZ5?m%c~PL;wI9i6*-2VxT4>@u2Xc)17V%Dud=?@*M@! zU?+}gia`a#xq4PbwIG zoHR!BUbYNQ7o`afaX7e@4e-S16tI3}hIK*%jV=%l_+%tFHj=#!90{yoz^1isoLgdy zZD_5%aKI;)p6h1=E!~L*^lQ#G-5)wakAkBtPE_08Rhvh_4T!`J*A|mQkYNrt77q%H zE~;m6lu@zO zALauC*#M8bqbYFco&4_V3`->%&~Lla?hmb)k#R`{SA98oLZ58GfYO`pOZNv`HWQ8% zoR4tQ@`L~aI&sjh8%NQ}IqYFUdm92&1kI=q*Ez!)S)WstKnvS~C#@sKh}$ z%AqM410EK{rvRYAIP@^kWO$6=&_e_eVLZxKIOsHNfY+MPq5;i}B`(}$6fnYA;>3f( zE3T`%KlrGZ;ZU$izzGtZhnJrxAxGBZkVv9yW>`}#Hr23ZWJ3c?r&I-GS2aSX3;;T4 z$g_-*XjlNyh^M!T=S=<2@f)@=hD~oH=^(&FSn_mdga|8{@^IGRXC_Rq9HSXL0JOk0 z!#C=2)5)5_N(X^=oGWpEI2{)%qzG)6QAfc^WhYQ@Qf(ZNVzfeqr6FSkYzwIN;xMTvfek!z0}?b)?78*Xnlo zMtYz6PWP!#C%3Hw76pW2>sOh;ndEwgS-%$zXg}a6UFhGH3nHzt17H6Er!5{7;sHlf zfWa{4Fl@kyq=P{0f_0I=Y8Vc~TyP2i8h%~k_|0m2*@!mKe_bLJ4A`JE8rWR>59o}E zaKH!d*ObV#{QwUb%LaI0{iZ;^-3M5IOFSsNu)NsJmZ!~y{vY)h`H*Z$+(812_YuSb z_xTpCI-kvU`hxBCN*E7oqyqIBRq$$inqB2<`u7FSHiS$?0#Db{{dl?BAH*Y@=hl*u z3e@MKTB>_1rE{VMcSJ<0b)ZftFkg%?_jR+ss%%+G+jY5(4Sw{i`AxDyDP^(q04;v z0~#gBR+#ClyksCh*G3j@5i1#x^1wq@5XIJ4%au`=y^mJqQI%Yv zzKo*oLiuXjY*)0P!g}J8;3ubOdNUc)!Qj;v19c@CCiQlBpd{|ye@Ik^CZ?bOO~}t zs8|Frc{|I59*N}-JCw}UirE+xFlzZl@kZXEe$fa9?n`Y=>>kf0=U5V{=M@0qz<-U! zxBtkRM9Dm0r?I7j#uR zy~pkp#>`v?`-=nuTz=59ji}&U%_(V2k>0K?c#9PP>`1^@m2ZPBzfF`l}IAxVU2k z8-#Q);Oc*vu>M9i&^cc~2RqS7)A)h_06aJ?d{gfm))S0i1x7Z|pGikQ;plxyb~88X zDY3w8Wlh%2)lYxI)^}*u#7YKoYj!}tU$DSKX9q?wa9iG%epY#expckwP;VQ_2a8rr zic+gB-88{RJ40jA6arjYQ5Om}{5`fqqpnaqIEbzCNFXs*t7!RP(Tcz5mOs`chekqL zE>K%uhkh03>qEVclMVECo%>(53J1o{JvK@%P}_B;hh?N3#o#(aHqcvMkGP%q{Mk^i zXC(u#OwS_+niNZ-@<@gT(;g(TW8` zV;C9>7{S18`GFmstK|p1p?<(h26D>}e0{36N2%$D`T;K-_^q1ntL2Ix>xS0cN(OSv z>i6}A-n*9`Bp7P-fpjov#a^xqB}WI`HIR$BQwVTr&ARurze-3w44rjDG_YH}|3F*4 z=h{|I{F`M%dw&c79xWXl)Hx}BE-+LF5Dn~BKR8^kF8T0#Xg{!$f!y+Whp&aWf2hwh zf`QxeJTwoc<-G-8>7ky-3kQB{#q8M71L;?D+E2RL@@rH>SIiOwFlnurQ8~&q*H?R* z4c3n&l?+`mV^F||)6HSAnpig>0+=`}`Ph23YWdaaa1;_!eXXP|9QbcxD&dN#oG7&o zMJM~}xZ+bXCFeOgFD-+BPg@^{xqM1$us)n{;JZ;1RP(9wzN0219Sq!z&6UBrJd>X5 zJ7a6f2D%%wlM-%0o*~gUUm`((i|eIn!SUDp1q3j09*iv~&Zql&unY|EZm#|rD&}yKUDRd zQ}6)b(XxNyky%k4>W2d9V9;t0Dl^HdZlDM+A1vJ5Dkvo_>-C*mrJ{k&wLxY{Z-h3m z(*NtJZ~e)))c>{9%>mcZmv>vTbBe$MEEBhkpa@6@gI4fH#yI-&Zcu+=c{eOE$?`4_ zkki8G%ew&uVR;uNMqb_x#iGV8z2SZweR(&L3}lzy2!7{NI(^d{v0&h~+%8rd$6nqI z;QjJ3ShS`qU@^h+Zb}3Y;L-|Cz(rVD9U7d3;=w^|m9dw1Q)TeWyC^mG@@^y-b#M7z zw*<@h{-G0RCmZOkFkCOgGRS?Gv|XLq<=x;{aXLD<>@Q%i{I&+xUx|s9Y!>dT#|k zx{$c8HFV4mq=P}L&*?G~EOJI_fPAoM>%lKWGFCWP4_-PLw5BBS8YDwv=#(S|0FPE; z!mr9P9EPS4y>Q^SVuA6O{9p;ml3!~yOjpC0`VURsr4Z0UYeIxoF^0p?2@ymCyJd;- zdKklCs3pb#;L*|nR>c?wLv;Yrz;0RL_zP~ZLTSOx{XX`BTPzqgZl#Np4nMgX=&u_3RxWRy_ ziWdo}|E{6vm14Fsf8DDxS{eXMo6xzC4PTLdZDQpC#I%X1tbT1`!~w!6Y9|~~@24m& z4FG?xTY~;c)s1b9f-4S~Hg^&M^rQx&Tkw|kWkvfaS*(JaBN(huDB!-W;Z8esdl3uu zx4n!E0%I8M5O_oD2LpkCd11M_yj-s?W*^gk>-~&w9T$&qmjnS;n%Vj*hz9n{!2ayG zSu1?HgOvq2AZlec6WE&-L;P@j* zNIxP6J-^yFr(M0AH@gKr%F1_{-;G3)#VcZ|6-XPL<`?T`aesQ2Ej+M%H>b;-4ofas z<*biuGl$d3>g&^LaX+)=XDn6`4p_Y|=}O*$R1&(EXvrdg$@fJjHEmXl$TRba-;QMd zbb34i1HZQ-XV;v9|8fNr=mOqmf1F=dtMy5^TIp_qU(e7HfWRwlvA8%rRUqtFAJ}3n3^?U=bvP{+wQzE2 zR9!hB@cL=C4NtW6va87{EGfaYsOfs)hQIyh4`Vhcj|#>w3ye=ZvywSjfvG9!VDKi- z;BeY(s=ag+>Wfh{6kvdjv-aPdj=R(G)^)wOucpQ7zw<`_8|yOrT6+!#oW2JQ#f1%< zxeB@Jy_&MI#QwFXraG~}?lpCAYfTzb?(#UhW&b;$*Ix@0`2tD|5FOn$!1&M z2pa{XfP^0S1)_>A>i*vR3VEAo#euR=ruRrsK!6;un*8w9GI*lu@!>K2Fy zoJCz#`j1LIA^_@dv09I6$z+zwU2ts9vY|(ad2&%bZiHNf2y*Wk&0WTwgw1D9EW~#%I<}HZ8Q?ab_T3BFZqdKp9U(#uq=@-Q#z8BoV%b|f;MqhGMj<2tz z6<;yxHZj2LGaVYy(xW(EDVS_V5(6#q7*LNuM4YOONF<)8yc+R$8j)uy1u5xBWJV>) z6ou7EwcFKO{!X6JbOMZQ<76gDqY(iHh*+m+Ole{!XCE$?drESV-O8<0kVgtz z$;ocDmiwiJnkV^Db*Qa1T{dgJ0mmoVLIufp*xLR|tsH0dSUmGc+DO)8f(e2@W(gV% zeu5bZRG%z`Hn5Pheyf=LnodeN*k`v`J5G zqho`k$*D&KK;3!;dMx-r)6>}}DhYSn{$)PDP@$lp>VmBr#tb1l&@ui=f&)97&=HEO zX%AiYBoQp0O+b7%!4MG~Z9ohmNtNgYx{SFNhntYzO)&s0W0>zy6EF+_!O(hC)H2cG zy50&lSg;l0TpP4tV3u!Pn!(*{>jr>enAe>=s!yQ1BnJCotox`{Ro<&wAM5>=?%#R9 zd&GI^AOySV>K!dm=+LGVA*apsc&rxJ8!0_hJg@_xh-iQbp5N)vs2SDR;iX{HS}eST zBk;g4*IShG_cdh)glnHh_cRe87}~@(8X|7#gBkEx{S{AhA-Yq44h`ILV{t`C?BzSn zMjwj=(wqhYquiKA1!?5q-*OmzOmkphmh&H~uv%wi z6*jv6@Mz$cij)goZC(N+fT(MA@31(zUrtHe zBZG6PeW(jnrF_Js_ThlR_(z5IA<`|*|DhoZ1|-*y3~DJ?dw@(%^-RJwMg`ZdF+rVC z+R{zU?3gu)zx9Zv98cTTBefa(<~VvpaLmP-bo~{rdFCdFqsN&EBv|HJn?5lwI7mBf zM{n&I5gc>#2$f9XhyKy$5f%!pa{h;k?t>QQ369>U+o<50%L3@HXgYD^S&p6s2=Tzr zF4w}*MkA(p82R4VBV>F|IoH1WG-X#ZYV`JPqe6eV_SIi)R*!@v%INJI;(=ez%jojC zG|%W>CPoCuTt<)1Lagb;&>Yz-W>drH8NCz}Jaf8K`-3i;o1C-7h~Su;52-J1bUqXT zf?=+As}JJXh-vT9dv_ZZTywb~_0#|2588KQMy>Bam9uXYvMkRK9!Nmj& zyW$N&5ZpCG02X-V#=VEtnm?X6`nYG11Wvb$mUfH7RejCF@#jB#Kcg}R66BIJpD!7% zvobAN+*{A%7ovhcEo?CEZ zI&AUKbrv~?2x`d?5m3vl?oHy3nH4^J1aD)<2uDumHrV7#@pR)Xtyw&)v(xwgx1hCP zDT`^*NwgL~qDfzlGnddBc|ulY#YwUkLl(+Cs=8W%<8guh3Cu;(gp|N_r)IU zzKK?b81)u!-t0>{A^_sa1}jd}er#N^*T`EJhGXXLg)fgFC&A2hYKE$;DWNyr(f}#*~D6cH1XeJ3d0!WY(B5+rd z&;A!@HP5w2tq{Tlz05GWs~)eLia*0K*)ZxrK`>)~KHqec_UBPMD8`FwH$^c<1x0(_ zYm-bE)a02rz~bF(=NO=c11Wp*D`o4F@~gT0!(9Gl&*@MLoUUI z=7dh6lCU=)pU0@6C^!~X_{QV&2owZ`F<6z2M?$8tCmDm=$e=0=aO#5_9^e8hgZa#j`$ z)NJa~ejl=82^GAeV=^fsp%?-*tTSL}P*R*_QgE~A8B8<^$XFM!Yu2m9W4f)0?y;u@ z&Y5`by!gDnl^FIj76U}kznDVvi`7=z$6wyRjNlGF4hppFM#xk@X5D9gS<}t#Dtr*U zQt=4btt}1_ByE;SAbDs`d)odZvn-y)7qg5ZK{Kz*1Ks|UV>!MqBSet2%L%rspHNC~ zeaD!N*e8l_W)$_;h5;QrmlEhWb7dlk;=#I@l|utLyAO#W$5|`Gu{eG$;>dx5YTQLa zecP|ptOW*YPuKKR>+BQtKXbZHdoSEs^7jQPT_wXfjJ8O?Jr}}Vs+Ve|7q9+DUqmkz zpwEP$nMbz%p)Vw40`S!qAg$0Y*406}^{3#eTP?DsUX2_I2Zg9zxAnuZ+trE$T%=-3 z)k}8NTg8wGz^Hz9rytY3d)uuQ3ApEj7FE0Vs`ZNYqOrr-hdr$*6bsnUkks!w^_K(h zYe;S3pzvl;b9)(PJ=gDO8#1g8{<)_PcmPm&HlVUu9S-U(F&6$Gd%}C6fPBG0-lHSO zkqh9bv>Dn0jbu`Pcedk-Bmyi_>LU@Y zw^FT0z`YdIjY7YAzgp0xSrh}X&iUh>bxb4!{CTwrYO&eT3vPS$9|EQ~qxvF4nD){5 zOClM_@36nmFHdwqsaoQao~$ZJG(xgWBY^>@@8HXbv&tGDSM+dUj#j~$E(p)iY9WEy z3zxKm>NumQNxwl(UR8cUvcSv44;D+Z0sgcppdZI0JGv0wtSIoT9Bw2QkbmJJuj@yw zJr?vo2~LXy)SntC3FdFQI~)fSK|Ez3Xh)T8J+?vxb2bhsl!`jNdP(mista`vvrp}x zRP-Gg8-9veFdCWihN9oyK@F2>86bYUT-qIw4Yeki`Ay$Z-OgWA@*V= zPB9AjaMq(s>W2ev@TyW{Wmzq@#K){C6Oz4rA$Z!FjZTfms&*VEZGnt(|<^J^}eIG2V zW3{1|*48Fb7|8_E6J!eC)LYtuHCr@0{@%X~*m`xbr)>rwBm+$%6JXDIu#UF`3&K_j zGL#J97d)^UQEAGhM?1D{&ku)OZDZL04{E(S&>@|#8Y;&^52$r08Nkm3wLVbVk{X$X zEtq;q%BH-Kl?%|QwujSBDVv8KR9i0@z~tv($%n_AO-)zfF1ntqEO0GS&3O!vdD4@i zosGids|ATO3Ec_>+*6mw9d*Uor}ys6stajGR?v^F9OJTDGC4STdtrY#D-&?f1hu0q z!d6<^EC`5&`Z=k9d?JK=$Zu0DNFPXWN+O`14xq?a*GK-My#iwq&>$3mVclrr%DRO9 zb<+|7^?Xn_%KtsA*K`Phuivfid6Q7TP%wbQ4zX^oR{UdQ{VmkW1YD@n&Hb^>MN0(K zlYvS%>jRHfFxM57X+&~h+x3C>z{3{Y zjo#t4L_mct`1NTuwo;8qfQ81Zz|RHdqkfm4 zcP)r_1ltMZ0yZ?9yeuH@N7b0R~;U(BUV8+F#~PH0yONQ2kBw>{%+5R1X$Q%)P9ypI!q`Sz+s0` zzfaL&0=a;FA!yMqFJCZ45E?a-4Ct@}J!n=FbRZ`ckb(Wq?|puER-KO5hZ7&;EBPDr0hu=ZRfPl^0o{ic$vaZ$b zBo&?fpd~}~uB5OgRB+773r+}$IN$T6Z`Khhk~>Z#M-9qzyO=K@L9@co1;_E3n4d4$Af^++xV`T5qD2H1QDYHgKNTLv%bO{0ry(fg8E z2#?yV0}0GryS2*aE>-B;ZZb$WpPXTj#>atx&+AZbi@G@Y7ObH|XuiebkymahdI$9= zJ&QG(W*i7K<9tv{Gu~e@UB0gm%AkPJJ5X!8talI$rGl+QkeqL@t%m_8SxdewLuoWE zc@!{u<7!{+uGOl-y@n2qP!g4PSvFffrCegu z!0%#XKtSic3>`87+K*QWZ@d+3gmALEI0Z;0#ApdzZSoObQXP|6fCOUixLUPangVIs z$i}x}!Gyp`?$VdT0jck~Purx(RUT;pvDq($sY=0VAt%0zSquhx&s=@8+Rc7N|MMyB zx}5FmnjiWLmNB#>!-A0sz^AXPgYNO_zw&;7g0z7Xblj}pb${_vf%t6n+j4bP3yTZ| zIa?>Hg$cPpeZdt~jA-i}3NRkFV4=ZDYXJwMfgRWQw4+TLyyXw7G2{aEIdD8&SNCh$ zy(=m@GbO}k56IH?guldsf%{_obD$4K)df2*AdZ0!WCQ()>rJ(oeRli9Te30#vU}Z8 zOEHLvJODlAfikKsSO(yrAQ52Cda$6*j6Mq%bvV30C?JFS!Lk^}Q|dyZ!l{u8WKc2KrE@Y04}JxV##E7jO~pE-IKBh9YxR;!BIZAAS}vQ9%F=AA7nH z{c5f|>or2T1=JJ}IQ<~}w#`YqTxgmZ3;&}atO!P+0&)=|Sbn#FrDS;pH|>VfODSqN z@RP=JS~?MSg^oCuTM%%0H>^$2qNnZsZS!zTdm9AjQE*RUC_1O87z@nE{*OD_?Y$z8 zPZ7_(JGaa(M_S0Bf0eFpEV6$u*V6L;zypC3jR11d%qGktPwORjvH}!%(WvgfPO3ot z(cJvP#~MZBrWf8tEkpymzs#^xffFr@KYC2*A$q}__T1a2ka)HQFE4~(U2JpcU{Bt} zS3l7$eGl5KH!kufUU~st4+nlU%6bV2za4F?(3kkI?21NNFT0Cf00wS3yQJd#`sGK-*MjqbaRXM z+(B- z2aG7=;VTsBN?i6W%6NF8c`e0DzcL%OAjO*asB8=hbn~{T8&!_Z!0~>dU?D0LoY#*> z0;?aIkDKQHs{X3l)Ah~jPcv%R`Icg`Bi)Kp?di&?qj0bEAJq4UUw-hxvRNEvyT`|C z3eubX)dxTSz~#raO*n*rq5HQiY6n%yf&USx@~EI{{cBo3S_q_la;v>?(R;DOaB?%c z46#58*H{w%Zxa!;p@X_o>jsJ_8=A@z~G@wK>D7c_N%1WL0! zrTM{Z)wFu#hp**`J=;-iBZD#}^p%%)^))U*eMm`sbr(XG?C(b=+rk7*8)-5$H?)$N zsAE5)P4L$p zWXE*n0xGETz1x12SLv9&yA23}c9N8IAX{FUv(R&jXSq(Y+_@7pQ2SY8l^@ra)oFb+ zUEF>{+bx@ibibc5QhwYiPV{A|7NMU*{bJoL?*GxKx6ncT{Q|91C}_WDUDje0XTT{u z1P0-smJ#04c`0ixEa|H$Nk`xy{#OOWRSzt&@%3cvSqA4;p=E7MW^dXmv>2cYb{6gW zzS;`tqX_Yx)Z&D<6U_NP4h+Q7h#@YkZy)9NqKp%F@o*rQ*V>^HHo;DzH3P;GJIp?+ z4z@98UmfPn=}5VIw)Yq3{B(03XgZ|!UHS=z1O-~OPU`~ksH|vU#fhU5Mg|3B!ue%H zCZnL@EMEy7;DC@_ce0-bjb<+8riEiEgM3~X($Q`)S|Pc5dz0jV26ACu=rFt8&}C5T z*>AL+-=zzhw)~!$^O6Oe)>tHvdMPq?TU5OLtl*eVB(L4|A_R~KJ(SbT>OlGLdjFta z{&UUW#Wvg#ST+e1XxS99HFaAy@0$va#gr*1fB~IXqAx8SbWdiGF4}$>csjAMfB_;e zazrThV7+z0h5V5?k%a~Th1e}xT~G;n(L~KVSSG{WB7*}$Y~x@z@05)L3=lCPw(dCe z{wa;AW+g_ixPL|o{k1u=w5KE>?UfbXPH6(r0{K=u4;id~u5BRytvVerKdv@)j`yV! zRIns*Chs;jn44^Co;mG~$!>3{rXd}{g6~fXG<~@~9j>#COQ(%zsyP7$XOlV1>)7lq zW;=e-{zGzvXOaaXSpK3wvvvnGEdiQ()n#K!fF-DfrI;BmUE{QhLp3D zckq;^aQcyt(82!yE?`fGHs|eL%y{Onl(6wV2#=2%n5=Hz!j*)2zi;^4R7%t1XR18_ z1=kXfr#{=z5K~?8yGbVUcoFQmd~-%UAzudzz9y@ew*|FND`O0$S@ScEAw&h+5^K=k zWp?pQq}>P>d`reZ{UJq2dSfca$Ni{Fqhg&=Ia16kK1XcM|j+(!aj_;hkU1eyt}>7pJ{&9{aQI zhyeoiJPChcq=Uh8ahYnjBZtpw<<=l@2nOye39i~mzNNGO(!uOs4?~Z{gTu2i2f9Q~ zxaQ}hLEu)dgeo328Hj4+0`-}suF|su9}cUk77NV8widK6P&jr!%(fs{z{OSEOb9*< z7lMKNVyt8Hb0wT_DmZr!aZFzhWCK0XHeEY>vF2mqVYP-};64wU#>>#8??iVDu`cA} zLB{1I13Brxm$a#zzvgpTPqK1>n&_GKuu4rlOwSMu+*e~gtDm>DgsgAgW3~NHgS4H< z2a6Y4EWSPw36{VoLkU>Xz)r>tVyFx3n}*NB4jVIK@!*j7(G`u@Y~6?XQ6pBsT+>aS z6JQ##z)boU&3A?C{D<`|D;KD*#nz>NoiFHFp800^mu#I2vi^|CxX}~Pfd!KdQUlS*;K2R$er)6Zf^R7t*aJ!`v4H zi@4&`7ejH4VBofNok^$-)ip!|JJI!lE+H49&|!6kU=f#|2%chyqP-(pFmRK;r1EjB zO%Ll!Ml3K}I-V%xrgeQC%L6wFxz*28hTMsKut=<%N=+4Vd(jg1_35~zYdhE$AJ(%D zPBgI7R#!WtC$VrV7`Um0OE0?(v~VpJm}wj9yT#U11YzddG9?<=sh(*{dE$`=dN3;( zxXBbly;{N#kHe-IRxVJJkVL(txY(~Qc;sOrNgx~OiLU8hed&zwFkM41aG%B`$Rue_ zE8c1Uk3lnbEft7~MW5*A6>)?b<~h7*U?*vHDv)jEVQKY9Iv6Cj{fHj5-LOt`m~C6R zK>Z=D%aB`9*GE?ui`gfS>cvSt%yF3qpF3tl)H!N3hfBazLTzpt*XE3C;_4)p@}TITi<;zT-b-IAxVqaGu%=@8;#P!0kQ%dBRQY;GWZC!zUpL zRj_Z>%g$4apup^V{%ghT*V}{I@M9aZChNwBATXTxpp*ih^JV?QL2`{}#EHli%hc3QKPmg}|!*YkMEjP>zAVD*;&Hel7| zN(wf^d$}^F2qw=cYIw%XMq(7ffKlQ*Zquyv4xMlQbhTB3{3ZQouKX|?ZVc_6G8ov+ zyrxwPCLgS}be?9Vw@2z%+xU4#!3GSE!n9{MDA*>xMCtJpdaL$vkurz+k_;O7ecPF!R^m9!_l?x;3CtG#Hm`TV#)(VMgn=KK?|L)%lt z0=Hy#5tgTpvt029UWUf<91IvGxv-?D$_25OKQtG{;*@ZrcjzQFjmil);FQc(L;hbi ztF1Vm51p;@Kw$NTAI{WB85R~db`)H-@1-(>WE%u*l5AI4P^~h|FCHIjKD-^8?UJCt zEb&#X;^GTBLw%Ki1YSwh9h642dC-?9^I97kb?4x~@GreB&?{Kiw1H&*nDY8GQ&Fc_ zf|Pc5;^wksZ3o%>#PH6-2KS$ra_>A?jy5PW& z?Rf#ivUJxtJueRn#$7tqk^41W?81g|qw6$)%QC!EnlB!QArA+JY^w*K++?fgVZk`a z%6ii_Gd5*5HrpBYL8kK$$;uX@f-kG#7T;)k&JZ4_U*%!JxJ<)4l^>Aj;1g*$Ls)`N&qP6iWPf9l1gcC@CO6aowOkp{!}Vw54*@D*{vnT;jIZx3=N zaGY4O6Zw4J9o}L>-XSu0vk@g*>n^V`PDI%a4d#L8K=%EhcSB)H*II*NYi-4`;umHpB01WbyUQR3M^(Is~=@j%*8buNfU~rWOg2bL)Xh%BxB@RF8xR z>LK=sAOX>to1Lmhh#bH^Sa(GIj5UQ{k{wEE$<;(Q#KD8}kNgOm<$NjScMGnDk|47F zCn0U{&tr|uEaNqAgf;NN`p1$Y!n$U2#P@H&LOcQR4rY$Bjfh#~f{WWEy%ZaW0SDh; zUysbUBhS3K0ZoS#z&(i0JGhIP=z@#L2P<4tHw?gBj0Xbi{?cv@$>pl2iU)EuP={cR zi*}>0XP;N!JhoHhOL}pq+4C1j4OveTalq+2E3;R5_EB@%E&Nsc zvA*1uPy3gwNm${gtCb;v*~?&dr=oN3HMzUlzTT~+L(wH?7dSSIbTD`U4DPP3wsaO~ zU(YURQz08?mYm$+;8W4SeuKxR&}x5NRs36nw+p;VHwO;^E-$sYTsHen#h*d@)nFD7 z4*WM6{C%^TFX-(D@otwdhSP{Kz{c67Z@MY$l93Ju&(Z6JGkS)P{!?Go`}tm7eZpF0 z!728`ad~{atL-)Bykr3Xh5GqorH%`nwtVaVeYe`%h=E8zJpm{>rE?|hQTvC!SdbZk zU8?4mmxgBiqmcDvF+9iER+ebKUZp`J@#_F{;rP_y+i=Lv}$G_oh~nHdTsI7 zzfref&z9;CasPXW8oK9_o{^B{0{Vq^5fwnNiY+czV~Nbna}cbN3fNH1mX|8Pw{br;$6`6)->QbCvmEMr^btE&EH(o?wqaRd zD;B`dsV=29CH?w0>TK$T_M>cd3kHU;FSlg^^4SS#bag>a;r0JKOx6yH}kc4^Yo|^(m7Prz!;@ z7)inaZ58Mx3UJ~jOTFQYM8GKz5^zyJ@_B;uJV;w40H5%H2Wi;->poU*qyZ*qHTA=| zt>z^HE~wS9Uh@xFw6hnL8}sj+TcC3=Z~Qy$+MjviWNV?58} zGcp0GJpPx}!@ykG;qyF?p9%z+s$cvYr9N1^^XkXQ1myEANO6Mkk7sqd7&D$*C@b~9 z+bD?%bI-HVmPFK1^}R1mAg|mhtI+fMUL*}Ls`bo!b0)r%gRS#gkC7Qd-lJF5t$Ajq z;^#p!G6AXDF8Eng=y`3|k_b388B2Z?N4)c9MXXf7Cbbj?qTaP^4@LnWafIj%7mpHZ zOb_7X4tU;}-WCaUzUBabyH_{ks~kTaK)zgEQMR4!k0m!z`C!Q)v$8=!Il8!**r?|@ zI!>qzDmLv9(71I~jQv|Pp_W_rycjzchuXch+EvRXtuP*DzrOR}7a!U`&*vtyFHDX~ zj+Z&PCK`5sm0-Z=J29g#>f^&^e}86K(gR(K^+~t^r{pl6TqjbiEoi*Sxu8U01=Q#a?ViGXVYQ}0Q4+1u^e+*a$ev2VA&_D7x;PkXw^r4$V_p}>V{ZR-Q z3l^P{y#{Tu9ORZJ&J#dFEFfQ3RXaA#`Y>BuSF7zz?-tNimmVxC8MB>G6G6DYvKZj< z;#Y@eJNu`*zxm>0nt!QlpqBc->|kARBd->x35bFL{c5YkzIsS&DB_ir1sjYq@S$)} zc*#-tWQ*F%ubLNZs$uY3k^$~jk0P}uF{0{I!GQLvM+s$p8Tfvx=Y)g8x7BMqYPX?u zeSSd#HSXk*K*0Q&{@2Bt9wlJ)TCm>3pjdeT`BMWTy(m{Ov*s|Om*i|c#O+r->tW=f z9;Qvm369$)5C|Ak7j;?VqY>N0$^(e03vD1ISIeUGvo8n)%zxKSzZ2fgDaau+Ew7~k zz|>=3Zz!M}u^tczm_OI`*w^Z+A|9t8)5z4tNd%DTD+lRGfqs3(hy%pi^r#d))^%m~ zrO}^0)w@>7#m%tAl!?BH10ve0S8K_73W630i>!y#5K0EJS3yaaDhL~R@Ro4kyS|-v=}#Ul>fMp91Y)i9 zoVHM#Pr)jK0!FV(W$)51SbmRSL8cT!<2FguViCaPHGGt^z9-!uSnzfrWM+vN0Pt`& zg5FA#xh-uT=kL7hYa?ypz<&{(QKVXYeOmQjR)V-l1ufY?cmB$iST0RxVlA`a_(~q% zO9unz9l${LmVLcLA{of9fU5hQR)ddp9f;5o3f?D$L{|Cc&MzY#9G=4$;2=8ag6S+| zvFNc+egS2Hdnr5Rf}PQj#v(&B>fCB^c`Mz}7EgB7wQH??6l>~(Yi&iN)-CL7J&aC* z4bi}U743u8HU&P}?;AdfD|m|-BH1R7paV0h z$T+*c;|&iW@}OI0+z`mBVknOo06bdb9u@nXW>ox!t)b(d7Y=;a9-lW?Us4)vzf_yb zZ_{eL^i)Y-J@5eF;q*Yo=$M*XY|q$4Up=&i1K*9nzKAs-))@MZz>IV-aQ)Jjq4(8} zD>}8v;`i;BE!jYKBcLs@tS?SiEOg%yFcvJ~)}k{Uh-(D{H?=p~)RCDA479gEIPl%* zYt@3$naMHq9eoqYKu#@PJ$-VEc8Cg@gn^bGN(Y0~(#hf6x?ZjMEtLZ;-OC2Li#M%) zP=Zp~tiAV*H#za(@YdR9n|z^9=s4u!xOz~_-oId74|1b$Kn4My)EZ6Tz^Y@QH9|6w z)7H4I4%YAT3#|iNBN7h|&q8ZfQLF7Ge|V+f*+Gcn8orE+1%fY^%x0FTrk`zVnajRyK-FB|A?MrJMWVYS~ggEin`jMu|&NLCd1)?jPqo1Avu>* z@U}x&->XX}zHI0r8geyg!M*xBp9fiV z?|*GUMB|_%o&yHmziP=6zoNy9In5p9*NL~&Gmkl-65nlCLLXHR6fSm|-;YO{#{@~Y z$m-iC{Xp(Y1rIK^bRZao01BG#x8%45WEk(^x;d?vpNe-M)YGXnf(GU9v?zaE9jhz4 zoePY`*8k7ZsPd4Y*!Bu(c@;a}rG*G#Bl>t=AqNb)-5NbedvK=HsDT7Ux6WDuNaf1i#;*L5fH2ReQ?(uxcKfH#qCk+gknN z-X{;}2FTAF7emRmIi6NURA{w5s<%H8N1yRVbqN$Sf8J`E_7`NMTE(|0GQE;6{k%V# z!IlsJ{SVHde~)erWc%9H4Ny1WXVSJyV88zOk3l;C2km!S+Ww!X`s6mZiRS#f(G<+! zfm}N@i3@MPR$N(4ju)EnkcAX?bS))7M<`Yv$L7A(~1)K(fln)Q0!`cXD>{`YpUjVm>}7X zP2(1zcZGz#^W%knEFuWHZJ2Hfk`@>C-T(Wzj?y*r;iv#Xuibr+g`({a&YLfrFPrsR z9mixXa=h--1rFNn*%SArI0%h5dy-*6wH;M)-csuBXA-=0F>y?vuo=r$av zwZrPLEJdn!PZwX&A~tKY5Yyt7)|7hW(Q&yUKm=TJ3L*#15x zRltI3mxYRX(Wxvn&WbV)>G7c`XEI*QbeBVf{uqZ87r#M=lmP}^rn#f9Zo(lkfS}i2 ztcjIxj!fU#uNvCn$=@hD-eOH28k89y8dZ?;)LFhG`cN4cWPj1hgs7uLOD@Rjh@%Uh zCu(8w+0!BhsKBfxRQy~t<;&4#D;?M%{mXLF6bY)y%;8@1F&!-sR@C>?SD?)UmHF%P z$`ni#cGFiSWr2#cQ}Vy9j*DyBL>SB_MI#z7B`>0a=+9ajXFl22>h-i=Uw%>7%bMQ~ zT<}_63yJTt1^6KEa<35WPKu~IXXImwnGL(w&BJ5klL6uR(HsaEy|(^lQ_VjA-R%!= z(anGA@a8-CA%nadb-#me~P_3C0@?H_*txp_Jc1bp7ccM%`6sXNnH1>0sJSSA#s zfDzwbv<+eM_6jk;hHo!b(y5X$pHbQ?0s)_Qq1LFqPP-*7wPz_6Z0Ln(xy4c(uyTI= z_Gc7a(CaXC%hpD?2BEKCPelX!dC;Z;%EMeXYr5Tybuk6UfFLZ=K_VH*PoXgVz7U_O zDY)Gla#Bz$6nJg~A-v`4u&DNYxY>6E3B>|4tfL$y4X9%hA3Y0Q5SeUvP;jgXqEfYb zxu|7mL;BZAY$%irWEYj#`X1DB`IZiHum;>WDrpM`{)*nYG_flHeHv+dD4Vu~dL+4oTOyXf(I_fRhth(4ZBzoGv!E!{hw2;~CxHMs2C z^lRuDF4q-*NVMRPEM&&R01E&fuj8ALhYmxC2k#LIQcVyl5(yB%gw=>HM~_morZEGrN4h-x zAj~Iw+X)K*9Gw_dx(tt4JSXtf=oIyxgO3UkPj9AIB_DN_DVqv-da_$_1*A6zs3^{o=hN zg;;V1xe=~=8;-0c1G!~wxm3$gYjd)J-qN_7bQxN2G4o3o++{b^$4BzP;uWYZY=^^fFI{R< zaHSC>iVXqr;Lx&t&JZchgzW*4*XX8 zt0MXtSDwMp_7BB_gIleH4T|;eyIL6w7IDRi=}=rF7`Ux5U3y(%=$Ib8v(Osf=vQhD zeiAlxd~>o(!-yhkEh#LlDxhGIjsjIEdKCaJesrSr#kS~}14>!J0A zXw*9z-Igo$-c=CYGI^LGqgzWpSVTQdm6{@Yc5;Cl`E>iMp4qdlKE$WT!hs+8bXP=P z+8W~1Q}N&sjp?e8nnCb)Rt_1{1IZcWDP|A`IhsMV>O4&huaJ`%zGZPf++@1iP>b`z zq4Ow?Qv7rgF_$$Yj!LA1LCfYfgXwHO6b}w;D~R`Vj?oJ7C7nK(M+2eKQ@r@fSi+DT zS{nd*h~hb2Oj_a{5?6V_z-^5=UHRRiV@@O=EPQU)wgO7Y#@IXe&Letww$ zkPZf|9-+!i)+4-d;71XVG8lwsOkWrh0fnMv>}euDjcr8(+pl&Q3n^NP>b=?_VRW%k zK2+^rW5c46*mw-EaXb6eq>z*c-Dr<4c8B zrng5+ezNZzfCm5%7X^pK@Z7K=s~rXTbj=S2*# zVcRG0Il9lz>!ajq7P4@9C!HifyJ{kPB zs1E$HYr!6S5zq()+*2W(_|SHN3zYHV=eC~+0I!9&unYEGi*Q;dS3CLX?IE>G9^if^ zsGWN{j_EfA{#~r0lZ#r0pvOjz8-{>7xd08j#<5XZB{t$7(lsC!kk1FoJvMZu$FkY3 z`THjdLL^bYp=dzAwxJsuj&uj;VRoDTq%Pz<=o3cj-`I+mZ0&Y3&1A#a|NZz)2c$n|& zEAlsczUvp<7wZ8;D^ipgJaBx)i?~hoyQlqu`sR|ZN@ViEJAsKl93hE>;mG!JsvO@N>uhXVl(ivXflmC6c zYB`apS)jrV-HbV=3XMDlNbI;h+bZs<&w2&w{-Qz;wps=8suq>lU?3EAdnSfl(+#~W zVnGNgAsU$gd@2MytiIvl{;r>m&}AoDBESOU-;3R>r}0~XfC{YfP}lcaCH6EDBM(49 zi>V*f3xOMM+q}Ci|ED-L<9FNgR6Qr-G+W!v-{Nig>G+egnOq;!cQ&A$~8_j{1+Ap zq~6PrI&J3%dd7Lj&+YzKfzu0VbP)^CK<;~+)B3ow&l%GG8DWj&E2!F=x=NnDw&NXTv&n}9JsYK7#BWP zhx>DyNAo^qEDeg7VEJ0A!Ov-X$gEm?eOd``8WcPOn95{z7XyLMtLeA8m|7wbY^~%< zm6E26aKMJwj>`iv^NmrpudSc!fTBrtkgVzk=Q-u3-yfCoE= zRe%O&Z;8xQ!iJv9W<5i}i;}5a*1Dmtl>-B>mQA6k=&i=GsTin}&;6AUT8+)e0D(`- z1AzAa#5?n`JV1m4He!#HpQ{+V$5|vW5_=r=w+)ScLX=t(Gn~`o0yHrDe%dq4D7>gB zLR`<4dC!m6;>379QqUlSf@jOZ>?h*wQDa$Hgww&M-t2@cp2uZlalqykz6~$wZE4nD zmTc@PF)O1Q0|PEE^IRytXQ`BIdn%`*QNW}%mKeHJX1;A6Rx6&+SYt^W47^&tz!dH3 zYGe5V1`W)Fw%eU}RgK$r8U;**wxcpP*LEQocnMzUYcbU|ZojuUVAC4szKr8@Ce$5k zoJ)|vs1+xfa+#^XSaC@V1U`a>T#P=sh8z+Yy_@<+KRH*PNuL5^J>~C48frPb|N6ha z^(Ws_|K}DT5aAyQ|G^T^pw+FYAouJQ=hiW^!OK1+yePc(Y}4 zfzG6X`CrE}w-gKd%CeG%oGDmE1J93AUC|vnTYBV*_6W>w`9I2*b}^FPvbfOUkIUGq zW%O;sdX>ebbO8*$KP=A_*K9Wa|Ka6k1DJqz@#*R(3t*+|*fu5K+)VIxF=#ddU{IMQxtg#~x z489+vnq@yzG4z4%UlHyxzZ^-wo!DUgei3W4MN8nkoRYIgK9BL?`gEk-WqfjXQpO$` zj9WgKZ5=uHJC=XQ!GdcmzKlMiZ1$taw6IU>+tMogSn*{R7i{yI1zXx&C~WngM6(Gj zxX!XY&3?3?UB9$7`MTlv{F>R?vK9M(|40>c zoKP>h2j6|XU7)2t-0v%XfAHu%n1KaXxi^F#eN^rDD`BV{y*IGH;M5U z?PaXlOCbZ)K=zqo#VPNxT&WBQOMP^oDL{jBnMHr{px*L6XHtu{u;AL74Y2K_lJ=}> z$C?dfP{Fj!627SDdQEz)gWrZRsU-x^;9O=2IyKCycT!8Ru;+2rix@Z0)xv^nnJu^+ zJ(Tm)6Y9n@9wJVCB{snN0?u)LtMySNxxwQkYXhV`U6o zDN?qg*}yELohhs-yBb3Wd7<{FwH6ikqWq6d8PqUBVPz#wm+M41=5Rh2&J1_85?A4Z zD&B5|s=-h-8n%8rwOf@D3IleNXL!4}Th0Yl@3H=-OOets0M=mVT{@aW1x=OcJXg+T zKOC&4vjrXU5O#}q6`f^L=nU9S-00iA?Fy|)&yxp+Xf49oD*%iRMuIJDz4u;9B>2%*{)pD+vDcoQ7v3Fc)p*YDP1Ul8IZjl>!;8h2LIF zId&_*HK<@K;*Z*Uy@9by4hy~_&e9(?)vGwr;C*PLLH@_|VkP!1fp?MW<3br93cQk| z8(^Yfs~(2P0S(^!Zpo*~%i-c$n&JpFTqG;=bo88VFVhn%0x*b+B$!lzIC&*FS)ldC zavN;W7jc8=Y3)F)?Lg90$82Fi>NH-dHMMKJ8Wn6sr*kvRZUn=&>U4lxWlYth3Vgh1 z#Ry!EQJh_A$>>k7+_Qe2y1fF^R0C6?^>M-jM`?>7k&d&Q^h$D~RzbpnW_YQiqg5KA zYTNM^(BLgRIF*ypcD0-1a*SdzTQVA4FcyiLUVRZP8;HFTzND6z6fig)yH3S9vv#G- zalu$b`&9jfUKTPl6MTqhHRVwufQBNOp@XJ^odeN6#?D^+EfU0ZN@vz2%2o+tfy|Ur zOu^fg(oeu0Uz*Qe3TAEROF1q|=tRNA=AvK$4PK|DXqQZUqruPs?sX@706(9>Qsui?dnvB@I~&zB!aEVSRkW}Mf{tj zSw>d@3*OW!8*`w+TX?XXjJ5LMQZ80_@MJL?&2R^&jbtK zoo*x^8Psa&ritW1txA`}a(q&n(2`HXg0HZq*qgM91b!A&w2k>p^3hhM%VAMEmv1B1 zEahB9@4VR1$R4;Tq06|Lk^N%mkL-)Mx}dyAj&ZHxssoLZ7Cj|xl3tCZwjZ%p$WFf% zpdc)!F!H~N({6!$D>(V(;ez&&%}DZ#^9IG11E$vuJg8WolvEj@!l~tCKBnW2Lht#n z^6C$Y&MeK+Rqgz$l#scMVn)=G(NBqrZf+s=;;p*X z92Pb$CgT?Bbqygjw3>{wz~FSOx}gb_MX57)T1qj?(YePK&?u?X(S_!1S`C+~td4y* zG;OmeP1`u}cY~8C3kMq(cFMY;Nt8ut5~XON>djz&7Nu1S&0$f(!nW!UQ@XQ2AZ^vR zx!7PXS`GbmQ)|->G|P+S+pb$H@d6sWo~7+lCPN&kUSvvaVoIDA7Nm|li5E`=`0BHk z{5~s&Pn^UtX@D?2#{c$=H+DxmC%>sk7s7pB(wX$s~6n!w8 zFXux_cYDWkb)(IR`samyo0$G0U2zj}(Y?hr`xOP%CpntWepsnPWf%8?J1Z1%f`c z-+9dT~lq6e&2<$}2P?awRXRvBFk%6eYJ%gPqEMpaG%IUm~JRph8K zrBr(nPn%fa8bOu@k_3OE9WJlIpInw2K{~(<#Awk`G;>)XNT{^=Lai&wUer;gc{Gsp zv8`^;kIc8Wika>;;$aF49q^w691|fRV~i>w z$lmhEGWFyu%NFsZGRu}Dg6?jKPF>*7@=zY>;F9)tQIND8<^^h;LUNt`j*E!x}mvOmNcTB0I6Eo92T5+@a2iJgj&vEDI**R zKn$fu1>*yJXc^^K9|B|Gdh@Enl%8{V)8~H4+c##JE%!{OunH7q_5Fwr=ww0%+scoC z3)Y8TDU(-oYOO082eUOBm?Wz=v5O6MztvtXW)rdXv}&~lGMIf|z8=pm*b=w$WrGSv zzs1UtW{1`5dt921I?;o(DtA5%!Ilry%9DZmBmy>i*F z(kuR@p1=%ZRG|%UfLBOa+w&@5@cONctWl(x%wV!rEAzm???+MkWFlU6)hdb>$YA#S zXZm}l9(v~!*;f6t0}XD!=TaX8()Lz8mx~Sdl8@8WtkksH`5J)1>$m8!ocOhB(ZB_( z-*=70!Ah&XD~IJdC(kAOw&KiT!Rhx`YW}7BtiYgx(QiR|#)l@z_-NUx1v${*_DegP zC;YAct$JsJ3P#_L=*=J@(QH+xIV?E+IHB$j4!mgADo(iAVE5}+f3c)%mRPrHRlg22 zxcz=XeIQP2wCWcMWH9?tYC-EWLgv>hN&y$FeoW5y*0Gju6_YKn#7lDzLf~l0n*)Q_ zZ%qqv5YwtP<*)+hWFt{|VPL`O`*B9TB+f;)^5X&-%zlIvyS-Ks(x0jGqg9^LNCUQ3 z(aOa}d3}#s&Q_xvw*9p7s2n!uT>boyezXW&s@W=902gKT>-Obv%wOc$s%{M`82xd= z%LQ$r33NrR#t9xc_&A0Y)0!^@CcyeF`UTy=F5~8ti&`jaGozbj|4k7@X+ucuOUmWCv>=w zU;936+dQ<6f&y9ud(eBw6V@%ev4??&hN^EEv2??z5W-vghDQJ$@1kCoxAVj-Ywl04 zW<9KIFisjc8x(X8fuT+b#W*P~?nnt3pv3xWNilsVrpiryRic2F4~6<6Euk5@h^tcc74TnKp7|XImtaB@vGK<0Em=bym zwo4|12c|nHliK&PTu3kdMeH`Il*&N_+rxa%_ldp|?5V!CxVIR-WXl)R?KxMAiO?W_ zhy8*s45io4SphNewN3!wA>xrILT#8xXvIi9Zp%uD86HRyd~gW3TM}@&n(+HiV@7{6 zwSficlM<=g-%Kmt)WZ%^KJSZ3%4PNvK4iRKl3`AyE(SCMOi#=T+qz;RsH~()0WomL z^Qlp_=v~oePXm1g66*`i+>wWei2J!kim&KmP`*ZDX0@tzCPd=kJ&}Mv-h&cY6Nw(r=zLW-8B^v0_pe8Pr}qiqBNGFs%OwrAIfNb?-I?6Q#T38g{O3iDxS^ zX19`H(;O6pUitp8O8FIy7UndVEZu@$wqc9cg3e&_bQ@^&bjFqf2~S7aQRk)8n4o*? zI*ZE1E|ZJZ^_UL-^XX*FB!}QNWpqgJ+((>OZ&9EAta^!V%#Yq%(J4%n?hV(#OQG#Y zY@5zuD)CK2g3K%1D!t_EutnJnCQm2r6l_DMF?qV>)o;6Q8Y_(nx_9RKkVfx>;=%Iv zL>*S4GlAw_ZI(GE^)isA7DMn5@jfde&D1)pIts`NiAhH5gt!zC^MNR4w4zj9Sm=yN z$70l24#;`J%9#ghC}zA+C&l7J2Ja_E8(TeH_zB=4;>mn5Q`0--t>%A6nI;b1Vq_on+dwQ+;3<%m(0KxZJq_J+$w(SRk3 zSo;vjG$Objl(+`dnR-K#rHq(sl_@PSm_3_{&)PS)ssDVvXVdwLFJN< z7M)ohZf;W-7|dR~_(PU{$B);Vw~HJTeD_@M$!=E5OWFX<`cA~Ujo>>4ELiWmtjl3W zN33R3zN8TupFr#2g7=~Mw4bWSoqtyodm^TgE6fZsxbrf*Ur3RmNtr9S;C)gpv&v5b zQ6i$R3l`jkhYF_jQX6htdaorjrFWYh)1KRw-i1f$8NZX;c3ZzIweUyk>fza>cWVBJ zDo6c?i&PloN2FRgpzd-5;3)iq$~P*@;aht|*@NskGN>Q=)au{#BfxBcix_0d+zvFz z?^VfX{D!Ltj}J2|T+qJd(`HG+kM1J2Cd;G-6_lkKrfK^P)o_6f>K~HE>x8ZoSWWqi zAma9vYvvIAS#mfK{lpT<2jqX-fTwgW{w<&8G9B@* z7m@<-f6=%N}8H8jxkARFBzmvlE4{omD?G|?ql zBVqSN#O#DY(+VVDFyAkKAkW-IRy1`wel zTWGM~Ewj@y4oe)-z5>J=6`c1n+Qv6p_UOu+`D{E6T)Y-zXoF>3i^T=){SvKOn4a=m zmt#Cy<^`}sOgEvWSNvRbJ7NHX_-?7h%Gzw@Mntk4inFtU1?j^Q=_0vS+ok!I6ywga zp$lk`KPr*0ro}hR2q$79B2aD@90K0TzfWpBJEl2R3+|zU618mp2!8 zMZ4lhcCAQrSe_K#-f>9*3(`AYjfzbuVj-JxC1YH_0U=JAzXkobS-2x{0+o$(>EnW@XbAVwFM|2@!Xn{|OD zT!~h0w(V$3?G`~%$3(O*#;2MEMGqAveKT)t`j4i4F@zE0R;JN9n4m*_>OTdWY%{}_ za6$XPEoDuEjhOb9%IYG6`ic2?w#a%<=@439cUH5|ExHlgT?$Mm&yXmfZEy3mz zap<;y4XG(uphvQe!DI8}&TIn?X!)=xgl8MKXuxizmw$lREP)&7y+v&uIl*+^-$6I9Ik|4hHz|D|k6% zL@XIp2};r8FEoV|C?Xa=7zXdwe`-fGeVJZeC3M51aBFvicI0EiU^GZ||1en1FQu(5 zF@y4w7qHNv{-L3!7cCZicM`EWR<$J^kTHOuAs1iL<1{o$n9;nj^jcN}7cZlNkY+mk zKZT4MGf7x6s#_Wh4tniAX-0NX+fVtx*vNfcOpsArq_SqT6iENT#*PMY(M1GNUaD-R zZYmI{8kVZS1ep#}QlM`Xq`Vma17$QsVx}vJSgEc0J@8P5w-pK91vH`Ua_NXR#s}j` z#2M!*C65jPl)>@>tj97%k4dO2&4JTlNgzk}46CWs{u}iSIUFc-y#@kkqk07%NZ!hB z61rcv*Qfuv3aoC$1T=$W#z_n+DDQZb+3j@1w)B{+L}E0cAbdN!87HrL=KsmA;@R<2Fp4!0$?*o^Y0tUS%uv!THf6Rn2PwWDN z`JuTvl+m|b9&+0^pQY{p-}+q}#!FqnUw zjp-p6N{48No^W6<5IDpKqf4k@yOT|p`u3py;n_)VxDsv=4KU(V~gc7s;dHK<_x*ej*_ z8yz?tP)wf<(yPIgHfjr7wPU6d#bQf5P<7u^rCx`nnF)TMNlfe#bri^8_G>`dfpxW3 zHDFM|==<4tcAfGCZRKYE)Q@RjgGX9cA`? zN_{gKru^D%E1xQm!Te6C?6ubuMciiq$Z8;?9NoMA2r5eDR~wy|!nHx|%5Raud>3MM z1gHB4rQJ+1xtCb$zy<3)^Kw%!|DWM#l+5{lBZgML0%guF@VKCT%m4EQ^~;STh)8Ns zL3!7wY_}Cc4vR{^I0Sw}|Sz_uSSTjc)63_8WOENn0|CHwh8XNQ_x4KN0 zLt!U)E4KnJXz%!?zFhGu!!ZLk(bO6ggr#x@R`6Pt6S$y#*Dt3UQ>D`z3K>iBo~Vc` zfaEH!5J1SIiV*$oVmiHM{VZnEPc%G0Nbe4{6;Oc70+dNMCZGU^fKp2* zE2(ejsdcsnTD5c+Tc%&8lVm2G@^4FTu|Z#o>gjB>!XqWj4s5ey3V){fsd!Y4D@0h-2^JvODk)QOa9X`6n44(_`ing2mUs zAbwmeJ^fv-_?RJ39ee2k@RF~qkqTSyt$f{}qSPgGt3OJ|9$T5)0)x2Z=j!h&*I>)r z%FhdAP%~xTh>Iy^&&5g&EdTppcr_gJ9^R^fmEckOQWv7W5}J3b#1XilEhUa>6ui;I zu|fbLrNoiGD{?z#d8}35=7B>%DQ%)}ROH!6+T>!(^ft9&ir*@2B6^Dr`cm4I(Ie%2 zqi>Zq<**QlA`&VHyojb6jk{yg*fHkX?XF-AWaM}`PcH&K&RowXM?z4)zaPtUAMC-e~&@uRqGK#;s;XuEv}1X zLd#i~4Yy!|C^0OX6|Z1S=``w<`5^GE><@H9P4Zdq>3DV#*uNH&apy=TAz@&_dB@{a zJ95}wGiD}3q%^2JBV9JfZ|-TuXi#~^Wg=Y0(2CKZg3+%@{pK}m)>bu{!-De>YI57G z^wDQytU;&|!g(ISWuDqz6ET*Vl9)Q|k9)hC6k}sPIIn8qt|TdR%*6uzFXF5M z66krt=%HB;+BI{P^6L#TTQzF5I0Vqa_22Z_IIZ?w|MkK5{_K0||9$&^{`dF3_s0%8 z@`4C*IJ4;EU5k}aMID&MA%G6fEb78e@fG9_tWn@Y#fOZOL`0XEbMG~tQf7f7&MtI| z&sZg$n@aZze5l~OB-{;j;3W3E2qxoh zoG>x)&`@}x_YrajMn&Ve#u7ls!%{t5k)z&7TTfzEp#v3BV1vCF%o~yV3o&7AJeaS5 zgP$$E^qfr>rPtVCFZ%$s&U8v|kf^7F`03r2K2RbE=%DSJxe&HRw%6ejK*yW##nai# z9$hiU+aPA|Hs^!|DEQvWvT^S)namcqPxp`MT)Hqj8gm5>A(_co1`>RCeLi{KFy=Tv zPgt5Xe8?~klGznosWJPE0;~oXWqn^U_xlGlpSYv}a&JU8)zA}pv}_i5C@&_nb`=Ei zq2!&C5*mq6{xML3cn6DV=Yk3!8wwtC3eq`k*XISq^micvfCm42C4Qap>k6SzFC3$b z>GK2)6?o|QkkfIQTn$%asuHn24kB{ZkdzVw)V#~8xf#rdi{XT?n3##KpppU|Dn8*< ze~^T8I!BEXu%#d_>t9>APt%CXb^VON7&u4SKr}1Jr!v*M(BEn(A&Q zO)dv=&KR?x!&eGV0X>NBj`j#O4WfI109s0ZO2XBNP?fy04WzlBddOhE@7IjFj#l!G znC&inWmr_O>TxnftlT`Ejg!le;6qNF^O<{%$@9GYk2QCLoVbPrnm+a|Z#B6|04pix zZfm|C1P&-dmW~3b6CBh!16gTB z6T8pXA5P|02vb2{sg2T)#9pj<8?~rl)pJWlgX(T>se%c{N9v(iI{2K9vfj~bF&U0` z=-+yyOMZ4KCL9-lW-hJx_c8%Qe8h{;2U@eCdiaeW6UD4C73={uJ`-fU%gaiqF9wo* zVnSDxB1=*uW=1|V7Fug(Vk`;72wpSawAW|?h~O+ zA)*@n0#<0|H$%2^8q;XNGEFv0(@tp&AZUJUjCPrfQpy2YqL>BLNy-EEhK9=lLGz|5QF=)sHN8rOC>@i$Glg?pnAiYaK4}om*S0NF=Il;f(|I?as$$H^}?;u4GowBmS~pgQn(?d zAx#cgqFK>%L;UW&hBP@KXmlT>UP@rwY@(b2I`zA%k?AO{jux-@bk)u=S3G)hx^N4E^| zW1mJ8IUGtsv)mL(uX}rXJWta`z0plFdQPjdt4ytnEw1_LikQ$Pf;CSi+0pc*QsJE+pjWkno^l14C=Ql)Gy#H zj335qG7gbjY|zu1hW44WgjT&MtoBp|6_X8ofQZ?#QB@&RKn!eQzf7|M)l|w)cQ&&H zgAMwMEwbSi?K`KZ`lu(8jzzb$MTG)l&@ipu8Xe7A1&a;|KhJ$*nfnI4E!5jr%MbM0 zv)*Cc8_*jzF9!oQvABp?j?lj6;=8fS{qF)Vq<+juwPg#b{GXkwtWrWCEnqHIqh+se z{zskUrGA(up7=wtF?%iy5)3ARL%>_U0FgOrSgnh~FdI}*svg#nrT!>i$Q;+hDma0+ zbQ|+MpFCjem`#|Xt$~X&m+IO4d7zg2*+$Z;o;`2~_#287`SoMzUz-!F)pN(r7;|k za=#+wxs;j5R9T${11^(OfaQk;U631akXI`~-Tges((9?PEYn3LcpQ-OxKareB`4`r z@`jj!L0wHa43JUvg_pyWpQ!1gIt)0-AJf~cdg-ILJsxJ6PRHm)+MC%WpNhqteFLIt z5BN6*A0pndBKGpzj#N`hAmd$L#x-5;H53l=#AIU;LM#QOJmICN zqgH~F80U;o0tN_qpBFNnP4Oi&YKYnN6QRW+ft(L`IW)$hLm1Syc&Ck-V2IG;vOv(= zR#5+Taxoig#}!}IiAkDyAr*88D4e$RiM-0#+-Z3VNO>=VcJ4dAYGQ&rQ2mxHa6nAa zg7Ob(Y)3~GX0*XecmuO}3t|}{qzG=#XLMxbdMfB>9^5zr$l&Zj>Cc=_vLwzya$*iD0-1GL^27=cL_K6gseX`E5|a+p zDKX%nuS65ls=lCOfs`GvB3eh25(T6@Vk{A;m6(&@b+!OJBydePoy=zoDTH*l5hr`)~@Ibw?6wtbZ;Af*`jltoir(!hhSuI3{jkp+Te+o<-)HummpV<;e{ z9D9rn)pPK#p`rUUkW?NE8A;T&(v}h_duTfrs&GIIZyypv&xp~rs^19%k!}K^PXkGO zARNzT(oON*1VRu%#$DPbqh4O>oedXz>VJoqe76}fX%8r!^W$GUT(CZ5{;E{4jV5B* z5pWW-!3O(%d=72$z4Q@l&j4e&OPA7D%1u{pE$9uHjg;GBquh@n73I#qkggGo7*PO` zExZd44e#I=B@JTjN6fbZG9<$HfJgWVRL~;)B$-?YIaD+KUx`2E9eZ_p!n5MjiV_UR$iu zTST2IK2*5%%RLEd{ zfH*)gC9jRERETL2yD)%Ojw&8>kXuNsy5LsO;AZ@LJl&LkYvceky|2Tz?Dk%!kps*$ z9NiGJMh0^wqT16a%z|Xwh-$IHUa9NlOp4}hEuJHT`BSw^O{H_a{(LqYCzomu*laOe z-0rFWsGcTJw^^`N5OJNpMK{eYk_+NKwm-M3cG5*Mq6>9z>CX0KI2GOj>(}oAve3S= z5D{d3u%tnEFQXmtG_ONNPqYu>FW(R8C@@}uRmt}r@2K~28emrvxxg?M#5MnF}W~rk}5o8{HrJ9 z;&z#+DtS?`V1J4~usXku@oTo~8t|haTTKdbG^;Di zWYc9SNkDNvU#~bc)EivV?FdvolZ)}~fMx+{Yo>JnT(-GF1%#kzJ+EjpdJM%l+wSy5 zx|mHTG#CHnaPj$SxVY@mrLwGx{l0MtBKRQmmum=JO(m)SV?$DNMu>f+u5wpby!FoL zAHJf0Pz{*+On#4JR4mB>^AIb-hb4&D&UGWfz(c~r<&C-mQ60#7I$SL1eu&=ig8Dz! ziDJ4K3ulaA|Fwi3;HSPtaN;ibb9C@OsFuIYzRChkD89e1@}1&)dRyR9A7bwfM}JsR zI>gpMOy6ovUXs8tzzUB!9khAixiIG+G0k2eiZVbDR6%>O(kuSWy>3*104m-qlou8= zAJL_qd~k?ZTP#pTd$=S}!+OXfp(I&22-b~Q0J@1EWCu6A*Eyp4;$Q0yfS~Mg)=E!#!Nl}L@P&^C<=Qj5C!BK9<)AR?3m<=Z{q=I|c z;4YWkh6IMZb;&I_*qyxO)VB>o-zG08p@ZKkz4;>E5Y8hL!>HP{FmH|4P-tSB|BDFv4i1s$J{Z56wZ5{D9*XBLU2H?` zAcOiYZ9OYWO)D&ka0l#G#H^82WWe&IMgd#PZAbwN(hru;>3&J&Rdn1~O$H3dv+LfD z`Je1&_L5Z)u^TW)GBsVx0XgqN&gJy7w==zbHk@9L!#*FejnoD81PLs4YUmcZG`nFf z)1ex$K#i@cl4^QZZbH))LZ2M7dX-m?!VQ_nA%dn4UDG=CMW5PqhDn$rc51u8HKHsN zRQ(NptkxoPM^r12xm%k6I#3=@?!{JP#Kbk{;BkDA`HQej+PFZ6v1The7%)iGh@Vv& zacM`qQigIJvF5pz*DBVhgxFt(Evu?2!n6^WKg64s<6KLwUs9$~Z9uNi3Ar`Ri%Loz z%Ij-hWj@IKdDscm5}5fZ+pZ$^Bg9v}%LRFVT`$j=UyAJC)aM@SDRk%{()KyZeRH(E zB9dP7yFnYK2Qmlbd>Xdd?0F#eMD#iF<|>#V?W3?XT3q4dcSOPvFUzn%QcVM(an5UN z04^8g)ieP06UQT&fY)gQDA7SA7wZmY!%L?TkS}aDl?d>KWUAdHuTy4#4>I4jjfCDb zr@J`m|IiVOm2kOE%(Pmbx?U+LFHO|{#bbbo2UQUx3eapX5Hp(;A;I870Aq#GY zeOQA|u4lvRe&BvCQ<@?;D6{c5h zJPEYe0ONfo#kiPh+bA8HAgqCUS+;IE)1V1h4M(#jwW=8{rV7U>+iLI$pusw+U_IujeAUR7!!*(HMP2hkM+Z}jzx}ocL zS%+DpS5$zq4#NNycK*>*k>3H#hq{OaKF%Tq3)DPze`sq*eqdsa&M9n^(xYCym!!0p zQdkA)%uB!li||U!FoE@x&Xj-yO1v0r>t;E;U}ba`TQmVQ@NI@Z;d7VH+Kgd<3a`!3 z?W))6)%lCzqDPNl3jWcy%`hxbno#*+R#RcVsi zPr$nC8VNreNId+Y0x2QrN`aRTc+sQ3yrnZqW>_Q*I@(5$3I}Xqvub5N^A+u`RD0?N zBib1)T=^T3!Me3v>GXIaXtG0)swVm9dBlZtYe*`cLbt0+RYmG{keTqzSHw);8k#H< z?Bqp$W76^PcDCZ1QrpPy6NEIhx}PM%Am#f>?z_J+GNl(xW46kLh8PYyEbv~HeR)GI zDAax;E{$L&U+98lurO=on4|wtd&Bm(qO2AR4WH}u1`z<#G3Ey}+Qvwbs@kW8R4zFgT6)&XiD6mWc9bRv2 zKcW;ee3Mz*-dJFQDlgx+-`<$hWo%e!o9|aipvCJ0>}SQeo>{|c+XpZ#Q1gk~msP%_ zH7haDeARN|NhX6fZ&s}Od7cZi)z@}bEWieJHI}1WCZsj_?kxv0XyaQUd~C1~cIy;m~C~|TNNx& z>t zbn(4+@v(VXoQ*J@_1;xBsH?M@H08Jft9i4Jbyi!>uCImbz&2ntu)%6l``gT{mgCGs z01bR@Lq>c}BMhGjs`xm$99|DDD8XU9yt6o2us{v(-RisWRCZ_HU7~_6ejKJgrc0<< zBXu?ovn0^MXQQvwEDx)svk`Mn5!P|Lc^x?gba4f$Q(H0Qe@pYPHtMM}Ht>%}KHDZqV zYD_b89fXI9k9id@7c`KdGdx-o>mxBSu1-ve1)A;}O=tS&Aq^1^v>GVKASG0AzTt5S zCv5*YBC#r$Ip4NBicpG=jh$v26K?6l5TIuRO1IF&FQKDCad$2Pz&l5BM z1;Ad(u>wrc_3Oe?;@9f%vJpC<7b^M9WTVIy&-s5mF;qK#$o*KE-)ipM4H^aGpzDEUz8NC(8PpZV+-eCYu zSdhU{&O6Ewy@7pPb}(RFJ#c%5eNOKeG%6WR=+fbFZr3U@SRdr9v?Q`rca_kM)}!YF zbzn$SM_qw0^V1XR`f1P&@mJu%e>X2bKA^MayxjwL1=SVa#|HCXXy(a+?|TAH9j4QO z;CM%IWOP&coHmhO)8^M#w`a;1M$+lAn9W}r(s*?U9U2}B8l?TKF)gcBf(D0zCxQaC z{Kj{00Z$*N7wVGyUl`1g8FF~2km}-ja?6Y8q%I6PG`uTVLSJ6btBBd$TU#B#hmH?P zhq_SsM7_7(pC_YUqCTOy6nfG4YDjY{Z0w8a%M38;rH%xGl#BS^s^|DZTH@@YFnKK= zK4g5H%Qz#8ZjIAnrv9O@jr_(y%s8%UnJ^7RDW_58P+!w6;)R?G>iPM6EM^jpm%|Z2 zh-)41JDN?WtJ#NiITG)~&8;KTK-Bw^bwbV)GgTU4A4>r-D%QGH$?}{ZzW!(TS{*{j?8V7E zONNV`*-L)oZp6(zmL<}vN@>9fvA?!3QgzVSBUxzA*rqEJq=)S;IyWuD3(=p{ik2?C zjF{B3*l~8%Oc3^={juAIw#W2*N2m=&^b8i*S0&Rx(i8hj|6BR>qKIh>iy2arGeF2s z?T=g`DvIy^f$sB2m$!S;5<|p1j|G<%RjDBDWBcnuntl&wYdo1{ORbMh1tX>lEwm)8 zN(5OS+259AZL7%+SyeZS=8c6!UmZoH<-RWiaRl4NQ z0Yt1uTHK(O3Kj@@*Z#09NO?NzNfDjA1r4h)6tzworyLqc3iwYypLk}gt3&@Ocp!?)4|PX-KzA~*a=OS5 z9R>&yD@+NIgK=jS=FrqjqLsJTA*rB&B)Pg~!V%r>s!KCK$fr`=Iiz{h^dOy@w4U{# zh?`O^da#Qqb3vRK6pv;HlASsWir|14(NYu=>joH|S*pwhapKU2eo!Q~%&b&rLm!U_ zvc!~LeJv)@ou%{z3j~R=n?AKE6Jw^%VzSxg59#E4IxPJ5<3^S9Wddkv(ClkfhaN4JXVm>adGYk+ST1T&K$raX_bzB~Z5?k6= z!-a6kRA((Mr+^gEKKeVk<#%Qumj|MlHm0}eVFH04T6WOJ$}AA{(7GNZ^e&T&6@PaL_XyM!s&Y{zLT4uc_rEN0MsIdj*m_|Mlm zHj5@SDuWI3d-iinp7J|^0^3z%sTDGa?^lVX1?Pwt7A=@iXm5p?31f5yS=jH;K^V)y zQF5kn>MwMgVB=Q@jnid-5T?_k!xW3z*PLg#FC=nUa!!J|;t{ zf6eyjY}w)LawXh%5pj){g|E7Chz#=lsS)lM%5rQ?wj0pORFLM+FiYR_mD+BGIlu*R ze`)P5RVzG?wOz!EC6*wrVhcJ*^h1S7#?_+_JF5j9vJ#%jY!@mx63FpGMe*hCVlmr9 zsHiYNi0@a6*;05B zA>ufJ#S<&bphEx~k<}++-Ly;ItTn&@A#6_tAyUnB(o=aPkmFAu<*Hu}v%D=`t@xRM zcGE{Z4J7%IxKEF0s^hHme;2}$%65^sOaK}F5XgK*8HMOC?S?=le2Cy|k&EDy!7gl3 z5I~0SB}Qv`nwDAJXy+w74J7#y#e6GI2e*qT9y$d06KCcVX%4B~#F>K)a(8C)mF{0C zbWCYHI+zTf=hsTHxk8(nO_>O?TzB=pmJHLzU8@9;QKSl!8QnyrkG>qLf1*l`gxS7y!%t;JcmdaZ+((vgB>jeWI^1RLuA`rh~c?0f3}*$L@bQ;W(sYHGs@Qy23A zys6c3NZq{nE^3{VanUw*Iid5f{AOAS1JfCW0{A@BeGN9@3?35@TNkp=1BAF3!i7+j`OF1AjlDk<_wprm9Y^AXK@ntNh5Ya^a4q|E7Q zMs!=$#%fP1tB^riF%F!ligQ0!s)WvEoyks(%XEMo6;u`Tu!1VNL-~CNO|mMj)RmOt zhVZ@IiF6S+!ldz*6#I(}S<>$*iZr!S(<)#qALRRpb*5`Hbd3u-Y_MIiic-<0VsxN= ztTUkCfrd{;9t4Sv?F(e`8xq%;3W1Fyh?*Qp*al|B`>XP@9ai zWpC?3UCA?AJ{@N1Xlu2+c{ZG0j%lVtx#1vD3u=QQ{b#zj`VT@rlSO!}(F#&mKmOag zLQtT86$-SIUQ_v+m1x;%iK3ODNIxwViRvanwWz3zw{Msr7c+5DUl$S~1bz?@I2zA{ zWAiax)q2`;F39>>KvurRb1<7H{Hg4iX{q(p`IHd(w*iq(o6CR9hKq{QEEvc^pld%9lEU)_Ea~Q%C#Od_^H<@@Il^3C3#M5Us2a3 zHuRXWPrW#n4bsY%+e^nbfYVLNi7c)g%L#mt_v@17o}HbYg!=#A{PI_99J=YGn~Y+I z^v@XS!Twd!9+PI*dx6qkPY?0GV8rV!OLXI_+VC;Uvo0E7(3QqQFB&t29w$6Z4bi`h z6P>AtO=Q(qow*95+U17qauZZFh2W)oJ25_V(*y-R$op%?swXth_;R+mJiK10y>*o4 znSW>7-mo)+%Cr#ss~WLabVv7qUL0S9C0}nuGDi;KzYPojik7KP7U^uEMhW#MpKd~b zNCS#d9^xq9a%#c3E4{l^xSk&3KV<@D-wi35 zJVuImsjGy}jn!4x#WF%-d7OSsGe^l{M+ZO3)K!LdV`3m{)o#Y=AyNqaxK!HGZ}c24 zD=}uFt$rxM(?MK$lwSIJCQZk6GfHRKAg$bh^t&73aWEgWx@kah^br4>Ql;x(*9=8@ z_1|`qWkm8r{)Z*`r}=V(ZdJ5&CY<<-*^pE3u^btMVf_ZveD1faDdK5DZC_S-*@;DK znIXB{{_#V#d51Qbj|XJy4Yq%t4&tPWR^kFC?6#s^vKV2LWO*~=hZ)@q16iFgwa4PM zSLTZsnm}y3pfTh!`83i}Bv_7I|)L0v~ zO(X(rkXFPv_G2mhwhbjR8HBxWd)ex@%66>5Vz%yt`dEnyqOe_JF}s*8^`41E?^OM> zTD72;rf43KHgik|S5&F|#q?`TCOaJ7Ai(+W0d7dPNkQmmi{Z;LJw-Jh@@;vI#S(`l zTC~d!*>;lI0W6o6o*zuFQejSQjkN}cB35%j4Z%N$zdC3Y!An{kWgRzW3sUa54t}&+ z!@G`D?c9F?sW~sC+68>4)Mcxx?P{#jHP#s%_*kPFS_rl4V-8YPsGi6e(7gk^7pyTD zb7UQctkPfWcvi)ohs|HzopSl+Mv%w>iImc(W1M;fCY~FOunt z-tP3p(^WcF7sHJ7lNhYaKCK^qX*6v=2^Ykl@E;7YT~@ySBI3Aros2RIM13lVx~6@m z>GgC*Z)K}(2CQ`=w!zlQs_;PAM`dBjG^6`3)PWXSGMFt=;o_W#TMcAU90vrwUlyca zxTP_%xde;%?ub*9vYHA3q&zN5nbXTj18STr{sN4>Hg4=(DG4lcDcy#o#jj0L8;hBjgW3k~|Ws}(@$`%suki@2sUWPc!ooH2hkoXlUQ zm%@{9EzR$MLqgg7D)4Q{{4O-;@0ZNKNM6!rCN^=}Y7uh*E74LfMLl-sw15Te-BM|n ziEwoG-&&N_fP&I7@XG~_DFU5ZLj!xTpmjXk{GCiOnoZ_nuhP)78E{B=QW)EQ<%E7_ zHZ>yM;#xO{9unaM!3~IT&>_M}F|1Y_2pI_td-y6g1UNy)euP-a@Hgz`D$t|Ss`nNB?-$9fdJdMZ&Kxdod(V?w`U4;TBgPv5HrakX3l#knKU9jo9FA9s zqv?hEcTrWuO}7BAs0uJa*(3azcC*sU$KRNTBgL>l&PQQ6gXQpob&RNHvW_If1X*_}SzRR8 zy_4H#U+jL<+ZK;r#-vsT%9w?N1?fGXbVqI$F(Xxx6}X^%=+h1c`n?6=%EFi)Tx52j zLH?jZ{)(nr`Ct^&AVb_aGN?a(nO)QD=~XY^Y?$@jgPVh^@hankQp7~Bg}A&Z5I|j&UA(f+WyM^n$tF(T@R91qeOleBw`bnWvJCxqJzc{ECQ!dy5utAPBe>K zt4xzX&rj{|I6WCH6o|`gF+D#5d#$K~3ChB?X%;3#dl(#I;;&^0n_(~MZ1w6GyTmIG>jgP&#TWKPGzDe0!S zPI_PUKi|(c?O`XL`e~>>Bd&x1m&x#Q-&>Cux<3O})Xy_HB1df50oD4l!3)*D0937N zlWMWP5OKREXx38iY^1UNFv(ZZZH@2E1><4^pKm1EQ8T9>4>`%_5h0ut*e!#Jo zMnedlp8%s;G}(+9)NH12x?y!hl0l2=V z+*zt5(DM;~C+Rurvz`{w+W|RBk)na7_wdV-rtR58^!$i7Gk_Y>V=3yi?3$Lz+NL8d zmI7KN-^o7|YN{jOaY&%2hy}iz(V;4JF9_WuxId+9+E#kPn6*^nSP(@Bo$sUOOa640 zyjmVf8}K8tC%}drs^EZ{pW!u z*xp3?RIpFe-Xuf=O*Rv7KFo}z{yFT+V zekduD!coNBI-sL8X&%_A(reI&D_mu5dkvoeIx3#*ekN2_TTd=iKue|9@II8Psco-O zC4rtwuTlO~uut1wgQJ0_M{qfnj9scM@o+frsl&o-A{()k4?xd{8FVOk8$VFwJ(`iA zdE4z9I!3|@h}eMwJYPTs9Q+UPz2>J)-P1%&mLnD}fmUUApuznZUu$kRBJ)dN5qs@{ zSmiIliyE}?m7vXNaN(h$@IqBhbVh^Tsd}1R(McKB2^xE06&(s5!fv`I(yUL-L3D$N z4JCl9R)dQTcHal-gwRB9t6>Y@$_E{2aQp4gbbK3Xe;zpa{kmTy^YL($$O2l`y^jtB z_fc7@!Vglqc3q5r5xWNfR;hUh8O*kanxxZI&4z04qjxzM$#Qv1NUR5}G5ZNzPYnKJ zl?=LUTq=DkDO#h40%Ay!rh%4sU{L&0%U(^#>6G7cwML!=NLdVcpypjxjo#=W8E1{z zjCwr<6BPX=6wT=}nS4flmyU5Q`%BtVKk3o?z_dK7jK(@s#2pc30?%3ztWav_U4-AL zSsNvs)fus}(?n;%36*vnEvVG*i?9;cnB@a@j45+MPhUcHoAmM#$eHucc>=}ii#RN< zOlYtZGx4i=tjc;?sMMn*`SZ~@8S=Y8BK@(E$ea}#bxq3}Y1Wid(bsNC&_bmiHOMN} zg|e*1h#T%2*R~;rLOs(PRw%9AN31Zn5~+EiQ_n<&buP*JtTiK6@LLHr#89edJ!GX6 zv{;dmG1369*}yd?^wqQ+lfbhQHyMLK3zao7NF{mv5NDGyC})Mnn$}HU^I>w6t=o`7 zVNI)1AB!<)ldYy8UPI}hq9-H^hTI;)f;ka}l34 z*f?Bz+|XMSk<7@GmAc7@1X`%9iR&~`$4cB}T-Th?_g6)wFuA49Gu4$Ci`k49dcC=7 zFOfrWI6CPc{VAf8Lky+i7G-}RWl9@tQ9d{HM)-oVtQb)@?F$7t6h~N?vKY~MH*I0d z4ZRV*Yr10Q2Zf*gwVT!Ywu=_2O$urYEkHyp-t<~6j+ zCw4ZiwRDC@u&Xktz57c%=e7y03^VL1!~^dafvt9%hzBe;^a}C7{f&CqjZG0Y5f7@w zP#R&`%h^c0&0*7)wcOAv%uu)ml%{$%F+)+|h0dSz`B&-tf$&OVvVpM0QA4eebGtv8 zr>wVbBIhpCLS;n6%9g_gpU`ePV&%-xD)h5%(ey7Q57Dv1k#hw&phx|5M@ z8_@$c5mz~CsEx9&>n{4Ty4jO~??*C|4 zFZQ!ayR3Jf6ncYgDxX(;oo$Mvgw|h&+SD%XL{uZLKHZK?cR^X_VWtcsvV>?~m1v>) zS2ddHSc@8Z)tNYAm1`Zz94i$6ZH?l*hC&98cvfy5wPi*q{j5f*+Q^#CX@^>!btCez zb@cMQP+eo+WxBkr)7!0mD~wS3_d)y8j*A7|D7H&a$u4hC^Z;U;5(nY5XhdEXZ{h$o zwErev`)P6&a^{HHnuf|gRVI9R1Gb|j;8;)kQ zL69~E4%LSDkgs-`H}Is;tH%+NpVCkD^#FBoEMl!R+Quv=)atcdN$rV>U2L0*IGGf! zFK2-wJ$n#Tq~361RYmMkT~C!^g0kO++7Nq;I^>ZNvt03Fxij3B9Qyw?q`yxmt;XZo z=#0i+&y&R#<%%z~tDfD^*3FxlaFS(GKj4inMT`WL<=@sQ%i-`Vek=7g z%uuMyUM|24<-x3sy12zMb_~~LRwffecW|Vkf6k4l7<+d)(hzx}I@m|+UzbN#jN&f) zXqFRd!(Od?gCAEhnmhGsnK?@N`BeAvmnMSLWkg*n4=_Wyp1qc`kn=3rqf>qK3f9iq z4jc0#?$C_x7E5eU7@U{RubX;SDAnE;P)ZvQDA3Dyokh$nHj(PlLTjB>=|_2ZXT5JjR&`mSRL>rS zt(q$p4%J8WnhnkB@ItNbHN$F8=o0Dl6&=2xOW9!Lx}HlDK%D^*YoUVXaE^@H8TVzz)M=ywHJl@a5bC>P-9psnJg-p5z8*gn?(g%#M9kBXd7 zsdo#C7JNBeOr<0(@(utOn@!R@iIx!h^iFXX;~;rO)3ey6)T6ib#2aKIb}L2IvP21u zm6|U7fb!1movpL2jn=ft36*-yBw$HWNl}8;7_nmB#E@Ww!pfMeR3_c;%9iYEOcr2; z(z+VgN+oM{)wVgEniDE*+o8%)n-VF2+l%rtHN$d{Os|CpR@bQV9NKH#b&QZ`ol^RN zp0#A1a*g=2j>4P}0&RSh1d6w!M=aVCrkvaH!w=AF-VzE&zz65X!hf^*7?C|IS=M z;)Kj7d**jQG2_e)+A}AGP&@J9Ry^&|>d#h-QKDkj)7xcYZXIJo)*3U}VMoH z)q9`(hE@8N-Mb!8yvCI4T8b;&kj*-SXXD-JXhx5e@f!v@bOwPmUg*i{Vw{flTU}12 zDsU~s7Nqe)`?ne01oWDP7Nihb)4XWP^-s~fO0*DL)4b?c6&Gh>*G8Hb#|_yv&5M5e z`kR+W8ZWf)bjGk7i323GAdMGVc=~G;T95{W<_jmP=h~i)SCi?{YI4!;zODLzC6Yp@ z9Yq)2tn-_Ll&+_iWv(%~6OO9_B}6hKEaw-6n=n=0*$9;-j1yS6$7>Q;5JDg`1f=7N zr)EMzdnE0AxBD5`e5$h{V2~Jsnb_(5u9!?`#da2wL{bQ?v#dXf&WhcPWy{16%=G+T zA>FxPR&HmBb$}LPndvj{SD`28I-5S@86lC0pxzH?!}*+U>um#|Nfw+CX3; zv1MWi4hAOmJ7-;y_0|mprV1^@1_KlQ>NN)@mk|<~tf^>*^aGXA2nTdJ%bHk12nOp|TeAF9_Q;I{qr|ERKxb0mgG%vzWmB($0bs({5)N$SvpBVmWepv>4P$ssqob4fo>+eb*cwE(4)3-IQB6wCzD6Ny6t6p z3aFS&=>#a;)A`PoD(eU^;*H>TqjejSQ9u`VmLs@Wh1 zNYvV=Et~R##1Y52eV%m$JJe9Ewuma#nR%~!`}2Jj8&9@NZ@ZhV-h)N*hgFjCw}i!Q zaCNv`6SzYnE_ASLUeANaLE)y?h;|W5u9kTYkxC zldlv6C=sEHuNSo2Z*Z9(){qawzUZJ}jkKU#>bSMz6>(ToX{SNNL1mwhiEisiKq>yw zM~#D6rb{7%jyR(16E-eJt^wsxSDyH_Vfq=hHJ$gMsV2pLPQEc3Dm&V!K9jy z07NH>+jQ=btS8*?La*NRQS|Hqy|TN+jkFsJF8PQ$YU5z_Q#x^fAG&+_Tg(|VPF(r%A`@o;(8G#gx|{1K~GtiT29Jx>$;RTcby zealqIcALUlVDLUH^Jcdb@qxv?medv-?4?rEa78k9yHW!fy!X9Qe>+R*_=&Ldcc)F6 z3uG|g@tA2jg1=Vf-`lVnR51EAtQLO<7qnfAZ%M6c*u@6>1FyXL3-MmB-8O}Gpuzpf za^LME{+jwWO z!Cq-?^0Pf{TU+T_o{HD$zh_H6Wo_$q1vpCn#Hsy#3UR%`)od{sE=D)$3qF7SqIvZ* z1khpodTN~dv#Z5yA}7&J`+5c)3T&o>Z;;|MIegPhrwk45kH1UjG;=UpEPM8!=y)3) z&Y-ox!DM#15(X0y*FRc7b8%4dulAp+OwjeA{l?Rkyh=tPRS~O!1uzlqw=a*G5ERFFidQ5T}K z#_3XxA%U8YtVKNkQL@$eSe$h1cW9r22&z7iRb~1}3~Qy|b*Kq6Q1mliQ96Aw9H(T` zWH1_zZiF#k#Kmg`e88C)Hs}*9MiG*3RDUkrA=Z_}TpB16BGY(A!{b1_>?$&OJka#u zyK#C!_nA%RbO0+;XZiI%u-+6i`J~WHeF?ZAeydC@jFA5|!i7arg$csDKB4@i&A&Bg zEWK58PgBwje}#F4QpU`^_@%6%qMVP*q-wKLpjKlNQ<2)mhJgEJ0kWyL);6_M?2@tH z{f_PyS0mou@97_OJ~kRB!-WY$tV170&;!&sHU5pKfCb*EN(rZiG5IN|1tAUrWIV3Q zn9c&`h#4f+s3`Dr5vxD``TX{ubPxOg{jZ<@@h^7A<8+>-{7m3K*4M{qrnhA*GZSSB zI28K-+8d6A>8`(D8$QPZ_J2E~;UuC>&Gg%~&1BKQ@OVHwJ(jCQG8puR7jzfWiZTt8b+VKZ zPVFG-#wFuJ!~^Fi!zr%2;+;AozB*_n0WLPk?>e7frZ3V=x+gti&c%W9nG0ahK61Xj zPNvC1-2*ttmNS07BVu~h0rbhs@Q`rd`Gx(4w|c~A*8vmg2^!RIJ6}&}nkS)w+lXfQ zc=m{)zJuqpm(U@=HNT#Svm2gRw{K(qGCU-_<7i$@Q#Dc?jMZz{6meM*5#5>t>6@WS z02!_&UZ%?%@A8jBWsf$|KNqi`iAY_6qsv~w1l?VHcD8@G zdwhO2INbW0HF!im1t^!%g9YhZgXMFYOr~jp-LJQIPtNv_k66x#)D=L6vx*AJJC^cv zcWYA^0`7|{{3j0I?w@T=4Pv(5<%P!PT`q-T3>d+NnB)qMD7^Uw9Yq=C`)tRRBx zy>m?K+V3TZBcY}*ni70LH0)Rhx5W21@Z|C*ed1T?$gurt?){>S+NU%G#(PZBIhiA_UtR7ZSZXhWqSK~=Q7!>!ZpXRMbrZ+AH+$bMu? ze<=7zM8aV)d<$ws5EZ_7czo2oF9H;FMFT%N{&EuyynqE|;r_?lXU9@VY3}|O6@*0@ z`&(z{r;<^d2eASclyBLp?$cODwrj*1h(+?9#=!+?;X3{E4Y&?KL06dd?AiHgzk9P5 zu%Ikl=j?n}WNhv_78Qg=J$|*jb0kwXuSW+Lq=jKGhqr^_#Rb0;rn$csuso%>DBX_I zz=HCwb?gb<%5fu?Gh*J+LiugP1(s;VvbLr5OZ(@ei9P|q_ENuz=zR6hP4R$)B7NUr z(_$5i9Ry2J(r3z`&4~U^?Wtk~b-V#sYp`0{U;=mB4_3;V+Dh z<|%8TnDv};6(}g6=k{3+S1f!J`)DlS|3J+ijk4a;<3pApYN16V7!P&OK=I>(V(^qt z4F7wC9~tBliw5L~gc-l)L<$f@Z#pG9Kim7&-?OHR$w2u+<(QzmTc(rD7!#xejGi&8 zq=HG?k_HU>*{{1dtiluw``NEIV%Qv3Cf$T#iPSah8@>zumbGil@Jw_cf*KN^qNrsrY9auIA0_rwD@KRVhvq#67E z?zXt#6tOSX!>o#`ut3cBX-W5XkL?PjT?T@#nNd`Z5(xl}7d3J_FEz z|Km~iqW8P=@5H>HN;$@))OOSY)DzJe6Ux-XgXJC^Khmmk-(D4B)?*&Wv-X$f$bU+s#C zC4x)lpdft9A>97rspyq46K*`CMFpi>#+|Lx)8nsLXK7wWfU<^sj0VoJv zlb&xT!7E@{Qk#h}liAJd@!Z0K)E$m|xq;zGjtM$zSeh|C+kUon+80LZ4a?}kGNflT z6ZiD|Y?p75jY%C?kp2X@<=`oqm7gJtnfqfJBoIMm^OM2T;{$%g+%S#J0YPNj;Xqa0 z+3we!&ayb5AS{fyeSC1tZ?J7@#2gV+KeF|;v(K;e$E-f4Eq zS)Eq$b=Gjw!bJsTVM=n5v;A!$Ha0b70a_-coZyVs=P4;+?b(db1qC6Dn*VM4?37>5 zZDv#t6_n_5@;~;U?F+H8S(oF(g7iV&otnQ+2iw#ad?B2ci?}o|M|0<%E6AXJw?s`X zlFqjV6+|3S3n(ZPKuFmJC#Spp{zhzIkwN{iWP{V)gWWBOJK_X?p!5Ya$jcQ#IX9h^ z++YQi2_OXdfll@Kw5M5q06-9-RqOvw>G_thB;Kr5d#Ip9sKg)7`QY3va=D;9;r2IM z{6bP2LIVmy->7Q&k!NgU)EpI*_i{fsT98A#pCH(5y{u%GCZAzGCws~i77DGz7pv8bk|9O|60B$zmv525T?9hLpt3LS2 zt!A;q!2}&f#rjWlbqMPu%|^uqB*|YkN0V(02{JdD?C{&0n|C@2 zkR{?9cncx|1d(gLo#U_gjJ&z|3?#_hK5bW+OK#q$X+)MvXk#s?6e6hH_(AwD&C3C+YwVH05U=m}7i&1>qrolkJ|H6%|aOntRz>bvgTm)8Wu8L1XcK%SE7@3H+s^P#f> zgb}@RiE~md%H>Z=d354rQ42bMw#cWGrigv~IFr+&Wd2l+ z*X`IzgU$}Gs6k5K!m_@3C=JIZ8jep zIk=$pI--1R$dt52M^qYcx>JvRe#y8+{3Jk>%xj0@(6)us_+wkoX-;?LAzzF1&%&aN zUhT<)z819?81?n#4gPHi{UM59!hZKdu>Pq5g-JcP5eG#r+{Pajd2Z7`@6)Uuzt5nB z+gMnX(MtxqUy7$uv~!HwGbkNs;HQ{c7}Q{*Y~BzhV9ypq6rh6AHK$m>=IO3qJ~w`z z^DBDI6jnb5^Y2$g~ zk3tw6_dtY$%#%J9wtlrI)yN=)9~wPR`AUnqLfjZsDyRYmrEgrCXkiCL?aQf=LF$)t zn@=Lzms0_Q(l6(ZutBkXIW@9G`s)oDcW0ZBCDP9}MoP#M>2EehO2`7~#@gtPLKaAc z3zj=@B>#?Ow?*&rr>xsI7zNCibNA?X8>&%_ERY`a3k2%k zn5R70R9z}yQ2HJBk#J<9z0Yc7kovWG#IGc@H?0B&WvQI!JZA^xRLCIp%PE|lYhO+U z%v1LHy93)(Dqw+MLZPRGR2%??&EykMBmpj;Z!;q<~RQpYlsS?Q2h|fI;~v zpSCcAWO|HYxtNXB^I933=pIHqtKjD7)#(MF0y1#Z!PLkZyhs*VI-9Z@;_KOEuONdO zOKKs?W=m=o5ma|Chs)t;Jj~QZ`(J!DP)}mBMck`5vkRrm>HY_c%`zYE_xsWne{Gp9 zHkjWeUCA`37=GzAB8c9) zyqNT^r>ovmNF%0b6_R0MAi?*h`f95F&p5qU3>UYouSU$$dTc%*xbD#l zXX#`(?mZo5>1dncQ1WWY@`USFYg6_LHrQ=_>o3lp(Qc_7>Is=8 z+otvH1B3Tn*nEF?*Oq#q9$I?3f5ra~ z{++On6|v+AB(Dx#Sa9CQm*$V#yZf{b#b4GCktYF+p|!|hE|pe1yW6g`{`uXz5NJxf zcW^A+;Tf@)1W-&_b6k|v#%06$Z0lfeAQrc2WUOF^*y+MUexTI>yTJx~$-i{j1-EYJ zUltk6HXa(w2&7HpMF9%FdzUFa%6hv@)WeNE^?zm;{0p`*oP=c@ivAxrme$1u^IgTfPtVaUR-+}2ta`)6HOm^Yfk8pp!d5WBsLNXV>mr#iSk`sR z%Ho3g0aMl&!!b)76RiTp)v(}wT;{zPX31=>T#Mz7$tNXl7rKUDe1*F`zyA(*rTnAe z=q4G^bJVlW%kM&?{7=gEHy_QeuCjz5OMD)Y+DSFwgF{2b29($j0t(vHfeQ`(_sTX% zv%$Bk$$YS+1}|7)zl9ab@X+y2Sx23Sn4V0k3J+UUpaSh+x|&=hd<<%%z{7@uN*oIK zL7O-PSn%F2+kQsx$@0-YCL5Nlo}+@bT3R{swJL268{icqUOQet+C3^;c|OZh)wS}I zGBMebWN8N(rLM%fj2ied6lvPTIv*SwDs5bUmdP1Sn-=C_L&4js4o+ZqO5(;L3&hMM zxK+RdgIm`?@req?HT>(=fD8@|rSdBcDiTfk{o$e;myw6q5O@Fyewwjk27KKQ6<8=STJr zl<~8cir9}@Wzk^Z&~-s&NnVXuh6c9MP{99TUWThh!W-)E*Q{*PYOu---wrSMnB9QE zU{x3v2|xU3!l1D#43y)s)zE}NV}Sv_G@gxwF;oLz%E7>ax)wX`2Bq+O>+dUXn$0Ie z-b%k&)0c82=+|vwHW%fu+ZF%?{I@S>qh*pUdvqTAWb1UlPfrc(9c&5vt77_@9M25n zMR4%H3;rEiCKzmOZ||O*sawjAzEHd1S-*>!HRnVK3{dhOr{wJPe0Q*Sd^+IoTa8$> z2C8QdSBgskEpOsibT#z;Nq?VTK8Wf4I71Ym;JX99y{-L&!QNJ%*72DogP5G2BXm%~ z_&yl-Kd0AUb_cs(tD2`Pat1rQXC#8MXeSKlU$GTFAU( zzMs#=>FBoi?CgxUNyH4B2joccpn2N<;l^kUG-&U8BGuo{&-Q-HRzk#lo(EPfaRJZM z>+#F-GyWh?d-?(%^!Gf$mu9a9Tli>VBV&rekH!7@dp zoD7o-3P$T2pKl2pIGXu}fdk7=P_6^D4T#^j5z)0VWdb0W(4Mx=&-lIQjoOnz0|!d; zbZckpbepGXR2mBiCX|N$z$ZbCN@LK#;gn|gYhlw+)6y6~Fgc~+Pt-ImjdP3!{!C@u zIAu9K;rFLCEsMtEcz)M0kHTYk`ohDIP0OS4z+=67kEUnX%4z1+1`aIN1J3(= zh;HTq8Vww1Ip(TE;ZdPFqy$T~oy zx-n?rK=wgfg^#wLQtlyCPowO^1LYX$YFbJf`Iz09(Sm{zS*nsF-$T?WOLZW@hIqF_ zSNvv11fR9s(HS4Fn^{hyfx}wv=u6=d z_-2+faA5g9EXR-WB9^TgixC#^(If2B1=dHrH#h1L{(s)yyv>c{O7rb*NhBqa;v!O% zCCk2U_cqhFOEzVzm$}QJ08|xBY{J4Kb-Qm4stQHIL;)~>;-cr7Z_t1CeBU{-yqOW1 z=b$13sP^-;+pI*szjIFPk+DDzoHSbfT7yrLxM&%-fpLZK{ zyd_%;MCE2z6Fk&%^sHC^108`a0HbO-PZUJQL%PnR^Hc!FdYEd0huqP8aHUM_LaaIh=lVhjlnPr1ii_b9H;CGYw56 z2MWHdG-(_;Y_}@iu2B0#eOd8U!9;(7w*T?pc%%9YMhy(qsjYggF>Hxl@TfY~)dUZz z)jDVhhv!Ar4py!}p>R7wAOQ+^HZ)=-; z?K*WX>Vr9C}h@4MRJTDIBD8+s=_&Lkx|ofpkz_2RR)z^dSmp!$-Jr6`E?AD z-e|cZg)Wj8KEv~js72#7Bxt4HfaAf4P977R4#K%(H@9>!~)K0KLi==3|qA%U2 z{Gx(Lik1T<%LCm`vr*-XPGlZ{B3NmQ-Jv;7>dtlf;KjArjwX0nI`xI643QDka-d*j zMC-x$X}hSAkx>J~@kD5@V?9xF4CMviSjSS794Pp{t5)w-2aWivB8$_ujwEPVT{_s` z<@a4eX+3bVygjH^x|MxlKpC00GfnW)K7D5(PD{u2=^+S`6G3TWIn1G+iW9eCyTPxTh>e>O1SxGbo;UbmURilAs~2y7gUt zWj1PHV5Y0;cgdasUr|NXyH*Yqw3GVJ zn>SWOwUc>Wa8Zxw=isCvYa1PyIv_qf*)_KQZfmCyqRY4*dxu*vTaj!H8tm#6e9 z?ZX|em9lc6AZERKt9rx_gQH>wJ%-a6@b1KNv>rHUC5cae7ux=)Rx(or3$-sz#SbdN zKBcJIHx&daO{IgU4I#_LMbGMigEouG4?jSSYO{4kRq1%&2mdDT0MMi6%{3l{T$$6RN+cI>{3S5jFbY`CwnzYZO(ZLod%6 zR-1L<%Fiec^a`A|*iVn+SUqr1UTLF@P>)BIBr69BW*d(?!)9$?t=M4)z)`b}t|oXW zPtTPAw)yjclOD#>M&6nb-z%ixPQ3UJ5@w>^IO_+egsOabqI&X2d zw&y$>DJb7LKb@_odn)1SKp++okeiK&K9wM+$8p;H(U zAfpD%7b#}gzACK(=FAGXoGP%l>4$V|;`C&6`kF5Y0b4{In4<;6C-nH`Xn8`1G_fTu z;Ale!kSam`=X7l5D^s9f&X<$*tBX}KdPCmM&u7yAJha%HX@!rtoRvTfffBqb3>{G92NyZ z)&@r%7UXir>OUcOFbr6e%N^#I*O)u<0N9bs9n@4`YwpPD!-`z)SnWCK$4t{~mpeRl zSnxQ_PE@PzozOA3uani}C%z&L=$oZ->NM!|A9-!izw~}_HhD=$%F6hF)67!60^Sn` z|L3X@?a`TnbWT3qfT@N+i}_@>ej*;6`$Iq_;c1#;>isE?fi++H)@ZZd)8TJ?I~{O{ ztgpvd;v!(h=f$^v&$ebExzY2RF+lx^)WOcBhf0MfX|z})c99-=46OM=rS;zFbV6a$ z$2s;B@r1L0GX`BX8wy??{73E^>NrUmACwjujm2AamcAUX7BmDGF5%sl?x=(Q*OQCI ze7RQrybHRthwczqzTew_F`#urwR+MY9vn2D3x@+fySj*G;yM!9KR2>q+uw7)H>0jF z3;%T|7K%jJ`8S-Mbf;#$-B%|jZw%t`PE6!ruvBz}!w)X4%3fzEENG6#p9}EF@d^MS^ z7UNTOBz#g)`=yh^I;}^l41^mJ18Pht8Y4Ey!-j`=gKVgF=!!i$3!DGs5peYgwDNRE znB#8tdJC>24DOe(k^DWX^yyN_Dt-Nt?%xdPKS3|=b50!mZ}5BKHwI=s=M{ku$$d7Z z^G0w4SaRR7gmyj^A}G5upmAo4ecfW18=-H2F!?EpnM7 z%yHAIlI@Lc!F7beeSpAF?xK63D?QsQ2W_ija&vH`BKhK^54~UXS0uoiES!Uca4Agxh%nmRmqYyNZ86 z608S!u$rH*@sJtm1|%tzJf15H=1n?|eN25(BC1702>yDT*Z^8ZpzfxnKtK2m>sCO;#1n8fx3@+iazYnSGR`n%{X9z0asHwq5z^|tR7W* ziF8s_T=kJj0*2hL=H2?j2Jg5)riwtNe)Zbb7c`D#6D`uOR1&b;HrR5XEntlelVDbl z!|-))JjSVcU2ph$Hy-2Ex-N#VbK@~iFU`g9eYALtQ^~p*zKV^p0ix%-IxNZ)quE{A(EQtPrzC! z9t2I`9(Xu8fB~a>5olF`bUl=T@gC-IcdT8_Y9g)D3Ru+6I0r%ag;tmTu9i<#gl$T3 zt*$EyAX+E&Y@5w-yl++#Fk}>hwdnNY3a#Z~i$GjP@l-ivht6K9^!P&u;*qH;kWL!X z_lkP2!5fT+AE0A~9FGxZc#d8LX#p*mJwV16_iR~=hDU{K!lpZOtjTzP{a z3*sHx0^|&iJ&*V<(-t76&!jx%Iq@kZV0PIxQ)V+=Gxg_PcFn9FvVoheciA;l7^Z8c z{=CbsnbqUG*=5&EVVJI&`ZGW3jn8S$nAc4ke#9G(amKqSpzRKwX5M3)rMLnLL8K14 zF1<>v@m!5eSyo)v#nA)~jRSo=qzy*=@gQ-HL#hZAQcCWS#idlPGluq6|2e6&y8M|F zaqX)s3cnD-7c^BM<&C%yriwsO=6LyXGJCmK?KK7s`Vz`!jv&{Jj{WeG7X^=Uy?LaU z-LSAA&ls3hERg8(AYtu9EXgW@MA^`o(`X;?$5{jwWX2^U2o7Zn^BZ;YjxdK5G_S*u zAPE+A)6K7rE4{X~5+bP1U|^{xXw*+PKbwwL>)v=pOV-$|5%4_|N?ty6Wx;%mUoJ^gGwCacgZ?=C{dh)8imByT z(Z%r#79X&lHIvKXbL!yV%U+nwCTn4XP(U@2>EytW1@U3_%h$8{+nL%m$=4A9>sT_a z9MzR($g9iq^T|6g(A$t*X^=n9?9`b{1lIz}Nt&Z_E<4KLKDeN)L@O_A&k{Pmz9Zfi z6H+fKB|~I10sJfj(sD$8iDN()Qmf=(Mh~ES8K~B&4O`LOVh#mG7Ix6-@w-U_IzK$j zC<5lBS&eR~6@80LvrJO}ivDc@+~}dY3W2Tewg4JUcOs=0 z5BuUy=YU0tTz<(31O1Re^PUDwly2mbDxgkYJsKX?yEGrX%aqJCIbeFvATwDSnRSj* zO#na7!b%gthjlSE14eXQR2@+uovN+f5o^)N+6Ib%IoYP&$>Pm~G&0+`s(^YP_FBRi zIod;`$il=HFdAkQ0lS}N7j?8C9dy8!hk!vPmswIt;G96xiG0$1yOF*@k%Q5>c*2q3 zu`sI$n3FH*LeC-HR?!f$No2lsRRR4XOTB*QV35%Hk8~FUU!?_{aLFa1uM6;_3`|#r zZLDWPy5dY%&65SzslJctM8I7)#F-|5Xo$PXcTe^keA$TU9;SK#Atk%?wU$Q3%BY994%GIIgkSeDQEuvqD3>qY(*2(4tkmZqNeH6SM7F{ zPC8+6F@@hz1T6EeR&T#JrioO(490oqXaa~ga+iN_NmaoL6U8)G! z*J*B~P&S$kYUZhap#_~(XR{Sd$OK%z_3P3wtSAl>zGO^L7cKEiyF%t?Hu0@8;CEAa zpFSfB!{C5#9ZZ3QAW&J;OUDcgClSUqy;cvPtOXoUf0a$exE9dJ0rRUgbOY+B_Eov4 zsij?=V_S#wl}^Cv6ihH>1kA}&l5UWA{u^2V!3?3|QWAndeR;8ZbGoGc%)LQv|1fE( zg9qe~e*qs_te%-~6SaYV%;3e#7DFad4N;;S=}qwCcI}uA_x5lj4fxM|&wF)s>V}R# ziw~)*MBhDe81Qvw0BvQbPQ!llMWT+PrehOW69V?K^NG*M!-)GiBZMQ%LwZWA_ZqE4 z0len`@aEH`y)WI^7#HwN5-?;Y{iG++;xdz? z37iu~5f&XrqX?7}#$j7>EIN!<60k=$d(cT1$)H2ck3K+^&8H#L+{Ijy7Y6vD52kys z_d9&~2pQIkT<8ke{-8#+2J7xtSm*+aFx%FEn5wmBxp8663j_Qs8|G)UTpkTgceqb? zPtx%KgU-`BUoCc`>ZDB&81!g<@<(-uOG2Mc*Qc+N(UQKCCu}4(d?jCw&&Nyp55!%9 zH30>VqX^tx7uSftxt3#TITp0VRmL31yUN&PYZX>8>UE<(F4lMcSB)McVzgq96(w4Xg2PMzAo;}r&NzY zz34xqaqaF<&;u$9-{7bxT}c@eKF9%-)pyT$cVg;0B?W*guJr@zA2ey&yUy=WD_2}S zHDFZ0)C2mOC0}7uE?~YKKq|kfC!4>8lq*9yJ)pEt&y#AUJ*ZM9;J-tb^vRP0=(h5S zo^;v=4gOlZfK%;BLr;$RT0p428zE|yK}8yplI%nqs~!E}dbm6aY3noxV8rT{=9_ z0>UP=zM_=2lCy1M>4eVIau~HRh2|#t$%WFGOf82|cf21|8awhPQv>F{$y4^)U2(Nu zz?T?5b9sV**<40zJcV_SrE{5;0^nmZ;y|8&4cJxTcmW}Z-_+tl>HF=~GdZ5LTlkFC z13G(@&9h~#HbSua6K(ZCoRkjO4dNMYm3;Z(&g88U8qVkl<5f_@21o^RoGO`VmthMP_rO2cNu@`u%U8JmvFwWJ*~< z2_}Rv9wr9y``-zUMF!F6!7r}>|C8WVWX8~P0C^dsRq6Aifk>Z>9#CG!=pQu>_zp^B zT3JEBROgUx9H6OtVUSj?bC^j1pn5{~N&~i^RjwzLDnZ`Zzu#y}2QHPhA5s9QArxJQ zuwnYD+z`sq0>Xqyp5rMSBC7;>6QWw9C++hn8zM*npn5v=bzK8G!ns%Fx*(n!FeXej zadS-BFj*zYn}n`E8+6)D{_L)@37u*Ip@tkCTKHGx2bSfA91w!IN#^=dgut{<8K%3ILP9?M_Af%2GCgQ!OB@51r~@up=L=6aZ>^utT$I z2Xts(hhI-vZhFua14K1I+23i42=7a|1}HBGn5jI}6y*^eVaGRhWh)Oy4HyJ&!{>qW zfrA(zrhIoR1OD3SvgO+dLEPl64a4NJc7$eD+PcFPp@{&Pj;3Kj}d~n zshxT|tDUS8(8geH(*`d(hqMg*+984UY_RT?%sfR+ zAayZu9@FRLDxC|?LQ57CP8C>P=Q=;Y;wz?bmaKCbQ9xCDPdivUN%yeFFD)(C-aA@A zsJ^iI^M*K<>kIpG0Hwa{Xmy9C6jyi9Q36eVMyA~A4yyy}RllW6n@(sWD?c7AH=fF* zd_cQ%ToK02WdV=^K*ygtMGC<0ku8~*GA$oL$F%gMX`ix)R0{~zy{5~*4~0d%<+|4p zg1A~8M1K>s%jO?%Ww7d2Yv}`iQERzwb*co*O<2UdQ#LF{2;ypx*&EQlkXpUor73mZ zgK~q+oE}hWkft9UHaq*mi67+#X`UJ|sx0US&B~AbNU&T+b+mv`b5!Qf>TX)Lbt*SU z<%$84rc9gmXf^A?nI#b^lj#AKrcArj>{R$H5Ro!a14h-e+Ec2i*r1iG1~VxDbh;cL zZ2C%8GF==oKy?11zsuh@O6IRjD~~v8P(#Q@syxDK0fA7VC1JWcIfh@D6XA|$EKDW_OPnJs^V#Xz`IticxF-n+)n|0H8EQgE@{Xl=G`y84b-4w4=ZwhKrq28ga+4rr`ZYxJKs_<>u=>cv$9MvYI% zN3j(yH$F*~Ag?;A{Vwh0r!Bv9e2uW?zg$N(rzfC{l)5@vu$j9#n-d^5t4kM+*owsyW`xsK&@Z zSe5+emBFBw=#_{3SH*HA-)WuEUQWsD4j)g0ewx?YX>n_9}v@j(dUDm6~$v-8z@naoBP!u2TSQX{7al=9>B za(OmcvMFB94+ueAReWdT^99|N#HyF8I#MNH{>|)iI^Bu9RdVIWvp18aaG6v&>r*Aj ztBTM5@q{(MT*a430icq0{BB2C6haVJNjsg)#!>+&7o1cH@~YgboX-ZP+}=bZ17Q`E z#b`(Q9YPRSpCwgh-!q%xT8(~R+6))gkI`c2%y7ye|0T$)%f*5&ds`)!vk6@%HBQv^ zN^%|YL(n$Qq8Xbout`<)>P=PiY^cV{RrGm5z*K%z&vug^QzgjXAbCmpH$gE(DryzT z{!Gat#ZKO@$Ezf*Cz!6#h6Bc?lau9W`TkoHOi6+;;OfAn6iy95a(>1Zw}A5rIVu!^ z^L!njpVMh>lQ-jJa<*crk-p}H0aqin)K|gJasziy4VbSz%zQeXzfD%}FQ|HZ&3hSe zL@gKF^Sm?+P(6p$`_&aiu3XO{rw7#I#pLw$bi8NJex##HI|I6|hX1-2;HQ<-xmT3V z!;k1_BHCwu9q^(w;GZw1lhv9^+}=TJkYHO=TzO5UjNhCvu=mp6D(v$XAL)SU=2WN1 z)T#j9S^}zY?PnVN5D<9AWqO87Jk7jFI?-{97c{$$WXMU-c zTrXDt^6j^0^HXX$-mhQHXM6MI%WuE?7F8*|tF1N~ki4b-*{?SE&wK&P5?ooM<4Vg1 zd6$#U-QD{!QEQ!nv>GR%o9~znA=v#PJ>$bsF3O|<$vaB&P%V3{R)htR0rN7B&8`?A z%5J_8m9v{PAgSU^`wJ?1x${R1`3L! z1*=s^Xj@gY!p}~X3kifEu0q1EHY^ts(r_h*Y;9Cdk~ARs30X;}_^X>OSmA)dk`v=p z$(5&NUi;Eg;d1h+6695k`6HIg1%xypd2cx$ovA_J-pT0n^?1g2JOi4tRL5q(yefcH zpDdQD#UAzOf3S%V(9MO2g?Wk~Jy_Ch+n3AJ@m{alXf+0Oelm*-SV)~JSzb{W(1+^B?%p7ri*abn%i)L}rOh*5pcC;Zk~&L{)?Mc#921EmdT0hhg`YOLST2E35p+iHbB z8}qI6yOjpI81Sxe+U@oM*UA7Fe3s+Awa-=>=t6bc6ZTSUU7c!SU<+BSM|Uj=%Nw@N zV$j|I7e71i0B*EJcz<84(6@#|8}P5vvS{lxIv81<79-6W{~=_|x~W!k^lP-t6gd1h}TmV0#_J*z0wgwwzfc=7&H0W61c0)MOV!Q0-Xanwe zt&f>Z_Gwk)uDy1Z0e0GM^SFA{Xx4hd*1Ij*?z}n-D0tqlHxI7IbE6EflitR*4I9lb5s6bgw$-HIsdE`DvnUVDnap<3`S)C27Dvcj46y z;DGyMtyBS=$^!bp{<2}#h*58l&sPCscZTVy3P_4FKWVoW(x?LY$oKMDqc<1|)PSCt z>}V(IGU7Ksi3qO;KzB zqkYnX0J%QVF&!)^-Y2aHl;hJummjc4`=kXK(2;QUP&7yjG9bF;ij7?~NDFcxA(7%i zN)R9?JE*(1SeK%+gHdEqs$aBQlu_hRQZpItm1%ex)DJ^p%X&1*C^D#i{qWgt185Y1 zx|db4{lU|NCSOkkEJf#QS!e?1hL|Otd0U7!px0QEgihkFbs#pLnVqa)`4snFUDk$W#?b z8WOF?d-b-uQY9JEy*f#s?(t;f8Z_P{F+191Wr3yc8$CDIU<=>6f`&vME|UX>awh#k zyR|PZI0;zmq*XGv96bgk#xD|N^Z>fEn$wr{^Uc*xyVzV9?VT0`=w9YsjgIsbM#~{JBU%cLLYh#KMUsFyeu)R9M*C$HfpRiPw?emL^FfSG zF=zsJKMUgzbWLn;&|?D`aO#;A$`$QY6hNn>^=kZ5mgthE1p#u>j8-`D3yz}G%qRlo zq}j0D?+TY^MyDAxfpfC{vwo+_pVu3m^{pge$RPW*O07nlc!eXz<1&aV3Lxr#`-~>a zYJ8rItN(pjKp)%OYoAh=#N1BL7KV_C_hPM5l$PN*xRmLFZ3~Aq;JI+?HKMH7TZP-o z0{Q^qrgZ_d%0D@(^6Py=`kPFoT~#0-=8(-NRpH}sz)Cu%uG_azs|)O-9JY5*?X>uB z!yz;Ova=8dI3MDEl|No$yAW$tAW`E|hbP&u@=nIpxTzvgsBzVUM!z%QXIJ8CTt}0` z{o%L&{M|pZB_tkaHG%umW*TKluX3Ew5ef&rN=q28gnWf8<{L&E_^)&LKhTvA39S*M zi6FkgZd|>Pgeftwz?X*+D6e&O?$Utzu1Q5WB{iaox?+Ean|-Gr0SbYXmx18P>1heZEr%V4imm$5`tKAGSxVnRj1;+EJEIr~4Em*DkWR18ke}jc z?Zli60b_oBg)!m@G682BSZQ|-Buz9M9~fjXFbX}sqi4zCutA58_UIU1+N#KhCa%ZF zXak?tjTXOgL1kp!SdfV;Ta~c`bR@rY|dB1 zag$f6B2dU8_JMH8Vq6w+G=cLx6JT3-rWAqtnJw;py4B_>-6v5|*A^zvDowtk3E0-j z^r$#-7=Zdl{RWLaUEiiobdm1*jH_=X01QdWU``iUG}HRA)MtrnrZY(%R^vmu4NOS_ zhW@WMgD$Q^h0io1asA)CFu>@HnCAo9FTpz+*BS9tflMpHPE%aN5?K*K5vVMm(mtMz zt5{<5sizC9>mf~Bu!S++L#+r@+K7?s^0&0eMl90=&h<>{dBl6hcRk1od{twLLuA$M zh;qJ3pXuU#^FGmKsn)7IS2Gf97Ku%@R1=YWTfldpULW4o z1|9=mvXB<}c3L#mpGXUE;|9D1Wd^OUkEPo;XrQ~#rgk*iR|Y!m6X+S^!TZISrA8JX zM-)Ib&aXzRWU_d}e>aP3FEdHN{&MxFDJ|{%Zm(HCtW;klbPRaAU#SinbjCcDC-I9? z$mF3_HnWET7})d$Y@*4lex1x{w#ARdAu~yw9eHW6AN%ZDz1mbCYx(|uNCB7OjyCAO z0=@r3lU5HWwS7v116nsthe+0GlcI1xL^oiHfwN-+1s45MwCIO^QmgT!fcCEJ0VB*B z;l#(CTB8`S=GRhe>?-hsr*;0mzTS@F<8ffsKU`(ip#NPm=sc~r>0~DUqusym*uESw z)KYbIUqW}&tDN8ATlO7WnkT~2t5W)hZl7O5zT=cO99Z=?SETfy*El>Bl6bh=Bu-JV z?W%}9Yt;Ff@*PLaaA4Jcl_F+azlvHDlnm4!4z`hhv7@MQxKJC_;a2K4wN{1yn6_gZ zJsfQOJ1LIsPEvi^)fc|WSF<1QD2hcG>=R3dxsFb)SP-|d?5bqsQLs%c8MX{1G-<(R zzFn0Jj{~d3hz)u}`nEw|+UfGh7JpXot|FF4!M4AZa+^ABMDMrSVBE7EWwrtf)_tD0 zt}ZMo51AR+)JxO4pgzh`&H24-z6lu*ZQw!~VSjRAn6VMSbbRW5U;FXsZ(oLqx13lJ&O;SxaH#R3xoT&tJRb)B%wvQ zG|K8%dyTFh{L-q*TK}l>l-k-#qd62V0Su{=N!~;ulmpBDinpxMrcO$`(oE{Tp0Ls} zWa-mpv+@wwbVu1#RlyQh-v!(gp+wS{IBKBWPbnRp8p7E^A(My&Ql?m>_3Ct(1AU!k zvt1M|Qv~g2+BdssS6xuArqSd%hLGCZ^O08u{kEbXRr>V7pvw=b0?v*1k}nf0FzVGB ze}G;L!-#?LOZd^I1I6h2x1+lHOh{W%Xx>WA7O^Q9Qg6AjRIZ8ou;kO!5+R@gC&U*5 z+E!WxLidR8fW;8BR*}%>m#IY&lvaVzZ}XpVVhCCb1YI+!6zlh!Z}`;}Wosr!jir3Y z=CW7{sTC-LX8#R;CP@s%s)2GBIamKZ;W;6j?ek?O)e}g3>co>sPayFr6i;%}=yMgl z4y`_>{FYE1B+gNVe0_2wSkQ!TUou2>jw!#?F{GEY0c(Z9{)%I_hpl~Kekr7nx`_^H z@INtpYPR?(=YX4VltS9+=-6F4(AVt={ju8U(*7(ur=+Kv6?G6sofgmvCz+RRPd4hq zk_XmPJGuLm3KLt+gnR+YdF)Ao_Y0rbYS65HeZTWuwWhSlh-HUtkmK1!dD!uDYlj(c zCc}39Iqf`GQxA3F49$?`RyivK@w^Roe$M6syV9MFM1&23IBa-i4L0VAu1VUncQ-ht+72lfwY^pAtO0$ z!@Vq;gNAtMMaTl(Vi+OFcxBsnW^qSc{Hz{GdQ@ioO-{K99d;gm=Xnc3p0nJl=vpVYON zADSZ0$F^)gsh|m>Zb7}LJg{sFnwJDmm-h6b)Lxe@?Y)>3bV2shQ?BHq(=%7k>C)-O;>~Y`!BN@LSrmnj9Fwo`wq!bWp2OS*w_ zyl1jeQW*+&9+XZ|P8Z&KWZTQyIoZ<%S@$xjYu`9{p~e!OW3_kd`HMtNLiX9LT(*ZN zi^B#zma;#q(!uz4^6IG4;JaI8$5N6s_<9Di@S|qE!XH&%b_P;V23?nC`x|>VE*tl< zr8zGN-Z!ec zTS)0sl4fAPNgO8pf-?alEn(_EWT3y%3RfS7e8m}3t3Q+OO$%9VxX}n`!+>vC1L*rl zl}^y$SFVK&{5RW>$!|1+=3II&x-|M{>xQk(aO7bIn;b_p8zS7pvvqPn8wUIpmmKOl z+#xM@U8t-8xxv2$=IrE+&0rjcN$lJQA{r zb7NRM08C*EbN>ac@8b8WZC#k54FlK~hv>AOqjFs>jw25<*piaoHN^A-w=OBEI7~3P zLhXCC8FN5q>{Pm4s>*02*5<#$md_QN02@tdb%s>8%B5v%Q#=4nF$t41y8ogjMx=bg zNa8TzGhJN!bSgL{hH$b_$ZV=#IvqWL?xi5p{pEW)Arp>8RH|5jsim(?`lP_tI#IAp zu>hl?g`9LzuuKuK`v_yB)f&nxw?jsgg*ZBrz@@3yrUD{n%P8M6MZg}wH~I*qM~Ol= zCuHWd;GC-oVCo&+(;&w(%DYUl2y0im{i6=wEXTo8MZnT*(jRu!=0PEnQQ5?iEaG0Y z>A+9=X2TY^I9w(P+#Qoq=*TwlYT%GtAaZ#ml`CLqf1t3$DhgxefcX^O(14Wzve<`-y0A+#6}w-KmTr^fdqLskhDB4yM7N%K}~w~21$3K+Ro zjmleA4wy7#;x*P$Av0=#q#2lwzS~^})?z?dKazU;pv7055q>}|4{4}gDeFiK#Htk_ z2m4LF+ZzQjYDGx(sJA;$4zyYkBAtdB=ZRJW#1_Y-aZu|BtG^@4Nh${n@>k=aallt! zalUA^BBUvdc;X;h4UjBgs@-SPJ}zKJ4wx)py*j@aG|m^T21w?MIuK@uz8E=RGGC65 z_=v^%qSXozHG{*t5(P18MaZFW+Ik#Bs}&*A)lP8`tyYB4rGh&QmsTr6j-T%^6Zfr2cTmQ+ z@)NDZf*wGrU(R$M!;13DkpwRFtKF#$g@gN}{DK}pX0nbP&L$2Sx603-d5VCgUUj;a zABOy7LzGw011R+>n=ss!SD7MUcl87cIZVf1(K2nm8yd23)1O0e1%Z0FS}!NFmwTht z>12{j$Llri@MimQAuH{SmRq$OkDb3AFHc9SF$)e^=p}+PWgdOGSX>j@Q3jgY zXC0KY$;-)_k8)6|Y7sZe5Cn*FtNG3N9Ud{cHK>X%uwG@FdEESTy>pzSna3^2w)N;l zI0hlkJ4X{ZYVmXs7MHWr_2p9NA`RRDI+N=F zYI*E`mU$a#Fz>IN=+P%&&Q4Xccx<-8FRB>kRqh zk3vov3Nk5&f?;1XhINu-T3*)SPbv#pFm$y+8GxJzMDI#FV z11BQ%^{hP<_TGl{8{|Nw%E11@!5%dZ=|a7$tHzKOkg^FZg)^r?TVt=^9F_ue{tqWQ z;dOJ!IW=;81P)BP>zLGSbos$S$Xa&U0wW9HUphdl{+s%mw18YP*s2i_Nt{`9Xa+oU&8r0N5P_$x-t$BB5kb{9i_q_IQO{B@GB*&(EsCpFVy6lB5u+;Gn(tHpHmegiaQ0O~_? znjk(f#PPe+@nVygAyb7u(3b@7vEflj$IH>_dh%wx!OM_oAs@=r2@vNfs%PMzg!ELC~vGBIJP8Q&X%LeO3jCCNUriFp(qRP zLmkEO#p-l9S**u1`DDhBi3%^61yL|>Y33g%Yqp$!7f{D}94!QGlPliM7ix-!pPnn7 zD>5}uZYvK)CzJE(=p_#cS%K$zk%@tES2GrqjpucS%!_*%R}Une9;4;UH#!_4m7ymAF-cy7uCHIv=g&_Nc5Et{gbJb}|o^6Vvz zpK|cZw!E2`$C!>*YihGj*^0F+BNGEd$4&ovP5txn$>{VoODY?;yd-!!*O`aXHB)7C zoudYd&UO0lZ${HgzG5w#>s&c-K2^2P#pvB?@)HjUIr7zQYEvx`v?uh}%h^P1BFcK= z%7LTP0F=)xW%Io&2afKG=?7HP&zCeyk(`cBU-6~6Y+sDk1zEQsH0`rKpD!=i0#~+n z&&0qmQ6$E6a&k7|JLjdN=*WTdiK+)T401w_u63(HNJ0Om)?e|*H$Mq0#%bAID4m@0 z6E*?LE0YeCb<4VVuXEF;@n+eUH7^OCP6IPN#X3_q4Il-5-P5K&PG+op*`Bslg1Rn; z^f$_=R}WyzmP1w-WW4BtkT-uGBPA-I*t+F{T zFA1J*%{O)I%eLmJ76|uLxwn6ngBP;S&8=O0L9lc>y&WxQo967wrjw@!lFo5&Co{5R zCpivM&{t8L&R^~|J9OTLy7h&ngnd#_I;c5wn!u^RrH`bu6~pozOVg5osV^ojj6R9; z8>qu3rzN0~1=RIWEh%E-8SkNyWMQ;iZr3m^$-{)Ru($B6rz8Qp@1$L=Qm1=NSl_~? zIJlI9D1dH3sMYs}d>=f%AXrTfS8vsOyT(~f;8f=hMS(tIv#|_W8gEqcg+q070d!l3W_Q=EgH{B}tZk=FrPJp+mj*m@M9pF;gvR9#FbkrTIEHEIeu17}4^75kK z-NocFrik^FQj>Cu+wy;qqjs?W79F!1TBp$ol4(P*8%S|mu8{`o;ur0bT2j~Gg0uqMC=dS zLxoG49lG{PI^;OuNMGoAX;~EC$QLgO-UZ)?gP-PPm}m~?W>YyfC+DTXet=lf57cfX zsRRYg2tz3!^;8zjwDiz9Y-09`Ej_6wXsL(Y%Jb9|W)ps_hpsG`sfU}Il~@l`%>s>1 z!rpm2Q%%qwBAth757(xM2J|bT<>eV)7~Fg7@x?+n*6M#qALK(i2hcH4{3}%j@II|) zxR}gWdxL7fQtL^#F9i{ekOdZ0S>i!+*ynFY--c*aLA>kw*cLW2hh$V6s)C1F6SObr z42AXHiVozU#Ugu^Chf}aC-ooLiZ0+YwN|r4UKik>d*GuA9jj35RMnZ;?L&SP7I5!` zfG?=Sh;KY2)Rihdn!HHV=2U6(Ucfyzf)z!1nDNjvqgm-4(&6E35(MQl3VbmMQdK~I z=0mA{-{^NpE2pv&L-wSB_e0<8bh>J@?M4&gLtm7K8DD!*XirZ-chv+-qD5uevm24$)9uMgPh3%>-$Yx zw|ko_yLi8I+AzTPyH8hA(LQays*CqKlLa>CHyy<5qzTjU+`?~Pn>S!UKI_7(^+2=NV0Q66SI z_Nt!ADxs}e%lYJtZEQli>wLZA3IpvIKJ|+Q?Jr@$@r5sw1=jEB;W@2}JfUemmLA{J zE2zT=zXqV6WxHru6XLU9P8$aJ9c}v2AK%k{b$;z>d`H{S1=#Og(huH_Ruk6e_|9dj z3aFpUX@f>`F}}DIW{=}@xho9xUwQ>>zDiz=r*w|t-a(%ZMr&94)kcH$zJ2wwYoTi) zFksLx1%vuD=BZVW`4ubymvvofO$LA|ejS+Et*Wa7e(6qp9axly8Gj>0#F();nF5YQ zx-u{Y4h;J*n++S%w{)8B6*u4noOc##n}-TEPfr~G=a}c9VBTL}6}<)pkN=(%a4JuD zIPQuj*uygV%Ud_B1s?^S8l;nQTl(;0|2M1_1zQc`Aq zffEJtfrC`%_R%$VY_vlrH92Cc3E)EqNUO3tgHBtx%`GHbaY#oM&@VY?(yQ<%Q3f3N zr1kRAO~FPP@Lx)Bbth)8!{_dhKE_7pl?^EXrhMa=f^$2obp962sV2fwo{)Ub8N$iK zjJv)W2W*ZD*lEM20)a^oD7Q%A#6cDpTck2kAU|`w8&voXZNT0h);X;Q(9c~EmE1}# zxgs$`8c!}U2Ss%lao;gw*cEH6fHgj>!;l2-Q2{3wPGk$O$u+cgf-WjOg$;LhjZG1%VM?GsbtGB11EMjF364@MOtQn+&4ciu!|wu$^|d z24yH1#1&>;1+mS~ZVR*Jz?5GwiKTzCA-$gOv;y{MFzYMEtaQ~nlZ65fOJ@|NB9)S0 z&KJzfFN7(EfJ+A$HOUlBff-!Bp&tm<%x?3I<-im!-{_zGr{x=u2D3h0&tH#cdzBV# z_hAcD$k0Mdm;`avz_{ly>OTxCe0LyZq{xD-BxtuRjbFhKaMFr--*tzipneDHvLhj5 z{DLEcoEJ7`)kd#6Y#lV~{A^K7%v?!$^~iXYJ(9f(`3{=*uAmF9&3)AlEoI+X?z3uO zAd-q9yA>5lM-sHuqgJc3Lyxo?7&Z^mg_f;)o6qJkc`(%j=eEfewR%m$gbda5nE`U3 zd~7Kl-jjgyeT;xpU~5VX`uCwfq;ENWx)qFHEgUk@U2vu2XoB}efhXs>kS{kIpnRP{ zS5YWWY1KKK0b_EyD+xbsosm6~-HfR-3cBEaX5w3KHXGf3ga2v~GKZXxYbKZ{ZQ4#0 zMM?!hx@&!E*IJbx9k0PAT*x}hf>W6yShn`4{~)JVOzn~Cfn#eznG(~p;B&klZx1?8 z>wF^;ljB`Uc=Xt&((_7{mS`$mqV|#SSuo^dQX#d9%3#}Ctp1$tHKff)(m*Vx7V|W7 zyaTiNpT30ivzswIPZPX{CboFiYSieqAhsBUOz-Cdo0kRkbDyejTVkOh-y|idRRzM8IQSjZQWe7-PZAfz$u z_hpyjVwfs|1#h}SuP4eIEtV(rf8ei1jUs3<5Nyw;)z~mjiRo`-f*{$pnH~)J#E)s4 ztr{3MMZ^ulG4b*@1lyXFj+&ue(0o-8QC5n1$CS1v?4|>Br&O; z34&zn=k~C*FEl(cH7Ddifj_2)#AmN4e^Nn^Y`S##(?w#^MM**3<}R8St4hsTOzukc zz_IPL{kxn8V%lk66hvDxyR>tb?S90ROd|$@t@+g-Wrt#Fen$~3o2z>jx?_=F*AysifN;*8W=Xe>A%W}ACuo)NziOf*Y6w*lBe|-$DJNO zsEn!Ud{GdQO43|dR4QpP5Nu7S#&~i7V`@4_5iDENnISn_bH~(lkORf$yFsHV>#A6FfV@!m}OEF63oFwX+L&yxZA@oGO^MjOp`%(g}U$`)^Dc^F={K zTB;L?u-JqF#>^CHAT+_VW%}9v4o7-M3iz8Wa6F@{a_Rb_fpkGu$g)MPXFj`#(xCs$(D%*#kq4JEx~F$O6Y(MI z`0{vG8~n!}zcr?Po@XLGWbRg=yUJjHX4qBQzat_;(m0RI1VQ?xCDA=%D`QD*Y;L>V zkkkS9Lm62osjD&pwtQ}FnJ?+8lF4i=x*jsOT5#Q01@nPn)~D0SVl`Qb$dKAEkMu=B zylaRDOIm0w;zHX0JkC)B%X)WZ;fe9i7X{I#;nmeeOd94?!TicZ^l-fHkJka&H)OGK zKDfL%EVySZXpSyU&PHOQhV+W_Tvrk_>u+m(aWYR}wVa7MMrJOFD63EH{KPZ2_YUwrvaAw39>3Sut%vCJ2&k@7wcr16P)g-dcAU4?W^jSkwsoF;Ieq&WT@ z;E-_>2O>2f?qrDmdda#ImU*(hu?W$7EeMcm*3@sRqv>>XA{+@4Rvz=HOtJt|or-58 z-mgelDhZfsM73x0*(v3T8T}s{$FLTy;GC-pxi^?(U8MbU9fHwPIZM_f&y|f1QOI@(CF; z&c93&FyzechR%hR*uyW~m2-)jv zyP|rVEr0>%bGed58}bZT@)fYKpJM*pLBW!L7^7$=RNC4pG2m)cSpcN|hk~KtEIq zn&=vXDjoVMT=^PMH|H=pO$pc$4u07Ns5K>^bgJk!K&=Vj=edwR|NU?Hsxx4MRE((+ z1=3`Zws0R^`7EN9ApTGrK_@fSdvq#caxfeWg&qC@z4e?!1yw*F`_NXS+Uux~>umKC zuzyA3I>JET_tEVtzdR|RdnrM+Bye{O?x33d?zc~#u>J*fF!QKX4w#?49gkiw$LHx> zN_RPb_g?idSY$x64nbYB;2)S)anxbKef-9G#!RmUWFiQ8WJeXm2l!$7jPIQVtY?N2 zk0e<@t%e^C7)RNHt3|gGrPkMBY8=JrZ z-36;>*rGP@UwQapuSd%j6S@fMpuyjO6q3UXv}iz19VYk@us;$nncF4;o;L6g-3ZiP zwDmdOZ14lda8mFyU0{FaV)d25bZBAqNLq^=@S#d#=fq*a&s_s(t*5@2h|XJ){SW9b zN;VYrVa9#e43+A9y&cf%N^C0%;3NAxRo>{d`lM2=O1l^WS||pZ7Y6tX2VB(~coOjf zu8>NmSj==4;wl4;%;x-{KipUA=-7-Nm)SUR81Rkbdz}`2*L$>oDX}*2DIU-*7lO|L zV8{d4kmvR4aKNwq4{6W%1gJw5NaS!8A6i%6IN*aGm&09A0Nsp6$D#CIB+n|%A@65= zM)Q<`zUzcnoh`^_uYf+7kg`S+Fx1>C27S8aNA@zV=FaH?>xTEZbNv19lJB0-Pgz&v z!|N%_=vq}~7xZ97BSv_tpz^sBu_chKpvRs>sY7 zWLr((+(M-vQ5s%fp<)Rz1tTk!2x-P{HiY|`;zm}CHt>J#WUUmhRz)}HPIDS(_9-%g zEdj?E3dL&^2!`Ep3=?XZfG;wF0ZI@cl>n>x<%}kR_Y=CsfNm?H+3-f6KO``0Y;E)~ zx)#)7fEw(0Kao$d3|PdKim~+E!Ii3o^U+rvKM~g9-{3xb7KLh9JTs1{ZDFhQu)f*` zzEMW#3;wGUEY;n=((xNx`|kl@Mj;Dk2P87ncw1+|OdSRk5}-d2Hr;NW07e<$$N7{` z4;o|~4;%7sNc>bB_|IIta4cw8cT%9br+}(qt@&A>dQNn#bA=yNhjpGfprZ>9v#g~b zcDr<%w4A-;vsOVJ2IRc%zi3z4lD(zZMiz5z$49#8rN#GP;;U3&8fY~r%2HX~ zfy%lY)>D%b*~kK^x`!FERd02KkyzMVnFNI}uxgB*VcT@e&_RVdr>whS{T7MrXany1 z-0p}K)^8@fn%-a1a-P1R4q%Io?{=x$x5DuBo42c%v_A8EZ%y9{S9{0(!$yTJhn&!|WobQ5$jIJ` zn*QHr!Ujv~vp19Fe0D*rGT2aTZ;3~MC6C`-O!v;_7kl+qcR+KoSU$np5KyZ?PDca( zC}@K!|y9&nbiaOZ<3oIi0Gs zw@bp3lgo2;DL9+<&#qn&mY4Nx5m}y9i_vmL%j5RO?-rx=9@$T;bm2J;d6juWCax3a%#= zWJtD&8SmZ^77g3~DZqAHXz5DaCLLZ;OB(H@%Z~+K?%sL<4*UOGi2b?RN6p94_Y;00 z(;u(F1(9FI3zP*rQQl8fBU~HsbC%cOh0KQ+e;<$*2aR^4e^e1FLQYS1Z)y$-dw(BjFD=od6QuQR%~IYzyB?$SWLW-Pkma;Gqd`-Xy+d04 zBV0UiavgT(xv)Acf0(!BLKXdQ*JiFk!q$*dsQn!FyR+XxFOGIe@ zONgZ}+Jg#zq2Kdsu+q|CVMt>#sL+znMxRzX2@~(v(3tp4SR0a62Q+6*i+!tn3^DRlSRB%X4BORar%xlfYOOM;&<>5Nxb*EBnh=Q& z55i(@J&?!$*AjD|3X4M~h$x5X*;|?!+LTkSVS2Buc6~y zO2=#hjjb(Jh)U*UqiP)

b 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%0Dn2a+sS;EL$SbSQF0EC2ck=XNDQ;4IN;3iIJi2^ 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�B%!^oa)2|Gs)smL&xw_^zdV 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 $U?BNlO( zgSnW8`B;F3ScJt`f~8o7C86rd1AC`Jj6;uuO%hH_M(5>=>1 z4Qf$`dNiOBO=w07j-wTAIDvL_pc7r_Mh|+?hm+{X00uFHVT@oDV;IK-PGJ(K5l}is zAc7E#5QHKO;h2U9L?Q~)5sev`i5SenY{ViCb1)b4FdqxB5R0%FORyBnupBF}605Kp zYp@pU5RdgpKq59E2^+Bqo3RDS*oqWvLn^i-4e8i{4D7@%?8YAK#Xe+WKMo)Z2a$~& z9KvB7K`!!;j{+2;2*oJDQ5-`l%2199RH6#is6j32P>%*Qq6y7t!Ev;r4JXi!4s@am z-RMCt`fw8c7{K5ZQxkDR@-Rj)iZP610;e#E(+DV=A`n3cMhHR?hHy+n1R@cI>4?S* z%tQ=kVK!nBhdG#wd6b*M)J8qtJiwBR^e(S{RfM+Z95g>Lkq7kxO1ehgp`Lm0*gMlptQ zOyCqIaT)<{Oc9761S15Y2tzogAp((z!gNGq24*4#voIU6h{GJr#XQW%0xZNLEXEQn z#WF0%3arE`ti~Fw#X7`eJra2B{?MOp9b|3>gu?xGg2Yay( znb?m5$ihKnBL|0Y7)OwcJmjMQg(yNXN^lg%P>M2?qXLzvLN#hoi#pV!0gY%vGg@#Q zt!Tpuw4(!^=t4Jo(2G8tL_Y>Fh#?GP1fv+kI3{oklQ@llH>U_h5P}hcP=p~I(-473 zL}5CjF#|IZgISo3Sj1rt=3*Y^V*wUo5f)k%DbV#df429XpVLo!Eul*n_>;hfM6p0c7DIvXO&BIE*96MIQ1|fI<|Z z7$rE0V<<%#%29zzRG}I*s6`#>(SSxYp&2bWj#jkc1lrMoPIRFgJ?KRrPNE+J7{m~U zF@jNyVH^`Ug-M)7K=~Ab2tqJI5Q;E_V;Uk5i6~4*G-hBXVlWG{5sNs?!CcJ4d@R61 zEW%Lpdr?i7Hg12DPX|JsQx6 zCN!f3$I*&5oIpD|(1|W|qX)g{!%6gG0D~C9Fh($nF^ppZr!a}r2&kAM5J3n=2tpBt za7;r4A`yk@h{g=eL=0wOHe&JU2UE+8Gx0bM;7J_B)5yWIIE?3!ix-fO7g30pQH)n{ z6tANcZ=xJ;qjHLjJL9JMutfP>{hWvMaRDyGMYtH3;8I+M%W(y+#8tQ&*Wg-QhwE_z zzKiFz)GybYOKLptV2B3BLRun zfFx|hCTzwQBx5U5unno$jx?lW2Qsh|yRaL3uowG~iTyZ$EF45Oa&QQTaRj-@Lp};n zh$0lD1V?cUr6@x=Do}|kRHFv9s6#y((1<29qXoy&iZ+};J37#bE_9;@z39V9^kV>n z7{V|{Fp4pZV*;lziPH#pdx}5=As8VDMHs>{4H1Y$6s98@GcXe|n1$JhMI7c}F6LoA z7GNP3VKJ6qDVAY5R$wJoVKvrZE!H6(>ydy&Y(Nq=ViPuF3zD%FDcFWoY)2Z>u>%>{ ziCx%@J=lwV$i#jeKo$-n8#y?H!#ILmIczgI@IEB>FLcK@4FSBN)XP#xa3Yn8axWR8A3yAOs@> zp$J1brXd26h{AM4V+Lj-2D305v53PQ%*8y+#{w+GA}q!dEX6V`#|o^(Dy+sDti?LS zV?7d(hz&@>Mr^`nY(X-%A_d!!itR{4I(8rfJFyG9u?Ksx51H7H1IWTbWFrTMa2Q9B zi#+6`0EH+*F-mY0$54tgl%oQbs6sVrP>VX$qXCU*LNi)$9Ia@>3ACdFo#;Y0deDnL zoJ2ncFo+=xV+5lZ!#E~z3X?dEfT}415rklbAQWK;$23GB5>c3rXw1M $U?BNlO( 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

jEE| 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

L))YwmB?qI9ux@~~uDz6s#}IO0qT6?arDg!< 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�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 literal 2666143 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 z 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 Tx2x2ai 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 diff --git a/docs/build/html/.doctrees/examples/bulk_data.doctree b/docs/build/html/.doctrees/examples/bulk_data.doctree index 622021a53cdb46a833fe123027936d1395204087..e821a0c2d0f18bc2e7b1001c67a52ae26d79e2dc 100644 GIT binary patch delta 98 zcmdlh)h*82z&f>odn2n0Bcspcx7^Zf?wKVXrAeD}8Go@)&frv@+`}o!ST#98ZjnLzRP7Z`8M-Qj1fI%2KD4W@u$x0V+J0 zA(Nq9nv^>EA(ss!(_}erIR$T~(xi+7uwckw1N-$TjNel;c@d{3JSZn$JQg`jJ!s diff --git a/docs/build/html/.doctrees/examples/ifw_example.doctree b/docs/build/html/.doctrees/examples/ifw_example.doctree new file mode 100644 index 0000000000000000000000000000000000000000..befdc2763844b1d19ebe8b9708e40d8aee046fd2 GIT binary patch literal 8602 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 Hywmz0gOMBA literal 0 HcmV?d00001 diff --git a/docs/build/html/.doctrees/examples/index.doctree b/docs/build/html/.doctrees/examples/index.doctree index 4522011fbf6103a2792ff6a851e93f7eab73c22f..287181f7b8b59aabfcf54d719680fe72aab111e1 100644 GIT binary patch delta 278 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 delta 818 zcma)4OKVd>6z)xvwyDI8bdx4Bh?r<0G*F5PSqMHTfi!5vO>3FloaS7;FJ|VJ23ivz zT@>!7+!5-+Uy&c6f_1NmTcHbaB?$fi&m~-F6rux%d7b&rH{W-@AEZ9!GyTlV+quI` z>kz*g&1lt_pJ@v35tvFwzOiKR!KdBhl<{zI)cZPFsA5HiS(iJYx;{v~r?GkCR};v&T*it>gIGd664t?Q{U9h;%U=?6FNHdY#U zbeN8{i*Kf+7YHgqP=x!2aL){N!G%RE)>9wfqCz2@5LdfPK)w7ko%m6+=(w&js`%o9uiZ(DAMS#-wfeLE5C*$C=M|7bk!)sz0K oe<2T*Ez|FQjk=yqT>nWuP^|r_82(6^DT8NB@UcadS20@4`V*mgE diff --git a/docs/build/html/.doctrees/examples/petition_decisions.doctree b/docs/build/html/.doctrees/examples/petition_decisions.doctree new file mode 100644 index 0000000000000000000000000000000000000000..da53a91a7a01905c1ec7ec849610a35283bd45c8 GIT binary patch literal 25520 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 u8$pV6H>k0#mEi&FkzxThdnu3@B literal 0 HcmV?d00001 diff --git a/docs/build/html/.doctrees/examples/ptab_trials.doctree b/docs/build/html/.doctrees/examples/ptab_trials.doctree new file mode 100644 index 0000000000000000000000000000000000000000..66e21384cb35ebd2da4b33f3d7e4d4b93e7e5574 GIT binary patch literal 20742 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 literal 0 HcmV?d00001 diff --git a/docs/build/html/.doctrees/index.doctree b/docs/build/html/.doctrees/index.doctree index 84e38172c661b90d8888fcefe32f9f3d91c986cc..cafb9f99dfd0652f019c1e883740893b0ed11b72 100644 GIT binary patch delta 31 ncmeyY{85>ufpzM$jV#%WjP{cY7^T_VGfO;5lQvIgOb`G7xS0yC delta 33 pcmeyU{8^c$fpzMOjV#%WjE<8F7^OJ^it@8klS_&>Ph?CG007cO3%URR diff --git a/docs/build/html/.doctrees/installation.doctree b/docs/build/html/.doctrees/installation.doctree index 93a52fee06afa0ebf0b91688e7ccbcd1ba152c4e..0725acad0e4716ee7eaaaf42a4a4db3f0f8c98e0 100644 GIT binary patch delta 36 scmZ23Jwt-Efpsb`&qh{DMn<>E_KebO?wKVXrAeEU7<0KM$MAXs0J7}~?EnA( delta 372 zcmbOsv0R$9fpzK}-i@r5jEo+W?HQ#x0*dmpQj<%HHzzRWa@A)r^zao|7MG;v#^(iKRPjudl~ Mh!!RRVUw>GOY#&FWdHyG delta 203 zcmeyN^-GtvfpzM8v5l0d#sfVpNzqBYhbxMYIX@*vo86yKjhExW3hI9sV zhD?TbhO9SJX;PLsPfr7=8?UG&t22h^b}>J0$n);que diff --git a/docs/build/html/_modules/index.html b/docs/build/html/_modules/index.html index abd67e7..436801c 100644 --- a/docs/build/html/_modules/index.html +++ b/docs/build/html/_modules/index.html @@ -5,7 +5,7 @@ - Overview: module code — pyUSPTO 0.1.4.dev0+ga92fa00.d20250320 documentation + Overview: module code — pyUSPTO 0.2.3.dev1+g2c5d89b38.d20251125 documentation @@ -13,7 +13,7 @@ - + @@ -77,10 +77,18 @@

All modules for which code is available

@@ -90,7 +98,7 @@

All modules for which code is available


-

© Copyright 2025, Andrew Piechocki.

+

© Copyright 2025, Dunlap Codding, P.C..

Built with Sphinx using a diff --git a/docs/build/html/_modules/pyUSPTO/clients/bulk_data.html b/docs/build/html/_modules/pyUSPTO/clients/bulk_data.html index 09fd258..8e92649 100644 --- a/docs/build/html/_modules/pyUSPTO/clients/bulk_data.html +++ b/docs/build/html/_modules/pyUSPTO/clients/bulk_data.html @@ -5,7 +5,7 @@ - pyUSPTO.clients.bulk_data — pyUSPTO 0.1.4.dev0+ga92fa00.d20250320 documentation + pyUSPTO.clients.bulk_data — pyUSPTO 0.2.3.dev1+g2c5d89b38.d20251125 documentation @@ -13,7 +13,7 @@ - + @@ -84,17 +84,12 @@

Source code for pyUSPTO.clients.bulk_data

 """
 
 import os
-from typing import Any, Dict, Generator, Iterator, List, Optional
+from typing import Any, Dict, Iterator, List, Optional
 from urllib.parse import urlparse
 
-from pyUSPTO.base import BaseUSPTOClient
+from pyUSPTO.clients.base import BaseUSPTOClient
 from pyUSPTO.config import USPTOConfig
-from pyUSPTO.exceptions import USPTOApiError
-from pyUSPTO.models.bulk_data import (
-    BulkDataProduct,
-    BulkDataResponse,
-    FileData,
-)
+from pyUSPTO.models.bulk_data import BulkDataProduct, BulkDataResponse, FileData
 
 
 
@@ -136,7 +131,7 @@

Source code for pyUSPTO.clients.bulk_data

         # Use provided base_url or get from config
         base_url = base_url or self.config.bulk_data_base_url
 
-        super().__init__(api_key=api_key, base_url=base_url)
+ super().__init__(api_key=api_key, base_url=base_url, config=self.config)
@@ -413,7 +408,7 @@

Source code for pyUSPTO.clients.bulk_data

   
-

© Copyright 2025, Andrew Piechocki.

+

© Copyright 2025, Dunlap Codding, P.C..

Built with Sphinx using a diff --git a/docs/build/html/_modules/pyUSPTO/clients/patent_data.html b/docs/build/html/_modules/pyUSPTO/clients/patent_data.html index 31e0356..3745f7e 100644 --- a/docs/build/html/_modules/pyUSPTO/clients/patent_data.html +++ b/docs/build/html/_modules/pyUSPTO/clients/patent_data.html @@ -5,7 +5,7 @@ - pyUSPTO.clients.patent_data — pyUSPTO 0.1.4.dev0+ga92fa00.d20250320 documentation + pyUSPTO.clients.patent_data — pyUSPTO 0.2.3.dev1+g2c5d89b38.d20251125 documentation @@ -13,7 +13,7 @@ - + @@ -83,18 +83,33 @@

Source code for pyUSPTO.clients.patent_data

 It allows you to search for and retrieve patent application data.
 """
 
-import os
-import re
-from typing import Any, Dict, Iterator, List, Optional, Union
-from urllib.parse import urlparse
+import warnings
+from pathlib import Path
+from typing import Any, Dict, Iterator, List, Optional
+from urllib.parse import urljoin, urlparse
 
-from pyUSPTO.base import BaseUSPTOClient
+from pyUSPTO.clients.base import BaseUSPTOClient
 from pyUSPTO.config import USPTOConfig
-from pyUSPTO.exceptions import USPTOApiError
 from pyUSPTO.models.patent_data import (
+    ApplicationContinuityData,
+    ApplicationMetaData,
+    Assignment,
+    ChildContinuity,
+    DocumentBag,
+    DocumentFormat,
+    EventData,
+    ForeignPriority,
+    ParentContinuity,
     PatentDataResponse,
     PatentFileWrapper,
+    PatentTermAdjustmentData,
+    PrintedMetaData,
+    PrintedPublication,
+    RecordAttorney,
+    StatusCodeCollection,
+    StatusCodeSearchResponse,
 )
+from pyUSPTO.warnings import USPTODataMismatchWarning
 
 
 
@@ -102,684 +117,1182 @@

Source code for pyUSPTO.clients.patent_data

 class PatentDataClient(BaseUSPTOClient[PatentDataResponse]):
     """Client for interacting with the USPTO Patent Data API."""
 
-    # Centralized endpoint configuration
     ENDPOINTS = {
-        # Application endpoints
-        "applications_search": "applications/search",
-        "applications_search_download": "applications/search/download",
-        "application_by_number": "applications/{application_number}",
-        "application_metadata": "applications/{application_number}/meta-data",
-        "application_adjustment": "applications/{application_number}/adjustment",
-        "application_assignment": "applications/{application_number}/assignment",
-        "application_attorney": "applications/{application_number}/attorney",
-        "application_continuity": "applications/{application_number}/continuity",
-        "application_foreign_priority": "applications/{application_number}/foreign-priority",
-        "application_transactions": "applications/{application_number}/transactions",
-        "application_documents": "applications/{application_number}/documents",
-        "application_associated_documents": "applications/{application_number}/associated-documents",
-        # Document download endpoint (different base URL)
-        "download_document": "download/applications/{application_number}/{document_id}",
-        # Status code endpoints
-        "status_codes": "status-codes",
+        "search_applications": "api/v1/patent/applications/search",
+        "get_search_results": "api/v1/patent/applications/search/download",
+        "get_application_by_number": "api/v1/patent/applications/{application_number}",
+        "get_application_metadata": "api/v1/patent/applications/{application_number}/meta-data",
+        "get_application_adjustment": "api/v1/patent/applications/{application_number}/adjustment",
+        "get_application_assignment": "api/v1/patent/applications/{application_number}/assignment",
+        "get_application_attorney": "api/v1/patent/applications/{application_number}/attorney",
+        "get_application_continuity": "api/v1/patent/applications/{application_number}/continuity",
+        "get_application_foreign_priority": "api/v1/patent/applications/{application_number}/foreign-priority",
+        "get_application_transactions": "api/v1/patent/applications/{application_number}/transactions",
+        "get_application_documents": "api/v1/patent/applications/{application_number}/documents",
+        "get_application_associated_documents": "api/v1/patent/applications/{application_number}/associated-documents",
+        "download_application_document": "api/v1/download/applications/{application_number}/{document_id}",
+        "status_codes": "api/v1/patent/status-codes",
     }
 
-
-[docs] def __init__( self, api_key: Optional[str] = None, base_url: Optional[str] = None, config: Optional[USPTOConfig] = None, ): - """ - Initialize the PatentDataClient. + self.config = config or USPTOConfig(api_key=api_key) + api_key_to_use = api_key or self.config.api_key + effective_base_url = ( + base_url or self.config.patent_data_base_url or "https://api.uspto.gov" + ) + super().__init__( + api_key=api_key_to_use, base_url=effective_base_url, config=self.config + ) + +
+[docs] + def sanitize_application_number(self, input_number: str) -> str: + """Sanitize and validate a USPTO application number. + + Application numbers are either: + - 8 digits (e.g., "16123456") + - Series code format: 2 digits + "/" + 6 digits (e.g., "08/123456") + - PCT format: "PCT/US2024/012345" → "PCTUS2412345" + + This method removes common separators (commas, spaces) while preserving + the "/" in series code format. Args: - api_key: Optional API key for authentication - base_url: The base URL of the API, defaults to config.patent_data_base_url or "https://api.uspto.gov/api/v1/patent" - config: Optional USPTOConfig instance + input_number: Raw application number input. May include commas, + spaces, or other formatting. + + Returns: + str: Sanitized application number (either "NNNNNNNN" or "NN/NNNNNN"). + + Raises: + ValueError: If the format is invalid. + + Examples: + >>> client.sanitize_application_number("16123456") + "16123456" + >>> client.sanitize_application_number("16,123,456") + "16123456" + >>> client.sanitize_application_number("08/123456") + "08/123456" + >>> client.sanitize_application_number("08/123,456") + "08/123456" """ - # Use config if provided, otherwise create default config - self.config = config or USPTOConfig(api_key=api_key) + if not input_number or not input_number.strip(): + raise ValueError("Application number cannot be empty") - # Use provided API key or get from config - api_key = api_key or self.config.api_key + raw = input_number.strip() - # Use provided base_url or get from config - base_url = base_url or self.config.patent_data_base_url + # --- NEW: Handle PCT formats --- + # Example: "PCT/US2024/012345" -> "PCTUS2412345" + if raw.startswith("PCT"): + parts = raw.split("/") + if len(parts) != 3: + raise ValueError( + f"Invalid PCT application format: {input_number}. " + "Expected PCT/CCYYYY/NNNNNN" + ) - super().__init__(api_key=api_key, base_url=base_url)
+ _, country_year, serial = parts + # country_year can be "US2024" or "US24" + country = country_year[:2] -
-[docs] - def get_patent_applications( - self, params: Optional[Dict[str, Any]] = None - ) -> PatentDataResponse: - """ - Get a list of patent applications using the search endpoint. + year_part = country_year[2:] + if not year_part.isdigit(): + raise ValueError( + f"Invalid PCT year in: {country_year}. Must be digits." + ) - Args: - params: Optional query parameters including: - - q: Search query string - - sort: Field to sort by followed by sort order - - offset: Position in dataset to start from - - limit: Number of results to return - - facets: List of fields to facet upon - - fields: Fields to include in response - - filters: Field filters - - rangeFilters: Range filters + # Normalize: + # "2024" -> "24" + # "24" -> "24" + if len(year_part) == 4: + year = year_part[-2:] + elif len(year_part) == 2: + year = year_part + else: + raise ValueError( + f"Invalid PCT year length in: {country_year}. " + "Expected CCYYYY or CCYY." + ) - Returns: - PatentDataResponse object containing the API response - """ - result = self._make_request( - method="GET", - endpoint=self.ENDPOINTS["applications_search"], - params=params, - response_class=PatentDataResponse, - ) - # Since we specified response_class=BulkDataResponse, the result should be a BulkDataResponse - assert isinstance(result, PatentDataResponse) - return result
+ # Serial must be digits only + if not serial.isdigit(): + raise ValueError(f"Invalid PCT serial: {serial}. Must be numeric.") + return f"PCT{country}{year}{serial}" -
-[docs] - def search_patent_applications_post( - self, search_request: Dict[str, Any] - ) -> PatentDataResponse: - """ - Search patent applications using POST method with JSON payload. + # Strip whitespace and remove commas/spaces + cleaned = raw.replace(",", "").replace(" ", "") - Args: - search_request: JSON payload with search parameters including: - - q: Search query string - - filters: Array of filter objects - - rangeFilters: Array of range filter objects - - sort: Array of sort objects - - fields: Array of field names to include - - pagination: Pagination object - - facets: Array of facet field names + # Check if this is series code format (NN/NNNNNN) + if "/" in cleaned: + parts = cleaned.split("/") + if len(parts) != 2: + raise ValueError( + f"Invalid application number format: {input_number}. " + "Expected format: NNNNNNNN or NN/NNNNNN" + ) - Returns: - PatentDataResponse object containing the API response - """ - result = self._make_request( - method="POST", - endpoint=self.ENDPOINTS["applications_search"], - json_data=search_request, - response_class=PatentDataResponse, - ) - # Since we specified response_class=BulkDataResponse, the result should be a BulkDataResponse - assert isinstance(result, PatentDataResponse) - return result
+ series, serial = parts + if not series.isdigit() or not serial.isdigit(): + raise ValueError( + f"Invalid application number format: {input_number}. " + "Series and serial must be numeric." + ) + if len(series) != 2 or len(serial) != 6: + raise ValueError( + f"Invalid application number format: {input_number}. " + "Expected series code format: NN/NNNNNN (2 digits / 6 digits)" + ) -
-[docs] - def download_patent_applications( - self, params: Optional[Dict[str, Any]] = None, format: str = "json" - ) -> PatentDataResponse: - """ - Download patent data with specified format. + return cleaned - Args: - params: Optional query parameters - format: Download format (json or csv) + # Standard 8-digit format + if not cleaned.isdigit(): + raise ValueError( + f"Invalid application number format: {input_number}. " + "Must contain only digits." + ) - Returns: - PatentDataResponse object containing the API response + if len(cleaned) != 8: + raise ValueError( + f"Invalid application number format: {input_number}. " + "Expected 8 digits." + ) + + return cleaned
+ + + def _get_wrapper_from_response( + self, + response_data: PatentDataResponse, + application_number_for_validation: Optional[str] = None, + ) -> Optional[PatentFileWrapper]: + """Helper to extract a single PatentFileWrapper, optionally validating the app number.""" + if not response_data or not response_data.patent_file_wrapper_data_bag: + return None + + wrapper = response_data.patent_file_wrapper_data_bag[0] + + if ( + application_number_for_validation + and wrapper.application_number_text + != self.sanitize_application_number(application_number_for_validation) + ): + warnings.warn( + f"API returned application number '{wrapper.application_number_text}' " + f"but requested '{application_number_for_validation}'. " + f"This may indicate an API data inconsistency.", + USPTODataMismatchWarning, + stacklevel=2, + ) + return wrapper + +
+[docs] + def search_applications( + self, + query: Optional[str] = None, + sort: Optional[str] = None, + offset: Optional[int] = 0, + limit: Optional[int] = 25, + facets: Optional[str] = None, + fields: Optional[str] = None, + filters: Optional[str] = None, + range_filters: Optional[str] = None, + post_body: Optional[Dict[str, Any]] = None, + application_number_q: Optional[str] = None, + patent_number_q: Optional[str] = None, + inventor_name_q: Optional[str] = None, + applicant_name_q: Optional[str] = None, + assignee_name_q: Optional[str] = None, + filing_date_from_q: Optional[str] = None, + filing_date_to_q: Optional[str] = None, + grant_date_from_q: Optional[str] = None, + grant_date_to_q: Optional[str] = None, + classification_q: Optional[str] = None, + earliestPublicationNumber_q: Optional[str] = None, + pctPublicationNumber_q: Optional[str] = None, + additional_query_params: Optional[Dict[str, Any]] = None, + ) -> PatentDataResponse: + """ + Searches for patent applications. + Can perform a GET request based on OpenAPI query parameters or a POST request if post_body is specified. """ - # Add format parameter if not already in params - if params is None: - params = {} - if "format" not in params: - params["format"] = format - - result = self._make_request( - method="GET", - endpoint=self.ENDPOINTS["applications_search_download"], - params=params, - response_class=PatentDataResponse, - ) - # Since we specified response_class=BulkDataResponse, the result should be a BulkDataResponse + endpoint = self.ENDPOINTS["search_applications"] + + if post_body is not None: + result = self._make_request( + method="POST", + endpoint=endpoint, + json_data=post_body, + params=additional_query_params, + response_class=PatentDataResponse, + ) + else: + params: Dict[str, Any] = {} + final_q = query + + if final_q is None: + q_parts = [] + if application_number_q: + q_parts.append(f"applicationNumberText:{application_number_q}") + if patent_number_q: + q_parts.append( + f"applicationMetaData.patentNumber:{patent_number_q}" + ) + if inventor_name_q: + q_parts.append( + f"applicationMetaData.inventorBag.inventorNameText:{inventor_name_q}" + ) + if applicant_name_q: + q_parts.append( + f"applicationMetaData.firstApplicantName:{applicant_name_q}" + ) + if assignee_name_q: + q_parts.append( + f"assignmentBag.assigneeBag.assigneeNameText:{assignee_name_q}" + ) + if classification_q: + q_parts.append( + f"applicationMetaData.cpcClassificationBag:{classification_q}" + ) + if earliestPublicationNumber_q: + q_parts.append( + f"applicationMetaData.earliestPublicationNumber:{earliestPublicationNumber_q}" + ) + if pctPublicationNumber_q: + q_parts.append( + f"applicationMetaData.pctPublicationNumber:{pctPublicationNumber_q}" + ) + if filing_date_from_q and filing_date_to_q: + q_parts.append( + f"applicationMetaData.filingDate:[{filing_date_from_q} TO {filing_date_to_q}]" + ) + elif filing_date_from_q: + q_parts.append( + f"applicationMetaData.filingDate:>={filing_date_from_q}" + ) + elif filing_date_to_q: + q_parts.append( + f"applicationMetaData.filingDate:<={filing_date_to_q}" + ) + + if grant_date_from_q and grant_date_to_q: + q_parts.append( + f"applicationMetaData.grantDate:[{grant_date_from_q} TO {grant_date_to_q}]" + ) + elif grant_date_from_q: + q_parts.append( + f"applicationMetaData.grantDate:>={grant_date_from_q}" + ) + elif grant_date_to_q: + q_parts.append(f"applicationMetaData.grantDate:<={grant_date_to_q}") + + if q_parts: + final_q = " AND ".join(q_parts) + + if final_q is not None: + params["q"] = final_q + if sort is not None: + params["sort"] = sort + if offset is not None: + params["offset"] = offset + if limit is not None: + params["limit"] = limit + if facets is not None: + params["facets"] = facets + if fields is not None: + params["fields"] = fields + if filters is not None: + params["filters"] = filters + if range_filters is not None: + params["rangeFilters"] = range_filters + + if additional_query_params: + params.update(additional_query_params) + result = self._make_request( + method="GET", + endpoint=endpoint, + params=params, + response_class=PatentDataResponse, + ) assert isinstance(result, PatentDataResponse) return result
-
-[docs] - def download_patent_applications_post( - self, download_request: Dict[str, Any] - ) -> PatentDataResponse: +
+[docs] + def get_search_results( + self, + query: Optional[str] = None, + sort: Optional[str] = None, + offset: Optional[int] = 0, + limit: Optional[int] = 25, + fields_param: Optional[str] = None, + filters_param: Optional[str] = None, + range_filters_param: Optional[str] = None, + post_body: Optional[Dict[str, Any]] = None, + application_number_q: Optional[str] = None, + patent_number_q: Optional[str] = None, + inventor_name_q: Optional[str] = None, + applicant_name_q: Optional[str] = None, + assignee_name_q: Optional[str] = None, + filing_date_from_q: Optional[str] = None, + filing_date_to_q: Optional[str] = None, + grant_date_from_q: Optional[str] = None, + grant_date_to_q: Optional[str] = None, + classification_q: Optional[str] = None, + additional_query_params: Optional[Dict[str, Any]] = None, + ) -> list[ApplicationMetaData]: """ - Download patent data using POST method with JSON payload. + Fetches a dataset of patent applications based on search criteria, always requesting JSON format. + For GET, parameters align with OpenAPI for /api/v1/patent/applications/search/download. + For POST, post_body should conform to PatentDownloadRequest schema. + """ + endpoint = self.ENDPOINTS["get_search_results"] - Args: - download_request: JSON payload with download parameters including format + if post_body is not None: + if "format" not in post_body: + post_body["format"] = "json" - Returns: - PatentDataResponse object containing the API response - """ - result = self._make_request( - method="POST", - endpoint=self.ENDPOINTS["applications_search_download"], - json_data=download_request, - response_class=PatentDataResponse, - ) - # Since we specified response_class=BulkDataResponse, the result should be a BulkDataResponse - assert isinstance(result, PatentDataResponse) - return result
+ result = self._make_request( + method="POST", + endpoint=endpoint, + json_data=post_body, + params=additional_query_params, + ) + else: + params: Dict[str, Any] = {} + final_q = query + + if final_q is None: + q_parts = [] + if application_number_q: + q_parts.append(f"applicationNumberText:{application_number_q}") + if patent_number_q: + q_parts.append( + f"applicationMetaData.patentNumber:{patent_number_q}" + ) + if inventor_name_q: + q_parts.append( + f"applicationMetaData.inventorBag.inventorNameText:{inventor_name_q}" + ) + if applicant_name_q: + q_parts.append( + f"applicationMetaData.firstApplicantName:{applicant_name_q}" + ) + if assignee_name_q: + q_parts.append( + f"assignmentBag.assigneeBag.assigneeNameText:{assignee_name_q}" + ) + if classification_q: + q_parts.append( + f"applicationMetaData.cpcClassificationBag:{classification_q}" + ) + + if filing_date_from_q and filing_date_to_q: + q_parts.append( + f"applicationMetaData.filingDate:[{filing_date_from_q} TO {filing_date_to_q}]" + ) + elif filing_date_from_q: + q_parts.append( + f"applicationMetaData.filingDate:>={filing_date_from_q}" + ) + elif filing_date_to_q: + q_parts.append( + f"applicationMetaData.filingDate:<={filing_date_to_q}" + ) + + if grant_date_from_q and grant_date_to_q: + q_parts.append( + f"applicationMetaData.grantDate:[{grant_date_from_q} TO {grant_date_to_q}]" + ) + elif grant_date_from_q: + q_parts.append( + f"applicationMetaData.grantDate:>={grant_date_from_q}" + ) + elif grant_date_to_q: + q_parts.append(f"applicationMetaData.grantDate:<={grant_date_to_q}") + + if q_parts: + final_q = " AND ".join(q_parts) + + if final_q is not None: + params["q"] = final_q + if sort is not None: + params["sort"] = sort + if offset is not None: + params["offset"] = offset + if limit is not None: + params["limit"] = limit + if fields_param is not None: + params["fields"] = fields_param + if filters_param is not None: + params["filters"] = filters_param + if range_filters_param is not None: + params["rangeFilters"] = range_filters_param + + params["format"] = "json" + + if additional_query_params: + params.update(additional_query_params) + + result = self._make_request( + method="GET", + endpoint=endpoint, + params=params, + ) + assert isinstance(result, Dict) + amd_list = [ + ApplicationMetaData.from_dict(item["applicationMetaData"]) + for item in result["patentdata"] + ] + return amd_list
-
-[docs] - def get_patent_by_application_number( +
+[docs] + def get_application_by_number( self, application_number: str - ) -> PatentFileWrapper: - """ - Get a specific patent by application number. + ) -> Optional[PatentFileWrapper]: + """Retrieves the full details for a specific patent application by its number. + + This method fetches comprehensive information for a single patent application + identified by its unique application number. Args: - application_number: The application number + application_number (str): The USPTO application number for the patent + application (e.g., "16123456" or "18/915,708"). The application + number will be automatically sanitized to remove commas and spaces. Returns: - PatentFileWrapper object containing the patent data + Optional[PatentFileWrapper]: A `PatentFileWrapper` object representing + the complete file wrapper for the application if found. This object + contains all data sections related to the application, such as + metadata, addresses, assignments, attorney/agent data, continuity + data, PTA/PTE data, transactions, and associated documents. + Returns None if the application cannot be found or if the response + does not contain the expected data. """ - endpoint = self.ENDPOINTS["application_by_number"].format( - application_number=application_number + endpoint = self.ENDPOINTS["get_application_by_number"].format( + application_number=self.sanitize_application_number(application_number) ) - data = self._make_request(method="GET", endpoint=endpoint) - - # Handling different response formats - if isinstance(data, dict): - if "patentFileWrapperDataBag" in data: - for wrapper in data["patentFileWrapperDataBag"]: - if wrapper.get("applicationNumberText") == application_number: - return PatentFileWrapper.from_dict(wrapper) - raise ValueError( - f"Patent with application number {application_number} not found in response" - ) - else: - # If response doesn't contain patentFileWrapperDataBag, assume it's a direct PatentFileWrapper - return PatentFileWrapper.from_dict(data) - elif isinstance(data, PatentFileWrapper): - return data - else: - raise TypeError(f"Unexpected response type: {type(data)}")
+ response_data = self._make_request( + method="GET", endpoint=endpoint, response_class=PatentDataResponse + ) + assert isinstance(response_data, PatentDataResponse) + return self._get_wrapper_from_response( + response_data=response_data, + application_number_for_validation=application_number, + )
[docs] - def get_application_metadata(self, application_number: str) -> PatentDataResponse: - """ - Get metadata for a specific patent application. + def get_application_metadata( + self, application_number: str + ) -> Optional[ApplicationMetaData]: + """Retrieves key metadata for a specific patent application. + + This method fetches the `ApplicationMetaData` component from the full + patent file wrapper. The metadata includes a wide range of information + such as application status, important dates (filing, grant, publication), + applicant and inventor details, classification data, and other core + identifying information for the application. Args: - application_number: The application number + application_number (str): The USPTO application number for which + metadata is being requested (e.g., "16123456" or "18/915,708"). + The application number will be automatically sanitized. Returns: - PatentDataResponse object containing the application metadata + Optional[ApplicationMetaData]: An `ApplicationMetaData` object + containing the core details of the patent application if found. + Returns None if the application cannot be found or if metadata + is not available in the response. """ - endpoint = self.ENDPOINTS["application_metadata"].format( - application_number=application_number + endpoint = self.ENDPOINTS["get_application_metadata"].format( + application_number=self.sanitize_application_number(application_number) ) - result = self._make_request( - method="GET", - endpoint=endpoint, - response_class=PatentDataResponse, + response_data = self._make_request( + method="GET", endpoint=endpoint, response_class=PatentDataResponse ) - # Since we specified response_class=BulkDataResponse, the result should be a BulkDataResponse - assert isinstance(result, PatentDataResponse) - return result
+ assert isinstance(response_data, PatentDataResponse) + wrapper = self._get_wrapper_from_response(response_data, application_number) + return wrapper.application_meta_data if wrapper else None
[docs] - def get_application_adjustment(self, application_number: str) -> PatentDataResponse: - """ - Get patent term adjustment data for an application. + def get_application_adjustment( + self, application_number: str + ) -> Optional[PatentTermAdjustmentData]: + """Retrieves patent term adjustment (PTA) data for a specific application. + + This method fetches the `PatentTermAdjustmentData` component from the + full patent file wrapper. This data includes details on various delay + quantities (e.g., A, B, C delays, applicant delays), the total + calculated adjustment, and a history of PTA events that influenced the + term. Args: - application_number: The application number + application_number (str): The USPTO application number for which PTA + data is being requested (e.g., "16123456"). Returns: - PatentDataResponse object containing the adjustment data + Optional[PatentTermAdjustmentData]: A `PatentTermAdjustmentData` + object containing the PTA details if the application is found + and has such data. Returns None if the application cannot be + found or if PTA data is not available in the response. """ - endpoint = self.ENDPOINTS["application_adjustment"].format( - application_number=application_number + endpoint = self.ENDPOINTS["get_application_adjustment"].format( + application_number=self.sanitize_application_number(application_number) ) - result = self._make_request( - method="GET", - endpoint=endpoint, - response_class=PatentDataResponse, + response_data = self._make_request( + method="GET", endpoint=endpoint, response_class=PatentDataResponse ) - # Since we specified response_class=BulkDataResponse, the result should be a BulkDataResponse - assert isinstance(result, PatentDataResponse) - return result
+ assert isinstance(response_data, PatentDataResponse) + wrapper = self._get_wrapper_from_response(response_data, application_number) + return wrapper.patent_term_adjustment_data if wrapper else None
[docs] - def get_application_assignment(self, application_number: str) -> PatentDataResponse: - """ - Get assignment data for an application. + def get_application_assignment( + self, application_number: str + ) -> Optional[List[Assignment]]: + """Retrieves a list of patent assignments for a specific application. + + This method fetches the `assignment_bag` from the patent file wrapper, + which contains a list of `Assignment` objects. Each `Assignment` object + details an assignment including information such as reel and frame numbers, + recording dates, conveyance text, and details about the assignors and assignees. Args: - application_number: The application number + application_number (str): The USPTO application number for which + assignment data is being requested (e.g., "16123456"). Returns: - PatentDataResponse object containing the assignment data + Optional[List[Assignment]]: A list of `Assignment` objects, each + representing a recorded assignment for the application. Returns + None if the application cannot be found, or if no assignment + data is available in the response. An empty list may be + returned if the application is found but has no recorded + assignments. """ - endpoint = self.ENDPOINTS["application_assignment"].format( - application_number=application_number + endpoint = self.ENDPOINTS["get_application_assignment"].format( + application_number=self.sanitize_application_number(application_number) ) - result = self._make_request( - method="GET", - endpoint=endpoint, - response_class=PatentDataResponse, + response_data = self._make_request( + method="GET", endpoint=endpoint, response_class=PatentDataResponse ) - # Since we specified response_class=BulkDataResponse, the result should be a BulkDataResponse - assert isinstance(result, PatentDataResponse) - return result
+ assert isinstance(response_data, PatentDataResponse) + wrapper = self._get_wrapper_from_response(response_data, application_number) + return wrapper.assignment_bag if wrapper else None
[docs] - def get_application_attorney(self, application_number: str) -> PatentDataResponse: - """ - Get attorney/agent data for an application. + def get_application_attorney( + self, application_number: str + ) -> Optional[RecordAttorney]: + """Retrieves data for the attorney(s) of record for a specific application. + + This method fetches the `RecordAttorney` object associated with the + patent application. This object contains details about the attorney(s) + of record, including customer number correspondence data, power of attorney + information, and a list of listed attorneys. Args: - application_number: The application number + application_number (str): The USPTO application number for which + attorney data is being requested (e.g., "16123456"). Returns: - PatentDataResponse object containing the attorney data + Optional[RecordAttorney]: A `RecordAttorney` object with details + about the attorney(s) of record if the application is found + and such data exists. Returns None if the application cannot + be found or if no attorney data is available in the response. """ - endpoint = self.ENDPOINTS["application_attorney"].format( - application_number=application_number + endpoint = self.ENDPOINTS["get_application_attorney"].format( + application_number=self.sanitize_application_number(application_number) ) - result = self._make_request( - method="GET", - endpoint=endpoint, - response_class=PatentDataResponse, + response_data = self._make_request( + method="GET", endpoint=endpoint, response_class=PatentDataResponse ) - # Since we specified response_class=BulkDataResponse, the result should be a BulkDataResponse - assert isinstance(result, PatentDataResponse) - return result
+ assert isinstance(response_data, PatentDataResponse) + wrapper = self._get_wrapper_from_response(response_data, application_number) + return wrapper.record_attorney if wrapper else None
[docs] - def get_application_continuity(self, application_number: str) -> PatentDataResponse: - """ - Get continuity data for an application. + def get_application_continuity( + self, application_number: str + ) -> Optional[ApplicationContinuityData]: + """Retrieves continuity data (parent/child applications) for a specific application. + + This method fetches the lineage of the specified application, returning an + `ApplicationContinuityData` object. This object consolidates lists of + `ParentContinuity` (applications to which the current one claims priority) + and `ChildContinuity` (applications claiming priority to the current one) + objects, each detailing the related application's key identifiers and status. Args: - application_number: The application number + application_number (str): The USPTO application number for which + continuity data is being requested (e.g., "16123456"). Returns: - PatentDataResponse object containing the continuity data + Optional[ApplicationContinuityData]: An `ApplicationContinuityData` + object containing lists of parent and child continuity relationships. + Returns None if the application cannot be found or if the underlying + data to construct continuity is not available. The lists within + the returned object may be empty if no parent or child continuity + links exist. """ - endpoint = self.ENDPOINTS["application_continuity"].format( - application_number=application_number + endpoint = self.ENDPOINTS["get_application_continuity"].format( + application_number=self.sanitize_application_number(application_number) ) - result = self._make_request( - method="GET", - endpoint=endpoint, - response_class=PatentDataResponse, + response_data = self._make_request( + method="GET", endpoint=endpoint, response_class=PatentDataResponse ) - # Since we specified response_class=BulkDataResponse, the result should be a BulkDataResponse - assert isinstance(result, PatentDataResponse) - return result
+ assert isinstance(response_data, PatentDataResponse) + wrapper = self._get_wrapper_from_response(response_data, application_number) + return ApplicationContinuityData.from_wrapper(wrapper) if wrapper else None
[docs] def get_application_foreign_priority( self, application_number: str - ) -> PatentDataResponse: - """ - Get foreign priority data for an application. + ) -> Optional[List[ForeignPriority]]: + """Retrieves a list of foreign priority claims for a specific application. + + This method fetches the `foreign_priority_bag` from the patent file + wrapper. This bag contains a list of `ForeignPriority` objects, each + representing a claim to a foreign patent application's priority date. + Details include the IP office name, filing date, and application number + of the foreign priority application. Args: - application_number: The application number + application_number (str): The USPTO application number for which + foreign priority data is being requested (e.g., "16123456"). Returns: - PatentDataResponse object containing the foreign priority data + Optional[List[ForeignPriority]]: A list of `ForeignPriority` objects, + each detailing a claimed foreign priority. Returns None if the + application cannot be found or if no foreign priority data is + available. An empty list may be returned if the application + is found but has no foreign priority claims. """ - endpoint = self.ENDPOINTS["application_foreign_priority"].format( - application_number=application_number + endpoint = self.ENDPOINTS["get_application_foreign_priority"].format( + application_number=self.sanitize_application_number(application_number) ) - result = self._make_request( - method="GET", - endpoint=endpoint, - response_class=PatentDataResponse, + response_data = self._make_request( + method="GET", endpoint=endpoint, response_class=PatentDataResponse ) - # Since we specified response_class=BulkDataResponse, the result should be a BulkDataResponse - assert isinstance(result, PatentDataResponse) - return result
+ assert isinstance(response_data, PatentDataResponse) + wrapper = self._get_wrapper_from_response(response_data, application_number) + return wrapper.foreign_priority_bag if wrapper else None
[docs] def get_application_transactions( self, application_number: str - ) -> PatentDataResponse: - """ - Get transaction data for an application. + ) -> Optional[List[EventData]]: + """Retrieves the transaction history (events) for a specific application. + + This method fetches the `event_data_bag` from the patent file wrapper. + This bag contains a list of `EventData` objects, each representing a + single recorded event in the prosecution history of the patent application. + Events include details like an event code, a textual description, and + the date the event was recorded. Args: - application_number: The application number + application_number (str): The USPTO application number for which + transaction history is being requested (e.g., "16123456"). Returns: - PatentDataResponse object containing the transaction data + Optional[List[EventData]]: A list of `EventData` objects, each + detailing a transaction or event in the application's history. + Returns None if the application cannot be found or if no + transaction data is available. An empty list may be returned if + the application is found but has no recorded transaction events. """ - endpoint = self.ENDPOINTS["application_transactions"].format( - application_number=application_number + endpoint = self.ENDPOINTS["get_application_transactions"].format( + application_number=self.sanitize_application_number(application_number) ) - result = self._make_request( - method="GET", - endpoint=endpoint, - response_class=PatentDataResponse, + response_data = self._make_request( + method="GET", endpoint=endpoint, response_class=PatentDataResponse ) - # Since we specified response_class=BulkDataResponse, the result should be a BulkDataResponse - assert isinstance(result, PatentDataResponse) - return result
+ assert isinstance(response_data, PatentDataResponse) + wrapper = self._get_wrapper_from_response(response_data, application_number) + return wrapper.event_data_bag if wrapper else None
[docs] - def get_application_documents(self, application_number: str) -> PatentDataResponse: - """ - Get document details for an application. + def get_application_documents( + self, + application_number: str, + document_codes: Optional[List[str]] = None, + official_date_from: Optional[str] = None, + official_date_to: Optional[str] = None, + ) -> DocumentBag: + """Retrieves metadata for documents associated with a specific application. + + This method fetches a collection of document metadata related to the given + patent application. The result is a `DocumentBag` object, which is an + iterable collection of `Document` instances. Each `Document` object + contains metadata such as its identifier, official date, document code + and description, direction (incoming/outgoing), and available download + formats. Args: - application_number: The application number + application_number (str): The USPTO application number for which + document metadata is being requested (e.g., "16123456"). + document_codes (Optional[List[str]]): Filter by specific document type + codes. If provided, only documents with these codes will be returned. + Examples: ['ABST', 'CLM', 'SPEC', 'DRWD']. + official_date_from (Optional[str]): Filter documents from this date + (inclusive). Date format: YYYY-MM-DD (e.g., "2020-01-15"). + official_date_to (Optional[str]): Filter documents to this date + (inclusive). Date format: YYYY-MM-DD (e.g., "2023-12-31"). Returns: - PatentDataResponse object containing document details + DocumentBag: A `DocumentBag` object containing metadata for all + publicly available documents associated with the application + that match the provided filters. The bag will be empty if no + documents are found or if the API response indicates no documents. + It does not return None for "not found" cases; an empty collection + is returned instead. """ - endpoint = self.ENDPOINTS["application_documents"].format( - application_number=application_number + endpoint = self.ENDPOINTS["get_application_documents"].format( + application_number=self.sanitize_application_number(application_number) ) - result = self._make_request( - method="GET", - endpoint=endpoint, - response_class=PatentDataResponse, + + params = {} + if document_codes: + params["documentCodes"] = ",".join(document_codes) + if official_date_from: + params["officialDateFrom"] = official_date_from + if official_date_to: + params["officialDateTo"] = official_date_to + + result_dict = self._make_request( + method="GET", endpoint=endpoint, params=params if params else None ) - # Since we specified response_class=BulkDataResponse, the result should be a BulkDataResponse - assert isinstance(result, PatentDataResponse) - return result
+ assert isinstance(result_dict, dict) + return DocumentBag.from_dict(result_dict)
[docs] def get_application_associated_documents( self, application_number: str - ) -> PatentDataResponse: - """ - Get associated documents metadata for an application. + ) -> Optional[PrintedPublication]: + """Retrieves metadata for Pre-Grant Publication and Grant documents. - Args: - application_number: The application number - - Returns: - PatentDataResponse object containing the associated documents metadata - """ - endpoint = self.ENDPOINTS["application_associated_documents"].format( - application_number=application_number - ) - result = self._make_request( - method="GET", - endpoint=endpoint, - response_class=PatentDataResponse, - ) - # Since we specified response_class=BulkDataResponse, the result should be a BulkDataResponse - assert isinstance(result, PatentDataResponse) - return result
- - -
-[docs] - def download_application_document( - self, application_number: str, document_id: str, destination: str - ) -> str: - """ - Download a document for a patent application. + This method fetches metadata specifically for published documents associated + with the patent application, such as Pre-Grant Publications (PGPUBs) + and granted patent documents. It does not retrieve the prosecution + history documents (see `get_application_documents` for that). + The result is a `PrintedPublication` object, which holds + `PrintedMetaData` including file URIs and names. Download with download_archive. Args: - application_number: The application number - document_id: The document identifier - destination: Directory where the file should be saved + application_number (str): The USPTO application number for which + associated PGPUB/Grant document metadata is being requested + (e.g., "16123456"). Returns: - Path to the downloaded file + Optional[PrintedPublication]: A `PrintedPublication` object + containing `PrintedMetaData` for the Pre-Grant Publication + and/or the Grant document, if available. Returns None if the + application cannot be found or if no such associated document + metadata is available. The fields within the returned object + (`pgpub_document_meta_data`, `grant_document_meta_data`) + may themselves be None if a particular type of document + (e.g., PGPUB) does not exist for the application. """ - # This endpoint is at a different base URL level - base_url_parts = self.base_url.split("/patent") - base_url_root = base_url_parts[0] - endpoint = self.ENDPOINTS["download_document"].format( - application_number=application_number, document_id=document_id + endpoint = self.ENDPOINTS["get_application_associated_documents"].format( + application_number=self.sanitize_application_number(application_number) ) - - # Get the response with streaming enabled - response = self._make_request( - method="GET", endpoint=endpoint, stream=True, custom_base_url=base_url_root + response_data = self._make_request( + method="GET", endpoint=endpoint, response_class=PatentDataResponse ) + assert isinstance(response_data, PatentDataResponse) + wrapper = self._get_wrapper_from_response(response_data, application_number) + return PrintedPublication.from_wrapper(wrapper) if wrapper else None
- # Ensure we have a Response object with iter_content - import requests - if not isinstance(response, requests.Response): - raise TypeError("Expected a Response object for streaming download") +
+[docs] + def paginate_applications(self, **kwargs: Any) -> Iterator[PatentFileWrapper]: + """Provides an iterator to easily paginate through patent application search results. - if not os.path.exists(destination): - os.makedirs(destination) + This method simplifies the process of fetching all patent applications + that match a given search query by automatically handling pagination. + It internally calls the `search_applications` method for GET requests, + batching results and yielding them one by one. - # Get filename from Content-Disposition header if available - content_disposition = response.headers.get("Content-Disposition") - if content_disposition and "filename=" in content_disposition: - filename_match = re.search(r'filename="(.+?)"', content_disposition) - if filename_match: - filename = filename_match.group(1) - else: - filename = document_id - else: - filename = document_id - - file_path = os.path.join(destination, filename) - - with open(file=file_path, mode="wb") as f: - for chunk in response.iter_content(chunk_size=8192): - f.write(chunk) - - return file_path
- - -
-[docs] - def paginate_patents(self, **kwargs: Any) -> Iterator[PatentFileWrapper]: - """ - Paginate through all patents matching the search criteria. + All keyword arguments provided to this method (`**kwargs`) are passed + directly to the `search_applications` method to define the search + criteria. See the `search_applications` method for more details + on available parameters. + The `offset` and `limit` parameters are managed by the pagination logic; + setting them directly in `kwargs` might lead to unexpected behavior. Args: - **kwargs: Keyword arguments to pass to search_patents + **kwargs (Any): Keyword arguments to be passed to the + `search_applications` method for constructing the search query. + These define the criteria for the patent applications to be + retrieved. Do not include `post_body`. + + Returns: + Iterator[PatentFileWrapper]: An iterator that yields `PatentFileWrapper` + objects, allowing iteration over all matching patent applications + across multiple pages of results. - Yields: - PatentFileWrapper objects + Raises: + ValueError: If `post_body` is included in `kwargs`, as this + method only supports GET request parameters for pagination. """ + if "post_body" in kwargs: + raise ValueError( + "paginate_applications uses GET requests and does not support 'post_body'. " + "Use keyword arguments for search criteria." + ) + return self.paginate_results( - method_name="get_patent_applications", + method_name="search_applications", response_container_attr="patent_file_wrapper_data_bag", **kwargs, )
-
-[docs] - def get_patent_status_codes( +
+[docs] + def get_status_codes( self, params: Optional[Dict[str, Any]] = None - ) -> Dict[str, Any]: - """ - Get patent application status codes and descriptions. + ) -> StatusCodeSearchResponse: + """Retrieves USPTO patent application status codes and their descriptions. + + This method fetches a list of defined USPTO patent application status codes + (e.g., codes for "Pending," "Abandoned," "Issued") using a GET request. + The request can be customized with query parameters to filter or paginate + the results if supported by the API endpoint. Args: - params: Optional query parameters including: - - q: Search query string - - offset: Position in dataset to start from - - limit: Number of results to return + params (Optional[Dict[str, Any]], optional): A dictionary of query + parameters to be sent with the GET request. These parameters can + be used to filter or control the output of the status codes + list. Defaults to None, which typically retrieves all available + status codes or the API's default set. Returns: - Dictionary containing status codes and descriptions + StatusCodeSearchResponse: An object containing a count of matching + status codes, a `StatusCodeCollection` of the `StatusCode` + objects (code and description), and a request identifier. """ - result = self._make_request( + result_dict = self._make_request( method="GET", endpoint=self.ENDPOINTS["status_codes"], params=params ) - assert isinstance(result, dict) - return result
+ assert isinstance(result_dict, dict) + return StatusCodeSearchResponse.from_dict(result_dict)
-
-[docs] - def search_patent_status_codes_post( +
+[docs] + def search_status_codes( self, search_request: Dict[str, Any] - ) -> Dict[str, Any]: - """ - Search patent status codes using POST method with JSON payload. + ) -> StatusCodeSearchResponse: + """Searches USPTO patent application status codes using POST criteria. + + Performs targeted searches for USPTO patent application status codes + (e.g., for "Pending," "Abandoned," "Issued") by sending a POST request + with a JSON body containing the `search_request` criteria. This method + is suited for more complex queries than the GET-based `get_status_codes`. Args: - search_request: JSON payload with search parameters + search_request (Dict[str, Any]): A dictionary with search criteria, + sent as the JSON POST body. The structure must conform to USPTO + API requirements for this endpoint (e.g., for searching by code + or description keywords). Returns: - Dictionary containing status codes and descriptions + StatusCodeSearchResponse: An object containing a count of matching + status codes, a `StatusCodeCollection` of the `StatusCode` + objects (code and description), and a request identifier. """ - result = self._make_request( + result_dict = self._make_request( method="POST", endpoint=self.ENDPOINTS["status_codes"], json_data=search_request, ) - assert isinstance(result, dict) - return result
+ assert isinstance(result_dict, dict) + return StatusCodeSearchResponse.from_dict(result_dict)
-
-[docs] - def search_patents( +
+[docs] + def download_document( + self, + document_format: DocumentFormat, + file_name: Optional[str] = None, + destination_path: Optional[str] = None, + overwrite: bool = False, + stream: bool = True, + ) -> str: + """Downloads a document in the specified format. + + Args: + document_format: DocumentFormat object containing download URL and metadata + file_name: Optional filename. If not provided, extracted from URL + destination_path: Optional path - can be a directory OR a complete file path + overwrite: Whether to overwrite existing files. Default False + stream: Whether to stream the download. Default True for large files + + Returns: + str: Path to the downloaded file + + Raises: + ValueError: If document_format has no download URL + FileExistsError: If file exists and overwrite=False + """ + # Validate we have a download URL + if document_format.download_url is None: + raise ValueError("DocumentFormat must have a download_url") + + # Get filename - either provided or extract from URL + if file_name is None: + url_filename = document_format.download_url.split("/")[-1] + if "." in url_filename: + file_name = url_filename + else: + extension = ( + document_format.mime_type_identifier.lower() + if document_format.mime_type_identifier + else "pdf" + ) + file_name = f"document.{extension}" + + # Determine final file path + if destination_path is None: + final_file_path = Path(file_name) + else: + # destination_path is ALWAYS treated as a directory path + destination_dir = Path(destination_path) + destination_dir.mkdir(parents=True, exist_ok=True) + final_file_path = destination_dir / file_name + + # Download the file (overwrite check handled by base class) + return self._download_file( + url=document_format.download_url, + file_path=final_file_path.as_posix(), + overwrite=overwrite, + )
+ + +
+[docs] + def get_IFW_metadata( self, - query: Optional[str] = None, application_number: Optional[str] = None, + publication_number: Optional[str] = None, patent_number: Optional[str] = None, - inventor_name: Optional[str] = None, - applicant_name: Optional[str] = None, - assignee_name: Optional[str] = None, - filing_date_from: Optional[str] = None, - filing_date_to: Optional[str] = None, - grant_date_from: Optional[str] = None, - grant_date_to: Optional[str] = None, - classification: Optional[str] = None, - limit: Optional[int] = 25, - offset: Optional[int] = 0, - ) -> PatentDataResponse: - """ - Search for patents with various filters. + PCT_app_number: Optional[str] = None, + PCT_pub_number: Optional[str] = None, + ) -> Optional[PatentFileWrapper]: + """Retrieves complete patent file wrapper data using common identifiers. + + This utility fetches the `PatentFileWrapper`, which contains comprehensive + IFW metadata, application details, and more. Provide only one + identifier if possible. If multiple are given, they are processed in the + order listed in the arguments, and the first successful match is returned. Args: - query: Search text in all fields - application_number: Filter by application number - patent_number: Filter by patent number - inventor_name: Filter by inventor name - applicant_name: Filter by applicant name - assignee_name: Filter by assignee name - filing_date_from: Filter by filing date from (YYYY-MM-DD) - filing_date_to: Filter by filing date to (YYYY-MM-DD) - grant_date_from: Filter by grant date from (YYYY-MM-DD) - grant_date_to: Filter by grant date to (YYYY-MM-DD) - classification: Filter by CPC classification - limit: Number of results to return (default 25) - offset: Position in dataset to start from (default 0) + application_number (Optional[str], optional): USPTO application number + (e.g., "16123456"). Checked first (direct lookup). + patent_number (Optional[str], optional): USPTO patent number + (e.g., "11000000"). Checked second (uses search). + publication_number (Optional[str], optional): USPTO pre-grant + publication number (e.g., "20230123456"). Checked third (uses search). + PCT_app_number (Optional[str], optional): PCT application number. + Checked fourth (direct lookup, treated as USPTO app#). + PCT_pub_number (Optional[str], optional): PCT publication number + (e.g., "2023012345"). Checked fifth (uses search). Returns: - PatentDataResponse object containing matching patents + Optional[PatentFileWrapper]: A `PatentFileWrapper` object with + comprehensive data if found using one of the identifiers, + otherwise None. """ - # Build the query string - q_parts = [] if application_number: - q_parts.append(f"applicationNumberText:{application_number}") - + return self.get_application_by_number(application_number=application_number) if patent_number: - q_parts.append(f"applicationMetaData.patentNumber:{patent_number}") - - if inventor_name: - q_parts.append( - f"applicationMetaData.inventorBag.inventorNameText:{inventor_name}" + pdr = self.search_applications(patent_number_q=patent_number, limit=1) + if pdr.patent_file_wrapper_data_bag: + return pdr.patent_file_wrapper_data_bag[0] + if publication_number: + pdr = self.search_applications( + earliestPublicationNumber_q=publication_number, limit=1 ) - - if applicant_name: - q_parts.append(f"applicationMetaData.firstApplicantName:{applicant_name}") - - if assignee_name: - q_parts.append( - f"assignmentBag.assigneeBag.assigneeNameText:{assignee_name}" + if pdr.patent_file_wrapper_data_bag: + return pdr.patent_file_wrapper_data_bag[0] + if PCT_app_number: + return self.get_application_by_number(application_number=PCT_app_number) + if PCT_pub_number: + pdr = self.search_applications( + pctPublicationNumber_q=PCT_pub_number, limit=1 ) + if pdr.patent_file_wrapper_data_bag: + return pdr.patent_file_wrapper_data_bag[0] + return None
- if classification: - q_parts.append(f"applicationMetaData.cpcClassificationBag:{classification}") - # Add date range filters - range_filters = [] +
+[docs] + def download_archive( + self, + printed_metadata: PrintedMetaData, + file_name: Optional[str] = None, + destination_path: Optional[str] = None, + overwrite: bool = False, + ) -> str: + """Downloads Printed Metadata (XML data). These are XML files of the patent as printed. - if filing_date_from and filing_date_to: - range_filters.append( - f"applicationMetaData.filingDate:[{filing_date_from} TO {filing_date_to}]" - ) - elif filing_date_from: - range_filters.append(f"applicationMetaData.filingDate:>={filing_date_from}") - elif filing_date_to: - range_filters.append(f"applicationMetaData.filingDate:<={filing_date_to}") - - if grant_date_from and grant_date_to: - range_filters.append( - f"applicationMetaData.grantDate:[{grant_date_from} TO {grant_date_to}]" - ) - elif grant_date_from: - range_filters.append(f"applicationMetaData.grantDate:>={grant_date_from}") - elif grant_date_to: - range_filters.append(f"applicationMetaData.grantDate:<={grant_date_to}") + Note: + See also `download_publication()` for a clearer method name with identical functionality. + + Args: + printed_metadata: ArchiveMetaData object containing download URL and metadata + file_name: Optional filename. If not provided, uses xml_file_name from metadata + destination_path: Optional directory path to save the file + overwrite: Whether to overwrite existing files. Default False - # Combine all query parts - if query: - q_parts.append(query) + Returns: + str: Path to the downloaded file - q_parts.extend(range_filters) + Raises: + ValueError: If printed_metadata has no download URL + FileExistsError: If file exists and overwrite=False + """ + # Validate we have a download URL + if printed_metadata.file_location_uri is None: + raise ValueError("PrintedMetaData must have a file_location_uri") + + # Get filename - either provided or from metadata + if file_name is None: + if printed_metadata.xml_file_name: + file_name = printed_metadata.xml_file_name + else: + # Fallback: extract from URL + url_filename = printed_metadata.file_location_uri.split("/")[-1] + if "." in url_filename: + file_name = url_filename + else: + # Last resort: use product identifier + product_id = printed_metadata.product_identifier or "patent_text" + file_name = f"{product_id}.xml" + + # Determine final file path + if destination_path is None: + final_file_path = Path(file_name) + else: + destination_dir = Path(destination_path) + destination_dir.mkdir(parents=True, exist_ok=True) + final_file_path = destination_dir / file_name + + # Check for existing file + if final_file_path.exists() and overwrite is False: + raise FileExistsError( + f"File already exists: {final_file_path}. Use overwrite=True to replace." + ) - # Build the final query string - q = " AND ".join(q_parts) if q_parts else None + # Download the Printed Metadata + return self._download_file( + url=printed_metadata.file_location_uri, file_path=final_file_path.as_posix() + )
- # Set up parameters - params = {} - if offset is not None: - params["offset"] = str(offset) +
+[docs] + def download_publication( + self, + printed_metadata: PrintedMetaData, + file_name: Optional[str] = None, + destination_path: Optional[str] = None, + overwrite: bool = False, + ) -> str: + """Download a publication XML file (grant or pre-grant publication). - if limit is not None: - params["limit"] = str(limit) + This method downloads publication XML files from PrintedMetaData objects, + such as grant documents or pre-grant publications (pgpub). The filename + is automatically extracted from the metadata if not provided. - if q: - params["q"] = q + Args: + printed_metadata: PrintedMetaData object containing the publication + download URL and filename information. Typically obtained from + `get_application_associated_documents()` or from PatentFileWrapper's + `grant_document_meta_data` or `pg_publication_document_meta_data`. + file_name: Optional custom filename. If not provided, uses the + `xml_file_name` from the metadata (e.g., "18915708_12307527.xml"). + destination_path: Optional directory path where the file should be saved. + If not provided, saves to the current directory. The directory will + be created if it doesn't exist. + overwrite: Whether to overwrite an existing file at the destination. + Default is False, which raises FileExistsError if file exists. - # Use the applications_search endpoint from ENDPOINTS - result = self._make_request( - method="GET", - endpoint=self.ENDPOINTS["applications_search"], - params=params, - response_class=PatentDataResponse, - ) - # Since we specified response_class=BulkDataResponse, the result should be a BulkDataResponse - assert isinstance(result, PatentDataResponse) - return result
+ Returns: + str: Absolute path to the downloaded publication file. + + Raises: + ValueError: If printed_metadata has no file_location_uri (download URL). + FileExistsError: If the file already exists and overwrite=False. + + Examples: + Download grant XML to a specific directory (auto-filename): + + >>> response = client.get_application_by_number("18/915,708") + >>> ifw = response + >>> grant_metadata = ifw.grant_document_meta_data + >>> path = client.download_publication(grant_metadata, destination_path="./downloads") + >>> print(path) + './downloads/18915708_12307527.xml' + + Download pgpub XML with custom filename: + + >>> pgpub_metadata = ifw.pg_publication_document_meta_data + >>> path = client.download_publication( + ... pgpub_metadata, + ... file_name="my_publication.xml", + ... destination_path="./downloads" + ... ) + >>> print(path) + './downloads/my_publication.xml' + + Download to current directory: + + >>> path = client.download_publication(grant_metadata) + >>> print(path) + './18915708_12307527.xml' + """ + return self.download_archive( + printed_metadata=printed_metadata, + file_name=file_name, + destination_path=destination_path, + overwrite=overwrite, + )
@@ -791,7 +1304,7 @@

Source code for pyUSPTO.clients.patent_data

   
-

© Copyright 2025, Andrew Piechocki.

+

© Copyright 2025, Dunlap Codding, P.C..

Built with Sphinx using a diff --git a/docs/build/html/_modules/pyUSPTO/clients/petition_decisions.html b/docs/build/html/_modules/pyUSPTO/clients/petition_decisions.html new file mode 100644 index 0000000..87aaefb --- /dev/null +++ b/docs/build/html/_modules/pyUSPTO/clients/petition_decisions.html @@ -0,0 +1,737 @@ + + + + + + + + pyUSPTO.clients.petition_decisions — pyUSPTO 0.2.3.dev1+g2c5d89b38.d20251125 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + + +
  • +
  • +
+
+
+
+
+ +

Source code for pyUSPTO.clients.petition_decisions

+"""
+clients.petition_decisions - Client for USPTO Final Petition Decisions API
+
+This module provides a client for interacting with the USPTO Final Petition
+Decisions API. It allows you to search for and retrieve final agency petition
+decisions in publicly available patent applications and patents filed in 2001 or later.
+"""
+
+import warnings
+from pathlib import Path
+from typing import Any, Dict, Iterator, List, Optional, Union
+
+import requests
+
+from pyUSPTO.clients.base import BaseUSPTOClient
+from pyUSPTO.config import USPTOConfig
+from pyUSPTO.models.petition_decisions import (
+    DocumentDownloadOption,
+    PetitionDecision,
+    PetitionDecisionDownloadResponse,
+    PetitionDecisionResponse,
+)
+from pyUSPTO.warnings import USPTODataMismatchWarning
+
+
+
+[docs] +class FinalPetitionDecisionsClient(BaseUSPTOClient[PetitionDecisionResponse]): + """Client for interacting with the USPTO Final Petition Decisions API. + + This client provides methods to search for petition decisions, retrieve specific + decisions by ID, download decision data, and download associated documents. + + Final petition decisions data are incrementally added to the USPTO Open Data Portal + on a monthly basis starting with data from 2022 and later. + """ + + ENDPOINTS = { + "search_decisions": "api/v1/petition/decisions/search", + "get_decision_by_id": "api/v1/petition/decisions/{petitionDecisionRecordIdentifier}", + "download_decisions": "api/v1/petition/decisions/search/download", + } + +
+[docs] + def __init__( + self, + api_key: Optional[str] = None, + base_url: Optional[str] = None, + config: Optional[USPTOConfig] = None, + ): + """Initialize the FinalPetitionDecisionsClient. + + Args: + api_key: Optional API key for authentication. + base_url: Optional base URL override for the API. + config: Optional USPTOConfig instance for configuration. + """ + self.config = config or USPTOConfig(api_key=api_key) + api_key_to_use = api_key or self.config.api_key + effective_base_url = ( + base_url + or self.config.petition_decisions_base_url + or "https://api.uspto.gov" + ) + super().__init__( + api_key=api_key_to_use, base_url=effective_base_url, config=self.config + )
+ + + def _get_decision_from_response( + self, + response_data: PetitionDecisionResponse, + petition_decision_record_identifier_for_validation: Optional[str] = None, + ) -> Optional[PetitionDecision]: + """Helper to extract a single PetitionDecision from response. + + Args: + response_data: The API response containing petition decisions. + petition_decision_record_identifier_for_validation: Optional identifier + to validate against the returned decision. + + Returns: + Optional[PetitionDecision]: The first petition decision if found, None otherwise. + """ + if not response_data or not response_data.petition_decision_data_bag: + return None + + decision = response_data.petition_decision_data_bag[0] + + if ( + petition_decision_record_identifier_for_validation + and decision.petition_decision_record_identifier + != petition_decision_record_identifier_for_validation + ): + warnings.warn( + f"API returned decision identifier '{decision.petition_decision_record_identifier}' " + f"but requested '{petition_decision_record_identifier_for_validation}'. " + f"This may indicate an API data inconsistency.", + USPTODataMismatchWarning, + stacklevel=2, + ) + return decision + +
+[docs] + def search_decisions( + self, + query: Optional[str] = None, + sort: Optional[str] = None, + offset: Optional[int] = 0, + limit: Optional[int] = 25, + facets: Optional[str] = None, + fields: Optional[str] = None, + filters: Optional[str] = None, + range_filters: Optional[str] = None, + post_body: Optional[Dict[str, Any]] = None, + # Convenience query parameters + application_number_q: Optional[str] = None, + patent_number_q: Optional[str] = None, + inventor_name_q: Optional[str] = None, + applicant_name_q: Optional[str] = None, + invention_title_q: Optional[str] = None, + decision_type_code_q: Optional[str] = None, + decision_date_from_q: Optional[str] = None, + decision_date_to_q: Optional[str] = None, + petition_mail_date_from_q: Optional[str] = None, + petition_mail_date_to_q: Optional[str] = None, + technology_center_q: Optional[str] = None, + final_deciding_office_name_q: Optional[str] = None, + additional_query_params: Optional[Dict[str, Any]] = None, + ) -> PetitionDecisionResponse: + """Searches for final petition decisions. + + This method can perform either a GET request using query parameters or a POST + request if post_body is specified. When using GET, you can provide either a + direct query string or use convenience parameters that will be automatically + combined into a query. + + Args: + query: Direct query string in USPTO search syntax. + sort: Sort order for results. + offset: Number of records to skip (pagination). + limit: Maximum number of records to return. + facets: Facet configuration string. + fields: Specific fields to return. + filters: Filter configuration string. + range_filters: Range filter configuration string. + post_body: Optional POST body for complex queries. + application_number_q: Filter by application number. + patent_number_q: Filter by patent number. + inventor_name_q: Filter by inventor name. + applicant_name_q: Filter by applicant name. + invention_title_q: Filter by invention title. + decision_type_code_q: Filter by decision type code. + decision_date_from_q: Filter decisions from this date (YYYY-MM-DD). + decision_date_to_q: Filter decisions to this date (YYYY-MM-DD). + petition_mail_date_from_q: Filter petition mail dates from (YYYY-MM-DD). + petition_mail_date_to_q: Filter petition mail dates to (YYYY-MM-DD). + technology_center_q: Filter by technology center. + final_deciding_office_name_q: Filter by deciding office name. + additional_query_params: Additional custom query parameters. + + Returns: + PetitionDecisionResponse: Response containing matching petition decisions. + + Examples: + # Search with direct query + >>> response = client.search_decisions(query="applicationNumberText:17765301") + + # Search with convenience parameters + >>> response = client.search_decisions( + ... applicant_name_q="ACME Corp", + ... decision_date_from_q="2022-01-01", + ... limit=50 + ... ) + + # Search with POST body + >>> response = client.search_decisions( + ... post_body={"q": "technologyCenter:1700", "limit": 100} + ... ) + """ + endpoint = self.ENDPOINTS["search_decisions"] + + if post_body is not None: + # POST request path + result = self._make_request( + method="POST", + endpoint=endpoint, + json_data=post_body, + params=additional_query_params, + response_class=PetitionDecisionResponse, + ) + else: + # GET request path + params: Dict[str, Any] = {} + final_q = query + + # Build query from convenience parameters + if final_q is None: + q_parts = [] + if application_number_q: + q_parts.append(f"applicationNumberText:{application_number_q}") + if patent_number_q: + q_parts.append(f"patentNumber:{patent_number_q}") + if inventor_name_q: + q_parts.append(f"inventorBag:{inventor_name_q}") + if applicant_name_q: + q_parts.append(f"firstApplicantName:{applicant_name_q}") + if invention_title_q: + q_parts.append(f"inventionTitle:{invention_title_q}") + if decision_type_code_q: + q_parts.append(f"decisionTypeCode:{decision_type_code_q}") + if technology_center_q: + q_parts.append(f"technologyCenter:{technology_center_q}") + if final_deciding_office_name_q: + q_parts.append( + f"finalDecidingOfficeName:{final_deciding_office_name_q}" + ) + + # Handle decision date range + if decision_date_from_q and decision_date_to_q: + q_parts.append( + f"decisionDate:[{decision_date_from_q} TO {decision_date_to_q}]" + ) + elif decision_date_from_q: + q_parts.append(f"decisionDate:>={decision_date_from_q}") + elif decision_date_to_q: + q_parts.append(f"decisionDate:<={decision_date_to_q}") + + # Handle petition mail date range + if petition_mail_date_from_q and petition_mail_date_to_q: + q_parts.append( + f"petitionMailDate:[{petition_mail_date_from_q} TO {petition_mail_date_to_q}]" + ) + elif petition_mail_date_from_q: + q_parts.append(f"petitionMailDate:>={petition_mail_date_from_q}") + elif petition_mail_date_to_q: + q_parts.append(f"petitionMailDate:<={petition_mail_date_to_q}") + + if q_parts: + final_q = " AND ".join(q_parts) + + # Add parameters + if final_q is not None: + params["q"] = final_q + if sort is not None: + params["sort"] = sort + if offset is not None: + params["offset"] = offset + if limit is not None: + params["limit"] = limit + if facets is not None: + params["facets"] = facets + if fields is not None: + params["fields"] = fields + if filters is not None: + params["filters"] = filters + if range_filters is not None: + params["rangeFilters"] = range_filters + + if additional_query_params: + params.update(additional_query_params) + + result = self._make_request( + method="GET", + endpoint=endpoint, + params=params, + response_class=PetitionDecisionResponse, + ) + + assert isinstance(result, PetitionDecisionResponse) + return result
+ + +
+[docs] + def get_decision_by_id( + self, + petition_decision_record_identifier: str, + include_documents: Optional[bool] = None, + ) -> Optional[PetitionDecision]: + """Retrieves a specific petition decision by its record identifier. + + Args: + petition_decision_record_identifier: The unique identifier for the petition + decision record (UUID format). + include_documents: Whether to include associated documents in the response. + If True, adds includeDocuments=true query parameter. + + Returns: + Optional[PetitionDecision]: The petition decision if found, None otherwise. + + Examples: + # Get decision without documents + >>> decision = client.get_decision_by_id( + ... "9f1a4a2b-eee1-58ec-a3aa-167c4075aed4" + ... ) + + # Get decision with documents + >>> decision = client.get_decision_by_id( + ... "34044333-4b40-515f-a684-2515325c57c5", + ... include_documents=True + ... ) + """ + endpoint = self.ENDPOINTS["get_decision_by_id"].format( + petitionDecisionRecordIdentifier=petition_decision_record_identifier + ) + + params = {} + if include_documents is not None: + params["includeDocuments"] = str(include_documents).lower() + + response_data = self._make_request( + method="GET", + endpoint=endpoint, + params=params if params else None, + response_class=PetitionDecisionResponse, + ) + assert isinstance(response_data, PetitionDecisionResponse) + return self._get_decision_from_response( + response_data=response_data, + petition_decision_record_identifier_for_validation=petition_decision_record_identifier, + )
+ + +
+[docs] + def download_decisions( + self, + format: str = "json", + query: Optional[str] = None, + sort: Optional[str] = None, + offset: Optional[int] = None, + limit: Optional[int] = None, + fields: Optional[str] = None, + filters: Optional[str] = None, + range_filters: Optional[str] = None, + # Convenience query parameters + application_number_q: Optional[str] = None, + patent_number_q: Optional[str] = None, + inventor_name_q: Optional[str] = None, + applicant_name_q: Optional[str] = None, + decision_date_from_q: Optional[str] = None, + decision_date_to_q: Optional[str] = None, + additional_query_params: Optional[Dict[str, Any]] = None, + # File save options (for CSV format) + file_name: Optional[str] = None, + destination_path: Optional[str] = None, + overwrite: bool = False, + ) -> Union[PetitionDecisionDownloadResponse, requests.Response, str]: + """Downloads petition decisions data in the specified format. + + This endpoint is designed for bulk downloads of petition decisions data. + It supports JSON and CSV formats. + + Args: + format: Download format, either "json" or "csv". Defaults to "json". + query: Direct query string in USPTO search syntax. + sort: Sort order for results. + offset: Number of records to skip (pagination). + limit: Maximum number of records to return. + fields: Specific fields to return. + filters: Filter configuration string. + range_filters: Range filter configuration string. + application_number_q: Filter by application number. + patent_number_q: Filter by patent number. + inventor_name_q: Filter by inventor name. + applicant_name_q: Filter by applicant name. + decision_date_from_q: Filter decisions from this date (YYYY-MM-DD). + decision_date_to_q: Filter decisions to this date (YYYY-MM-DD). + additional_query_params: Additional custom query parameters. + file_name: Optional filename for CSV downloads. Defaults to "petition_decisions.csv". + destination_path: Optional directory path to save CSV file. If None, returns Response. + overwrite: Whether to overwrite existing files. Default False. + + Returns: + Union[PetitionDecisionDownloadResponse, requests.Response, str]: + - If format="json": Returns PetitionDecisionDownloadResponse + - If format="csv" and destination_path is None: Returns streaming Response + - If format="csv" and destination_path is set: Returns str path to saved file + + Raises: + FileExistsError: If CSV file exists and overwrite=False + + Examples: + # Download as JSON + >>> download = client.download_decisions( + ... format="json", + ... technology_center_q="1700", + ... limit=1000 + ... ) + >>> for decision in download.petition_decision_data: + ... print(decision.application_number_text) + + # Download CSV and save to file + >>> file_path = client.download_decisions( + ... format="csv", + ... decision_date_from_q="2023-01-01", + ... destination_path="./downloads" + ... ) + >>> print(f"Saved to: {file_path}") + + # Download CSV as streaming response (advanced usage) + >>> response = client.download_decisions(format="csv") + >>> with open("decisions.csv", "wb") as f: + ... for chunk in response.iter_content(chunk_size=8192): + ... f.write(chunk) + """ + endpoint = self.ENDPOINTS["download_decisions"] + + params: Dict[str, Any] = {"format": format} + final_q = query + + # Build query from convenience parameters + if final_q is None: + q_parts = [] + if application_number_q: + q_parts.append(f"applicationNumberText:{application_number_q}") + if patent_number_q: + q_parts.append(f"patentNumber:{patent_number_q}") + if inventor_name_q: + q_parts.append(f"inventorBag:{inventor_name_q}") + if applicant_name_q: + q_parts.append(f"firstApplicantName:{applicant_name_q}") + + # Handle decision date range + if decision_date_from_q and decision_date_to_q: + q_parts.append( + f"decisionDate:[{decision_date_from_q} TO {decision_date_to_q}]" + ) + elif decision_date_from_q: + q_parts.append(f"decisionDate:>={decision_date_from_q}") + elif decision_date_to_q: + q_parts.append(f"decisionDate:<={decision_date_to_q}") + + if q_parts: + final_q = " AND ".join(q_parts) + + # Add parameters + if final_q is not None: + params["q"] = final_q + if sort is not None: + params["sort"] = sort + if offset is not None: + params["offset"] = offset + if limit is not None: + params["limit"] = limit + if fields is not None: + params["fields"] = fields + if filters is not None: + params["filters"] = filters + if range_filters is not None: + params["rangeFilters"] = range_filters + + if additional_query_params: + params.update(additional_query_params) + + if format.lower() == "json": + # For JSON, parse the response + result_dict = self._make_request( + method="GET", endpoint=endpoint, params=params + ) + assert isinstance(result_dict, dict) + return PetitionDecisionDownloadResponse.from_dict(result_dict) + else: + # For CSV or other formats, get streaming response + result = self._make_request( + method="GET", endpoint=endpoint, params=params, stream=True + ) + assert isinstance(result, requests.Response) + + if destination_path is not None: + # Save to file using the base class helper + from pathlib import Path + + # Determine filename + if file_name is None: + file_name = "petition_decisions.csv" + + # Build full file path + destination_dir = Path(destination_path) + destination_dir.mkdir(parents=True, exist_ok=True) + final_file_path = destination_dir / file_name + + # Save streaming response to file (overwrite check handled by base class) + return self._save_response_to_file( + response=result, file_path=str(final_file_path), overwrite=overwrite + ) + else: + # Return streaming response for manual handling + return result
+ + +
+[docs] + def paginate_decisions(self, **kwargs: Any) -> Iterator[PetitionDecision]: + """Provides an iterator to paginate through petition decision search results. + + This method simplifies fetching all petition decisions matching a search query + by automatically handling pagination. It internally calls the search_decisions + method for GET requests, batching results and yielding them one by one. + + All keyword arguments are passed directly to search_decisions to define the + search criteria. The offset and limit parameters are managed by the pagination + logic; setting them directly in kwargs might lead to unexpected behavior. + + Args: + **kwargs: Keyword arguments passed to search_decisions for constructing + the search query. Do not include post_body. + + Returns: + Iterator[PetitionDecision]: An iterator yielding PetitionDecision objects, + allowing iteration over all matching petition decisions across multiple + pages of results. + + Raises: + ValueError: If post_body is included in kwargs, as this method only + supports GET request parameters for pagination. + + Examples: + # Paginate through all decisions for a technology center + >>> for decision in client.paginate_decisions(technology_center_q="1700"): + ... print(f"{decision.application_number_text}: {decision.decision_type_code}") + + # Paginate with date range + >>> for decision in client.paginate_decisions( + ... decision_date_from_q="2023-01-01", + ... decision_date_to_q="2023-12-31" + ... ): + ... process_decision(decision) + """ + if "post_body" in kwargs: + raise ValueError( + "paginate_decisions uses GET requests and does not support 'post_body'. " + "Use keyword arguments for search criteria." + ) + + return self.paginate_results( + method_name="search_decisions", + response_container_attr="petition_decision_data_bag", + **kwargs, + )
+ + +
+[docs] + def download_petition_document( + self, + download_option: DocumentDownloadOption, + file_name: Optional[str] = None, + destination_path: Optional[str] = None, + overwrite: bool = False, + ) -> str: + """Downloads a petition decision document in the specified format. + + Args: + download_option: DocumentDownloadOption object containing the download + URL and metadata. + file_name: Optional filename for the downloaded file. If not provided, + it will be extracted from the URL or generated based on the MIME type. + destination_path: Optional directory path where the file should be saved. + If not provided, saves to the current directory. + overwrite: Whether to overwrite an existing file. Defaults to False. + + Returns: + str: The absolute path to the downloaded file. + + Raises: + ValueError: If download_option has no download URL. + FileExistsError: If the file exists and overwrite=False. + + Examples: + # Download first document from a decision + >>> decision = client.get_decision_by_id( + ... "34044333-4b40-515f-a684-2515325c57c5", + ... include_documents=True + ... ) + >>> if decision.document_bag: + ... doc = decision.document_bag[0] + ... if doc.download_option_bag: + ... # Download PDF version + ... pdf_option = next( + ... opt for opt in doc.download_option_bag + ... if opt.mime_type_identifier == "PDF" + ... ) + ... path = client.download_petition_document( + ... pdf_option, + ... destination_path="./downloads" + ... ) + ... print(f"Downloaded to: {path}") + """ + if download_option.download_url is None: + raise ValueError("DocumentDownloadOption must have a download_url") + + # Determine filename + if file_name is None: + url_filename = download_option.download_url.split("/")[-1] + if "." in url_filename: + file_name = url_filename + else: + # Generate filename from MIME type + extension = ( + download_option.mime_type_identifier.lower() + if download_option.mime_type_identifier + else "pdf" + ) + file_name = f"document.{extension}" + + # Determine final file path + if destination_path is None: + final_file_path = Path(file_name) + else: + destination_dir = Path(destination_path) + destination_dir.mkdir(parents=True, exist_ok=True) + final_file_path = destination_dir / file_name + + # Check for existing file + if final_file_path.exists() and overwrite is False: + raise FileExistsError( + f"File already exists: {final_file_path}. Use overwrite=True to replace." + ) + + # Download the file + return self._download_file( + url=download_option.download_url, file_path=final_file_path.as_posix() + )
+
+ +
+ +
+
+
+ +
+ +
+

© Copyright 2025, Dunlap Codding, P.C..

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/build/html/_modules/pyUSPTO/clients/ptab_appeals.html b/docs/build/html/_modules/pyUSPTO/clients/ptab_appeals.html new file mode 100644 index 0000000..ac4d6fc --- /dev/null +++ b/docs/build/html/_modules/pyUSPTO/clients/ptab_appeals.html @@ -0,0 +1,363 @@ + + + + + + + + pyUSPTO.clients.ptab_appeals — pyUSPTO 0.2.3.dev1+g2c5d89b38.d20251125 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +

Source code for pyUSPTO.clients.ptab_appeals

+"""
+clients.ptab_appeals - Client for USPTO PTAB Appeals API
+
+This module provides a client for interacting with the USPTO PTAB (Patent Trial
+and Appeal Board) Appeals API. It allows you to search for ex parte appeal decisions.
+"""
+
+from typing import Any, Dict, Iterator, Optional
+
+from pyUSPTO.clients.base import BaseUSPTOClient
+from pyUSPTO.config import USPTOConfig
+from pyUSPTO.models.ptab import PTABAppealDecision, PTABAppealResponse
+
+
+
+[docs] +class PTABAppealsClient(BaseUSPTOClient[PTABAppealResponse]): + """Client for interacting with the USPTO PTAB Appeals API. + + This client provides methods to search for ex parte appeal decisions from the + Patent Trial and Appeal Board. + + Appeals data includes decisions on patent application appeals from the examiner + to the PTAB. + """ + + ENDPOINTS = { + "search_decisions": "api/v1/patent/appeals/decisions/search", + } + +
+[docs] + def __init__( + self, + api_key: Optional[str] = None, + base_url: Optional[str] = None, + config: Optional[USPTOConfig] = None, + ): + """Initialize the PTABAppealsClient. + + Args: + api_key: Optional API key for authentication. + base_url: Optional base URL override for the API. + config: Optional USPTOConfig instance for configuration. + """ + self.config = config or USPTOConfig(api_key=api_key) + api_key_to_use = api_key or self.config.api_key + effective_base_url = ( + base_url or self.config.ptab_base_url or "https://api.uspto.gov" + ) + super().__init__( + api_key=api_key_to_use, base_url=effective_base_url, config=self.config + )
+ + +
+[docs] + def search_decisions( + self, + query: Optional[str] = None, + sort: Optional[str] = None, + offset: Optional[int] = 0, + limit: Optional[int] = 25, + facets: Optional[str] = None, + fields: Optional[str] = None, + filters: Optional[str] = None, + range_filters: Optional[str] = None, + post_body: Optional[Dict[str, Any]] = None, + # Convenience query parameters + appeal_number_q: Optional[str] = None, + application_number_text_q: Optional[str] = None, + appellant_name_q: Optional[str] = None, + requestor_name_q: Optional[str] = None, + decision_type_category_q: Optional[str] = None, + decision_date_from_q: Optional[str] = None, + decision_date_to_q: Optional[str] = None, + technology_center_number_q: Optional[str] = None, + additional_query_params: Optional[Dict[str, Any]] = None, + ) -> PTABAppealResponse: + """Searches for PTAB appeal decisions. + + This method can perform either a GET request using query parameters or a POST + request if post_body is specified. When using GET, you can provide either a + direct query string or use convenience parameters that will be automatically + combined into a query. + + Args: + query: Direct query string in USPTO search syntax. + sort: Sort order for results. + offset: Number of records to skip (pagination). + limit: Maximum number of records to return. + facets: Facet configuration string. + fields: Specific fields to return. + filters: Filter configuration string. + range_filters: Range filter configuration string. + post_body: Optional POST body for complex queries. + appeal_number_q: Filter by appeal number. + application_number_text_q: Filter by application number. + appellant_name_q: Filter by appellant name. + requestor_name_q: Filter by requestor name. + decision_type_category_q: Filter by decision type category. + decision_date_from_q: Filter decisions from this date (YYYY-MM-DD). + decision_date_to_q: Filter decisions to this date (YYYY-MM-DD). + technology_center_number_q: Filter by technology center number. + additional_query_params: Additional custom query parameters. + + Returns: + PTABAppealResponse: Response containing matching appeal decisions. + + Examples: + # Search with direct query + >>> response = client.search_decisions(query="appealNumber:2023-001234") + + # Search with convenience parameters + >>> response = client.search_decisions( + ... technology_center_number_q="3600", + ... decision_date_from_q="2023-01-01", + ... limit=50 + ... ) + + # Search with POST body + >>> response = client.search_decisions( + ... post_body={"q": "decisionTypeCategory:Affirmed", "limit": 100} + ... ) + """ + endpoint = self.ENDPOINTS["search_decisions"] + + if post_body is not None: + # POST request path + result = self._make_request( + method="POST", + endpoint=endpoint, + json_data=post_body, + params=additional_query_params, + response_class=PTABAppealResponse, + ) + else: + # GET request path + params: Dict[str, Any] = {} + final_q = query + + # Build query from convenience parameters + if final_q is None: + q_parts = [] + if appeal_number_q: + q_parts.append(f"appealNumber:{appeal_number_q}") + if application_number_text_q: + q_parts.append(f"applicationNumberText:{application_number_text_q}") + if appellant_name_q: + q_parts.append(f"appellantName:{appellant_name_q}") + if requestor_name_q: + q_parts.append(f"requestorName:{requestor_name_q}") + if decision_type_category_q: + q_parts.append(f"decisionTypeCategory:{decision_type_category_q}") + if technology_center_number_q: + q_parts.append( + f"technologyCenterNumber:{technology_center_number_q}" + ) + + # Handle decision date range + if decision_date_from_q and decision_date_to_q: + q_parts.append( + f"decisionDate:[{decision_date_from_q} TO {decision_date_to_q}]" + ) + elif decision_date_from_q: + q_parts.append(f"decisionDate:>={decision_date_from_q}") + elif decision_date_to_q: + q_parts.append(f"decisionDate:<={decision_date_to_q}") + + if q_parts: + final_q = " AND ".join(q_parts) + + # Add parameters + if final_q is not None: + params["q"] = final_q + if sort is not None: + params["sort"] = sort + if offset is not None: + params["offset"] = offset + if limit is not None: + params["limit"] = limit + if facets is not None: + params["facets"] = facets + if fields is not None: + params["fields"] = fields + if filters is not None: + params["filters"] = filters + if range_filters is not None: + params["rangeFilters"] = range_filters + + if additional_query_params: + params.update(additional_query_params) + + result = self._make_request( + method="GET", + endpoint=endpoint, + params=params, + response_class=PTABAppealResponse, + ) + + assert isinstance(result, PTABAppealResponse) + return result
+ + +
+[docs] + def paginate_decisions(self, **kwargs: Any) -> Iterator[PTABAppealDecision]: + """Provides an iterator to paginate through appeal decision search results. + + This method simplifies fetching all appeal decisions matching a search query + by automatically handling pagination. It internally calls the search_decisions + method for GET requests, batching results and yielding them one by one. + + All keyword arguments are passed directly to search_decisions to define the + search criteria. The offset and limit parameters are managed by the pagination + logic; setting them directly in kwargs might lead to unexpected behavior. + + Args: + **kwargs: Keyword arguments passed to search_decisions for constructing + the search query. Do not include post_body. + + Returns: + Iterator[PTABAppealDecision]: An iterator yielding PTABAppealDecision objects, + allowing iteration over all matching decisions across multiple pages of results. + + Raises: + ValueError: If post_body is included in kwargs, as this method only + supports GET request parameters for pagination. + + Examples: + # Paginate through all decisions for a technology center + >>> for decision in client.paginate_decisions(technology_center_number_q="3600"): + ... print(f"{decision.appeal_meta_data.appeal_number}: " + ... f"{decision.decision_data.decision_type_category}") + + # Paginate with date range + >>> for decision in client.paginate_decisions( + ... decision_date_from_q="2023-01-01", + ... decision_date_to_q="2023-12-31" + ... ): + ... process_decision(decision) + """ + if "post_body" in kwargs: + raise ValueError( + "paginate_decisions uses GET requests and does not support 'post_body'. " + "Use keyword arguments for search criteria." + ) + + return self.paginate_results( + method_name="search_decisions", + response_container_attr="patent_appeal_data_bag", + **kwargs, + )
+
+ +
+ +
+
+
+ +
+ +
+

© Copyright 2025, Dunlap Codding, P.C..

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/build/html/_modules/pyUSPTO/clients/ptab_interferences.html b/docs/build/html/_modules/pyUSPTO/clients/ptab_interferences.html new file mode 100644 index 0000000..9ba2c9b --- /dev/null +++ b/docs/build/html/_modules/pyUSPTO/clients/ptab_interferences.html @@ -0,0 +1,389 @@ + + + + + + + + pyUSPTO.clients.ptab_interferences — pyUSPTO 0.2.3.dev1+g2c5d89b38.d20251125 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + + +
  • +
  • +
+
+
+
+
+ +

Source code for pyUSPTO.clients.ptab_interferences

+"""
+clients.ptab_interferences - Client for USPTO PTAB Interferences API
+
+This module provides a client for interacting with the USPTO PTAB (Patent Trial
+and Appeal Board) Interferences API. It allows you to search for patent interference decisions.
+"""
+
+from typing import Any, Dict, Iterator, Optional
+
+from pyUSPTO.clients.base import BaseUSPTOClient
+from pyUSPTO.config import USPTOConfig
+from pyUSPTO.models.ptab import PTABInterferenceDecision, PTABInterferenceResponse
+
+
+
+[docs] +class PTABInterferencesClient(BaseUSPTOClient[PTABInterferenceResponse]): + """Client for interacting with the USPTO PTAB Interferences API. + + This client provides methods to search for patent interference decisions from the + Patent Trial and Appeal Board. + + Interference proceedings are used to determine priority of invention when two or + more parties claim the same patentable invention. + """ + + ENDPOINTS = { + "search_decisions": "api/v1/patent/interferences/decisions/search", + } + +
+[docs] + def __init__( + self, + api_key: Optional[str] = None, + base_url: Optional[str] = None, + config: Optional[USPTOConfig] = None, + ): + """Initialize the PTABInterferencesClient. + + Args: + api_key: Optional API key for authentication. + base_url: Optional base URL override for the API. + config: Optional USPTOConfig instance for configuration. + """ + self.config = config or USPTOConfig(api_key=api_key) + api_key_to_use = api_key or self.config.api_key + effective_base_url = ( + base_url or self.config.ptab_base_url or "https://api.uspto.gov" + ) + super().__init__( + api_key=api_key_to_use, base_url=effective_base_url, config=self.config + )
+ + +
+[docs] + def search_decisions( + self, + query: Optional[str] = None, + sort: Optional[str] = None, + offset: Optional[int] = 0, + limit: Optional[int] = 25, + facets: Optional[str] = None, + fields: Optional[str] = None, + filters: Optional[str] = None, + range_filters: Optional[str] = None, + post_body: Optional[Dict[str, Any]] = None, + # Convenience query parameters + interference_number_q: Optional[str] = None, + senior_party_application_number_q: Optional[str] = None, + junior_party_application_number_q: Optional[str] = None, + senior_party_name_q: Optional[str] = None, + junior_party_name_q: Optional[str] = None, + real_party_in_interest_q: Optional[str] = None, + interference_outcome_category_q: Optional[str] = None, + decision_type_category_q: Optional[str] = None, + decision_date_from_q: Optional[str] = None, + decision_date_to_q: Optional[str] = None, + additional_query_params: Optional[Dict[str, Any]] = None, + ) -> PTABInterferenceResponse: + """Searches for PTAB interference decisions. + + This method can perform either a GET request using query parameters or a POST + request if post_body is specified. When using GET, you can provide either a + direct query string or use convenience parameters that will be automatically + combined into a query. + + Args: + query: Direct query string in USPTO search syntax. + sort: Sort order for results. + offset: Number of records to skip (pagination). + limit: Maximum number of records to return. + facets: Facet configuration string. + fields: Specific fields to return. + filters: Filter configuration string. + range_filters: Range filter configuration string. + post_body: Optional POST body for complex queries. + interference_number_q: Filter by interference number. + senior_party_application_number_q: Filter by senior party application number. + junior_party_application_number_q: Filter by junior party application number. + senior_party_name_q: Filter by senior party name. + junior_party_name_q: Filter by junior party name. + real_party_in_interest_q: Filter by Real Party in Interest. + interference_outcome_category_q: Filter by interference outcome category. + decision_type_category_q: Filter by decision type category. + decision_date_from_q: Filter decisions from this date (YYYY-MM-DD). + decision_date_to_q: Filter decisions to this date (YYYY-MM-DD). + additional_query_params: Additional custom query parameters. + + Returns: + PTABInterferenceResponse: Response containing matching interference decisions. + + Examples: + # Search with direct query + >>> response = client.search_decisions(query="interferenceNumber:106123") + + # Search with convenience parameters + >>> response = client.search_decisions( + ... interference_outcome_category_q="Priority to Senior Party", + ... decision_date_from_q="2020-01-01", + ... limit=50 + ... ) + + # Search with POST body + >>> response = client.search_decisions( + ... post_body={"q": "decisionTypeCategory:Final Decision", "limit": 100} + ... ) + """ + endpoint = self.ENDPOINTS["search_decisions"] + + if post_body is not None: + # POST request path + result = self._make_request( + method="POST", + endpoint=endpoint, + json_data=post_body, + params=additional_query_params, + response_class=PTABInterferenceResponse, + ) + else: + # GET request path + params: Dict[str, Any] = {} + final_q = query + + # Build query from convenience parameters + if final_q is None: + q_parts = [] + if interference_number_q: + q_parts.append(f"interferenceNumber:{interference_number_q}") + if senior_party_application_number_q: + q_parts.append( + f"seniorPartyData.applicationNumberText:{senior_party_application_number_q}" + ) + if junior_party_application_number_q: + q_parts.append( + f"juniorPartyData.applicationNumberText:{junior_party_application_number_q}" + ) + if senior_party_name_q: + q_parts.append( + f'seniorPartyData.patentOwnerName:"{senior_party_name_q}" OR seniorPartyData.inventorName:"{senior_party_name_q}" OR seniorPartyData.realPartyInInterestName:"{senior_party_name_q}"' + ) + if junior_party_name_q: + q_parts.append( + f'juniorPartyData.patentOwnerName:"{junior_party_name_q}" OR juniorPartyData.inventorName:"{junior_party_name_q}" OR juniorPartyData.realPartyInInterestName:"{junior_party_name_q}"' + ) + if real_party_in_interest_q: + q_parts.append( + f'seniorPartyData.realPartyInInterestName:"{real_party_in_interest_q}" OR juniorPartyData.realPartyInInterestName:"{real_party_in_interest_q}"' + ) + + if interference_outcome_category_q: + q_parts.append( + f'documentData.interferenceOutcomeCategory:"{interference_outcome_category_q}"' + ) + if decision_type_category_q: + q_parts.append( + f'documentData.decisionTypeCategory:"{decision_type_category_q}"' + ) + + # Handle decision date range + if decision_date_from_q and decision_date_to_q: + q_parts.append( + f"documentData.decisionIssueDate:[{decision_date_from_q} TO {decision_date_to_q}]" + ) + elif decision_date_from_q: + q_parts.append( + f"documentData.decisionIssueDate:>={decision_date_from_q}" + ) + elif decision_date_to_q: + q_parts.append( + f"documentData.decisionIssueDate:<={decision_date_to_q}" + ) + + if q_parts: + final_q = " AND ".join(q_parts) + + # Add parameters + if final_q is not None: + params["q"] = final_q + if sort is not None: + params["sort"] = sort + if offset is not None: + params["offset"] = offset + if limit is not None: + params["limit"] = limit + if facets is not None: + params["facets"] = facets + if fields is not None: + params["fields"] = fields + if filters is not None: + params["filters"] = filters + if range_filters is not None: + params["rangeFilters"] = range_filters + + if additional_query_params: + params.update(additional_query_params) + + result = self._make_request( + method="GET", + endpoint=endpoint, + params=params, + response_class=PTABInterferenceResponse, + ) + + assert isinstance(result, PTABInterferenceResponse) + return result
+ + +
+[docs] + def paginate_decisions(self, **kwargs: Any) -> Iterator[PTABInterferenceDecision]: + """Provides an iterator to paginate through interference decision search results. + + This method simplifies fetching all interference decisions matching a search query + by automatically handling pagination. It internally calls the search_decisions + method for GET requests, batching results and yielding them one by one. + + All keyword arguments are passed directly to search_decisions to define the + search criteria. The offset and limit parameters are managed by the pagination + logic; setting them directly in kwargs might lead to unexpected behavior. + + Args: + **kwargs: Keyword arguments passed to search_decisions for constructing + the search query. Do not include post_body. + + Returns: + Iterator[PTABInterferenceDecision]: An iterator yielding PTABInterferenceDecision + objects, allowing iteration over all matching decisions across multiple pages + of results. + + Raises: + ValueError: If post_body is included in kwargs, as this method only + supports GET request parameters for pagination. + + Examples: + # Paginate through all interference decisions + >>> for decision in client.paginate_decisions(): + ... print(f"{decision.interference_meta_data.interference_number}: " + ... f"{decision.document_data.interference_outcome_category}") + + # Paginate with date range + >>> for decision in client.paginate_decisions( + ... decision_date_from_q="2020-01-01", + ... decision_date_to_q="2023-12-31" + ... ): + ... process_decision(decision) + """ + if "post_body" in kwargs: + raise ValueError( + "paginate_decisions uses GET requests and does not support 'post_body'. " + "Use keyword arguments for search criteria." + ) + + return self.paginate_results( + method_name="search_decisions", + response_container_attr="patent_interference_data_bag", + **kwargs, + )
+
+ +
+ +
+
+
+ +
+ +
+

© Copyright 2025, Dunlap Codding, P.C..

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/build/html/_modules/pyUSPTO/clients/ptab_trials.html b/docs/build/html/_modules/pyUSPTO/clients/ptab_trials.html new file mode 100644 index 0000000..a7d573d --- /dev/null +++ b/docs/build/html/_modules/pyUSPTO/clients/ptab_trials.html @@ -0,0 +1,618 @@ + + + + + + + + pyUSPTO.clients.ptab_trials — pyUSPTO 0.2.3.dev1+g2c5d89b38.d20251125 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +

Source code for pyUSPTO.clients.ptab_trials

+"""
+clients.ptab_trials - Client for USPTO PTAB Trials API
+
+This module provides a client for interacting with the USPTO PTAB (Patent Trial
+and Appeal Board) Trials API. It allows you to search for trial proceedings,
+documents, and decisions.
+"""
+
+from typing import Any, Dict, Iterator, List, Optional, Union
+
+from pyUSPTO.clients.base import BaseUSPTOClient
+from pyUSPTO.config import USPTOConfig
+from pyUSPTO.models.ptab import (
+    PTABTrialDocumentResponse,
+    PTABTrialProceeding,
+    PTABTrialProceedingResponse,
+)
+
+
+
+[docs] +class PTABTrialsClient( + BaseUSPTOClient[Union[PTABTrialProceedingResponse, PTABTrialDocumentResponse]] +): + """Client for interacting with the USPTO PTAB Trials API. + + This client provides methods to search for trial proceedings, trial documents, + and trial decisions from the Patent Trial and Appeal Board. + + Trial proceedings data includes IPR (Inter Partes Review), PGR (Post-Grant Review), + CBM (Covered Business Method), and DER (Derivation) proceedings. + """ + + ENDPOINTS = { + "search_proceedings": "api/v1/patent/trials/proceedings/search", + "search_documents": "api/v1/patent/trials/documents/search", + "search_decisions": "api/v1/patent/trials/decisions/search", + } + +
+[docs] + def __init__( + self, + api_key: Optional[str] = None, + base_url: Optional[str] = None, + config: Optional[USPTOConfig] = None, + ): + """Initialize the PTABTrialsClient. + + Args: + api_key: Optional API key for authentication. + base_url: Optional base URL override for the API. + config: Optional USPTOConfig instance for configuration. + """ + self.config = config or USPTOConfig(api_key=api_key) + api_key_to_use = api_key or self.config.api_key + effective_base_url = ( + base_url or self.config.ptab_base_url or "https://api.uspto.gov" + ) + super().__init__( + api_key=api_key_to_use, base_url=effective_base_url, config=self.config + )
+ + + def _perform_search( + self, + endpoint_key: str, + response_class: Any, + query: Optional[str], + query_parts: List[str], + post_body: Optional[Dict[str, Any]], + sort: Optional[str], + offset: Optional[int], + limit: Optional[int], + facets: Optional[str], + fields: Optional[str], + filters: Optional[str], + range_filters: Optional[str], + additional_params: Optional[Dict[str, Any]], + ) -> Union[PTABTrialProceedingResponse, PTABTrialDocumentResponse]: + """Internal helper to execute search requests (GET or POST).""" + endpoint = self.ENDPOINTS[endpoint_key] + + # Handle POST request + if post_body is not None: + result = self._make_request( + method="POST", + endpoint=endpoint, + json_data=post_body, + params=additional_params, + response_class=response_class, + ) + return result # type: ignore + + # Handle GET request + params: Dict[str, Any] = {} + final_q = query + + # Combine specific convenience query parts if no direct query is provided + if final_q is None and query_parts: + final_q = " AND ".join(query_parts) + + if final_q: + params["q"] = final_q + if sort: + params["sort"] = sort + if offset is not None: + params["offset"] = offset + if limit is not None: + params["limit"] = limit + if facets: + params["facets"] = facets + if fields: + params["fields"] = fields + if filters: + params["filters"] = filters + if range_filters: + params["rangeFilters"] = range_filters + + if additional_params: + params.update(additional_params) + + result = self._make_request( + method="GET", + endpoint=endpoint, + params=params, + response_class=response_class, + ) + return result # type: ignore + +
+[docs] + def search_proceedings( + self, + query: Optional[str] = None, + sort: Optional[str] = None, + offset: Optional[int] = 0, + limit: Optional[int] = 25, + facets: Optional[str] = None, + fields: Optional[str] = None, + filters: Optional[str] = None, + range_filters: Optional[str] = None, + post_body: Optional[Dict[str, Any]] = None, + # Convenience query parameters + trial_number_q: Optional[str] = None, + patent_owner_name_q: Optional[str] = None, + petitioner_real_party_in_interest_name_q: Optional[str] = None, + respondent_name_q: Optional[str] = None, + trial_type_code_q: Optional[str] = None, + trial_status_category_q: Optional[str] = None, + petition_filing_date_from_q: Optional[str] = None, + petition_filing_date_to_q: Optional[str] = None, + additional_query_params: Optional[Dict[str, Any]] = None, + ) -> PTABTrialProceedingResponse: + """Searches for PTAB trial proceedings. + + This method can perform either a GET request using query parameters or a POST + request if post_body is specified. When using GET, you can provide either a + direct query string or use convenience parameters that will be automatically + combined into a query. + + Args: + query: Direct query string in USPTO search syntax. + sort: Sort order for results. + offset: Number of records to skip (pagination). + limit: Maximum number of records to return. + facets: Facet configuration string. + fields: Specific fields to return. + filters: Filter configuration string. + range_filters: Range filter configuration string. + post_body: Optional POST body for complex queries. + trial_number_q: Filter by trial number (e.g., "IPR2023-00001"). + patent_owner_name_q: Filter by patent owner name. + petitioner_real_party_in_interest_name_q: Filter by petitioner real party in interest. + respondent_name_q: Filter by respondent name. + trial_type_code_q: Filter by trial type code (e.g., "IPR", "PGR", "CBM", "DER"). + trial_status_category_q: Filter by trial status category. + petition_filing_date_from_q: Filter proceedings from this date (YYYY-MM-DD). + petition_filing_date_to_q: Filter proceedings to this date (YYYY-MM-DD). + additional_query_params: Additional custom query parameters. + + Returns: + PTABTrialProceedingResponse: Response containing matching trial proceedings. + + Examples: + # Search with direct query + >>> response = client.search_proceedings(query="trialNumber:IPR2023-00001") + + # Search with convenience parameters + >>> response = client.search_proceedings( + ... trial_type_code_q="IPR", + ... petition_filing_date_from_q="2023-01-01", + ... limit=50 + ... ) + """ + q_parts = [] + if trial_number_q: + q_parts.append(f"trialNumber:{trial_number_q}") + if patent_owner_name_q: + q_parts.append(f'patentOwnerData.patentOwnerName:"{patent_owner_name_q}"') + if petitioner_real_party_in_interest_name_q: + q_parts.append( + f'regularPetitionerData.realPartyInInterestName:"{petitioner_real_party_in_interest_name_q}"' + ) + if respondent_name_q: + q_parts.append(f'respondentData.patentOwnerName:"{respondent_name_q}"') + if trial_type_code_q: + q_parts.append(f"trialMetaData.trialTypeCode:{trial_type_code_q}") + if trial_status_category_q: + q_parts.append( + f'trialMetaData.trialStatusCategory:"{trial_status_category_q}"' + ) + + if petition_filing_date_from_q and petition_filing_date_to_q: + q_parts.append( + f"trialMetaData.petitionFilingDate:[{petition_filing_date_from_q} TO {petition_filing_date_to_q}]" + ) + elif petition_filing_date_from_q: + q_parts.append( + f"trialMetaData.petitionFilingDate:>={petition_filing_date_from_q}" + ) + elif petition_filing_date_to_q: + q_parts.append( + f"trialMetaData.petitionFilingDate:<={petition_filing_date_to_q}" + ) + + return self._perform_search( + endpoint_key="search_proceedings", + response_class=PTABTrialProceedingResponse, + query=query, + query_parts=q_parts, + post_body=post_body, + sort=sort, + offset=offset, + limit=limit, + facets=facets, + fields=fields, + filters=filters, + range_filters=range_filters, + additional_params=additional_query_params, + ) # type: ignore
+ + +
+[docs] + def search_documents( + self, + query: Optional[str] = None, + sort: Optional[str] = None, + offset: Optional[int] = 0, + limit: Optional[int] = 25, + facets: Optional[str] = None, + fields: Optional[str] = None, + filters: Optional[str] = None, + range_filters: Optional[str] = None, + post_body: Optional[Dict[str, Any]] = None, + # Convenience query parameters + trial_number_q: Optional[str] = None, + document_category_q: Optional[str] = None, + document_type_name_q: Optional[str] = None, + filing_date_from_q: Optional[str] = None, + filing_date_to_q: Optional[str] = None, + petitioner_real_party_in_interest_name_q: Optional[str] = None, + inventor_name_q: Optional[str] = None, + real_party_in_interest_name_q: Optional[str] = None, + patent_number_q: Optional[str] = None, + patent_owner_name_q: Optional[str] = None, + additional_query_params: Optional[Dict[str, Any]] = None, + ) -> PTABTrialDocumentResponse: + """Searches for PTAB trial documents. + + This method can perform either a GET request using query parameters or a POST + request if post_body is specified. When using GET, you can provide either a + direct query string or use convenience parameters that will be automatically + combined into a query. + + Args: + query: Direct query string in USPTO search syntax. + sort: Sort order for results. + offset: Number of records to skip (pagination). + limit: Maximum number of records to return. + facets: Facet configuration string. + fields: Specific fields to return. + filters: Filter configuration string. + range_filters: Range filter configuration string. + post_body: Optional POST body for complex queries. + trial_number_q: Filter by trial number. + document_category_q: Filter by document category (e.g., "Petition") DOCUMENTED BUT NOT IN API. + document_type_name_q: Filter by document type name (description). + filing_date_from_q: Filter documents from this date (YYYY-MM-DD). + filing_date_to_q: Filter documents to this date (YYYY-MM-DD). + petitioner_real_party_in_interest_name_q: Filter by petitioner real party in interest. + inventor_name_q: Filter by inventor name. + real_party_in_interest_name_q: Filter by real party in interest (generic). + patent_number_q: Filter by patent number. + patent_owner_name_q: Filter by patent owner name. + additional_query_params: Additional custom query parameters. + + Returns: + PTABTrialDocumentResponse: Response containing matching trial documents. + + Examples: + # Search with direct query + >>> response = client.search_documents(query="trialNumber:IPR2023-00001") + + # Search with convenience parameters + >>> response = client.search_documents( + ... document_category_q="Paper", + ... filing_date_from_q="2023-01-01", + ... limit=50 + ... ) + """ + q_parts = [] + if trial_number_q: + q_parts.append(f"trialNumber:{trial_number_q}") + if document_category_q: + q_parts.append(f'documentData.documentCategory:"{document_category_q}"') + if document_type_name_q: + q_parts.append( + f'documentData.documentTypeDescriptionText:"{document_type_name_q}"' + ) + if petitioner_real_party_in_interest_name_q: + q_parts.append( + f'regularPetitionerData.realPartyInInterestName:"{petitioner_real_party_in_interest_name_q}"' + ) + if inventor_name_q: + q_parts.append(f'patentOwnerData.inventorName:"{inventor_name_q}"') + if real_party_in_interest_name_q: + q_parts.append( + f'regularPetitionerData.realPartyInInterestName:"{real_party_in_interest_name_q}"' + ) + if patent_number_q: + q_parts.append(f"patentOwnerData.patentNumber:{patent_number_q}") + if patent_owner_name_q: + q_parts.append(f'patentOwnerData.patentOwnerName:"{patent_owner_name_q}"') + + if filing_date_from_q and filing_date_to_q: + q_parts.append( + f"documentData.documentFilingDate:[{filing_date_from_q} TO {filing_date_to_q}]" + ) + elif filing_date_from_q: + q_parts.append(f"documentData.documentFilingDate:>={filing_date_from_q}") + elif filing_date_to_q: + q_parts.append(f"documentData.documentFilingDate:<={filing_date_to_q}") + + return self._perform_search( + endpoint_key="search_documents", + response_class=PTABTrialDocumentResponse, + query=query, + query_parts=q_parts, + post_body=post_body, + sort=sort, + offset=offset, + limit=limit, + facets=facets, + fields=fields, + filters=filters, + range_filters=range_filters, + additional_params=additional_query_params, + ) # type: ignore
+ + +
+[docs] + def search_decisions( + self, + query: Optional[str] = None, + sort: Optional[str] = None, + offset: Optional[int] = 0, + limit: Optional[int] = 25, + facets: Optional[str] = None, + fields: Optional[str] = None, + filters: Optional[str] = None, + range_filters: Optional[str] = None, + post_body: Optional[Dict[str, Any]] = None, + # Convenience query parameters + trial_number_q: Optional[str] = None, + decision_type_category_q: Optional[str] = None, + document_type_description_q: Optional[str] = None, + decision_date_from_q: Optional[str] = None, + decision_date_to_q: Optional[str] = None, + trial_type_code_q: Optional[str] = None, + patent_number_q: Optional[str] = None, + application_number_q: Optional[str] = None, + patent_owner_name_q: Optional[str] = None, + trial_status_category_q: Optional[str] = None, + real_party_in_interest_name_q: Optional[str] = None, + document_category_q: Optional[str] = None, + additional_query_params: Optional[Dict[str, Any]] = None, + ) -> PTABTrialDocumentResponse: + """Searches for PTAB trial decisions. + + This method can perform either a GET request using query parameters or a POST + request if post_body is specified. When using GET, you can provide either a + direct query string or use convenience parameters that will be automatically + combined into a query. + + Args: + query: Direct query string in USPTO search syntax. + sort: Sort order for results. + offset: Number of records to skip (pagination). + limit: Maximum number of records to return. + facets: Facet configuration string. + fields: Specific fields to return. + filters: Filter configuration string. + range_filters: Range filter configuration string. + post_body: Optional POST body for complex queries. + trial_number_q: Filter by trial number. + decision_type_category_q: Filter by decision type category. + document_type_description_q: Filter by "*[description]*". + decision_date_from_q: Filter decisions from this date (YYYY-MM-DD). + decision_date_to_q: Filter decisions to this date (YYYY-MM-DD). + trial_type_code_q: Filter by trial type code (e.g., "IPR", "PGR", "CBM", "DER"). + patent_number_q: Filter by patent number. + application_number_q: Filter by application number. + patent_owner_name_q: Filter by patent owner name. + trial_status_category_q: Filter by trial status category. + real_party_in_interest_name_q: Filter by real party in interest name. + document_category_q: Filter by document category. + additional_query_params: Additional custom query parameters. + + Returns: + PTABTrialDocumentResponse: Response containing matching trial decisions. + + Examples: + # Search with direct query + >>> response = client.search_decisions(query="trialNumber:IPR2023-00001") + + # Search with convenience parameters + >>> response = client.search_decisions( + ... decision_type_category_q="Final Written Decision", + ... decision_date_from_q="2023-01-01", + ... limit=50 + ... ) + """ + q_parts = [] + if trial_number_q: + q_parts.append(f"trialNumber:{trial_number_q}") + if decision_type_category_q: + q_parts.append( + f'decisionData.decisionTypeCategory:"{decision_type_category_q}"' + ) + if document_type_description_q: + q_parts.append( + f'documentData.documentTypeDescriptionText:"*{document_type_description_q}*"' + ) + if trial_type_code_q: + q_parts.append(f"trialMetaData.trialTypeCode:{trial_type_code_q}") + if patent_number_q: + q_parts.append(f"patentOwnerData.patentNumber:{patent_number_q}") + if application_number_q: + q_parts.append( + f"patentOwnerData.applicationNumberText:{application_number_q}" + ) + if patent_owner_name_q: + q_parts.append(f'patentOwnerData.patentOwnerName:"{patent_owner_name_q}"') + if trial_status_category_q: + q_parts.append( + f'trialMetaData.trialStatusCategory:"{trial_status_category_q}"' + ) + if real_party_in_interest_name_q: + q_parts.append( + f'regularPetitionerData.realPartyInInterestName:"{real_party_in_interest_name_q}"' + ) + if document_category_q: + q_parts.append(f'documentData.documentCategory:"{document_category_q}"') + + if decision_date_from_q and decision_date_to_q: + q_parts.append( + f"decisionData.decisionIssueDate:[{decision_date_from_q} TO {decision_date_to_q}]" + ) + elif decision_date_from_q: + q_parts.append(f"decisionData.decisionIssueDate:>={decision_date_from_q}") + elif decision_date_to_q: + q_parts.append(f"decisionData.decisionIssueDate:<={decision_date_to_q}") + + return self._perform_search( + endpoint_key="search_decisions", + response_class=PTABTrialDocumentResponse, + query=query, + query_parts=q_parts, + post_body=post_body, + sort=sort, + offset=offset, + limit=limit, + facets=facets, + fields=fields, + filters=filters, + range_filters=range_filters, + additional_params=additional_query_params, + ) # type: ignore
+ + +
+[docs] + def paginate_proceedings(self, **kwargs: Any) -> Iterator[PTABTrialProceeding]: + """Provides an iterator to paginate through trial proceeding search results.""" + if "post_body" in kwargs: + raise ValueError( + "paginate_proceedings uses GET requests and does not support 'post_body'. " + "Use keyword arguments for search criteria." + ) + + return self.paginate_results( + method_name="search_proceedings", + response_container_attr="patent_trial_proceeding_data_bag", + **kwargs, + )
+
+ +
+ +
+
+
+ +
+ +
+

© Copyright 2025, Dunlap Codding, P.C..

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/build/html/_modules/pyUSPTO/config.html b/docs/build/html/_modules/pyUSPTO/config.html index 819a396..8c9b251 100644 --- a/docs/build/html/_modules/pyUSPTO/config.html +++ b/docs/build/html/_modules/pyUSPTO/config.html @@ -5,7 +5,7 @@ - pyUSPTO.config — pyUSPTO 0.1.4.dev0+ga92fa00.d20250320 documentation + pyUSPTO.config — pyUSPTO 0.2.3.dev1+g2c5d89b38.d20251125 documentation @@ -13,7 +13,7 @@ - + @@ -79,60 +79,89 @@

Source code for pyUSPTO.config

 """
 config - Configuration management for USPTO API clients
 
-This module provides configuration management for USPTO API clients.
+This module provides configuration management for USPTO API clients,
+including API keys, base URLs, and HTTP transport settings.
 """
 
 import os
 from typing import Optional
 
+from pyUSPTO.http_config import HTTPConfig
+
 
 
[docs] class USPTOConfig: - """Configuration for USPTO API clients.""" + """Configuration for USPTO API clients. + + Manages API-level configuration (keys, URLs) and optionally + accepts HTTP transport configuration via HTTPConfig. + """
[docs] def __init__( self, api_key: Optional[str] = None, - bulk_data_base_url: str = "https://api.uspto.gov/api/v1/datasets", - patent_data_base_url: str = "https://api.uspto.gov/api/v1/patent", + bulk_data_base_url: str = "https://api.uspto.gov", + patent_data_base_url: str = "https://api.uspto.gov", + petition_decisions_base_url: str = "https://api.uspto.gov", + ptab_base_url: str = "https://api.uspto.gov", + http_config: Optional[HTTPConfig] = None, + include_raw_data: bool = False, ): - """ - Initialize the USPTOConfig. + """Initialize the USPTOConfig. Args: api_key: API key for authentication, defaults to USPTO_API_KEY environment variable bulk_data_base_url: Base URL for the Bulk Data API patent_data_base_url: Base URL for the Patent Data API + petition_decisions_base_url: Base URL for the Final Petition Decisions API + ptab_base_url: Base URL for the PTAB (Patent Trial and Appeal Board) API + http_config: Optional HTTPConfig for request handling (uses defaults if None) + include_raw_data: If True, store raw JSON in response objects for debugging (default: False) """ # Use environment variable only if api_key is None, not if it's an empty string self.api_key = ( api_key if api_key is not None else os.environ.get("USPTO_API_KEY") ) self.bulk_data_base_url = bulk_data_base_url - self.patent_data_base_url = patent_data_base_url
+ self.patent_data_base_url = patent_data_base_url + self.petition_decisions_base_url = petition_decisions_base_url + self.ptab_base_url = ptab_base_url + + # Use provided HTTPConfig or create default + self.http_config = http_config if http_config is not None else HTTPConfig() + + # Control whether to include raw JSON data in response objects + self.include_raw_data = include_raw_data
[docs] @classmethod def from_env(cls) -> "USPTOConfig": - """ - Create a USPTOConfig from environment variables. + """Create a USPTOConfig from environment variables. Returns: - USPTOConfig instance + USPTOConfig instance with values from environment """ return cls( api_key=os.environ.get("USPTO_API_KEY"), bulk_data_base_url=os.environ.get( - "USPTO_BULK_DATA_BASE_URL", "https://api.uspto.gov/api/v1/datasets" + "USPTO_BULK_DATA_BASE_URL", "https://api.uspto.gov" ), patent_data_base_url=os.environ.get( - "USPTO_PATENT_DATA_BASE_URL", "https://api.uspto.gov/api/v1/patent" + "USPTO_PATENT_DATA_BASE_URL", "https://api.uspto.gov" + ), + petition_decisions_base_url=os.environ.get( + "USPTO_PETITION_DECISIONS_BASE_URL", "https://api.uspto.gov" + ), + ptab_base_url=os.environ.get( + "USPTO_PTAB_BASE_URL", "https://api.uspto.gov" ), + # Also read HTTP config from environment + http_config=HTTPConfig.from_env(), )
@@ -145,7 +174,7 @@

Source code for pyUSPTO.config

   
-

© Copyright 2025, Andrew Piechocki.

+

© Copyright 2025, Dunlap Codding, P.C..

Built with Sphinx using a diff --git a/docs/build/html/_modules/pyUSPTO/exceptions.html b/docs/build/html/_modules/pyUSPTO/exceptions.html index 071202b..587cf1e 100644 --- a/docs/build/html/_modules/pyUSPTO/exceptions.html +++ b/docs/build/html/_modules/pyUSPTO/exceptions.html @@ -5,7 +5,7 @@ - pyUSPTO.exceptions — pyUSPTO 0.1.4.dev0+ga92fa00.d20250320 documentation + pyUSPTO.exceptions — pyUSPTO 0.2.3.dev1+g2c5d89b38.d20251125 documentation @@ -13,7 +13,7 @@ - + @@ -79,27 +79,112 @@

Source code for pyUSPTO.exceptions

 """
 exceptions - Exception classes for USPTO API clients
 
-This module provides exception classes for USPTO API clients.
+This module provides exception classes for USPTO API errors that correspond to
+the various response types from the USPTO API. It also includes helper
+structures and functions for creating these exceptions.
 """
 
-from typing import Optional
+from dataclasses import asdict, dataclass
+from typing import TYPE_CHECKING, Optional, Type, Union
 
+# To avoid circular imports if requests is type-hinted directly,
+# use TYPE_CHECKING guard or a string literal for the type hint.
+if TYPE_CHECKING:
+    import requests  # requests.exceptions.HTTPError
 
+
+# --- Exception Classes (largely unchanged) ---
 
[docs] class USPTOApiError(Exception): - """Base exception for USPTO API errors.""" - - def __init__(self, message: str, status_code: Optional[int] = None): + """Base exception for USPTO API errors. + This is the parent class for all USPTO API-specific exceptions. It includes + information about the status code, API's short error message, detailed error + information, and request identifier from the API response. + """ + + DEFAULT_UNKNOWN_MESSAGE = "UNK USPTO API ERROR" + +
+[docs] + def __init__( + self, + message: str, # Primary client-facing message for the exception context + status_code: Optional[int] = None, + api_short_error: Optional[ + str + ] = None, # From API 'error' or 'message' (for 413) field + error_details: Optional[ + Union[str, dict] + ] = None, # From API 'errorDetails' or 'detailedMessage' field + request_identifier: Optional[str] = None, + ): + """ + Initializes the USPTOApiError. + Args: + message: The primary message for the exception (often client-generated context). + status_code: The HTTP status code from the API response (e.g., 400, 403). + api_short_error: The short error description from the API (e.g., "Bad Request", "Forbidden"). + error_details: The detailed error message or structure from the API. + request_identifier: The request identifier from the API response, if available. + """ + effective_message = message if message else self.DEFAULT_UNKNOWN_MESSAGE + super().__init__(effective_message) self.status_code = status_code - super().__init__(message)
+ self.api_short_error = api_short_error + self.error_details = error_details + self.request_identifier = request_identifier
+ + + @property + def message(self) -> str: + """ + Provides direct access to the primary exception message. + This refers to the first argument passed to the exception, + which is conventionally the main human-readable message. + """ + return str(object=self.args[0]) + +
+[docs] + def __str__(self) -> str: + """Provides a more informative string representation of the error.""" + parts = [super().__str__()] + + if self.status_code: + parts.append(f"HTTP Status: {self.status_code}") + + if self.api_short_error: + parts.append(f"API Error: {self.api_short_error}") + + if self.error_details: + details_str = str(self.error_details) + parts.append(f"Details: {details_str}") + + if self.request_identifier: + parts.append(f"Request ID: {self.request_identifier}") + + if len(parts) > 1: + return " - ".join(filter(None, parts)) + else: + return parts[0]
+
+ + + +
+[docs] +class USPTOApiBadRequestError(USPTOApiError): + """Bad Request error (HTTP 400).""" + + pass
[docs] class USPTOApiAuthError(USPTOApiError): - """Authentication error.""" + """Authentication/Authorization error (HTTP 401/403).""" pass
@@ -108,7 +193,7 @@

Source code for pyUSPTO.exceptions

 
[docs] class USPTOApiRateLimitError(USPTOApiError): - """Rate limit exceeded.""" + """Rate limit exceeded error (HTTP 429).""" pass
@@ -117,10 +202,187 @@

Source code for pyUSPTO.exceptions

 
[docs] class USPTOApiNotFoundError(USPTOApiError): - """Resource not found.""" + """Resource not found error (HTTP 404).""" + + pass
+ + + +
+[docs] +class USPTOApiPayloadTooLargeError(USPTOApiError): + """Payload Too Large error (HTTP 413).""" + + pass
+ + + +
+[docs] +class USPTOApiServerError(USPTOApiError): + """Internal Server Error (HTTP 500 series).""" pass
+ + +
+[docs] +class USPTOConnectionError(USPTOApiError): + """Network-level connection error (DNS failure, refused connection, etc.).""" + + pass
+ + + +
+[docs] +class USPTOTimeout(USPTOApiError): + """Request to USPTO API timed out.""" + + pass
+ + + +# --- Helper Structures and Functions --- + + +
+[docs] +@dataclass +class APIErrorArgs: + """Data structure to hold arguments for API exception constructors.""" + + message: str + status_code: Optional[int] = None + api_short_error: Optional[str] = None + error_details: Optional[Union[str, dict]] = None + request_identifier: Optional[str] = None + +
+[docs] + @classmethod + def from_http_error( + cls, + http_error: "requests.exceptions.HTTPError", # String literal for type hint + client_operation_message: str, + ) -> "APIErrorArgs": + """ + Creates an APIErrorArgs instance by parsing a requests.exceptions.HTTPError. + + Args: + http_error: The HTTPError object from the requests library. + client_operation_message: A message describing the client operation that failed. + + Returns: + An instance of APIErrorArgs populated with details from the HTTPError. + """ + status_code = http_error.response.status_code + + api_short_error_from_response = None + error_details_from_response = None + request_identifier_from_response = None + + try: + error_data = http_error.response.json() + if status_code == 413: + api_short_error_from_response = error_data.get("message") + error_details_from_response = error_data.get("detailedMessage") + else: + api_short_error_from_response = error_data.get("error") + error_details_from_response = error_data.get("errorDetails") + request_identifier_from_response = error_data.get("requestIdentifier") + except ValueError: # If response.json() fails (e.g., not JSON) + pass # Values remain None + + # Fallback for api_short_error if not found in JSON response + if not api_short_error_from_response and http_error.response.reason: + api_short_error_from_response = http_error.response.reason + + # Fallback for error_details if not found in JSON and response text is available + if not error_details_from_response and http_error.response.text: + # Avoid setting very long HTML pages as error_details if JSON parsing failed + if ( + "content-type" in http_error.response.headers + and "application/json" + not in http_error.response.headers.get("content-type", "").lower() + ): + if len(http_error.response.text) > 500: # Heuristic for "too long" + error_details_from_response = f"Non-JSON error response (status {status_code}). Check response text." + else: + error_details_from_response = http_error.response.text + elif ( + http_error.response.text + ): # If it might have been JSON but parsing failed + error_details_from_response = http_error.response.text + + return cls( + message=client_operation_message, + status_code=status_code, + api_short_error=api_short_error_from_response, + error_details=error_details_from_response, + request_identifier=request_identifier_from_response, + )
+ + +
+[docs] + @classmethod + def from_request_exception( + cls, + request_exception: "requests.exceptions.RequestException", # String for type hint + client_operation_message: Optional[str] = None, + ) -> "APIErrorArgs": + """ + Creates an APIErrorArgs instance from a generic requests.exceptions.RequestException + (e.g., ConnectionError, Timeout) that is not an HTTPError. + """ + message_prefix = client_operation_message or "API request failed" + return cls( + message=f"{message_prefix} due to a network or request issue: {str(request_exception)}" + # status_code, api_short_error, etc., will be None + )
+
+ + + +
+[docs] +def get_api_exception(error_args: APIErrorArgs) -> USPTOApiError: + """ + Determines and instantiates the appropriate USPTOApiError subclass + based on the status code in error_args. + + Args: + error_args: An instance of APIErrorArgs containing all necessary + information to construct the exception. + + Returns: + An instance of a USPTOApiError subclass. + """ + status_code = error_args.status_code + exception_class: Type[USPTOApiError] + + match status_code: + case 400: + exception_class = USPTOApiBadRequestError + case 401 | 403: + exception_class = USPTOApiAuthError + case 404: + exception_class = USPTOApiNotFoundError + case 413: + exception_class = USPTOApiPayloadTooLargeError + case 429: + exception_class = USPTOApiRateLimitError + case _ if status_code is not None and status_code >= 500: + exception_class = USPTOApiServerError + case ( + _ + ): # Default for other errors or if status_code is None (e.g. network error) + exception_class = USPTOApiError + + return exception_class(**asdict(error_args))
+
@@ -130,7 +392,7 @@

Source code for pyUSPTO.exceptions

   
-

© Copyright 2025, Andrew Piechocki.

+

© Copyright 2025, Dunlap Codding, P.C..

Built with Sphinx using a diff --git a/docs/build/html/_modules/pyUSPTO/http_config.html b/docs/build/html/_modules/pyUSPTO/http_config.html new file mode 100644 index 0000000..d1a802c --- /dev/null +++ b/docs/build/html/_modules/pyUSPTO/http_config.html @@ -0,0 +1,196 @@ + + + + + + + + pyUSPTO.http_config — pyUSPTO 0.2.3.dev1+g2c5d89b38.d20251125 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +

Source code for pyUSPTO.http_config

+"""
+http_config - HTTP client configuration for USPTO API requests
+
+This module provides configuration for HTTP transport-level settings including
+timeouts, retries, connection pooling, and custom headers.
+"""
+
+import os
+from dataclasses import dataclass, field
+from typing import Dict, List, Optional
+
+
+
+[docs] +@dataclass +class HTTPConfig: + """HTTP client configuration for request handling. + + This class separates transport-level HTTP concerns from API-level + configuration, allowing fine-grained control over request behavior. + + Attributes: + timeout: Read timeout in seconds for requests (default: 30.0) + connect_timeout: Connection establishment timeout in seconds (default: 10.0) + max_retries: Maximum number of retry attempts (default: 3) + backoff_factor: Exponential backoff multiplier for retries (default: 1.0) + retry_status_codes: HTTP status codes that trigger retries + pool_connections: Number of connection pools to cache (default: 10) + pool_maxsize: Maximum number of connections per pool (default: 10) + custom_headers: Additional headers to include in all requests + """ + + # Timeout configuration + timeout: Optional[float] = 30.0 + connect_timeout: Optional[float] = 10.0 + + # Retry configuration + max_retries: int = 3 + backoff_factor: float = 1.0 + retry_status_codes: List[int] = field( + default_factory=lambda: [429, 500, 502, 503, 504] + ) + + # Connection pooling + pool_connections: int = 10 + pool_maxsize: int = 10 + + # Custom headers (User-Agent, tracking, etc.) + custom_headers: Optional[Dict[str, str]] = None + +
+[docs] + @classmethod + def from_env(cls) -> "HTTPConfig": + """Create HTTPConfig from environment variables. + + Environment variables: + USPTO_REQUEST_TIMEOUT: Request timeout in seconds + USPTO_CONNECT_TIMEOUT: Connection timeout in seconds + USPTO_MAX_RETRIES: Maximum retry attempts + USPTO_BACKOFF_FACTOR: Retry backoff factor + USPTO_POOL_CONNECTIONS: Connection pool size + USPTO_POOL_MAXSIZE: Max connections per pool + + Returns: + HTTPConfig instance with values from environment or defaults + """ + return cls( + timeout=float(os.environ.get("USPTO_REQUEST_TIMEOUT", "30.0")), + connect_timeout=float(os.environ.get("USPTO_CONNECT_TIMEOUT", "10.0")), + max_retries=int(os.environ.get("USPTO_MAX_RETRIES", "3")), + backoff_factor=float(os.environ.get("USPTO_BACKOFF_FACTOR", "1.0")), + pool_connections=int(os.environ.get("USPTO_POOL_CONNECTIONS", "10")), + pool_maxsize=int(os.environ.get("USPTO_POOL_MAXSIZE", "10")), + )
+ + +
+[docs] + def get_timeout_tuple(self) -> tuple[Optional[float], Optional[float]]: + """Get timeout as tuple for requests library. + + Returns: + Tuple of (connect_timeout, read_timeout) for requests + """ + return (self.connect_timeout, self.timeout)
+
+ +
+ +
+
+
+ +
+ +
+

© Copyright 2025, Dunlap Codding, P.C..

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/build/html/_modules/pyUSPTO/models/bulk_data.html b/docs/build/html/_modules/pyUSPTO/models/bulk_data.html index 3b6b714..5b321ae 100644 --- a/docs/build/html/_modules/pyUSPTO/models/bulk_data.html +++ b/docs/build/html/_modules/pyUSPTO/models/bulk_data.html @@ -5,7 +5,7 @@ - pyUSPTO.models.bulk_data — pyUSPTO 0.1.4.dev0+ga92fa00.d20250320 documentation + pyUSPTO.models.bulk_data — pyUSPTO 0.2.3.dev1+g2c5d89b38.d20251125 documentation @@ -13,7 +13,7 @@ - + @@ -82,7 +82,8 @@

Source code for pyUSPTO.models.bulk_data

 This module provides data models for the USPTO Open Data Portal (ODP) Bulk Data API.
 """
 
-from dataclasses import dataclass
+import json
+from dataclasses import dataclass, field
 from typing import Any, Dict, List, Optional
 
 
@@ -201,22 +202,40 @@ 

Source code for pyUSPTO.models.bulk_data

 [docs]
 @dataclass
 class BulkDataResponse:
-    """Top-level response from the bulk data API."""
+    """Top-level response from the bulk data API.
+
+    Attributes:
+        count: The number of bulk data products in the response.
+        bulk_data_product_bag: List of bulk data products.
+        raw_data: Optional raw JSON data from the API response (for debugging).
+    """
 
     count: int
     bulk_data_product_bag: List[BulkDataProduct]
+    raw_data: Optional[str] = field(default=None, compare=False, repr=False)
 
 
[docs] @classmethod - def from_dict(cls, data: Dict[str, Any]) -> "BulkDataResponse": - """Create a BulkDataResponse object from a dictionary.""" + def from_dict( + cls, data: Dict[str, Any], include_raw_data: bool = False + ) -> "BulkDataResponse": + """Create a BulkDataResponse object from a dictionary. + + Args: + data: Dictionary containing API response data. + include_raw_data: If True, store the raw JSON for debugging. + + Returns: + BulkDataResponse: An instance of BulkDataResponse. + """ return cls( count=data.get("count", 0), bulk_data_product_bag=[ BulkDataProduct.from_dict(product) for product in data.get("bulkDataProductBag", []) ], + raw_data=json.dumps(data) if include_raw_data else None, )
@@ -247,7 +266,7 @@

Source code for pyUSPTO.models.bulk_data

   
-

© Copyright 2025, Andrew Piechocki.

+

© Copyright 2025, Dunlap Codding, P.C..

Built with Sphinx using a diff --git a/docs/build/html/_modules/pyUSPTO/models/patent_data.html b/docs/build/html/_modules/pyUSPTO/models/patent_data.html index 3e74975..de7fd30 100644 --- a/docs/build/html/_modules/pyUSPTO/models/patent_data.html +++ b/docs/build/html/_modules/pyUSPTO/models/patent_data.html @@ -5,7 +5,7 @@ - pyUSPTO.models.patent_data — pyUSPTO 0.1.4.dev0+ga92fa00.d20250320 documentation + pyUSPTO.models.patent_data — pyUSPTO 0.2.3.dev1+g2c5d89b38.d20251125 documentation @@ -13,7 +13,7 @@ - + @@ -79,63 +79,427 @@

Source code for pyUSPTO.models.patent_data

 """
 models.patent_data - Data models for USPTO patent data API
 
-This module provides data models for the USPTO Patent Data API.
+This module provides Pydantic-style data models, primarily using frozen
+dataclasses, for representing responses from the USPTO Patent Data API.
+It aims to offer more Pythonic representations (e.g., Enums, native
+date/datetime objects) of the API's JSON data. Models cover aspects like
+application metadata, party information (applicants, inventors, attorneys),
+document details, continuity, assignments, and more.
 """
 
-from dataclasses import dataclass, field
-from typing import Any, Dict, List, Optional
+import csv
+import io
+import json
+import warnings
+from dataclasses import asdict, dataclass, field
+from datetime import date, datetime
+from enum import Enum
+from typing import Any, Dict, Iterator, List, Optional, Union
+
+# Import utility functions from models.utils module
+from pyUSPTO.models.utils import (
+    ASSUMED_NAIVE_TIMEZONE,
+    ASSUMED_NAIVE_TIMEZONE_STR,
+    parse_to_date,
+    parse_to_datetime_utc,
+    parse_yn_to_bool,
+    serialize_bool_to_yn,
+    serialize_date,
+    serialize_datetime_as_iso,
+    serialize_datetime_as_naive,
+    to_camel_case,
+)
+from pyUSPTO.warnings import USPTOEnumParseWarning
+
+
+# --- Enums for Categorical Data ---
+
+[docs] +class DirectionCategory(Enum): + """Represents the direction of a document relative to the USPTO (e.g., INCOMING, OUTGOING).""" + + INCOMING = "INCOMING" + OUTGOING = "OUTGOING"
+ + + +
+[docs] +class ActiveIndicator(Enum): + """Represents an active or inactive status, often used for practitioners or entities. + + This Enum is designed to flexibly parse common string representations of + active/inactive or true/false states (e.g., "Y", "N", "true", "false", "Active") + into standardized Enum members. + """ + + YES = "Y" + NO = "N" + TRUE = "true" + FALSE = "false" + ACTIVE = "Active" + @classmethod + def _missing_(cls, value: Any) -> "ActiveIndicator": + if isinstance(value, str): + val_upper = value.upper() + if val_upper == "Y": + return cls.YES + if val_upper == "N": + return cls.NO + if val_upper == "TRUE": + return cls.TRUE + if val_upper == "FALSE": + return cls.FALSE + if val_upper == "ACTIVE": + return cls.ACTIVE + return super()._missing_(value=value) # type: ignore[no-any-return]
+ + + +# --- Data Models --- +
+[docs] +@dataclass(frozen=True) +class DocumentFormat: + """Represents an available download format for a specific document. + + Attributes: + mime_type_identifier: The MIME type of the downloadable file (e.g., "PDF"). + download_url: The URL from which the document format can be downloaded. + page_total_quantity: The total number of pages in this document format. + """ + + mime_type_identifier: Optional[str] = None + download_url: Optional[str] = None + page_total_quantity: Optional[int] = None + + def __str__(self) -> str: + return ( + f"{self.mime_type_identifier} format with {self.page_total_quantity} pages" + ) + + def __repr__(self) -> str: + return f"DocumentFormat(mime_type={self.mime_type_identifier}, pages={self.page_total_quantity})" + +
+[docs] + @classmethod + def from_dict(cls, data: Dict[str, Any]) -> "DocumentFormat": + """Creates a `DocumentFormat` instance from a dictionary representation. -
-[docs] -@dataclass -class PatentDataResponse: - """Top-level response from the patent data API.""" + This factory method is typically used to construct `DocumentFormat` + objects from data parsed from an API JSON response. It maps + dictionary keys (expected in camelCase) to the class attributes. - count: int - patent_file_wrapper_data_bag: List["PatentFileWrapper"] + Args: + data (Dict[str, Any]): A dictionary containing the data for a + `DocumentFormat`. Expected keys from the API are + "mimeTypeIdentifier", "downloadUrl", and "pageTotalQuantity". -
-[docs] + Returns: + DocumentFormat: An instance of `DocumentFormat` initialized with + data from the input dictionary. + """ + + return cls( + mime_type_identifier=data.get("mimeTypeIdentifier"), + download_url=data.get("downloadUrl"), + page_total_quantity=data.get("pageTotalQuantity"), + )
+ + +
+[docs] + def to_dict(self) -> Dict[str, Any]: + """Converts the `DocumentFormat` instance to a dictionary. + + This method serializes the `DocumentFormat` object into a dictionary, + mapping the instance's attributes to camelCase keys. This is typically + useful for generating JSON representations compatible with API expectations. + + Returns: + Dict[str, Any]: A dictionary representation of the `DocumentFormat` + instance with keys "mimeTypeIdentifier", "downloadUrl", and + "pageTotalQuantity". + """ + + return { + "mimeTypeIdentifier": self.mime_type_identifier, + "downloadUrl": self.download_url, + "pageTotalQuantity": self.page_total_quantity, + }
+
+ + + +
+[docs] +@dataclass(frozen=True) +class Document: + """Represents a single document associated with a patent application. + + This includes metadata such as its identifier, official date, code, description, + direction (incoming/outgoing), and available download formats. + + Attributes: + application_number_text: The application number this document belongs to. + official_date: The official date of the document. + document_identifier: A unique identifier for this document. + document_code: A code representing the type of document. + document_code_description_text: A textual description of the document code. + direction_category: The direction of the document (e.g., INCOMING, OUTGOING). + document_formats: A list of available download formats for this document. + """ + + application_number_text: Optional[str] = None + official_date: Optional[datetime] = None + document_identifier: Optional[str] = None + document_code: Optional[str] = None + document_code_description_text: Optional[str] = None + direction_category: Optional[DirectionCategory] = None + document_formats: List[DocumentFormat] = field(default_factory=list) + + def __str__(self) -> str: + date_str = ( + self.official_date.strftime("%Y-%m-%d") if self.official_date else "No date" + ) + return f"Document {self.document_identifier} ({self.document_code}): {self.document_code_description_text} - {date_str}" + + def __repr__(self) -> str: + return f"Document(id={self.document_identifier}, code={self.document_code}, date={self.official_date.strftime('%Y-%m-%d') if self.official_date else 'None'})" + +
+[docs] @classmethod - def from_dict(cls, data: Dict[str, Any]) -> "PatentDataResponse": - """Create a PatentDataResponse object from a dictionary.""" + def from_dict(cls, data: Dict[str, Any]) -> "Document": + """Creates a `Document` instance from a dictionary representation. + + Maps API JSON keys (camelCase) to class attributes, parsing nested + objects like `DocumentFormat` and `DirectionCategory`. + + Args: + data (Dict[str, Any]): A dictionary containing document data, + typically from an API response. + + Returns: + Document: An instance of `Document`. + """ + + dl_formats = [ + DocumentFormat.from_dict(f) + for f in data.get("downloadOptionBag", []) + if isinstance(f, dict) + ] + dir_val = data.get("documentDirectionCategory") + dir_cat = None + if dir_val: + try: + dir_cat = DirectionCategory(dir_val) + except ValueError: + warnings.warn( + f"Unknown document direction category '{dir_val}'", + category=USPTOEnumParseWarning, + stacklevel=2, + ) return cls( - count=data.get("count", 0), - patent_file_wrapper_data_bag=[ - PatentFileWrapper.from_dict(data=wrapper) - for wrapper in data.get("patentFileWrapperDataBag", []) - ], + application_number_text=data.get("applicationNumberText"), + official_date=parse_to_datetime_utc(data.get("officialDate")), + document_identifier=data.get("documentIdentifier"), + document_code=data.get("documentCode"), + document_code_description_text=data.get("documentCodeDescriptionText"), + direction_category=dir_cat, + document_formats=dl_formats, )
-
-[docs] +
+[docs] def to_dict(self) -> Dict[str, Any]: - """Convert the PatentDataResponse object to a dictionary.""" + """Converts the `Document` instance to a dictionary for API compatibility. + + Serializes attributes to camelCase keys and handles nested objects. + Omits keys with None values or empty lists. + + Returns: + Dict[str, Any]: A dictionary representation of the `Document`. + """ + + d = { + "applicationNumberText": self.application_number_text, + "officialDate": ( + serialize_datetime_as_iso(self.official_date) + if self.official_date + else None + ), + "documentIdentifier": self.document_identifier, + "documentCode": self.document_code, + "documentCodeDescriptionText": self.document_code_description_text, + "documentDirectionCategory": ( + self.direction_category.value if self.direction_category else None + ), + "downloadOptionBag": [df.to_dict() for df in self.document_formats], + } return { - "count": self.count, - "patentFileWrapperDataBag": [ - # If PatentFileWrapper had a to_dict method, we would use it here - # For now, we'll just return a basic representation - { - "applicationNumberText": wrapper.application_number_text, - # Add other fields as needed - } - for wrapper in self.patent_file_wrapper_data_bag - ], - # Add other fields that might be in the API response but not in our model - "documentBag": [], # Empty placeholder for document bag + k: v + for k, v in d.items() + if v is not None and (not isinstance(v, list) or v) }
+
+[docs] +class DocumentBag: + """A collection of Document objects associated with a patent application. + + Provides iterable access and standard collection methods like `len` and `getitem`. + This class is immutable by convention after initialization. + + Attributes: + documents (tuple[Document, ...]): An immutable tuple of `Document` objects. + """ + +
+[docs] + def __init__(self, documents: List[Document]): + """Initializes the DocumentBag with a list of documents. + + Args: + documents (List[Document]): A list of `Document` instances. + """ + self._documents = tuple(documents)
+ + + @property + def documents(self) -> tuple[Document, ...]: + """Provides access to the tuple of documents.""" + return self._documents + + def __iter__(self) -> Iterator[Document]: + return iter(self._documents) + + def __len__(self) -> int: + return len(self._documents) + + def __getitem__(self, index: int) -> Document: + return self._documents[index] + +
+[docs] + def __str__(self) -> str: + """Returns a string representation showing document count and summary. + + Returns: + str: Human-readable summary of the DocumentBag. + """ + count = len(self._documents) + if count == 0: + return "DocumentBag(0 documents)" + + # Count unique document codes + doc_codes: Dict[str, int] = {} + for doc in self._documents: + code = doc.document_code or "Unknown" + doc_codes[code] = doc_codes.get(code, 0) + 1 + + # Format summary + if count == 1: + code = self._documents[0].document_code or "Unknown" + return f"DocumentBag(1 document: {code})" + + # Show top 3 most common document codes + sorted_codes = sorted(doc_codes.items(), key=lambda x: x[1], reverse=True) + top_codes = sorted_codes[:3] + code_summary = ", ".join(f"{code} ({cnt})" for code, cnt in top_codes) + + if len(sorted_codes) > 3: + remaining = len(sorted_codes) - 3 + return f"DocumentBag({count} documents: {code_summary}, +{remaining} more types)" + else: + return f"DocumentBag({count} documents: {code_summary})"
+ + +
+[docs] + def __repr__(self) -> str: + """Returns a detailed string representation for debugging. + + Returns: + str: Detailed representation of the DocumentBag. + """ + return f"DocumentBag(documents={self._documents!r})"
+ + +
+[docs] + @classmethod + def from_dict(cls, data: Dict[str, Any]) -> "DocumentBag": + """Creates a `DocumentBag` instance from a dictionary representation. + + Expects a dictionary with a "documentBag" key containing a list of + document data dictionaries. + + Args: + data (Dict[str, Any]): A dictionary, typically from an API response, + containing the document bag. + + Returns: + DocumentBag: An instance of `DocumentBag`. + """ + docs_data = data.get("documentBag", []) + docs = ( + [Document.from_dict(dd) for dd in docs_data if isinstance(dd, dict)] + if isinstance(docs_data, list) + else [] + ) + return cls(documents=docs)
+ + +
+[docs] + def to_dict(self) -> Dict[str, Any]: + """Converts the `DocumentBag` instance to a dictionary. + + Serializes the collection into a dictionary with a "documentBag" key, + containing a list of `Document` dictionaries. + + Returns: + Dict[str, Any]: A dictionary representation of the `DocumentBag`. + """ + return {"documentBag": [doc.to_dict() for doc in self._documents]}
+
+ + +
[docs] -@dataclass +@dataclass(frozen=True) class Address: - """Represents an address in the patent data API.""" + """Represents a postal address with fields for street, city, region, country, and postal code. + + It can be used for various entities like applicants, inventors, or correspondence. + + Attributes: + name_line_one_text: First line of the name (e.g., company name). + name_line_two_text: Second line of the name. + address_line_one_text: First line of the street address. + address_line_two_text: Second line of the street address. + address_line_three_text: Third line of the street address. + address_line_four_text: Fourth line of the street address. + geographic_region_name: Name of the geographic region (e.g., state, province). + geographic_region_code: Code for the geographic region. + postal_code: Postal or ZIP code. + city_name: Name of the city. + country_code: Two-letter country code (e.g., "US"). + country_name: Full name of the country (e.g., "United States"). + postal_address_category: Category of the address (e.g., "MAILING_ADDRESS"). + correspondent_name_text: Name of the correspondent at this address. + country_or_state_code: Country or state code. + ict_state_code: International code for the state/region (USPTO format). + ict_country_code: International code for the country (USPTO format). + """ name_line_one_text: Optional[str] = None name_line_two_text: Optional[str] = None @@ -151,12 +515,24 @@

Source code for pyUSPTO.models.patent_data

     country_name: Optional[str] = None
     postal_address_category: Optional[str] = None
     correspondent_name_text: Optional[str] = None
+    country_or_state_code: Optional[str] = None
+    ict_state_code: Optional[str] = None
+    ict_country_code: Optional[str] = None
 
 
[docs] @classmethod def from_dict(cls, data: Dict[str, Any]) -> "Address": - """Create an Address object from a dictionary.""" + """Creates an `Address` instance from a dictionary representation. + + Maps camelCase keys from API data to class attributes. + + Args: + data (Dict[str, Any]): Dictionary containing address data. + + Returns: + Address: An instance of `Address`. + """ return cls( name_line_one_text=data.get("nameLineOneText"), name_line_two_text=data.get("nameLineTwoText"), @@ -172,16 +548,56 @@

Source code for pyUSPTO.models.patent_data

             country_name=data.get("countryName"),
             postal_address_category=data.get("postalAddressCategory"),
             correspondent_name_text=data.get("correspondentNameText"),
+            country_or_state_code=data.get("countryOrStateCode"),
+            ict_state_code=data.get("ictStateCode"),
+            ict_country_code=data.get("ictCountryCode"),
         )
+ + +
+[docs] + def to_dict(self) -> Dict[str, Any]: + """Converts the `Address` instance to a dictionary with camelCase keys. + + Returns: + Dict[str, Any]: A dictionary representation of the address. + """ + _dict = { + "nameLineOneText": self.name_line_one_text, + "nameLineTwoText": self.name_line_two_text, + "addressLineOneText": self.address_line_one_text, + "addressLineTwoText": self.address_line_two_text, + "addressLineThreeText": self.address_line_three_text, + "addressLineFourText": self.address_line_four_text, + "geographicRegionName": self.geographic_region_name, + "geographicRegionCode": self.geographic_region_code, + "postalCode": self.postal_code, + "cityName": self.city_name, + "countryCode": self.country_code, + "countryName": self.country_name, + "postalAddressCategory": self.postal_address_category, + "correspondentNameText": self.correspondent_name_text, + "countryOrStateCode": self.country_or_state_code, + "ictStateCode": self.ict_state_code, + "ictCountryCode": self.ict_country_code, + } + # Filter out None values to match API behavior + return {k: v for k, v in _dict.items() if v is not None}
[docs] -@dataclass +@dataclass(frozen=True) class Telecommunication: - """Represents telecommunication information.""" + """Represents telecommunication details, such as phone or fax numbers. + + Attributes: + telecommunication_number: The main number (e.g., phone number). + extension_number: Any extension associated with the number. + telecom_type_code: A code indicating the type of telecommunication (e.g., "TEL", "FAX"). + """ telecommunication_number: Optional[str] = None extension_number: Optional[str] = None @@ -191,21 +607,57 @@

Source code for pyUSPTO.models.patent_data

 [docs]
     @classmethod
     def from_dict(cls, data: Dict[str, Any]) -> "Telecommunication":
-        """Create a Telecommunication object from a dictionary."""
+        """Creates a `Telecommunication` instance from a dictionary.
+
+        Args:
+            data (Dict[str, Any]): Dictionary with telecommunication data.
+
+        Returns:
+            Telecommunication: An instance of `Telecommunication`.
+        """
         return cls(
             telecommunication_number=data.get("telecommunicationNumber"),
             extension_number=data.get("extensionNumber"),
             telecom_type_code=data.get("telecomTypeCode"),
         )
+ + +
+[docs] + def to_dict(self) -> Dict[str, Any]: + """Converts the `Telecommunication` instance to a dictionary. + + Returns: + Dict[str, Any]: Dictionary representation with camelCase keys. + """ + _dict = { + "telecommunicationNumber": self.telecommunication_number, + "extensionNumber": self.extension_number, + "telecomTypeCode": self.telecom_type_code, + } + # Filter out None values to match API behavior + return {k: v for k, v in _dict.items() if v is not None}
[docs] -@dataclass +@dataclass(frozen=True) class Person: - """Base class for person-related data.""" + """A base data class representing a person with common name and country attributes. + + This class is typically inherited by more specific types like Applicant, Inventor, or Attorney. + + Attributes: + first_name: The first name of the person. + middle_name: The middle name or initial of the person. + last_name: The last name or surname of the person. + name_prefix: A prefix for the name (e.g., "Dr.", "Mr."). + name_suffix: A suffix for the name (e.g., "Jr.", "PhD"). + preferred_name: The person's preferred name, if different. + country_code: The country code associated with the person (e.g., citizenship). + """ first_name: Optional[str] = None middle_name: Optional[str] = None @@ -215,29 +667,45 @@

Source code for pyUSPTO.models.patent_data

     preferred_name: Optional[str] = None
     country_code: Optional[str] = None
 
-
-[docs] @classmethod - def from_dict(cls, data: Dict[str, Any]) -> "Person": - """Create a Person object from a dictionary.""" - return cls( - first_name=data.get("firstName"), - middle_name=data.get("middleName"), - last_name=data.get("lastName"), - name_prefix=data.get("namePrefix"), - name_suffix=data.get("nameSuffix"), - preferred_name=data.get("preferredName"), - country_code=data.get("countryCode"), - )
+ def _extract_person_fields(cls, data: Dict[str, Any]) -> Dict[str, Any]: + return { + "first_name": data.get("firstName"), + "middle_name": data.get("middleName"), + "last_name": data.get("lastName"), + "name_prefix": data.get("namePrefix"), + "name_suffix": data.get("nameSuffix"), + "preferred_name": data.get("preferredName"), + "country_code": data.get("countryCode"), + } + +
+[docs] + def to_dict(self) -> Dict[str, Any]: + """Converts the `Person` instance to a dictionary with camelCase keys. + + Omits attributes that are None. + + Returns: + Dict[str, Any]: A dictionary representation of the person. + """ + return {to_camel_case(k): v for k, v in asdict(self).items() if v is not None}
[docs] -@dataclass +@dataclass(frozen=True) class Applicant(Person): - """Represents an applicant in the patent data.""" + """Represents an applicant for a patent, inheriting from Person. + + Includes applicant-specific name text and a list of correspondence addresses. + + Attributes: + applicant_name_text: The full name of the applicant as a single string. + correspondence_address_bag: A list of `Address` objects for the applicant. + """ applicant_name_text: Optional[str] = None correspondence_address_bag: List[Address] = field(default_factory=list) @@ -246,35 +714,70 @@

Source code for pyUSPTO.models.patent_data

 [docs]
     @classmethod
     def from_dict(cls, data: Dict[str, Any]) -> "Applicant":
-        """Create an Applicant object from a dictionary."""
-        person = Person.from_dict(data=data)
-        addresses = []
-        if "correspondenceAddressBag" in data:
-            addresses = [
-                Address.from_dict(data=addr)
-                for addr in data.get("correspondenceAddressBag", [])
-            ]
-
+        """Creates an `Applicant` instance from a dictionary.
+
+        Inherits person fields and adds applicant-specific fields.
+
+        Args:
+            data (Dict[str, Any]): Dictionary with applicant data.
+
+        Returns:
+            Applicant: An instance of `Applicant`.
+        """
+        pf = Person._extract_person_fields(data)
+        addrs = [
+            Address.from_dict(a)
+            for a in data.get("correspondenceAddressBag", [])
+            if isinstance(a, dict)
+        ]
         return cls(
-            first_name=person.first_name,
-            middle_name=person.middle_name,
-            last_name=person.last_name,
-            name_prefix=person.name_prefix,
-            name_suffix=person.name_suffix,
-            preferred_name=person.preferred_name,
-            country_code=person.country_code,
+            **pf,
             applicant_name_text=data.get("applicantNameText"),
-            correspondence_address_bag=addresses,
+            correspondence_address_bag=addrs,
         )
+ + +
+[docs] + def to_dict(self) -> Dict[str, Any]: + """Converts the `Applicant` instance to a dictionary. + + Includes inherited person fields and applicant-specific fields, + using camelCase keys and omitting None values or empty lists. + + Returns: + Dict[str, Any]: Dictionary representation of the applicant. + """ + d = super().to_dict() + d.update( + { + "applicantNameText": self.applicant_name_text, + "correspondenceAddressBag": [ + a.to_dict() for a in self.correspondence_address_bag + ], + } + ) + return { + k: v + for k, v in d.items() + if v is not None and (not isinstance(v, list) or v) + }
[docs] -@dataclass +@dataclass(frozen=True) class Inventor(Person): - """Represents an inventor in the patent data.""" + """Represents an inventor for a patent application, inheriting from Person. + + Includes inventor-specific name text and a list of correspondence addresses. + + Attributes: + inventor_name_text: The full name of the inventor as a single string. + correspondence_address_bag: A list of `Address` objects for the inventor. + """ inventor_name_text: Optional[str] = None correspondence_address_bag: List[Address] = field(default_factory=list) @@ -283,35 +786,73 @@

Source code for pyUSPTO.models.patent_data

 [docs]
     @classmethod
     def from_dict(cls, data: Dict[str, Any]) -> "Inventor":
-        """Create an Inventor object from a dictionary."""
-        person = Person.from_dict(data=data)
-        addresses = []
-        if "correspondenceAddressBag" in data:
-            addresses = [
-                Address.from_dict(data=addr)
-                for addr in data.get("correspondenceAddressBag", [])
-            ]
-
+        """Creates an `Inventor` instance from a dictionary.
+
+        Inherits person fields and adds inventor-specific fields.
+
+        Args:
+            data (Dict[str, Any]): Dictionary with inventor data.
+
+        Returns:
+            Inventor: An instance of `Inventor`.
+        """
+        pf = Person._extract_person_fields(data)
+        addrs = [
+            Address.from_dict(a)
+            for a in data.get("correspondenceAddressBag", [])
+            if isinstance(a, dict)
+        ]
         return cls(
-            first_name=person.first_name,
-            middle_name=person.middle_name,
-            last_name=person.last_name,
-            name_prefix=person.name_prefix,
-            name_suffix=person.name_suffix,
-            preferred_name=person.preferred_name,
-            country_code=person.country_code,
+            **pf,
             inventor_name_text=data.get("inventorNameText"),
-            correspondence_address_bag=addresses,
+            correspondence_address_bag=addrs,
         )
+ + +
+[docs] + def to_dict(self) -> Dict[str, Any]: + """Converts the `Inventor` instance to a dictionary. + + Includes inherited person fields and inventor-specific fields, + using camelCase keys and omitting None values or empty lists. + + Returns: + Dict[str, Any]: Dictionary representation of the inventor. + """ + d = super().to_dict() + d.update( + { + "inventorNameText": self.inventor_name_text, + "correspondenceAddressBag": [ + a.to_dict() for a in self.correspondence_address_bag + ], + } + ) + return { + k: v + for k, v in d.items() + if v is not None and (not isinstance(v, list) or v) + }
[docs] -@dataclass +@dataclass(frozen=True) class Attorney(Person): - """Represents an attorney in the patent data.""" + """Represents an attorney or agent associated with a patent application, inheriting from Person. + + Includes registration number, active status, practitioner category, addresses, and telecommunication details. + + Attributes: + registration_number: The attorney's USPTO registration number. + active_indicator: Indicates if the attorney is currently active (e.g., "Y", "N"). + registered_practitioner_category: Category of the practitioner (e.g., "ATTORNEY", "AGENT"). + attorney_address_bag: List of `Address` objects for the attorney. + telecommunication_address_bag: List of `Telecommunication` objects for the attorney. + """ registration_number: Optional[str] = None active_indicator: Optional[str] = None @@ -323,45 +864,79 @@

Source code for pyUSPTO.models.patent_data

 [docs]
     @classmethod
     def from_dict(cls, data: Dict[str, Any]) -> "Attorney":
-        """Create an Attorney object from a dictionary."""
-        person = Person.from_dict(data=data)
-        addresses = []
-        if "attorneyAddressBag" in data:
-            addresses = [
-                Address.from_dict(data=addr)
-                for addr in data.get("attorneyAddressBag", [])
-            ]
-
-        telecom_addresses = []
-        if "telecommunicationAddressBag" in data:
-            telecom_addresses = [
-                Telecommunication.from_dict(data=telecom)
-                for telecom in data.get("telecommunicationAddressBag", [])
-            ]
-
+        """Creates an `Attorney` instance from a dictionary.
+
+        Inherits person fields and adds attorney-specific details.
+
+        Args:
+            data (Dict[str, Any]): Dictionary with attorney data.
+
+        Returns:
+            Attorney: An instance of `Attorney`.
+        """
+        pf = Person._extract_person_fields(data)
+        addrs = [
+            Address.from_dict(a)
+            for a in data.get("attorneyAddressBag", [])
+            if isinstance(a, dict)
+        ]
+        telecoms = [
+            Telecommunication.from_dict(t)
+            for t in data.get("telecommunicationAddressBag", [])
+            if isinstance(t, dict)
+        ]
         return cls(
-            first_name=person.first_name,
-            middle_name=person.middle_name,
-            last_name=person.last_name,
-            name_prefix=person.name_prefix,
-            name_suffix=person.name_suffix,
-            preferred_name=person.preferred_name,
-            country_code=person.country_code,
+            **pf,
             registration_number=data.get("registrationNumber"),
             active_indicator=data.get("activeIndicator"),
             registered_practitioner_category=data.get("registeredPractitionerCategory"),
-            attorney_address_bag=addresses,
-            telecommunication_address_bag=telecom_addresses,
+            attorney_address_bag=addrs,
+            telecommunication_address_bag=telecoms,
         )
+ + +
+[docs] + def to_dict(self) -> Dict[str, Any]: + """Converts the `Attorney` instance to a dictionary. + + Includes inherited person fields and attorney-specific fields, + using camelCase keys and omitting None values or empty lists. + + Returns: + Dict[str, Any]: Dictionary representation of the attorney. + """ + d = super().to_dict() + d.update( + { + "registrationNumber": self.registration_number, + "activeIndicator": self.active_indicator, + "registeredPractitionerCategory": self.registered_practitioner_category, + "attorneyAddressBag": [a.to_dict() for a in self.attorney_address_bag], + "telecommunicationAddressBag": [ + t.to_dict() for t in self.telecommunication_address_bag + ], + } + ) + return { + k: v + for k, v in d.items() + if v is not None and (not isinstance(v, list) or v) + }
[docs] -@dataclass +@dataclass(frozen=True) class EntityStatus: - """Represents entity status data.""" + """Represents the entity status of an applicant (e.g., small entity status). + + Attributes: + small_entity_status_indicator: Boolean indicating if the applicant qualifies for small entity status. + business_entity_status_category: String category of the business entity status (e.g., "Undiscounted"). + """ small_entity_status_indicator: Optional[bool] = None business_entity_status_category: Optional[str] = None @@ -370,20 +945,50 @@

Source code for pyUSPTO.models.patent_data

 [docs]
     @classmethod
     def from_dict(cls, data: Dict[str, Any]) -> "EntityStatus":
-        """Create an EntityStatus object from a dictionary."""
+        """Creates an `EntityStatus` instance from a dictionary.
+
+        Args:
+            data (Dict[str, Any]): Dictionary with entity status data.
+
+        Returns:
+            EntityStatus: An instance of `EntityStatus`.
+        """
         return cls(
             small_entity_status_indicator=data.get("smallEntityStatusIndicator"),
             business_entity_status_category=data.get("businessEntityStatusCategory"),
         )
+ + +
+[docs] + def to_dict(self) -> Dict[str, Any]: + """Converts the `EntityStatus` instance to a dictionary. + + Returns: + Dict[str, Any]: Dictionary representation with camelCase keys. + """ + return { + "smallEntityStatusIndicator": self.small_entity_status_indicator, + "businessEntityStatusCategory": self.business_entity_status_category, + }
[docs] -@dataclass +@dataclass(frozen=True) class CustomerNumberCorrespondence: - """Represents customer number correspondence data.""" + """Represents correspondence data associated with a USPTO customer number. + + Includes patron identifier, organization name, power of attorney addresses, and telecommunication details. + + Attributes: + patron_identifier: The USPTO customer number. + organization_standard_name: The name of the organization associated with the customer number. + power_of_attorney_address_bag: List of `Address` objects for power of attorney. + telecommunication_address_bag: List of `Telecommunication` objects. + """ patron_identifier: Optional[int] = None organization_standard_name: Optional[str] = None @@ -394,46 +999,76 @@

Source code for pyUSPTO.models.patent_data

 [docs]
     @classmethod
     def from_dict(cls, data: Dict[str, Any]) -> "CustomerNumberCorrespondence":
-        """Create a CustomerNumberCorrespondence object from a dictionary."""
-        addresses = []
-        if "powerOfAttorneyAddressBag" in data:
-            power_of_attorney_bag = data.get("powerOfAttorneyAddressBag", [])
-            # Ensure we only process dictionary objects
-            addresses = [
-                Address.from_dict(data=addr)
-                for addr in power_of_attorney_bag
-                if isinstance(addr, dict)
-            ]
-
-        telecom_addresses = []
-        if "telecommunicationAddressBag" in data:
-            telecom_bag = data.get("telecommunicationAddressBag", [])
-            # Ensure we only process dictionary objects
-            telecom_addresses = [
-                Telecommunication.from_dict(data=telecom)
-                for telecom in telecom_bag
-                if isinstance(telecom, dict)
-            ]
-
+        """Creates a `CustomerNumberCorrespondence` instance from a dictionary.
+
+        Args:
+            data (Dict[str, Any]): Dictionary with customer number correspondence data.
+
+        Returns:
+            CustomerNumberCorrespondence: An instance of `CustomerNumberCorrespondence`.
+        """
+        addrs = [
+            Address.from_dict(a)
+            for a in data.get("powerOfAttorneyAddressBag", [])
+            if isinstance(a, dict)
+        ]
+        telecoms = [
+            Telecommunication.from_dict(t)
+            for t in data.get("telecommunicationAddressBag", [])
+            if isinstance(t, dict)
+        ]
         return cls(
             patron_identifier=data.get("patronIdentifier"),
             organization_standard_name=data.get("organizationStandardName"),
-            power_of_attorney_address_bag=addresses,
-            telecommunication_address_bag=telecom_addresses,
+            power_of_attorney_address_bag=addrs,
+            telecommunication_address_bag=telecoms,
         )
+ + +
+[docs] + def to_dict(self) -> Dict[str, Any]: + """Converts the `CustomerNumberCorrespondence` instance to a dictionary. + + Omits keys with None values or empty lists. + + Returns: + Dict[str, Any]: Dictionary representation. + """ + d = { + "patronIdentifier": self.patron_identifier, + "organizationStandardName": self.organization_standard_name, + "powerOfAttorneyAddressBag": [ + a.to_dict() for a in self.power_of_attorney_address_bag + ], + "telecommunicationAddressBag": [ + t.to_dict() for t in self.telecommunication_address_bag + ], + } + return { + k: v + for k, v in d.items() + if v is not None and (not isinstance(v, list) or v) + }
[docs] -@dataclass +@dataclass(frozen=True) class RecordAttorney: - """Represents record attorney data.""" + """Represents information about the attorney(s) of record for a patent application. - customer_number_correspondence_data: List[CustomerNumberCorrespondence] = field( - default_factory=list - ) + Contains customer number correspondence data, power of attorney information, and listed attorneys. + + Attributes: + customer_number_correspondence_data: `CustomerNumberCorrespondence` object with customer number details. + power_of_attorney_bag: List of `Attorney` objects named in a power of attorney. + attorney_bag: List of `Attorney` objects listed as attorneys of record. + """ + + customer_number_correspondence_data: Optional[CustomerNumberCorrespondence] = None power_of_attorney_bag: List[Attorney] = field(default_factory=list) attorney_bag: List[Attorney] = field(default_factory=list) @@ -441,67 +1076,119 @@

Source code for pyUSPTO.models.patent_data

 [docs]
     @classmethod
     def from_dict(cls, data: Dict[str, Any]) -> "RecordAttorney":
-        """Create a RecordAttorney object from a dictionary."""
-        customer_correspondence = []
-        if "customerNumberCorrespondenceData" in data:
-            correspondence_data = data.get("customerNumberCorrespondenceData", [])
-            # Ensure we only process dictionary objects
-            customer_correspondence = [
-                CustomerNumberCorrespondence.from_dict(corr)
-                for corr in correspondence_data
-                if isinstance(corr, dict)
-            ]
-
-        power_attorneys = []
-        if "powerOfAttorneyBag" in data:
-            power_attorneys = [
-                Attorney.from_dict(data=attorney)
-                for attorney in data.get("powerOfAttorneyBag", [])
-            ]
-
-        attorneys = []
-        if "attorneyBag" in data:
-            attorneys = [
-                Attorney.from_dict(data=attorney)
-                for attorney in data.get("attorneyBag", [])
-            ]
-
+        """Creates a `RecordAttorney` instance from a dictionary.
+
+        Args:
+            data (Dict[str, Any]): Dictionary with record attorney data.
+
+        Returns:
+            RecordAttorney: An instance of `RecordAttorney`.
+        """
+        cust_corr_data = data.get("customerNumberCorrespondenceData")
+        cust_corr = (
+            CustomerNumberCorrespondence.from_dict(cust_corr_data)
+            if isinstance(cust_corr_data, dict)
+            else None
+        )
+        poa_bag = [
+            Attorney.from_dict(a)
+            for a in data.get("powerOfAttorneyBag", [])
+            if isinstance(a, dict)
+        ]
+        att_bag = [
+            Attorney.from_dict(a)
+            for a in data.get("attorneyBag", [])
+            if isinstance(a, dict)
+        ]
         return cls(
-            customer_number_correspondence_data=customer_correspondence,
-            power_of_attorney_bag=power_attorneys,
-            attorney_bag=attorneys,
+            customer_number_correspondence_data=cust_corr,
+            power_of_attorney_bag=poa_bag,
+            attorney_bag=att_bag,
         )
+ + +
+[docs] + def to_dict(self) -> Dict[str, Any]: + """Converts the `RecordAttorney` instance to a dictionary. + + Omits keys with None values. Includes empty lists to match API behavior. + + Returns: + Dict[str, Any]: Dictionary representation. + """ + d = { + "customerNumberCorrespondenceData": ( + self.customer_number_correspondence_data.to_dict() + if self.customer_number_correspondence_data + else None + ), + "powerOfAttorneyBag": [p.to_dict() for p in self.power_of_attorney_bag], + "attorneyBag": [a.to_dict() for a in self.attorney_bag], + } + return {k: v for k, v in d.items() if v is not None}
[docs] -@dataclass +@dataclass(frozen=True) class Assignor: - """Represents an assignor in an assignment.""" + """Represents an assignor in a patent assignment. + + Attributes: + assignor_name: The name of the assigning party. + execution_date: The date the assignment was executed. + """ assignor_name: Optional[str] = None - execution_date: Optional[str] = None + execution_date: Optional[date] = None
[docs] @classmethod def from_dict(cls, data: Dict[str, Any]) -> "Assignor": - """Create an Assignor object from a dictionary.""" + """Creates an `Assignor` instance from a dictionary. + + Args: + data (Dict[str, Any]): Dictionary with assignor data. + + Returns: + Assignor: An instance of `Assignor`. + """ return cls( assignor_name=data.get("assignorName"), - execution_date=data.get("executionDate"), + execution_date=parse_to_date(data.get("executionDate")), )
+ + +
+[docs] + def to_dict(self) -> Dict[str, Any]: + """Converts the `Assignor` instance to a dictionary. + + Returns: + Dict[str, Any]: Dictionary representation with camelCase keys. + """ + return { + "assignorName": self.assignor_name, + "executionDate": serialize_date(self.execution_date), + }
[docs] -@dataclass +@dataclass(frozen=True) class Assignee: - """Represents an assignee in an assignment.""" + """Represents an assignee in a patent assignment. + + Attributes: + assignee_name_text: The name of the party receiving the assignment. + assignee_address: The `Address` of the assignee. + """ assignee_name_text: Optional[str] = None assignee_address: Optional[Address] = None @@ -510,130 +1197,314 @@

Source code for pyUSPTO.models.patent_data

 [docs]
     @classmethod
     def from_dict(cls, data: Dict[str, Any]) -> "Assignee":
-        """Create an Assignee object from a dictionary."""
-        address = None
-        if "assigneeAddress" in data and data.get("assigneeAddress") is not None:
-            address = Address.from_dict(data=data.get("assigneeAddress", {}))
+        """Creates an `Assignee` instance from a dictionary.
 
+        Args:
+            data (Dict[str, Any]): Dictionary with assignee data.
+
+        Returns:
+            Assignee: An instance of `Assignee`.
+        """
+        addr_data = data.get("assigneeAddress")
+        addr = Address.from_dict(addr_data) if isinstance(addr_data, dict) else None
         return cls(
-            assignee_name_text=data.get("assigneeNameText"), assignee_address=address
+            assignee_name_text=data.get("assigneeNameText"), assignee_address=addr
         )
+ + +
+[docs] + def to_dict(self) -> Dict[str, Any]: + """Converts the `Assignee` instance to a dictionary. + + Omits keys with None values. + + Returns: + Dict[str, Any]: Dictionary representation. + """ + d = { + "assigneeNameText": self.assignee_name_text, + "assigneeAddress": ( + self.assignee_address.to_dict() if self.assignee_address else None + ), + } + return {k: v for k, v in d.items() if v is not None}
[docs] -@dataclass +@dataclass(frozen=True) class Assignment: - """Represents an assignment in the patent data.""" + """Represents a patent assignment, detailing the transfer of rights. + + Includes information about the reel and frame, document location, dates, conveyance text, + and bags of assignors, assignees, correspondence address, and domestic representative. + + Attributes: + reel_number: Reel number for the assignment record. + frame_number: Frame number for the assignment record. + reel_and_frame_number: Combined reel and frame number. + page_total_quantity: Total number of pages in the assignment document. + assignment_document_location_uri: URI for the assignment document. + assignment_received_date: Date the assignment was received by USPTO. + assignment_recorded_date: Date the assignment was recorded by USPTO. + assignment_mailed_date: Date the assignment notification was mailed. + conveyance_text: Text describing the nature of the conveyance. + image_available_status_code: Code to indicate the availability of the image. + attorney_docket_number: Attorney docket number for the assignment. + assignor_bag: List of `Assignor` objects. + assignee_bag: List of `Assignee` objects. + correspondence_address: `Address` object for correspondence (single object). + domestic_representative: `Address` object for the domestic representative. + """ reel_number: Optional[int] = None frame_number: Optional[int] = None reel_and_frame_number: Optional[str] = None + page_total_quantity: Optional[int] = None assignment_document_location_uri: Optional[str] = None - assignment_received_date: Optional[str] = None - assignment_recorded_date: Optional[str] = None - assignment_mailed_date: Optional[str] = None + assignment_received_date: Optional[date] = None + assignment_recorded_date: Optional[date] = None + assignment_mailed_date: Optional[date] = None conveyance_text: Optional[str] = None + image_available_status_code: Optional[bool] = None + attorney_docket_number: Optional[str] = None assignor_bag: List[Assignor] = field(default_factory=list) assignee_bag: List[Assignee] = field(default_factory=list) - correspondence_address_bag: List[Address] = field(default_factory=list) + correspondence_address: Optional[Address] = None + domestic_representative: Optional[Address] = None
[docs] @classmethod def from_dict(cls, data: Dict[str, Any]) -> "Assignment": - """Create an Assignment object from a dictionary.""" - assignors = [] - if "assignorBag" in data: - assignors = [ - Assignor.from_dict(data=assignor) - for assignor in data.get("assignorBag", []) - ] - - assignees = [] - if "assigneeBag" in data: - assignees = [ - Assignee.from_dict(data=assignee) - for assignee in data.get("assigneeBag", []) - ] - - addresses = [] - if "correspondenceAddressBag" in data: - addresses = [ - Address.from_dict(data=addr) - for addr in data.get("correspondenceAddressBag", []) - ] + """Creates an `Assignment` instance from a dictionary. + + Args: + data (Dict[str, Any]): Dictionary with assignment data. + + Returns: + Assignment: An instance of `Assignment`. + """ + assignors = [ + Assignor.from_dict(a) + for a in data.get("assignorBag", []) + if isinstance(a, dict) + ] + assignees = [ + Assignee.from_dict(a) + for a in data.get("assigneeBag", []) + if isinstance(a, dict) + ] + + # Parse correspondence address (single object, not bag) + corr_addr_data = data.get("correspondenceAddress") + corr_addr = ( + Address.from_dict(corr_addr_data) + if isinstance(corr_addr_data, dict) + else None + ) + + # Parse domestic representative + dom_rep_data = data.get("domesticRepresentative") + dom_rep = ( + Address.from_dict(dom_rep_data) if isinstance(dom_rep_data, dict) else None + ) return cls( reel_number=data.get("reelNumber"), frame_number=data.get("frameNumber"), reel_and_frame_number=data.get("reelAndFrameNumber"), + page_total_quantity=data.get("pageTotalQuantity"), assignment_document_location_uri=data.get("assignmentDocumentLocationURI"), - assignment_received_date=data.get("assignmentReceivedDate"), - assignment_recorded_date=data.get("assignmentRecordedDate"), - assignment_mailed_date=data.get("assignmentMailedDate"), + assignment_received_date=parse_to_date(data.get("assignmentReceivedDate")), + assignment_recorded_date=parse_to_date(data.get("assignmentRecordedDate")), + assignment_mailed_date=parse_to_date(data.get("assignmentMailedDate")), conveyance_text=data.get("conveyanceText"), + image_available_status_code=data.get("imageAvailableStatusCode"), + attorney_docket_number=data.get("attorneyDocketNumber"), assignor_bag=assignors, assignee_bag=assignees, - correspondence_address_bag=addresses, + correspondence_address=corr_addr, + domestic_representative=dom_rep, )
+ + +
+[docs] + def to_dict(self) -> Dict[str, Any]: + """Converts the `Assignment` instance to a dictionary. + + Returns: + Dict[str, Any]: Dictionary representation with camelCase keys. + """ + _dict = { + "reelNumber": self.reel_number, + "frameNumber": self.frame_number, + "reelAndFrameNumber": self.reel_and_frame_number, + "pageTotalQuantity": self.page_total_quantity, + "assignmentDocumentLocationURI": self.assignment_document_location_uri, + "assignmentReceivedDate": serialize_date(self.assignment_received_date), + "assignmentRecordedDate": serialize_date(self.assignment_recorded_date), + "assignmentMailedDate": serialize_date(self.assignment_mailed_date), + "conveyanceText": self.conveyance_text, + "imageAvailableStatusCode": self.image_available_status_code, + "attorneyDocketNumber": self.attorney_docket_number, + "assignorBag": [a.to_dict() for a in self.assignor_bag], + "assigneeBag": [a.to_dict() for a in self.assignee_bag], + "correspondenceAddress": ( + self.correspondence_address.to_dict() + if self.correspondence_address + else None + ), + "domesticRepresentative": ( + self.domestic_representative.to_dict() + if self.domestic_representative + else None + ), + } + # Filter out None values to match API behavior + return {k: v for k, v in _dict.items() if v is not None}
[docs] -@dataclass +@dataclass(frozen=True) class ForeignPriority: - """Represents foreign priority information.""" + """Represents a foreign priority claim for a patent application. + + Attributes: + ip_office_name: The name of the intellectual property office of the priority application. + filing_date: The filing date of the priority application. + application_number_text: The application number of the priority application. + """ ip_office_name: Optional[str] = None - filing_date: Optional[str] = None + filing_date: Optional[date] = None application_number_text: Optional[str] = None
[docs] @classmethod def from_dict(cls, data: Dict[str, Any]) -> "ForeignPriority": - """Create a ForeignPriority object from a dictionary.""" + """Creates a `ForeignPriority` instance from a dictionary. + + Args: + data (Dict[str, Any]): Dictionary with foreign priority data. + + Returns: + ForeignPriority: An instance of `ForeignPriority`. + """ return cls( ip_office_name=data.get("ipOfficeName"), - filing_date=data.get("filingDate"), + filing_date=parse_to_date(data.get("filingDate")), application_number_text=data.get("applicationNumberText"), )
+ + +
+[docs] + def to_dict(self) -> Dict[str, Any]: + """Converts the `ForeignPriority` instance to a dictionary. + + Returns: + Dict[str, Any]: Dictionary representation with camelCase keys. + """ + return { + "ipOfficeName": self.ip_office_name, + "filingDate": serialize_date(self.filing_date), + "applicationNumberText": self.application_number_text, + }
[docs] -@dataclass +@dataclass(frozen=True) class Continuity: - """Base class for continuity information.""" + """Base class representing continuity data for a patent application. + + This includes details about the application's relationship to other applications (parent/child), + its filing status under AIA (America Invents Act), and key identifiers. + + Attributes: + first_inventor_to_file_indicator: Boolean indicating if the application is under First-Inventor-to-File provisions. + application_number_text: The application number of the related (parent or child) application. + filing_date: The filing date of the related application. + status_code: The status code of the related application. + status_description_text: The status description of the related application. + patent_number: The patent number if the related application is granted. + claim_parentage_type_code: Code indicating the type of continuity claim (e.g., "CON", "DIV"). + claim_parentage_type_code_description_text: Description of the continuity claim type. + """ first_inventor_to_file_indicator: Optional[bool] = None application_number_text: Optional[str] = None - filing_date: Optional[str] = None + filing_date: Optional[date] = None status_code: Optional[int] = None status_description_text: Optional[str] = None patent_number: Optional[str] = None claim_parentage_type_code: Optional[str] = None - claim_parentage_type_code_description_text: Optional[str] = None
+ claim_parentage_type_code_description_text: Optional[str] = None + + @property + def is_aia(self) -> Optional[bool]: + """Returns True if the application is AIA, False if pre-AIA, None if unknown.""" + return self.first_inventor_to_file_indicator + + @property + def is_pre_aia(self) -> Optional[bool]: + """Returns True if the application is pre-AIA, False if AIA, None if unknown.""" + if self.first_inventor_to_file_indicator is None: + return None + return not self.first_inventor_to_file_indicator + +
+[docs] + def to_dict(self) -> Dict[str, Any]: + """Converts the `Continuity` instance to a dictionary. + + Omits attributes that are None and property-derived fields. + Keys are converted to camelCase. + + Returns: + Dict[str, Any]: A dictionary representation of the continuity data. + """ + return { + to_camel_case(k): v + for k, v in asdict(self).items() + if v is not None and not k.startswith("is_") + }
+
[docs] -@dataclass +@dataclass(frozen=True) class ParentContinuity(Continuity): - """Represents parent continuity information.""" + """Represents a parent application in a patent application's continuity chain. + + Inherits from Continuity and adds specific fields for parent application details. + + Attributes: + parent_application_status_code: Status code of the parent application. + parent_patent_number: Patent number of the parent application, if granted. + parent_application_status_description_text: Status description of the parent application. + parent_application_filing_date: Filing date of the parent application. + parent_application_number_text: Application number of the parent application. + child_application_number_text: Application number of the child (current) application. + """ parent_application_status_code: Optional[int] = None parent_patent_number: Optional[str] = None parent_application_status_description_text: Optional[str] = None - parent_application_filing_date: Optional[str] = None + parent_application_filing_date: Optional[date] = None parent_application_number_text: Optional[str] = None child_application_number_text: Optional[str] = None @@ -641,7 +1512,15 @@

Source code for pyUSPTO.models.patent_data

 [docs]
     @classmethod
     def from_dict(cls, data: Dict[str, Any]) -> "ParentContinuity":
-        """Create a ParentContinuity object from a dictionary."""
+        """Creates a `ParentContinuity` instance from a dictionary.
+
+        Args:
+            data (Dict[str, Any]): Dictionary with parent continuity data.
+
+        Returns:
+            ParentContinuity: An instance of `ParentContinuity`.
+        """
+        p_filing_date = parse_to_date(data.get("parentApplicationFilingDate"))
         return cls(
             first_inventor_to_file_indicator=data.get("firstInventorToFileIndicator"),
             parent_application_status_code=data.get("parentApplicationStatusCode"),
@@ -649,42 +1528,87 @@ 

Source code for pyUSPTO.models.patent_data

             parent_application_status_description_text=data.get(
                 "parentApplicationStatusDescriptionText"
             ),
-            parent_application_filing_date=data.get("parentApplicationFilingDate"),
+            parent_application_filing_date=p_filing_date,
             parent_application_number_text=data.get("parentApplicationNumberText"),
             child_application_number_text=data.get("childApplicationNumberText"),
             claim_parentage_type_code=data.get("claimParentageTypeCode"),
             claim_parentage_type_code_description_text=data.get(
                 "claimParentageTypeCodeDescriptionText"
             ),
-            # Map parent-specific fields to base class fields
+            application_number_text=data.get("parentApplicationNumberText"),
+            filing_date=p_filing_date,
             status_code=data.get("parentApplicationStatusCode"),
             status_description_text=data.get("parentApplicationStatusDescriptionText"),
-            filing_date=data.get("parentApplicationFilingDate"),
-            application_number_text=data.get("parentApplicationNumberText"),
             patent_number=data.get("parentPatentNumber"),
         )
+ + +
+[docs] + def to_dict(self) -> Dict[str, Any]: + """Converts the `ParentContinuity` instance to a dictionary. + + Maps attributes to specific camelCase keys expected by the API for parent continuity. + Filters out None values to match the API response structure. + + Returns: + Dict[str, Any]: Dictionary representation. + """ + _dict = { + "firstInventorToFileIndicator": self.first_inventor_to_file_indicator, + "parentApplicationStatusCode": self.parent_application_status_code, + "parentPatentNumber": self.parent_patent_number, + "parentApplicationStatusDescriptionText": self.parent_application_status_description_text, + "parentApplicationFilingDate": serialize_date( + self.parent_application_filing_date + ), + "parentApplicationNumberText": self.parent_application_number_text, + "childApplicationNumberText": self.child_application_number_text, + "claimParentageTypeCode": self.claim_parentage_type_code, + "claimParentageTypeCodeDescriptionText": self.claim_parentage_type_code_description_text, + } + return {k: v for k, v in _dict.items() if v is not None}
[docs] -@dataclass +@dataclass(frozen=True) class ChildContinuity(Continuity): - """Represents child continuity information.""" + """Represents a child application in a patent application's continuity chain. + + Inherits from Continuity and adds specific fields for child application details. + + Attributes: + child_application_status_code: Status code of the child application. + parent_application_number_text: Application number of the parent (current) application. + child_application_number_text: Application number of the child application. + child_application_status_description_text: Status description of the child application. + child_application_filing_date: Filing date of the child application. + child_patent_number: Patent number of the child application, if granted. + """ child_application_status_code: Optional[int] = None parent_application_number_text: Optional[str] = None child_application_number_text: Optional[str] = None child_application_status_description_text: Optional[str] = None - child_application_filing_date: Optional[str] = None + child_application_filing_date: Optional[date] = None child_patent_number: Optional[str] = None
[docs] @classmethod def from_dict(cls, data: Dict[str, Any]) -> "ChildContinuity": - """Create a ChildContinuity object from a dictionary.""" + """Creates a `ChildContinuity` instance from a dictionary. + + Args: + data (Dict[str, Any]): Dictionary with child continuity data. + + Returns: + ChildContinuity: An instance of `ChildContinuity`. + """ + c_filing_date = parse_to_date(data.get("childApplicationFilingDate")) return cls( first_inventor_to_file_indicator=data.get("firstInventorToFileIndicator"), child_application_status_code=data.get("childApplicationStatusCode"), @@ -693,73 +1617,163 @@

Source code for pyUSPTO.models.patent_data

             child_application_status_description_text=data.get(
                 "childApplicationStatusDescriptionText"
             ),
-            child_application_filing_date=data.get("childApplicationFilingDate"),
+            child_application_filing_date=c_filing_date,
             child_patent_number=data.get("childPatentNumber"),
             claim_parentage_type_code=data.get("claimParentageTypeCode"),
             claim_parentage_type_code_description_text=data.get(
                 "claimParentageTypeCodeDescriptionText"
             ),
-            # Map child-specific fields to base class fields
+            application_number_text=data.get("childApplicationNumberText"),
+            filing_date=c_filing_date,
             status_code=data.get("childApplicationStatusCode"),
             status_description_text=data.get("childApplicationStatusDescriptionText"),
-            filing_date=data.get("childApplicationFilingDate"),
-            application_number_text=data.get("childApplicationNumberText"),
             patent_number=data.get("childPatentNumber"),
         )
+ + +
+[docs] + def to_dict(self) -> Dict[str, Any]: + """Converts the `ChildContinuity` instance to a dictionary. + + Maps attributes to specific camelCase keys expected by the API for child continuity. + Filters out None values to match the API response structure. + + Returns: + Dict[str, Any]: Dictionary representation. + """ + _dict = { + "childApplicationStatusCode": self.child_application_status_code, + "parentApplicationNumberText": self.parent_application_number_text, + "childApplicationNumberText": self.child_application_number_text, + "childApplicationStatusDescriptionText": self.child_application_status_description_text, + "childApplicationFilingDate": serialize_date( + self.child_application_filing_date + ), + "firstInventorToFileIndicator": self.first_inventor_to_file_indicator, + "childPatentNumber": self.child_patent_number, + "claimParentageTypeCode": self.claim_parentage_type_code, + "claimParentageTypeCodeDescriptionText": self.claim_parentage_type_code_description_text, + } + return {k: v for k, v in _dict.items() if v is not None}
[docs] -@dataclass +@dataclass(frozen=True) class PatentTermAdjustmentHistoryData: - """Represents patent term adjustment history data.""" + """Represents a single entry in the patent term adjustment (PTA) history for an application. + + Details specific events, dates, and day quantities affecting the patent term. + + Attributes: + event_date: Date of the PTA event. + applicant_day_delay_quantity: Number of days of delay attributable to the applicant for this event. + event_description_text: Textual description of the PTA event. + event_sequence_number: Sequence number of this event in the PTA history. + originating_event_sequence_number: Sequence number of an event that originated this event. + pta_pte_code: Code indicating if the event relates to PTA or Patent Term Extension (PTE). + ip_office_day_delay_quantity: Number of days of IP office delay used in adjustment calculation for this event. + """ - event_date: Optional[str] = None + event_date: Optional[date] = None applicant_day_delay_quantity: Optional[float] = None event_description_text: Optional[str] = None event_sequence_number: Optional[float] = None - ip_office_day_delay_quantity: Optional[float] = None originating_event_sequence_number: Optional[float] = None pta_pte_code: Optional[str] = None + ip_office_day_delay_quantity: Optional[float] = None
[docs] @classmethod def from_dict(cls, data: Dict[str, Any]) -> "PatentTermAdjustmentHistoryData": - """Create a PatentTermAdjustmentHistoryData object from a dictionary.""" + """Creates a `PatentTermAdjustmentHistoryData` instance from a dictionary. + + Args: + data (Dict[str, Any]): Dictionary with PTA history event data. + + Returns: + PatentTermAdjustmentHistoryData: An instance of `PatentTermAdjustmentHistoryData`. + """ return cls( - event_date=data.get("eventDate"), + event_date=parse_to_date(data.get("eventDate")), applicant_day_delay_quantity=data.get("applicantDayDelayQuantity"), event_description_text=data.get("eventDescriptionText"), event_sequence_number=data.get("eventSequenceNumber"), - ip_office_day_delay_quantity=data.get("ipOfficeDayDelayQuantity"), originating_event_sequence_number=data.get( "originatingEventSequenceNumber" ), pta_pte_code=data.get("ptaPTECode"), + ip_office_day_delay_quantity=data.get("ipOfficeDayDelayQuantity"), )
+ + +
+[docs] + def to_dict(self) -> Dict[str, Any]: + """Converts the `PatentTermAdjustmentHistoryData` instance to a dictionary. + + Omits keys with None values. + + Returns: + Dict[str, Any]: Dictionary representation with camelCase keys. + """ + final_dict: Dict[str, Any] = {} + if self.event_date is not None: + final_dict["eventDate"] = serialize_date(self.event_date) + if self.applicant_day_delay_quantity is not None: + final_dict["applicantDayDelayQuantity"] = self.applicant_day_delay_quantity + if self.event_description_text is not None: + final_dict["eventDescriptionText"] = self.event_description_text + if self.event_sequence_number is not None: + final_dict["eventSequenceNumber"] = self.event_sequence_number + if self.originating_event_sequence_number is not None: + final_dict["originatingEventSequenceNumber"] = ( + self.originating_event_sequence_number + ) + if self.pta_pte_code is not None: + final_dict["ptaPTECode"] = self.pta_pte_code + if self.ip_office_day_delay_quantity is not None: + final_dict["ipOfficeDayDelayQuantity"] = self.ip_office_day_delay_quantity + return final_dict
[docs] -@dataclass +@dataclass(frozen=True) class PatentTermAdjustmentData: - """Represents patent term adjustment data.""" + """Represents the overall patent term adjustment (PTA) data for an application. + + Includes various delay quantities (A, B, C, applicant, IP office), total adjustment, + and a history of PTA events. + + Attributes: + a_delay_quantity: Number of days of 'A' delay. + adjustment_total_quantity: Total calculated PTA in days. + applicant_day_delay_quantity: Total days of delay attributable to the applicant. + b_delay_quantity: Number of days of 'B' delay. + c_delay_quantity: Number of days of 'C' delay. + non_overlapping_day_quantity: Number of non-overlapping delay days. + overlapping_day_quantity: Number of overlapping delay days. + non_overlapping_day_delay_quantity: Number of non-overlapping delay days specifically for delay calculation. + ip_office_adjustment_delay_quantity: Days of IP office delay used in adjustment calculation. + patent_term_adjustment_history_data_bag: List of `PatentTermAdjustmentHistoryData` events. + """ a_delay_quantity: Optional[float] = None adjustment_total_quantity: Optional[float] = None applicant_day_delay_quantity: Optional[float] = None b_delay_quantity: Optional[float] = None c_delay_quantity: Optional[float] = None - filing_date: Optional[str] = None - grant_date: Optional[str] = None non_overlapping_day_quantity: Optional[float] = None overlapping_day_quantity: Optional[float] = None - ip_office_day_delay_quantity: Optional[float] = None + non_overlapping_day_delay_quantity: Optional[float] = None + ip_office_adjustment_delay_quantity: Optional[float] = None patent_term_adjustment_history_data_bag: List[PatentTermAdjustmentHistoryData] = ( field(default_factory=list) ) @@ -768,104 +1782,246 @@

Source code for pyUSPTO.models.patent_data

 [docs]
     @classmethod
     def from_dict(cls, data: Dict[str, Any]) -> "PatentTermAdjustmentData":
-        """Create a PatentTermAdjustmentData object from a dictionary."""
-        history_data = []
-        if "patentTermAdjustmentHistoryDataBag" in data:
-            history_data = [
-                PatentTermAdjustmentHistoryData.from_dict(history)
-                for history in data.get("patentTermAdjustmentHistoryDataBag", [])
-            ]
-
+        """Creates a `PatentTermAdjustmentData` instance from a dictionary.
+
+        Args:
+            data (Dict[str, Any]): Dictionary with PTA data.
+
+        Returns:
+            PatentTermAdjustmentData: An instance of `PatentTermAdjustmentData`.
+        """
+        history = [
+            PatentTermAdjustmentHistoryData.from_dict(h)
+            for h in data.get("patentTermAdjustmentHistoryDataBag", [])
+            if isinstance(h, dict)
+        ]
         return cls(
             a_delay_quantity=data.get("aDelayQuantity"),
             adjustment_total_quantity=data.get("adjustmentTotalQuantity"),
             applicant_day_delay_quantity=data.get("applicantDayDelayQuantity"),
             b_delay_quantity=data.get("bDelayQuantity"),
             c_delay_quantity=data.get("cDelayQuantity"),
-            filing_date=data.get("filingDate"),
-            grant_date=data.get("grantDate"),
             non_overlapping_day_quantity=data.get("nonOverlappingDayQuantity"),
             overlapping_day_quantity=data.get("overlappingDayQuantity"),
-            ip_office_day_delay_quantity=data.get("ipOfficeDayDelayQuantity"),
-            patent_term_adjustment_history_data_bag=history_data,
+            non_overlapping_day_delay_quantity=data.get(
+                "nonOverlappingDayDelayQuantity"
+            ),
+            ip_office_adjustment_delay_quantity=data.get(
+                "ipOfficeAdjustmentDelayQuantity"
+            ),
+            patent_term_adjustment_history_data_bag=history,
         )
+ + +
+[docs] + def to_dict(self) -> Dict[str, Any]: + """Converts the `PatentTermAdjustmentData` instance to a dictionary. + + Omits keys with None values or empty lists, and converts field names to camelCase. + + Returns: + Dict[str, Any]: Dictionary representation. + """ + d = asdict(self) + d["patentTermAdjustmentHistoryDataBag"] = [ + h.to_dict() for h in self.patent_term_adjustment_history_data_bag + ] + return { + to_camel_case(k): v + for k, v in d.items() + if v is not None and (not isinstance(v, list) or v) + }
-
-[docs] -@dataclass -class Event: - """Represents an event in the patent data.""" +
+[docs] +@dataclass(frozen=True) +class EventData: + """Represents a single event in the transaction history of a patent application. + + Attributes: + event_code: A code identifying the type of event. + event_description_text: A textual description of the event. + event_date: The date the event was recorded. + """ event_code: Optional[str] = None event_description_text: Optional[str] = None - event_date: Optional[str] = None + event_date: Optional[date] = None -
-[docs] +
+[docs] @classmethod - def from_dict(cls, data: Dict[str, Any]) -> "Event": - """Create an Event object from a dictionary.""" + def from_dict(cls, data: Dict[str, Any]) -> "EventData": + """Creates an `EventData` instance from a dictionary. + + Args: + data (Dict[str, Any]): Dictionary with event data. + + Returns: + EventData: An instance of `EventData`. + """ return cls( event_code=data.get("eventCode"), event_description_text=data.get("eventDescriptionText"), - event_date=data.get("eventDate"), + event_date=parse_to_date(data.get("eventDate")), )
+ + +
+[docs] + def to_dict(self) -> Dict[str, Any]: + """Converts the `EventData` instance to a dictionary. + + Omits keys with None values and converts field names to camelCase. + + Returns: + Dict[str, Any]: Dictionary representation. + """ + d = asdict(self) + d["eventDate"] = serialize_date(self.event_date) + return {to_camel_case(k): v for k, v in d.items() if v is not None}
-
-[docs] -@dataclass -class DocumentMetaData: - """Represents document metadata.""" +
+[docs] +@dataclass(frozen=True) +class PrintedMetaData: + """Represents metadata for a specific archive file, such as a PGPUB or Grant XML file. + + Attributes: + zip_file_name: The name of the ZIP archive. + product_identifier: An identifier for the data product (e.g., "APPXML", "PTGRXML"). + file_location_uri: The URI where the document file can be accessed. + file_create_date_time: The creation timestamp of the document file (UTC). + xml_file_name: The name of the XML file within the ZIP archive. + """ zip_file_name: Optional[str] = None product_identifier: Optional[str] = None file_location_uri: Optional[str] = None - file_create_date_time: Optional[str] = None + file_create_date_time: Optional[datetime] = None xml_file_name: Optional[str] = None -
-[docs] +
+[docs] @classmethod - def from_dict(cls, data: Dict[str, Any]) -> "DocumentMetaData": - """Create a DocumentMetaData object from a dictionary.""" + def from_dict(cls, data: Dict[str, Any]) -> "PrintedMetaData": + """Creates a `PrintedMetaData` instance from a dictionary. + + Args: + data (Dict[str, Any]): Dictionary with printed metadata. + + Returns: + PrintedMetaData: An instance of `PrintedMetaData`. + """ return cls( zip_file_name=data.get("zipFileName"), product_identifier=data.get("productIdentifier"), file_location_uri=data.get("fileLocationURI"), - file_create_date_time=data.get("fileCreateDateTime"), + file_create_date_time=parse_to_datetime_utc(data.get("fileCreateDateTime")), xml_file_name=data.get("xmlFileName"), )
+ + +
+[docs] + def to_dict(self) -> Dict[str, Any]: + """Converts the `PrintedMetaData` instance to a dictionary. + + Omits keys with None values. Serializes datetime to ISO format with 'Z'. + + Returns: + Dict[str, Any]: Dictionary representation with camelCase keys. + """ + final_dict: Dict[str, Any] = {} + if self.zip_file_name is not None: + final_dict["zipFileName"] = self.zip_file_name + if self.product_identifier is not None: + final_dict["productIdentifier"] = self.product_identifier + if self.file_location_uri is not None: + final_dict["fileLocationURI"] = self.file_location_uri + if self.file_create_date_time is not None: + final_dict["fileCreateDateTime"] = serialize_datetime_as_naive( + self.file_create_date_time + ) + if self.xml_file_name is not None: + final_dict["xmlFileName"] = self.xml_file_name + return final_dict
[docs] -@dataclass +@dataclass(frozen=True) class ApplicationMetaData: - """Represents application metadata.""" + """Represents the metadata associated with a patent application. + + This class holds a wide range of information including application status, + dates (filing, grant, publication), applicant and inventor details, + classification data, and other identifying information. + + Attributes: + national_stage_indicator: Indicates if the application is a national stage entry. + entity_status_data: `EntityStatus` object detailing applicant's entity status. + publication_date_bag: List of publication dates. + publication_sequence_number_bag: List of publication sequence numbers. + publication_category_bag: List of publication categories. + docket_number: Applicant's or attorney's docket number. + first_inventor_to_file_indicator: Boolean indicating if under First-Inventor-to-File. + first_applicant_name: Name of the first listed applicant. + first_inventor_name: Name of the first listed inventor. + application_confirmation_number: USPTO confirmation number for the application. + application_status_date: Date the current application status was set. + application_status_description_text: Textual description of the current application status. + filing_date: Official filing date of the application. + effective_filing_date: Effective filing date, considering priority claims. + grant_date: Date the patent was granted, if applicable. + group_art_unit_number: USPTO Group Art Unit number. + application_type_code: Code for the application type. + application_type_label_name: Label for the application type (e.g., "Utility"). + application_type_category: Category of the application type. + invention_title: Title of the invention. + patent_number: USPTO patent number, if granted. + application_status_code: Numeric code for the application status. + earliest_publication_number: Number of the earliest pre-grant publication. + earliest_publication_date: Date of the earliest pre-grant publication. + pct_publication_number: PCT publication number, if applicable. + pct_publication_date: PCT publication date, if applicable. + international_registration_publication_date: Date of international registration publication. + international_registration_number: International registration number. + examiner_name_text: Name of the patent examiner. + class_field: USPC main classification. (Named `class_field` to avoid keyword clash). + subclass: USPC subclass. + uspc_symbol_text: Full USPC classification symbol. + customer_number: USPTO customer number associated with the application. + cpc_classification_bag: List of CPC classification symbols. + applicant_bag: List of `Applicant` objects. + inventor_bag: List of `Inventor` objects. + raw_data: Raw JSON string of the data used to create this instance (for debugging). + """ national_stage_indicator: Optional[bool] = None entity_status_data: Optional[EntityStatus] = None - publication_date_bag: List[str] = field(default_factory=list) + publication_date_bag: List[date] = field(default_factory=list) publication_sequence_number_bag: List[str] = field(default_factory=list) publication_category_bag: List[str] = field(default_factory=list) docket_number: Optional[str] = None - first_inventor_to_file_indicator: Optional[str] = None + first_inventor_to_file_indicator: Optional[bool] = None first_applicant_name: Optional[str] = None first_inventor_name: Optional[str] = None application_confirmation_number: Optional[int] = None - application_status_date: Optional[str] = None + application_status_date: Optional[date] = None application_status_description_text: Optional[str] = None - filing_date: Optional[str] = None - effective_filing_date: Optional[str] = None - grant_date: Optional[str] = None + filing_date: Optional[date] = None + effective_filing_date: Optional[date] = None + grant_date: Optional[date] = None group_art_unit_number: Optional[str] = None application_type_code: Optional[str] = None application_type_label_name: Optional[str] = None @@ -874,65 +2030,91 @@

Source code for pyUSPTO.models.patent_data

     patent_number: Optional[str] = None
     application_status_code: Optional[int] = None
     earliest_publication_number: Optional[str] = None
-    earliest_publication_date: Optional[str] = None
+    earliest_publication_date: Optional[date] = None
     pct_publication_number: Optional[str] = None
-    pct_publication_date: Optional[str] = None
-    international_registration_publication_date: Optional[str] = None
+    pct_publication_date: Optional[date] = None
+    international_registration_publication_date: Optional[date] = None
     international_registration_number: Optional[str] = None
     examiner_name_text: Optional[str] = None
-    class_field: Optional[str] = None  # 'class' is a reserved keyword
+    class_field: Optional[str] = None
     subclass: Optional[str] = None
     uspc_symbol_text: Optional[str] = None
     customer_number: Optional[int] = None
     cpc_classification_bag: List[str] = field(default_factory=list)
     applicant_bag: List[Applicant] = field(default_factory=list)
     inventor_bag: List[Inventor] = field(default_factory=list)
+    raw_data: Optional[str] = field(default=None, compare=False)
+
+    @property
+    def is_aia(self) -> Optional[bool]:
+        """Returns True if the application is AIA, False if pre-AIA, None if unknown."""
+        return self.first_inventor_to_file_indicator
+
+    @property
+    def is_pre_aia(self) -> Optional[bool]:
+        """Returns True if the application is pre-AIA, False if AIA, None if unknown."""
+        if self.first_inventor_to_file_indicator is None:
+            return None
+        return not self.first_inventor_to_file_indicator
 
 
[docs] @classmethod - def from_dict(cls, data: Dict[str, Any]) -> "ApplicationMetaData": - """Create an ApplicationMetaData object from a dictionary.""" - entity_status = None - if "entityStatusData" in data and data.get("entityStatusData") is not None: - entity_status = EntityStatus.from_dict( - data=data.get("entityStatusData", {}) - ) - - applicants = [] - if "applicantBag" in data: - applicants = [ - Applicant.from_dict(data=applicant) - for applicant in data.get("applicantBag", []) - ] - - inventors = [] - if "inventorBag" in data: - inventors = [ - Inventor.from_dict(data=inventor) - for inventor in data.get("inventorBag", []) - ] - + def from_dict( + cls, data: Dict[str, Any], include_raw_data: bool = False + ) -> "ApplicationMetaData": + """Creates an `ApplicationMetaData` instance from a dictionary. + + Args: + data (Dict[str, Any]): Dictionary with application metadata. + include_raw_data (bool): If True, store the raw JSON for debugging. + + Returns: + ApplicationMetaData: An instance of `ApplicationMetaData`. + """ + entity = ( + EntityStatus.from_dict(data["entityStatusData"]) + if isinstance(data.get("entityStatusData"), dict) + else None + ) + app_bag = [ + Applicant.from_dict(a) + for a in data.get("applicantBag", []) + if isinstance(a, dict) + ] + inv_bag = [ + Inventor.from_dict(i) + for i in data.get("inventorBag", []) + if isinstance(i, dict) + ] + pub_dates_str = data.get("publicationDateBag", []) + pub_dates = ( + [parse_to_date(d) for d in pub_dates_str if isinstance(d, str)] + if isinstance(pub_dates_str, list) + else [] + ) + fitf_indicator_str = data.get("firstInventorToFileIndicator") + fitf_indicator_bool = parse_yn_to_bool(fitf_indicator_str) return cls( national_stage_indicator=data.get("nationalStageIndicator"), - entity_status_data=entity_status, - publication_date_bag=data.get("publicationDateBag", []), + entity_status_data=entity, + publication_date_bag=[d for d in pub_dates if d is not None], publication_sequence_number_bag=data.get( "publicationSequenceNumberBag", [] ), publication_category_bag=data.get("publicationCategoryBag", []), docket_number=data.get("docketNumber"), - first_inventor_to_file_indicator=data.get("firstInventorToFileIndicator"), + first_inventor_to_file_indicator=fitf_indicator_bool, first_applicant_name=data.get("firstApplicantName"), first_inventor_name=data.get("firstInventorName"), application_confirmation_number=data.get("applicationConfirmationNumber"), - application_status_date=data.get("applicationStatusDate"), + application_status_date=parse_to_date(data.get("applicationStatusDate")), application_status_description_text=data.get( "applicationStatusDescriptionText" ), - filing_date=data.get("filingDate"), - effective_filing_date=data.get("effectiveFilingDate"), - grant_date=data.get("grantDate"), + filing_date=parse_to_date(data.get("filingDate")), + effective_filing_date=parse_to_date(data.get("effectiveFilingDate")), + grant_date=parse_to_date(data.get("grantDate")), group_art_unit_number=data.get("groupArtUnitNumber"), application_type_code=data.get("applicationTypeCode"), application_type_label_name=data.get("applicationTypeLabelName"), @@ -941,33 +2123,134 @@

Source code for pyUSPTO.models.patent_data

             patent_number=data.get("patentNumber"),
             application_status_code=data.get("applicationStatusCode"),
             earliest_publication_number=data.get("earliestPublicationNumber"),
-            earliest_publication_date=data.get("earliestPublicationDate"),
+            earliest_publication_date=parse_to_date(
+                data.get("earliestPublicationDate")
+            ),
             pct_publication_number=data.get("pctPublicationNumber"),
-            pct_publication_date=data.get("pctPublicationDate"),
-            international_registration_publication_date=data.get(
-                "internationalRegistrationPublicationDate"
+            pct_publication_date=parse_to_date(data.get("pctPublicationDate")),
+            international_registration_publication_date=parse_to_date(
+                data.get("internationalRegistrationPublicationDate")
             ),
             international_registration_number=data.get(
                 "internationalRegistrationNumber"
             ),
             examiner_name_text=data.get("examinerNameText"),
-            class_field=data.get("class"),  # Renamed due to reserved keyword
+            class_field=data.get("class"),
             subclass=data.get("subclass"),
             uspc_symbol_text=data.get("uspcSymbolText"),
             customer_number=data.get("customerNumber"),
             cpc_classification_bag=data.get("cpcClassificationBag", []),
-            applicant_bag=applicants,
-            inventor_bag=inventors,
+            applicant_bag=app_bag,
+            inventor_bag=inv_bag,
+            raw_data=json.dumps(data) if include_raw_data else None,
         )
+ + +
+[docs] + def to_dict(self) -> Dict[str, Any]: + """Converts the `ApplicationMetaData` instance to a dictionary. + + Serializes attributes to camelCase keys suitable for API interaction or storage. + Omits keys with None values or empty lists. Handles date and boolean serialization. + + Returns: + Dict[str, Any]: Dictionary representation of the application metadata. + """ + d = asdict(self) + d.pop("raw_data", None) + d.pop("is_aia", None) + d.pop("is_pre_aia", None) + date_fields = [ + "application_status_date", + "filing_date", + "effective_filing_date", + "grant_date", + "earliest_publication_date", + "pct_publication_date", + "international_registration_publication_date", + ] + for field_name in date_fields: + camel_key = to_camel_case(field_name) + d[camel_key] = serialize_date(getattr(self, field_name, None)) + if field_name != camel_key: + d.pop(field_name, None) + d["publicationDateBag"] = [ + serialize_date(dt) for dt in self.publication_date_bag if dt + ] + if ( + "publication_date_bag" in d + and "publication_date_bag" != "publicationDateBag" + ): + d.pop("publication_date_bag") + d["firstInventorToFileIndicator"] = serialize_bool_to_yn( + self.first_inventor_to_file_indicator + ) + if ( + "first_inventor_to_file_indicator" in d + and "first_inventor_to_file_indicator" != "firstInventorToFileIndicator" + ): + d.pop("first_inventor_to_file_indicator") + if self.entity_status_data: + d["entityStatusData"] = self.entity_status_data.to_dict() + else: + d.pop("entityStatusData", None) + d.pop("entity_status_data", None) + d["applicantBag"] = [a.to_dict() for a in self.applicant_bag] + if "applicant_bag" in d and "applicant_bag" != "applicantBag": + d.pop("applicant_bag") + d["inventorBag"] = [i.to_dict() for i in self.inventor_bag] + if "inventor_bag" in d and "inventor_bag" != "inventorBag": + d.pop("inventor_bag") + if "class_field" in d: + d["class"] = d.pop("class_field") + if "class" in d and d["class"] is None: + d.pop("class", None) + final_data = {} + for key_snake, v_obj in d.items(): + k_camel = to_camel_case(snake_str=key_snake) + if key_snake in [ + "firstInventorToFileIndicator", + "publicationDateBag", + "entityStatusData", + "applicantBag", + "inventorBag", + ] or any(to_camel_case(df) == key_snake for df in date_fields): + k_camel = key_snake + if v_obj is not None: + if isinstance(v_obj, list) and not v_obj: + continue + final_data[k_camel] = v_obj + return final_data
[docs] -@dataclass +@dataclass(frozen=True) class PatentFileWrapper: - """Represents a patent file wrapper.""" + """Represents the complete file wrapper for a single patent application. + + This is a top-level object containing all data sections related to an application, + such as metadata, addresses, assignments, attorney information, continuity data, + PTA data, transaction events, and associated document metadata. + + Attributes: + application_number_text: The primary application number. + application_meta_data: Comprehensive `ApplicationMetaData`. + correspondence_address_bag: List of `Address` objects for correspondence. + assignment_bag: List of `Assignment` records. + record_attorney: Information about the `RecordAttorney`. + foreign_priority_bag: List of `ForeignPriority` claims. + parent_continuity_bag: List of `ParentContinuity` records. + child_continuity_bag: List of `ChildContinuity` records. + patent_term_adjustment_data: `PatentTermAdjustmentData` details. + event_data_bag: List of `EventData` (transaction history). + pgpub_document_meta_data: `PrintedMetaData` for Pre-Grant Publication. + grant_document_meta_data: `PrintedMetaData` for the granted patent. + last_ingestion_date_time: Timestamp of when this data was last ingested by the API (UTC). + """ application_number_text: Optional[str] = None application_meta_data: Optional[ApplicationMetaData] = None @@ -978,112 +2261,634 @@

Source code for pyUSPTO.models.patent_data

     parent_continuity_bag: List[ParentContinuity] = field(default_factory=list)
     child_continuity_bag: List[ChildContinuity] = field(default_factory=list)
     patent_term_adjustment_data: Optional[PatentTermAdjustmentData] = None
-    event_data_bag: List[Event] = field(default_factory=list)
-    pgpub_document_meta_data: Optional[DocumentMetaData] = None
-    grant_document_meta_data: Optional[DocumentMetaData] = None
-    last_ingestion_date_time: Optional[str] = None
+    event_data_bag: List[EventData] = field(default_factory=list)
+    pgpub_document_meta_data: Optional[PrintedMetaData] = None
+    grant_document_meta_data: Optional[PrintedMetaData] = None
+    last_ingestion_date_time: Optional[datetime] = None
 
 
[docs] @classmethod - def from_dict(cls, data: Dict[str, Any]) -> "PatentFileWrapper": - """Create a PatentFileWrapper object from a dictionary.""" - application_meta = None - if ( - "applicationMetaData" in data - and data.get("applicationMetaData") is not None - ): - application_meta = ApplicationMetaData.from_dict( - data=data.get("applicationMetaData", {}) - ) + def from_dict( + cls, data: Dict[str, Any], include_raw_data: bool = False + ) -> "PatentFileWrapper": + """Creates a `PatentFileWrapper` instance from a dictionary. + + Args: + data (Dict[str, Any]): Dictionary with patent file wrapper data. + include_raw_data (bool): If True, store the raw JSON for debugging. + + Returns: + PatentFileWrapper: An instance of `PatentFileWrapper`. + """ + amd_json = data.get("applicationMetaData") + amd = ( + ApplicationMetaData.from_dict(amd_json, include_raw_data=include_raw_data) + if isinstance(amd_json, dict) + else None + ) + corr_addrs = [ + Address.from_dict(a) + for a in data.get("correspondenceAddressBag", []) + if isinstance(a, dict) + ] + assigns = [ + Assignment.from_dict(a) + for a in data.get("assignmentBag", []) + if isinstance(a, dict) + ] + rec_att_json = data.get("recordAttorney") + rec_att = ( + RecordAttorney.from_dict(rec_att_json) + if isinstance(rec_att_json, dict) + else None + ) + f_pris = [ + ForeignPriority.from_dict(fp) + for fp in data.get("foreignPriorityBag", []) + if isinstance(fp, dict) + ] + p_conts = [ + ParentContinuity.from_dict(pc) + for pc in data.get("parentContinuityBag", []) + if isinstance(pc, dict) + ] + c_conts = [ + ChildContinuity.from_dict(cc) + for cc in data.get("childContinuityBag", []) + if isinstance(cc, dict) + ] + pta_json = data.get("patentTermAdjustmentData") + pta = ( + PatentTermAdjustmentData.from_dict(pta_json) + if isinstance(pta_json, dict) + else None + ) + evts = [ + EventData.from_dict(e) + for e in data.get("eventDataBag", []) + if isinstance(e, dict) + ] + pgpub_json = data.get("pgpubDocumentMetaData") + pgpub = ( + PrintedMetaData.from_dict(pgpub_json) + if isinstance(pgpub_json, dict) + else None + ) + grant_json = data.get("grantDocumentMetaData") + grant = ( + PrintedMetaData.from_dict(grant_json) + if isinstance(grant_json, dict) + else None + ) + return cls( + application_number_text=data.get("applicationNumberText"), + application_meta_data=amd, + correspondence_address_bag=corr_addrs, + assignment_bag=assigns, + record_attorney=rec_att, + foreign_priority_bag=f_pris, + parent_continuity_bag=p_conts, + child_continuity_bag=c_conts, + patent_term_adjustment_data=pta, + event_data_bag=evts, + pgpub_document_meta_data=pgpub, + grant_document_meta_data=grant, + last_ingestion_date_time=parse_to_datetime_utc( + data.get("lastIngestionDateTime") + ), + )
- addresses = [] - if "correspondenceAddressBag" in data: - addresses = [ - Address.from_dict(data=addr) - for addr in data.get("correspondenceAddressBag", []) - ] - assignments = [] - if "assignmentBag" in data: - assignments = [ - Assignment.from_dict(data=assignment) - for assignment in data.get("assignmentBag", []) - ] +
+[docs] + def to_dict(self) -> Dict[str, Any]: + """Converts the `PatentFileWrapper` instance to a dictionary. + + Omits keys with None values or empty lists. Serializes nested objects. + + Returns: + Dict[str, Any]: Dictionary representation. + """ + _dict = { + "applicationNumberText": self.application_number_text, + "applicationMetaData": ( + self.application_meta_data.to_dict() + if self.application_meta_data + else None + ), + "correspondenceAddressBag": [ + a.to_dict() for a in self.correspondence_address_bag + ], + "assignmentBag": [a.to_dict() for a in self.assignment_bag], + "recordAttorney": ( + self.record_attorney.to_dict() if self.record_attorney else None + ), + "foreignPriorityBag": [fp.to_dict() for fp in self.foreign_priority_bag], + "parentContinuityBag": [pc.to_dict() for pc in self.parent_continuity_bag], + "childContinuityBag": [cc.to_dict() for cc in self.child_continuity_bag], + "patentTermAdjustmentData": ( + self.patent_term_adjustment_data.to_dict() + if self.patent_term_adjustment_data + else None + ), + "eventDataBag": [e.to_dict() for e in self.event_data_bag], + "pgpubDocumentMetaData": ( + self.pgpub_document_meta_data.to_dict() + if self.pgpub_document_meta_data + else None + ), + "grantDocumentMetaData": ( + self.grant_document_meta_data.to_dict() + if self.grant_document_meta_data + else None + ), + "lastIngestionDateTime": ( + serialize_datetime_as_naive(self.last_ingestion_date_time) + if self.last_ingestion_date_time + else None + ), + } + return { + k: v + for k, v in _dict.items() + if v is not None and (not isinstance(v, list) or v) + }
+
- record_atty = None - if "recordAttorney" in data and data.get("recordAttorney") is not None: - record_atty = RecordAttorney.from_dict(data=data.get("recordAttorney", {})) - foreign_priorities = [] - if "foreignPriorityBag" in data: - foreign_priorities = [ - ForeignPriority.from_dict(data=priority) - for priority in data.get("foreignPriorityBag", []) - ] - parent_continuities = [] - if "parentContinuityBag" in data: - parent_continuities = [ - ParentContinuity.from_dict(data=continuity) - for continuity in data.get("parentContinuityBag", []) - ] +
+[docs] +@dataclass(frozen=True) +class PatentDataResponse: + """Represents the overall response from a patent data API request. - child_continuities = [] - if "childContinuityBag" in data: - child_continuities = [ - ChildContinuity.from_dict(data=continuity) - for continuity in data.get("childContinuityBag", []) - ] + It typically includes a count of the results and a list of PatentFileWrapper objects, + each containing detailed data for a patent application. - patent_term = None - if ( - "patentTermAdjustmentData" in data - and data.get("patentTermAdjustmentData") is not None - ): - patent_term = PatentTermAdjustmentData.from_dict( - data=data.get("patentTermAdjustmentData", {}) + Attributes: + count: The total number of patent applications found matching the query. + patent_file_wrapper_data_bag: A list of `PatentFileWrapper` objects. + request_identifier: An identifier for the API request, if provided. + raw_data: Optional raw JSON data from the API response (for debugging). + """ + + count: int + patent_file_wrapper_data_bag: List[PatentFileWrapper] = field(default_factory=list) + request_identifier: Optional[str] = None + raw_data: Optional[str] = field(default=None, compare=False, repr=False) + +
+[docs] + @classmethod + def from_dict( + cls, data: Dict[str, Any], include_raw_data: bool = False + ) -> "PatentDataResponse": + """Creates a `PatentDataResponse` instance from a dictionary. + + Args: + data (Dict[str, Any]): Dictionary with API response data. + include_raw_data (bool): If True, store the raw JSON for debugging. + + Returns: + PatentDataResponse: An instance of `PatentDataResponse`. + """ + wrappers = [ + PatentFileWrapper.from_dict(w, include_raw_data=include_raw_data) + for w in data.get("patentFileWrapperDataBag", []) + if isinstance(w, dict) + ] + return cls( + count=data.get("count", 0), + patent_file_wrapper_data_bag=wrappers, + request_identifier=data.get("requestIdentifier"), + raw_data=json.dumps(data) if include_raw_data else None, + )
+ + +
+[docs] + def to_dict(self) -> Dict[str, Any]: + """Converts the `PatentDataResponse` instance to a dictionary. + + Returns: + Dict[str, Any]: Dictionary representation. + """ + _dict = { + "count": self.count, + "patentFileWrapperDataBag": [ + w.to_dict() for w in self.patent_file_wrapper_data_bag + ], + "requestIdentifier": self.request_identifier, + } + return { + k: v + for k, v in _dict.items() + if v is not None and (not isinstance(v, list) or v) + }
+ + +
+[docs] + def to_csv(self) -> str: + """Converts the patent data in this response to a CSV formatted string. + + The CSV will contain key metadata fields for each application, + such as invention title, application number, filing date, status, etc. + + Returns: + str: A string containing the data in CSV format. + """ + headers = [ + "inventionTitle", + "applicationNumberText", + "filingDate", + "applicationTypeLabelName", + "publicationCategoryBag", + "applicationStatusDescriptionText", + "applicationStatusDate", + "firstInventorName", + ] + + output = io.StringIO() + writer = csv.writer(output) + + writer.writerow(headers) + + if not self.patent_file_wrapper_data_bag: + return output.getvalue() + + for wrapper in self.patent_file_wrapper_data_bag: + if not wrapper.application_meta_data: + continue + + meta = wrapper.application_meta_data + + pub_category_str = ( + "|".join(meta.publication_category_bag) + if meta.publication_category_bag + else "" ) - events = [] - if "eventDataBag" in data: - events = [ - Event.from_dict(data=event) for event in data.get("eventDataBag", []) + row_data = [ + meta.invention_title or "", + wrapper.application_number_text or "", + serialize_date(meta.filing_date) or "", + meta.application_type_label_name or "", + pub_category_str, + meta.application_status_description_text or "", + serialize_date(meta.application_status_date) or "", + meta.first_inventor_name or "", ] + writer.writerow(row_data) - pgpub_meta = None - if ( - "pgpubDocumentMetaData" in data - and data.get("pgpubDocumentMetaData") is not None - ): - pgpub_meta = DocumentMetaData.from_dict( - data=data.get("pgpubDocumentMetaData", {}) - ) + return output.getvalue()
+
- grant_meta = None - if ( - "grantDocumentMetaData" in data - and data.get("grantDocumentMetaData") is not None - ): - grant_meta = DocumentMetaData.from_dict( - data=data.get("grantDocumentMetaData", {}) + + +
+[docs] +@dataclass(frozen=True) +class StatusCode: + """Represents a USPTO application status code and its textual description. + + Attributes: + code: The numeric status code. + description: The textual description of the status code. + """ + + code: Optional[int] = None + description: Optional[str] = None + +
+[docs] + def __str__(self) -> str: + """Returns a user-friendly string representation of the status code.""" + return f"{self.code}: {self.description}"
+ + +
+[docs] + @classmethod + def from_dict(cls, data: Dict[str, Any]) -> "StatusCode": + """Creates a `StatusCode` instance from a dictionary. + + Handles two possible key sets from the API for status information. + + Args: + data (Dict[str, Any]): Dictionary with status code data. + + Returns: + StatusCode: An instance of `StatusCode`. + """ + if "code" in data: + return cls( + code=data.get("code"), + description=data.get("description"), ) + else: + return cls( + code=data.get("applicationStatusCode"), + description=data.get("applicationStatusDescriptionText"), + )
+ + +
+[docs] + def to_dict(self) -> Dict[str, Any]: + """Converts the `StatusCode` instance to a dictionary. + + Uses keys "applicationStatusCode" and "applicationStatusDescriptionText" + for consistency with some API response parts. + + Returns: + Dict[str, Any]: Dictionary representation. + """ + return { + "applicationStatusCode": self.code, + "applicationStatusDescriptionText": self.description, + }
+
+ + + +
+[docs] +class StatusCodeCollection: + """A collection of StatusCode objects. + + Provides iterable access and helper methods to find or filter status codes. + This class is immutable by convention after initialization. + + Attributes: + status_codes (tuple[StatusCode, ...]): An immutable tuple of `StatusCode` objects. + """ + +
+[docs] + def __init__(self, status_codes: List[StatusCode]): + """Initializes the StatusCodeCollection with a list of status codes. + + Args: + status_codes (List[StatusCode]): A list of `StatusCode` instances. + """ + self._status_codes: tuple[StatusCode, ...] = tuple(status_codes)
+ + + def __iter__(self) -> Iterator[StatusCode]: + return iter(self._status_codes) + + def __len__(self) -> int: + return len(self._status_codes) + + def __getitem__(self, index: int) -> StatusCode: + return self._status_codes[index] + + def __str__(self) -> str: + return f"StatusCodeCollection with {len(self)} status codes." + + def __repr__(self) -> str: + if not self._status_codes: + return "StatusCodeCollection(empty)" + + if len(self._status_codes) <= 3: + codes = ", ".join(str(s.code) for s in self._status_codes) + return f"StatusCodeCollection({len(self)} status codes: {codes})" + else: + first_codes = ", ".join(str(s.code) for s in self._status_codes[:3]) + return f"StatusCodeCollection({len(self)} status codes: {first_codes}, ...)" + +
+[docs] + def find_by_code(self, code_to_find: int) -> Optional[StatusCode]: + """Finds a status code by its numeric code. + + Args: + code_to_find (int): The numeric status code to search for. + + Returns: + Optional[StatusCode]: The `StatusCode` object if found, otherwise None. + """ + for status in self._status_codes: + if status.code == code_to_find: + return status + return None
+ + +
+[docs] + def search_by_description(self, text: str) -> "StatusCodeCollection": + """Searches for status codes by a case-insensitive text match in their description. + + Args: + text (str): The text to search for within status code descriptions. + + Returns: + StatusCodeCollection: A new collection containing matching status codes. + """ + matching = [ + s + for s in self._status_codes + if s.description and text.lower() in s.description.lower() + ] + return StatusCodeCollection(status_codes=matching)
+ + +
+[docs] + def to_dict(self) -> List[Dict[str, Any]]: + """Converts the collection of status codes to a list of dictionaries. + + Returns: + List[Dict[str, Any]]: A list where each item is the dictionary + representation of a `StatusCode`. + """ + return [sc.to_dict() for sc in self._status_codes]
+
+ + + +
+[docs] +@dataclass(frozen=True) +class StatusCodeSearchResponse: + """Represents the response from a search query for patent application status codes. + + Attributes: + count: The total number of status codes found matching the query. + status_code_bag: A `StatusCodeCollection` of the `StatusCode` objects returned. + request_identifier: An identifier for the API request, if provided. + """ + + count: int + status_code_bag: StatusCodeCollection + request_identifier: Optional[str] = None +
+[docs] + @classmethod + def from_dict(cls, data: Dict[str, Any]) -> "StatusCodeSearchResponse": + """Creates a `StatusCodeSearchResponse` instance from a dictionary. + + Args: + data (Dict[str, Any]): Dictionary with API response data for status codes. + + Returns: + StatusCodeSearchResponse: An instance of `StatusCodeSearchResponse`. + """ + codes_json = data.get("statusCodeBag", []) + parsed_codes = ( + [StatusCode.from_dict(cd) for cd in codes_json if isinstance(cd, dict)] + if isinstance(codes_json, list) + else [] + ) + collection = StatusCodeCollection(parsed_codes) return cls( - application_number_text=data.get("applicationNumberText"), - application_meta_data=application_meta, - correspondence_address_bag=addresses, - assignment_bag=assignments, - record_attorney=record_atty, - foreign_priority_bag=foreign_priorities, - parent_continuity_bag=parent_continuities, - child_continuity_bag=child_continuities, - patent_term_adjustment_data=patent_term, - event_data_bag=events, - pgpub_document_meta_data=pgpub_meta, - grant_document_meta_data=grant_meta, - last_ingestion_date_time=data.get("lastIngestionDateTime"), + count=data.get("count", 0), + status_code_bag=collection, + request_identifier=data.get("requestIdentifier"), + )
+ + +
+[docs] + def to_dict(self) -> Dict[str, Any]: + """Converts the `StatusCodeSearchResponse` instance to a dictionary. + + Omits keys with None values or empty lists. + + Returns: + Dict[str, Any]: Dictionary representation. + """ + _dict = { + "count": self.count, + "statusCodeBag": self.status_code_bag.to_dict(), + "requestIdentifier": self.request_identifier, + } + return { + k: v + for k, v in _dict.items() + if v is not None and (not isinstance(v, list) or v) + }
+
+ + + +
+[docs] +@dataclass(frozen=True) +class ApplicationContinuityData: + """Holds parent and child continuity application data for a specific patent application. + + This class consolidates lists of ParentContinuity and ChildContinuity objects, + representing the lineage of an application. + + Attributes: + parent_continuity_bag: List of `ParentContinuity` objects. + child_continuity_bag: List of `ChildContinuity` objects. + """ + + parent_continuity_bag: List[ParentContinuity] = field(default_factory=list) + child_continuity_bag: List[ChildContinuity] = field(default_factory=list) + +
+[docs] + @classmethod + def from_wrapper(cls, wrapper: PatentFileWrapper) -> "ApplicationContinuityData": + """Creates an `ApplicationContinuityData` instance from a `PatentFileWrapper`. + + Extracts parent and child continuity bags from the wrapper. + + Args: + wrapper (PatentFileWrapper): The patent file wrapper containing continuity data. + + Returns: + ApplicationContinuityData: An instance of `ApplicationContinuityData`. + """ + return cls( + parent_continuity_bag=wrapper.parent_continuity_bag, + child_continuity_bag=wrapper.child_continuity_bag, )
+ + +
+[docs] + def to_dict( + self, + ) -> Dict[str, Any]: + """Converts the `ApplicationContinuityData` instance to a dictionary. + + Returns: + Dict[str, Any]: Dictionary representation with "parentContinuityBag" + and "childContinuityBag" keys. + """ + return { + "parentContinuityBag": [pc.to_dict() for pc in self.parent_continuity_bag], + "childContinuityBag": [cc.to_dict() for cc in self.child_continuity_bag], + }
+
+ + + +
+[docs] +@dataclass(frozen=True) +class PrintedPublication: + """Holds metadata for associated documents like Pre-Grant Publications (PGPUB) + and Grant documents for a specific patent application. + + Attributes: + pgpub_document_meta_data: `PrintedMetaData` for the Pre-Grant Publication, if any. + grant_document_meta_data: `PrintedMetaData` for the Grant document, if any. + """ + + pgpub_document_meta_data: Optional[PrintedMetaData] = None + grant_document_meta_data: Optional[PrintedMetaData] = None + +
+[docs] + @classmethod + def from_wrapper(cls, wrapper: PatentFileWrapper) -> "PrintedPublication": + """Creates a `PrintedPublication` instance from a `PatentFileWrapper`. + + Extracts PGPUB and Grant document metadata from the wrapper. + + Args: + wrapper (PatentFileWrapper): The patent file wrapper. + + Returns: + PrintedPublication: An instance of `PrintedPublication`. + """ + return cls( + pgpub_document_meta_data=wrapper.pgpub_document_meta_data, + grant_document_meta_data=wrapper.grant_document_meta_data, + )
+ + +
+[docs] + def to_dict(self) -> Dict[str, Any]: + """Converts the `PrintedPublication` instance to a dictionary. + + Omits keys if their corresponding metadata is None. + + Returns: + Dict[str, Any]: Dictionary representation. + """ + return { + "pgpubDocumentMetaData": ( + self.pgpub_document_meta_data.to_dict() + if self.pgpub_document_meta_data + else None + ), + "grantDocumentMetaData": ( + self.grant_document_meta_data.to_dict() + if self.grant_document_meta_data + else None + ), + }
@@ -1095,7 +2900,7 @@

Source code for pyUSPTO.models.patent_data

   
-

© Copyright 2025, Andrew Piechocki.

+

© Copyright 2025, Dunlap Codding, P.C..

Built with Sphinx using a diff --git a/docs/build/html/_modules/pyUSPTO/models/ptab.html b/docs/build/html/_modules/pyUSPTO/models/ptab.html new file mode 100644 index 0000000..91019c0 --- /dev/null +++ b/docs/build/html/_modules/pyUSPTO/models/ptab.html @@ -0,0 +1,1985 @@ + + + + + + + + pyUSPTO.models.ptab — pyUSPTO 0.2.3.dev1+g2c5d89b38.d20251125 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +

Source code for pyUSPTO.models.ptab

+"""
+models.ptab - Data models for USPTO PTAB (Patent Trial and Appeal Board) APIs
+
+This module provides data models, primarily using frozen dataclasses, for
+representing responses from the USPTO PTAB APIs. These models cover:
+- Patent trial proceedings (IPR, PGR, CBM, DER)
+- Trial documents and decisions
+- Appeal decisions
+- Interference decisions
+"""
+
+import json
+from dataclasses import asdict, dataclass, field
+from datetime import date, datetime
+from typing import Any, Dict, List, Optional
+
+try:
+    from typing import Self
+except ImportError:
+    from typing_extensions import Self
+
+# Import parsing utilities from models utils module
+from pyUSPTO.models.utils import (
+    parse_to_date,
+    parse_to_datetime_utc,
+    serialize_date,
+    serialize_datetime_as_iso,
+    serialize_datetime_as_naive,
+    to_camel_case,
+)
+
+
+@dataclass(frozen=True)
+class PartyData:
+    """Base class for all party data models across PTAB endpoints.
+
+    Attributes:
+        application_number_text: Application number.
+        counsel_name: Name of counsel.
+        grant_date: Patent grant date.
+        group_art_unit_number: Art unit number.
+        inventor_name: Name of inventor.
+        patent_number: Patent number.
+        technology_center_number: Technology center number.
+        real_party_in_interest_name: Real party in interest name.
+        patent_owner_name: Patent owner name.
+        publication_date: Publication date (if applicable).
+        publication_number: Publication number (if applicable).
+    """
+
+    application_number_text: Optional[str] = None
+    counsel_name: Optional[str] = None
+    grant_date: Optional[date] = None
+    group_art_unit_number: Optional[str] = None
+    inventor_name: Optional[str] = None
+    real_party_in_interest_name: Optional[str] = None
+    patent_number: Optional[str] = None
+    patent_owner_name: Optional[str] = None
+    technology_center_number: Optional[str] = None
+    publication_date: Optional[date] = None
+    publication_number: Optional[str] = None
+
+    @classmethod
+    def from_dict(cls, data: Dict[str, Any], include_raw_data: bool = False) -> Self:
+        """Creates a PartyData instance from a dictionary.
+
+        Args:
+            data: Dictionary containing party data from API response.
+            include_raw_data: Ignored for this model.
+
+        Returns:
+            PartyData: A populated PartyData instance.
+        """
+        return cls(
+            application_number_text=data.get("applicationNumberText"),
+            counsel_name=data.get("counselName"),
+            grant_date=parse_to_date(data.get("grantDate")),
+            group_art_unit_number=data.get("groupArtUnitNumber"),
+            inventor_name=data.get("inventorName"),
+            real_party_in_interest_name=data.get("realPartyInInterestName"),
+            patent_number=data.get("patentNumber"),
+            patent_owner_name=data.get("patentOwnerName"),
+            technology_center_number=data.get("technologyCenterNumber"),
+            publication_date=parse_to_date(data.get("publicationDate")),
+            publication_number=data.get("publicationNumber"),
+        )
+
+    def to_dict(self) -> Dict[str, Any]:
+        """Converts the PartyData instance to a dictionary.
+
+        Returns:
+            Dict[str, Any]: Dictionary with camelCase keys and None values filtered.
+        """
+        result: Dict[str, Any] = {}
+        for k, v in asdict(self).items():
+            if v is not None:
+                if isinstance(v, date):
+                    result[to_camel_case(k)] = serialize_date(v)
+                else:
+                    result[to_camel_case(k)] = v
+        return result
+
+
+# ============================================================================
+# TRIAL PROCEEDINGS MODELS
+# ============================================================================
+
+
+
+[docs] +@dataclass(frozen=True) +class TrialMetaData: + """Trial metadata including status, dates, and download URI. + + Attributes: + petition_filing_date: Date the petition was filed. + accorded_filing_date: The filing date accorded to the petition. + trial_last_modified_date_time: Last modification timestamp. + trial_last_modified_date: Last modification date. + trial_status_category: Status of the trial (e.g., "Institution Denied", "Instituted"). + trial_type_code: Type of trial (IPR, PGR, CBM, DER). + file_download_uri: URI to download ZIP of all trial documents. + termination_date: Date the trial was terminated. + latest_decision_date: Date of the most recent decision. + institution_decision_date: Date of the institution decision. + """ + + petition_filing_date: Optional[date] = None + accorded_filing_date: Optional[date] = None + trial_last_modified_date_time: Optional[datetime] = None + trial_last_modified_date: Optional[date] = None + trial_status_category: Optional[str] = None + trial_type_code: Optional[str] = None + file_download_uri: Optional[str] = None + termination_date: Optional[date] = None + latest_decision_date: Optional[date] = None + institution_decision_date: Optional[date] = None + +
+[docs] + @classmethod + def from_dict( + cls, data: Dict[str, Any], include_raw_data: bool = False + ) -> "TrialMetaData": + """Creates a TrialMetaData instance from a dictionary. + + Args: + data: Dictionary containing trial metadata from API response. + include_raw_data: Ignored for this model (no raw_data field). + + Returns: + TrialMetaData: An instance of TrialMetaData. + """ + # Handle aliases + file_download_uri = data.get("fileDownloadURI") or data.get("downloadURI") + return cls( + petition_filing_date=parse_to_date(data.get("petitionFilingDate")), + accorded_filing_date=parse_to_date(data.get("accordedFilingDate")), + trial_last_modified_date_time=parse_to_datetime_utc( + data.get("trialLastModifiedDateTime") + ), + trial_last_modified_date=parse_to_date(data.get("trialLastModifiedDate")), + trial_status_category=data.get("trialStatusCategory"), + trial_type_code=data.get("trialTypeCode"), + file_download_uri=file_download_uri, + termination_date=parse_to_date(data.get("terminationDate")), + latest_decision_date=parse_to_date(data.get("latestDecisionDate")), + institution_decision_date=parse_to_date( + data.get("institutionDecisionDate") + ), + )
+ + +
+[docs] + def to_dict(self) -> Dict[str, Any]: + """Converts the TrialMetaData instance to a dictionary. + + Returns: + Dict[str, Any]: Dictionary with camelCase keys and None values filtered. + """ + result: Dict[str, Any] = {} + + if self.petition_filing_date is not None: + result["petitionFilingDate"] = serialize_date(self.petition_filing_date) + if self.accorded_filing_date is not None: + result["accordedFilingDate"] = serialize_date(self.accorded_filing_date) + if self.trial_last_modified_date_time is not None: + result["trialLastModifiedDateTime"] = serialize_datetime_as_naive( + self.trial_last_modified_date_time + ) + if self.trial_last_modified_date is not None: + result["trialLastModifiedDate"] = serialize_date( + self.trial_last_modified_date + ) + if self.trial_status_category is not None: + result["trialStatusCategory"] = self.trial_status_category + if self.trial_type_code is not None: + result["trialTypeCode"] = self.trial_type_code + if self.file_download_uri is not None: + result["fileDownloadURI"] = self.file_download_uri + if self.termination_date is not None: + result["terminationDate"] = serialize_date(self.termination_date) + if self.latest_decision_date is not None: + result["latestDecisionDate"] = serialize_date(self.latest_decision_date) + if self.institution_decision_date is not None: + result["institutionDecisionDate"] = serialize_date( + self.institution_decision_date + ) + + return result
+
+ + + +
+[docs] +@dataclass(frozen=True) +class PatentOwnerData(PartyData): + """Party data for a patent owner in PTAB trial proceedings. + + Inherits all attributes from PartyData. Used in IPR, PGR, CBM, + and DER proceedings to represent the patent holder. + """ + + pass
+ + + +
+[docs] +@dataclass(frozen=True) +class RegularPetitionerData: + """Regular petitioner information. + + Attributes: + counsel_name: Name of counsel. + real_party_in_interest_name: Real party in interest name. + """ + + counsel_name: Optional[str] = None + real_party_in_interest_name: Optional[str] = None + +
+[docs] + @classmethod + def from_dict( + cls, data: Dict[str, Any], include_raw_data: bool = False + ) -> "RegularPetitionerData": + """Creates a RegularPetitionerData instance from a dictionary. + + Args: + data: Dictionary containing petitioner data from API response. + include_raw_data: Ignored for this model. + + Returns: + RegularPetitionerData: An instance of RegularPetitionerData. + """ + return cls( + counsel_name=data.get("counselName"), + real_party_in_interest_name=data.get("realPartyInInterestName"), + )
+ + +
+[docs] + def to_dict(self) -> Dict[str, Any]: + """Converts the RegularPetitionerData instance to a dictionary. + + Returns: + Dict[str, Any]: Dictionary with camelCase keys and None values filtered. + """ + result: Dict[str, Any] = {} + + if self.counsel_name is not None: + result["counselName"] = self.counsel_name + if self.real_party_in_interest_name is not None: + result["realPartyInInterestName"] = self.real_party_in_interest_name + + return result
+
+ + + +
+[docs] +@dataclass(frozen=True) +class RespondentData(PartyData): + """Respondent party data in derivation proceedings. + + Inherits all attributes from PartyData. Used in DER proceedings + to represent the responding party. + """ + + pass
+ + + +
+[docs] +@dataclass(frozen=True) +class DerivationPetitionerData(PartyData): + """Derivation petitioner data in derivation proceedings. + + Inherits all attributes from PartyData. Used in DER proceedings + to represent the petitioning party claiming derivation. + """ + + pass
+ + + +
+[docs] +@dataclass(frozen=True) +class PTABTrialProceeding: + """Individual PTAB trial proceeding record. + + Attributes: + trial_number: Trial number (e.g., "IPR2023-00123"). + trial_record_identifier: UUID identifier for the trial record. + last_modified_date_time: Last modification timestamp. + trial_meta_data: Trial metadata. + patent_owner_data: Patent owner information. + regular_petitioner_data: Regular petitioner information. + respondent_data: Respondent information. + derivation_petitioner_data: Derivation petitioner information. + raw_data: Raw JSON response data (if include_raw_data=True). + """ + + trial_number: Optional[str] = None + # trial_record_identifier: Optional[str] = None # Removed: Documented but not in API. + last_modified_date_time: Optional[datetime] = None + trial_meta_data: Optional[TrialMetaData] = None + patent_owner_data: Optional[PatentOwnerData] = None + regular_petitioner_data: Optional[RegularPetitionerData] = None + respondent_data: Optional[RespondentData] = None + derivation_petitioner_data: Optional[DerivationPetitionerData] = None + raw_data: Optional[Dict[str, Any]] = None + +
+[docs] + @classmethod + def from_dict( + cls, data: Dict[str, Any], include_raw_data: bool = False + ) -> "PTABTrialProceeding": + """Creates a PTABTrialProceeding instance from a dictionary. + + Args: + data: Dictionary containing trial proceeding data from API response. + include_raw_data: Whether to include raw JSON data in the instance. + + Returns: + PTABTrialProceeding: An instance of PTABTrialProceeding. + """ + # Parse nested objects + trial_meta = data.get("trialMetaData") + trial_meta_data = TrialMetaData.from_dict(trial_meta) if trial_meta else None + + patent_owner = data.get("patentOwnerData") + patent_owner_data = ( + PatentOwnerData.from_dict(patent_owner) if patent_owner else None + ) + + reg_petitioner = data.get("regularPetitionerData") + regular_petitioner_data = ( + RegularPetitionerData.from_dict(reg_petitioner) if reg_petitioner else None + ) + + respondent = data.get("respondentData") + respondent_data = RespondentData.from_dict(respondent) if respondent else None + + deriv_petitioner = data.get("derivationPetitionerData") + derivation_petitioner_data = ( + DerivationPetitionerData.from_dict(deriv_petitioner) + if deriv_petitioner + else None + ) + + return cls( + trial_number=data.get("trialNumber"), + # trial_record_identifier=data.get("trialRecordIdentifier"), + last_modified_date_time=parse_to_datetime_utc( + data.get("lastModifiedDateTime") + ), + trial_meta_data=trial_meta_data, + patent_owner_data=patent_owner_data, + regular_petitioner_data=regular_petitioner_data, + respondent_data=respondent_data, + derivation_petitioner_data=derivation_petitioner_data, + raw_data=data if include_raw_data else None, + )
+ + +
+[docs] + def to_dict(self) -> Dict[str, Any]: + """Converts the PTABTrialProceeding instance to a dictionary. + + Returns: + Dict[str, Any]: Dictionary with camelCase keys and None values filtered. + """ + result: Dict[str, Any] = {} + + if self.trial_number is not None: + result["trialNumber"] = self.trial_number + # Removed: Documented but not in API. + # if self.trial_record_identifier is not None: + # result["trialRecordIdentifier"] = self.trial_record_identifier + if self.last_modified_date_time is not None: + result["lastModifiedDateTime"] = serialize_datetime_as_naive( + self.last_modified_date_time + ) + if self.trial_meta_data is not None: + result["trialMetaData"] = self.trial_meta_data.to_dict() + if self.patent_owner_data is not None: + result["patentOwnerData"] = self.patent_owner_data.to_dict() + if self.regular_petitioner_data is not None: + result["regularPetitionerData"] = self.regular_petitioner_data.to_dict() + if self.respondent_data is not None: + result["respondentData"] = self.respondent_data.to_dict() + if self.derivation_petitioner_data is not None: + result["derivationPetitionerData"] = ( + self.derivation_petitioner_data.to_dict() + ) + + return result
+
+ + + +
+[docs] +@dataclass(frozen=True) +class PTABTrialProceedingResponse: + """Response container for PTAB trial proceedings search. + + Attributes: + count: Total number of matching results. + request_identifier: UUID for the API request. + patent_trial_proceeding_data_bag: List of trial proceedings. + raw_data: Raw JSON response data (if include_raw_data=True). + """ + + count: int = 0 + request_identifier: Optional[str] = None + patent_trial_proceeding_data_bag: List[PTABTrialProceeding] = field( + default_factory=list + ) + raw_data: Optional[Dict[str, Any]] = None + +
+[docs] + @classmethod + def from_dict( + cls, data: Dict[str, Any], include_raw_data: bool = False + ) -> "PTABTrialProceedingResponse": + """Creates a PTABTrialProceedingResponse instance from a dictionary. + + Args: + data: Dictionary containing response data from API. + include_raw_data: Whether to include raw JSON data in the instance. + + Returns: + PTABTrialProceedingResponse: An instance of PTABTrialProceedingResponse. + """ + proceedings_data = data.get("patentTrialProceedingDataBag", []) + proceedings = [ + PTABTrialProceeding.from_dict(item, include_raw_data=include_raw_data) + for item in proceedings_data + ] + + return cls( + count=data.get("count", 0), + request_identifier=data.get("requestIdentifier"), + patent_trial_proceeding_data_bag=proceedings, + raw_data=data if include_raw_data else None, + )
+ + +
+[docs] + def to_dict(self) -> Dict[str, Any]: + """Converts the PTABTrialProceedingResponse instance to a dictionary. + + Returns: + Dict[str, Any]: Dictionary with camelCase keys and None values filtered. + """ + result: Dict[str, Any] = {} + + if self.count is not None: + result["count"] = self.count + if self.request_identifier is not None: + result["requestIdentifier"] = self.request_identifier + if ( + self.patent_trial_proceeding_data_bag is not None + and len(self.patent_trial_proceeding_data_bag) > 0 + ): + result["patentTrialProceedingDataBag"] = [ + proceeding.to_dict() + for proceeding in self.patent_trial_proceeding_data_bag + ] + + return result
+
+ + + +
+[docs] +@dataclass(frozen=True) +class TrialDocumentData: + """Metadata for a document in a PTAB trial. + + Attributes: + document_category: Category of the document. + document_filing_date: Filing date. + document_identifier: Unique ID. + document_name: Filename. + document_number: Document number in the proceeding. + document_size_quantity: Size in bytes. + document_ocr_text: OCR text content. + document_title_text: Title of the document. + document_type_description_text: Description of document type. + file_download_uri: URL to download the file. + filing_party_category: Who filed (e.g., "Petitioner"). + mime_type_identifier: MIME type (e.g., "application/pdf"). + document_status: Public status. + """ + + # document_category: Optional[str] = None # Removed: Documented but not in API. + document_filing_date: Optional[date] = None + document_identifier: Optional[str] = None + document_name: Optional[str] = None + document_number: Optional[str] = None + document_size_quantity: Optional[int] = None + document_ocr_text: Optional[str] = None + document_title_text: Optional[str] = None + document_type_description_text: Optional[str] = None + file_download_uri: Optional[str] = None + filing_party_category: Optional[str] = None + # mime_type_identifier: Optional[str] = None # Removed: Documented but not in API. + # document_status: Optional[str] = None # Removed: Documented but not in API. + +
+[docs] + @classmethod + def from_dict( + cls, data: Dict[str, Any], include_raw_data: bool = False + ) -> "TrialDocumentData": + """Creates a TrialDocumentData instance from a dictionary. + + Args: + data: Dictionary containing document data from API response. + include_raw_data: Ignored for this model. + + Returns: + TrialDocumentData: An instance of TrialDocumentData. + """ + # Handle aliases + file_download_uri = data.get("fileDownloadURI") or data.get("downloadURI") + return cls( + # document_category=data.get("documentCategory"), # Removed: Documented but not in API. + document_filing_date=parse_to_date(data.get("documentFilingDate")), + document_identifier=data.get("documentIdentifier"), + document_name=data.get("documentName"), + document_number=data.get("documentNumber"), + document_size_quantity=data.get("documentSizeQuantity"), + document_ocr_text=data.get("documentOCRText"), + document_title_text=data.get("documentTitleText"), + document_type_description_text=data.get("documentTypeDescriptionText"), + file_download_uri=file_download_uri, + filing_party_category=data.get("filingPartyCategory"), + # mime_type_identifier=data.get("mimeTypeIdentifier"), + # document_status=data.get("documentStatus"), + )
+ + +
+[docs] + def to_dict(self) -> Dict[str, Any]: + """Converts the TrialDocumentData instance to a dictionary. + + Returns: + Dict[str, Any]: Dictionary with camelCase keys and None values filtered. + """ + result: Dict[str, Any] = {} + + # Removed: Documented but not in API. + # if self.document_category is not None: + # result["documentCategory"] = self.document_category + if self.document_filing_date is not None: + result["documentFilingDate"] = serialize_date(self.document_filing_date) + if self.document_identifier is not None: + result["documentIdentifier"] = self.document_identifier + if self.document_name is not None: + result["documentName"] = self.document_name + if self.document_number is not None: + result["documentNumber"] = self.document_number + if self.document_size_quantity is not None: + result["documentSizeQuantity"] = self.document_size_quantity + if self.document_ocr_text is not None: + result["documentOCRText"] = self.document_ocr_text # Uppercase OCR + if self.document_title_text is not None: + result["documentTitleText"] = self.document_title_text + if self.document_type_description_text is not None: + result["documentTypeDescriptionText"] = self.document_type_description_text + if self.file_download_uri is not None: + result["fileDownloadURI"] = self.file_download_uri # Uppercase URI + if self.filing_party_category is not None: + result["filingPartyCategory"] = self.filing_party_category + # Removed: Documented but not in API. + # if self.mime_type_identifier is not None: + # result["mimeTypeIdentifier"] = self.mime_type_identifier + # if self.document_status is not None: + # result["documentStatus"] = self.document_status + + return result
+
+ + + +
+[docs] +@dataclass(frozen=True) +class TrialDecisionData: + """Metadata for a decision in a PTAB trial. + + Attributes: + statute_and_rule_bag: List of applicable statutes and rules. + decision_issue_date: Date issued. + decision_type_category: Type of decision (e.g. "Final Written Decision"). + issue_type_bag: List of issues addressed. + trial_outcome_category: Outcome (e.g., "Denied"). + """ + + statute_and_rule_bag: List[str] = field(default_factory=list) + decision_issue_date: Optional[date] = None + decision_type_category: Optional[str] = None + issue_type_bag: List[str] = field(default_factory=list) + trial_outcome_category: Optional[str] = None + +
+[docs] + @classmethod + def from_dict(cls, data: Dict[str, Any]) -> "TrialDecisionData": + return cls( + statute_and_rule_bag=data.get("statuteAndRuleBag", []), + decision_issue_date=parse_to_date(data.get("decisionIssueDate")), + decision_type_category=data.get("decisionTypeCategory"), + issue_type_bag=data.get("issueTypeBag", []), + trial_outcome_category=data.get("trialOutcomeCategory"), + )
+ + +
+[docs] + def to_dict(self) -> Dict[str, Any]: + """Converts the TrialDecisionData instance to a dictionary. + + Returns: + Dict[str, Any]: Dictionary with camelCase keys and None values filtered. + """ + result: Dict[str, Any] = {} + + if self.statute_and_rule_bag is not None and len(self.statute_and_rule_bag) > 0: + result["statuteAndRuleBag"] = self.statute_and_rule_bag + if self.decision_issue_date is not None: + result["decisionIssueDate"] = serialize_date(self.decision_issue_date) + if self.decision_type_category is not None: + result["decisionTypeCategory"] = self.decision_type_category + if self.issue_type_bag is not None and len(self.issue_type_bag) > 0: + result["issueTypeBag"] = self.issue_type_bag + if self.trial_outcome_category is not None: + result["trialOutcomeCategory"] = self.trial_outcome_category + + return result
+
+ + + +
+[docs] +@dataclass(frozen=True) +class PTABTrialDocument: + """Individual trial document or decision record from PTAB document/decision search APIs. + + Used by search_documents() and search_decisions() endpoints. Contains document-specific + metadata (documentData) or decision information (decisionData), plus trial context. + Differs from PTABTrialProceeding which represents the entire proceeding rather than + individual documents within it. + + Attributes: + trial_document_category: Category (Document or Decision). + last_modified_date_time: Last modification timestamp. + trial_number: Trial number (e.g., "IPR2023-00123"). + trial_type_code: Type of trial (IPR, PGR, CBM, DER). + trial_meta_data: Trial metadata. + patent_owner_data: Patent owner information. + regular_petitioner_data: Regular petitioner information. + respondent_data: Respondent information. + derivation_petitioner_data: Derivation petitioner information. + document_data: Document metadata (if document). + decision_data: Decision information (if decision). + raw_data: Raw JSON response data (if include_raw_data=True). + """ + + trial_document_category: Optional[str] = None + last_modified_date_time: Optional[datetime] = None + trial_number: Optional[str] = None + trial_type_code: Optional[str] = None + trial_meta_data: Optional[TrialMetaData] = None + patent_owner_data: Optional[PatentOwnerData] = None + regular_petitioner_data: Optional[RegularPetitionerData] = None + respondent_data: Optional[RespondentData] = None + derivation_petitioner_data: Optional[DerivationPetitionerData] = None + document_data: Optional[TrialDocumentData] = None + decision_data: Optional[TrialDecisionData] = None + raw_data: Optional[Dict[str, Any]] = None + +
+[docs] + @classmethod + def from_dict( + cls, data: Dict[str, Any], include_raw_data: bool = False + ) -> "PTABTrialDocument": + trial_meta = data.get("trialMetaData") + patent_owner = data.get("patentOwnerData") + reg_petitioner = data.get("regularPetitionerData") + respondent = data.get("respondentData") + deriv_petitioner = data.get("derivationPetitionerData") + doc_data = data.get("documentData") + dec_data = data.get("decisionData") + + return cls( + trial_document_category=data.get("trialDocumentCategory"), + last_modified_date_time=parse_to_datetime_utc( + data.get("lastModifiedDateTime") + ), + trial_number=data.get("trialNumber"), + trial_meta_data=( + TrialMetaData.from_dict(trial_meta) if trial_meta else None + ), + patent_owner_data=( + PatentOwnerData.from_dict(patent_owner) if patent_owner else None + ), + regular_petitioner_data=( + RegularPetitionerData.from_dict(reg_petitioner) + if reg_petitioner + else None + ), + respondent_data=( + RespondentData.from_dict(respondent) if respondent else None + ), + derivation_petitioner_data=( + DerivationPetitionerData.from_dict(deriv_petitioner) + if deriv_petitioner + else None + ), + document_data=(TrialDocumentData.from_dict(doc_data) if doc_data else None), + decision_data=(TrialDecisionData.from_dict(dec_data) if dec_data else None), + raw_data=data if include_raw_data else None, + )
+ + +
+[docs] + def to_dict(self) -> Dict[str, Any]: + """Converts the PTABTrialDocument instance to a dictionary. + + Returns: + Dict[str, Any]: Dictionary with camelCase keys and None values filtered. + """ + result: Dict[str, Any] = {} + + if self.trial_document_category is not None: + result["trialDocumentCategory"] = self.trial_document_category + if self.last_modified_date_time is not None: + result["lastModifiedDateTime"] = serialize_datetime_as_naive( + self.last_modified_date_time + ) + if self.trial_number is not None: + result["trialNumber"] = self.trial_number + if self.trial_meta_data is not None: + result["trialMetaData"] = self.trial_meta_data.to_dict() + if self.patent_owner_data is not None: + result["patentOwnerData"] = self.patent_owner_data.to_dict() + if self.regular_petitioner_data is not None: + result["regularPetitionerData"] = self.regular_petitioner_data.to_dict() + if self.respondent_data is not None: + result["respondentData"] = self.respondent_data.to_dict() + if self.derivation_petitioner_data is not None: + result["derivationPetitionerData"] = ( + self.derivation_petitioner_data.to_dict() + ) + if self.document_data is not None: + result["documentData"] = self.document_data.to_dict() + if self.decision_data is not None: + result["decisionData"] = self.decision_data.to_dict() + + return result
+
+ + + +
+[docs] +@dataclass(frozen=True) +class PTABTrialDocumentResponse: + """Response container for PTAB trial documents/decisions search.""" + + count: int = 0 + request_identifier: Optional[str] = None + patent_trial_document_data_bag: List[PTABTrialDocument] = field( + default_factory=list + ) + raw_data: Optional[Dict[str, Any]] = None + +
+[docs] + @classmethod + def from_dict( + cls, data: Dict[str, Any], include_raw_data: bool = False + ) -> "PTABTrialDocumentResponse": + docs_data = data.get("patentTrialDocumentDataBag", []) + docs = [ + PTABTrialDocument.from_dict(item, include_raw_data=include_raw_data) + for item in docs_data + ] + return cls( + count=data.get("count", 0), + patent_trial_document_data_bag=docs, + request_identifier=data.get("requestIdentifier"), + raw_data=data if include_raw_data else None, + )
+ + +
+[docs] + def to_dict(self) -> Dict[str, Any]: + """Converts the PTABTrialDocumentResponse instance to a dictionary. + + Returns: + Dict[str, Any]: Dictionary with camelCase keys and None values filtered. + """ + result: Dict[str, Any] = {} + + if self.count is not None: + result["count"] = self.count + if self.request_identifier is not None: + result["requestIdentifier"] = self.request_identifier + if ( + self.patent_trial_document_data_bag is not None + and len(self.patent_trial_document_data_bag) > 0 + ): + result["patentTrialDocumentDataBag"] = [ + doc.to_dict() for doc in self.patent_trial_document_data_bag + ] + + return result
+
+ + + +# ============================================================================ +# APPEAL DECISIONS MODELS +# ============================================================================ + + +
+[docs] +@dataclass(frozen=True) +class AppealMetaData: + """Appeal metadata. + + Attributes: + appeal_filing_date: Date the appeal was filed. + appeal_last_modified_date: Last modification date. + appeal_last_modified_date_time: Last modification timestamp. + application_type_category: Type of application. + docket_notice_mailed_date: Date the docket notice was mailed. + file_download_uri: URI to download ZIP of appeal documents. + """ + + appeal_filing_date: Optional[date] = None + appeal_last_modified_date: Optional[date] = None + appeal_last_modified_date_time: Optional[datetime] = None + application_type_category: Optional[str] = None + docket_notice_mailed_date: Optional[date] = None + file_download_uri: Optional[str] = None + +
+[docs] + @classmethod + def from_dict( + cls, data: Dict[str, Any], include_raw_data: bool = False + ) -> "AppealMetaData": + """Creates an AppealMetaData instance from a dictionary. + + Args: + data: Dictionary containing appeal metadata from API response. + include_raw_data: Ignored for this model. + + Returns: + AppealMetaData: An instance of AppealMetaData. + """ + # Handle aliases + file_download_uri = data.get("fileDownloadURI") or data.get("downloadURI") + return cls( + appeal_filing_date=parse_to_date(data.get("appealFilingDate")), + appeal_last_modified_date=parse_to_date(data.get("appealLastModifiedDate")), + appeal_last_modified_date_time=parse_to_datetime_utc( + data.get("appealLastModifiedDateTime") + ), + application_type_category=data.get("applicationTypeCategory"), + docket_notice_mailed_date=parse_to_date(data.get("docketNoticeMailedDate")), + file_download_uri=file_download_uri, + )
+ + +
+[docs] + def to_dict(self) -> Dict[str, Any]: + """Converts the AppealMetaData instance to a dictionary. + + Returns: + Dict[str, Any]: Dictionary with camelCase keys and None values filtered. + """ + result: Dict[str, Any] = {} + + if self.appeal_filing_date is not None: + result["appealFilingDate"] = serialize_date(self.appeal_filing_date) + if self.appeal_last_modified_date is not None: + result["appealLastModifiedDate"] = serialize_date( + self.appeal_last_modified_date + ) + if self.appeal_last_modified_date_time is not None: + result["appealLastModifiedDateTime"] = serialize_datetime_as_naive( + self.appeal_last_modified_date_time + ) + if self.application_type_category is not None: + result["applicationTypeCategory"] = self.application_type_category + if self.docket_notice_mailed_date is not None: + result["docketNoticeMailedDate"] = serialize_date( + self.docket_notice_mailed_date + ) + if self.file_download_uri is not None: + result["fileDownloadURI"] = self.file_download_uri + + return result
+
+ + + +
+[docs] +@dataclass(frozen=True) +class AppellantData(PartyData): + """Appellant party data in PTAB appeals. + + Inherits all attributes from PartyData. Used in appeal proceedings + to represent the party appealing an examiner decision. + """ + + pass
+ + + +
+[docs] +@dataclass(frozen=True) +class RequestorData: + """Third party requestor information. + + Attributes: + third_party_name: Name of the third party. + """ + + third_party_name: Optional[str] = None + +
+[docs] + @classmethod + def from_dict( + cls, data: Dict[str, Any], include_raw_data: bool = False + ) -> "RequestorData": + """Creates a RequestorData instance from a dictionary. + + Args: + data: Dictionary containing requestor data from API response. + include_raw_data: Ignored for this model. + + Returns: + RequestorData: An instance of RequestorData. + """ + return cls( + third_party_name=data.get("thirdPartyName"), + )
+ + +
+[docs] + def to_dict(self) -> Dict[str, Any]: + """Converts the RequestorData instance to a dictionary. + + Returns: + Dict[str, Any]: Dictionary with camelCase keys and None values filtered. + """ + result: Dict[str, Any] = {} + for k, v in asdict(self).items(): + if v is not None: + result[to_camel_case(k)] = v + return result
+
+ + + +
+[docs] +@dataclass(frozen=True) +class AppealDocumentData: + """Appeal document metadata. + + Attributes: + document_filing_date: Date the document was filed. + document_identifier: Unique identifier for the document. + document_name: Name of the document. + document_size_quantity: Size of the document in bytes. + document_ocr_text: Full OCR text of the document. + document_type_description_text: Description of the document type. + file_download_uri: URI to download the document. + """ + + document_filing_date: Optional[date] = None + document_identifier: Optional[str] = None + document_name: Optional[str] = None + document_size_quantity: Optional[int] = None + document_ocr_text: Optional[str] = None + document_type_description_text: Optional[str] = None + file_download_uri: Optional[str] = None + +
+[docs] + @classmethod + def from_dict( + cls, data: Dict[str, Any], include_raw_data: bool = False + ) -> "AppealDocumentData": + """Creates an AppealDocumentData instance from a dictionary. + + Args: + data: Dictionary containing document data from API response. + include_raw_data: Ignored for this model. + + Returns: + AppealDocumentData: An instance of AppealDocumentData. + """ + # Handle aliases + file_download_uri = data.get("fileDownloadURI") or data.get("downloadURI") + doc_type = data.get("documentTypeDescriptionText") or data.get( + "documentTypeCategory" + ) + + return cls( + document_filing_date=parse_to_date(data.get("documentFilingDate")), + document_identifier=data.get("documentIdentifier"), + document_name=data.get("documentName"), + document_size_quantity=data.get("documentSizeQuantity"), + document_ocr_text=data.get("documentOCRText"), + document_type_description_text=doc_type, + file_download_uri=file_download_uri, + )
+ + +
+[docs] + def to_dict(self) -> Dict[str, Any]: + """Converts the AppealDocumentData instance to a dictionary. + + Returns: + Dict[str, Any]: Dictionary with camelCase keys and None values filtered. + """ + result: Dict[str, Any] = {} + + if self.document_filing_date is not None: + result["documentFilingDate"] = serialize_date(self.document_filing_date) + if self.document_identifier is not None: + result["documentIdentifier"] = self.document_identifier + if self.document_name is not None: + result["documentName"] = self.document_name + if self.document_size_quantity is not None: + result["documentSizeQuantity"] = self.document_size_quantity + if self.document_ocr_text is not None: + result["documentOCRText"] = self.document_ocr_text + if self.document_type_description_text is not None: + result["documentTypeDescriptionText"] = self.document_type_description_text + if self.file_download_uri is not None: + result["fileDownloadURI"] = self.file_download_uri + + return result
+
+ + + +
+[docs] +@dataclass(frozen=True) +class DecisionData: + """Appeal decision information. + + Attributes: + appeal_outcome_category: Outcome of the appeal. + statute_and_rule_bag: List of applicable statutes and rules. + decision_issue_date: Date the decision was issued. + decision_type_category: Type of decision. + issue_type_bag: List of issue types. + """ + + appeal_outcome_category: Optional[str] = None + statute_and_rule_bag: List[str] = field(default_factory=list) + decision_issue_date: Optional[date] = None + decision_type_category: Optional[str] = None + issue_type_bag: List[str] = field(default_factory=list) + +
+[docs] + @classmethod + def from_dict( + cls, data: Dict[str, Any], include_raw_data: bool = False + ) -> "DecisionData": + """Creates a DecisionData instance from a dictionary. + + Args: + data: Dictionary containing decision data from API response. + include_raw_data: Ignored for this model. + + Returns: + DecisionData: An instance of DecisionData. + """ + return cls( + appeal_outcome_category=data.get("appealOutcomeCategory"), + statute_and_rule_bag=data.get("statuteAndRuleBag", []), + decision_issue_date=parse_to_date(data.get("decisionIssueDate")), + decision_type_category=data.get("decisionTypeCategory"), + issue_type_bag=data.get("issueTypeBag", []), + )
+ + +
+[docs] + def to_dict(self) -> Dict[str, Any]: + """Converts the DecisionData instance to a dictionary. + + Returns: + Dict[str, Any]: Dictionary with camelCase keys and None values filtered. + """ + result: Dict[str, Any] = {} + for k, v in asdict(self).items(): + if v is not None: + if isinstance(v, date): + result[to_camel_case(k)] = serialize_date(v) + elif isinstance(v, list) and len(v) == 0: + # Skip empty lists + continue + else: + result[to_camel_case(k)] = v + return result
+
+ + + +
+[docs] +@dataclass(frozen=True) +class PTABAppealDecision: + """Individual PTAB appeal decision record. + + Attributes: + appeal_number: Appeal number. + last_modified_date_time: Last modification timestamp. + appeal_document_category: Document category. + appeal_meta_data: Appeal metadata. + appellant_data: Appellant information. + requestor_data: Third party requestor information. + document_data: Document metadata. + decision_data: Decision information. + raw_data: Raw JSON response data (if include_raw_data=True). + """ + + appeal_number: Optional[str] = None + last_modified_date_time: Optional[datetime] = None + appeal_document_category: Optional[str] = None + appeal_meta_data: Optional[AppealMetaData] = None + appellant_data: Optional[AppellantData] = None + requestor_data: Optional[RequestorData] = None + document_data: Optional[AppealDocumentData] = None + decision_data: Optional[DecisionData] = None + raw_data: Optional[Dict[str, Any]] = None + +
+[docs] + @classmethod + def from_dict( + cls, data: Dict[str, Any], include_raw_data: bool = False + ) -> "PTABAppealDecision": + """Creates a PTABAppealDecision instance from a dictionary. + + Args: + data: Dictionary containing appeal decision data from API response. + include_raw_data: Whether to include raw JSON data in the instance. + + Returns: + PTABAppealDecision: An instance of PTABAppealDecision. + """ + # Parse nested objects + appeal_meta = data.get("appealMetaData") + appeal_meta_data = ( + AppealMetaData.from_dict(appeal_meta) if appeal_meta else None + ) + + # Handle potential typo 'appelantData' vs 'appellantData' + appellant = data.get("appellantData") or data.get("appelantData") + appellant_data = AppellantData.from_dict(appellant) if appellant else None + + requestor = data.get("requestorData") + requestor_data = RequestorData.from_dict(requestor) if requestor else None + + document = data.get("documentData") + document_data = AppealDocumentData.from_dict(document) if document else None + + decision = data.get("decisionData") + decision_data = DecisionData.from_dict(decision) if decision else None + + return cls( + appeal_number=data.get("appealNumber"), + last_modified_date_time=parse_to_datetime_utc( + data.get("lastModifiedDateTime") + ), + appeal_document_category=data.get("appealDocumentCategory"), + appeal_meta_data=appeal_meta_data, + appellant_data=appellant_data, + requestor_data=requestor_data, + document_data=document_data, + decision_data=decision_data, + raw_data=data if include_raw_data else None, + )
+ + +
+[docs] + def to_dict(self) -> Dict[str, Any]: + """Converts the PTABAppealDecision instance to a dictionary. + + Returns: + Dict[str, Any]: Dictionary with camelCase keys and None values filtered. + """ + result: Dict[str, Any] = {} + + # Manually process each field to preserve nested objects + if self.appeal_number is not None: + result["appealNumber"] = self.appeal_number + if self.last_modified_date_time is not None: + result["lastModifiedDateTime"] = serialize_datetime_as_naive( + self.last_modified_date_time + ) + if self.appeal_document_category is not None: + result["appealDocumentCategory"] = self.appeal_document_category + if self.appeal_meta_data is not None: + result["appealMetaData"] = self.appeal_meta_data.to_dict() + if self.appellant_data is not None: + result["appellantData"] = self.appellant_data.to_dict() + if self.requestor_data is not None: + result["requestorData"] = self.requestor_data.to_dict() + if self.document_data is not None: + result["documentData"] = self.document_data.to_dict() + if self.decision_data is not None: + result["decisionData"] = self.decision_data.to_dict() + + return result
+
+ + + +
+[docs] +@dataclass(frozen=True) +class PTABAppealResponse: + """Response container for PTAB appeals search. + + Attributes: + count: Total number of matching results. + request_identifier: UUID for the API request. + patent_appeal_data_bag: List of appeal decisions. + raw_data: Raw JSON response data (if include_raw_data=True). + """ + + count: int = 0 + request_identifier: Optional[str] = None + patent_appeal_data_bag: List[PTABAppealDecision] = field(default_factory=list) + raw_data: Optional[Dict[str, Any]] = None + +
+[docs] + @classmethod + def from_dict( + cls, data: Dict[str, Any], include_raw_data: bool = False + ) -> "PTABAppealResponse": + """Creates a PTABAppealResponse instance from a dictionary. + + Args: + data: Dictionary containing response data from API. + include_raw_data: Whether to include raw JSON data in the instance. + + Returns: + PTABAppealResponse: An instance of PTABAppealResponse. + """ + appeals_data = data.get("patentAppealDataBag", []) + appeals = [ + PTABAppealDecision.from_dict(item, include_raw_data=include_raw_data) + for item in appeals_data + ] + + return cls( + count=data.get("count", 0), + request_identifier=data.get("requestIdentifier"), + patent_appeal_data_bag=appeals, + raw_data=data if include_raw_data else None, + )
+ + +
+[docs] + def to_dict(self) -> Dict[str, Any]: + """Converts the PTABAppealResponse instance to a dictionary. + + Returns: + Dict[str, Any]: Dictionary with camelCase keys and None values filtered. + """ + result: Dict[str, Any] = {} + + # Manually process each field + if self.count is not None: + result["count"] = self.count + if self.request_identifier is not None: + result["requestIdentifier"] = self.request_identifier + if ( + self.patent_appeal_data_bag is not None + and len(self.patent_appeal_data_bag) > 0 + ): + result["patentAppealDataBag"] = [ + decision.to_dict() for decision in self.patent_appeal_data_bag + ] + + return result
+
+ + + +# ============================================================================ +# INTERFERENCE DECISIONS MODELS +# ============================================================================ + + +
+[docs] +@dataclass(frozen=True) +class InterferenceMetaData: + """Interference metadata. + + Attributes: + interference_style_name: Style name of the interference. + interference_last_modified_date: Last modification date. + interference_last_modified_date_time: Last modification datetime. + declaration_date: Declaration date. + file_download_uri: URI to download ZIP of interference documents. + """ + + interference_style_name: Optional[str] = None + interference_last_modified_date: Optional[date] = None + interference_last_modified_date_time: Optional[datetime] = None + declaration_date: Optional[date] = None + file_download_uri: Optional[str] = None + +
+[docs] + @classmethod + def from_dict( + cls, data: Dict[str, Any], include_raw_data: bool = False + ) -> "InterferenceMetaData": + """Creates an InterferenceMetaData instance from a dictionary. + + Args: + data: Dictionary containing interference metadata from API response. + include_raw_data: Ignored for this model. + + Returns: + InterferenceMetaData: An instance of InterferenceMetaData. + """ + # Handle aliases + file_download_uri = data.get("fileDownloadURI") or data.get("downloadURI") + return cls( + interference_style_name=data.get("interferenceStyleName"), + interference_last_modified_date=parse_to_date( + data.get("interferenceLastModifiedDate") + ), + interference_last_modified_date_time=parse_to_datetime_utc( + data.get("interferenceLastModifiedDateTime") + ), + declaration_date=parse_to_date(data.get("declarationDate")), + file_download_uri=file_download_uri, + )
+ + +
+[docs] + def to_dict(self) -> Dict[str, Any]: + """Converts the InterferenceMetaData instance to a dictionary. + + Returns: + Dict[str, Any]: Dictionary with camelCase keys and None values filtered. + """ + result: Dict[str, Any] = {} + + if self.interference_style_name is not None: + result["interferenceStyleName"] = self.interference_style_name + if self.interference_last_modified_date is not None: + result["interferenceLastModifiedDate"] = serialize_date( + self.interference_last_modified_date + ) + if self.interference_last_modified_date_time is not None: + result["interferenceLastModifiedDateTime"] = serialize_datetime_as_naive( + self.interference_last_modified_date_time + ) + if self.declaration_date is not None: + result["declarationDate"] = serialize_date(self.declaration_date) + if self.file_download_uri is not None: + result["fileDownloadURI"] = self.file_download_uri + + return result
+
+ + + +
+[docs] +@dataclass(frozen=True) +class SeniorPartyData(PartyData): + """Senior party information in PTAB interference proceedings. + + Inherits all attributes from PartyData. Represents the party with + the earlier effective filing date in an interference. + """ + + pass
+ + + +
+[docs] +@dataclass(frozen=True) +class JuniorPartyData(PartyData): + """Junior party information in PTAB interference proceedings. + + Inherits all attributes from PartyData. Represents the party with + the later effective filing date in an interference. + """ + + pass
+ + + +
+[docs] +@dataclass(frozen=True) +class AdditionalPartyData: + """Additional party information in an interference. + + Attributes: + application_number_text: Application number. + inventor_name: Name of inventor. + patent_number: Patent number. + additional_party_name: Name of additional party. + """ + + application_number_text: Optional[str] = None + inventor_name: Optional[str] = None + patent_number: Optional[str] = None + additional_party_name: Optional[str] = None + +
+[docs] + @classmethod + def from_dict( + cls, data: Dict[str, Any], include_raw_data: bool = False + ) -> "AdditionalPartyData": + """Creates an AdditionalPartyData instance from a dictionary. + + Args: + data: Dictionary containing additional party data from API response. + include_raw_data: Ignored for this model. + + Returns: + AdditionalPartyData: An instance of AdditionalPartyData. + """ + return cls( + application_number_text=data.get("applicationNumberText"), + inventor_name=data.get("inventorName"), + patent_number=data.get("patentNumber"), + additional_party_name=data.get("additionalPartyName"), + )
+ + +
+[docs] + def to_dict(self) -> Dict[str, Any]: + """Converts the AdditionalPartyData instance to a dictionary. + + Returns: + Dict[str, Any]: Dictionary with camelCase keys and None values filtered. + """ + result: Dict[str, Any] = {} + + if self.application_number_text is not None: + result["applicationNumberText"] = self.application_number_text + if self.inventor_name is not None: + result["inventorName"] = self.inventor_name + if self.patent_number is not None: + result["patentNumber"] = self.patent_number + if self.additional_party_name is not None: + result["additionalPartyName"] = self.additional_party_name + + return result
+
+ + + +
+[docs] +@dataclass(frozen=True) +class InterferenceDocumentData: + """Interference document metadata. + + Attributes: + document_identifier: Unique identifier for the document. + document_name: Name of the document. + document_size_quantity: Size of the document in bytes. + document_ocr_text: Full OCR text of the document. + document_title_text: Title of the document. + interference_outcome_category: Outcome of the interference. + document_filing_date: Date the document was filed. + decision_issue_date: Date the decision was issued. + decision_type_category: Type of decision. + file_download_uri: URI to download the document. + statute_and_rule_bag: List of applicable statutes and rules. + issue_type_bag: List of issues addressed. + """ + + document_identifier: Optional[str] = None + document_name: Optional[str] = None + document_size_quantity: Optional[int] = None + document_ocr_text: Optional[str] = None + document_title_text: Optional[str] = None + interference_outcome_category: Optional[str] = None + document_filing_date: Optional[date] = None + decision_issue_date: Optional[date] = None + decision_type_category: Optional[str] = None + file_download_uri: Optional[str] = None + statute_and_rule_bag: List[str] = field(default_factory=list) + issue_type_bag: List[str] = field(default_factory=list) + +
+[docs] + @classmethod + def from_dict( + cls, data: Dict[str, Any], include_raw_data: bool = False + ) -> "InterferenceDocumentData": + """Creates an InterferenceDocumentData instance from a dictionary. + + Args: + data: Dictionary containing document data from API response. + include_raw_data: Ignored for this model. + + Returns: + InterferenceDocumentData: An instance of InterferenceDocumentData. + """ + # Handle aliases + file_download_uri = data.get("fileDownloadURI") or data.get("downloadURI") + + return cls( + document_identifier=data.get("documentIdentifier"), + document_name=data.get("documentName"), + document_size_quantity=data.get("documentSizeQuantity"), + document_ocr_text=data.get("documentOCRText"), + document_title_text=data.get("documentTitleText"), + interference_outcome_category=data.get("interferenceOutcomeCategory"), + document_filing_date=parse_to_date(data.get("documentFilingDate")), + decision_issue_date=parse_to_date(data.get("decisionIssueDate")), + decision_type_category=data.get("decisionTypeCategory"), + file_download_uri=file_download_uri, + statute_and_rule_bag=data.get("statuteAndRuleBag", []), + issue_type_bag=data.get("issueTypeBag", []), + )
+ + +
+[docs] + def to_dict(self) -> Dict[str, Any]: + """Converts the InterferenceDocumentData instance to a dictionary. + + Returns: + Dict[str, Any]: Dictionary with camelCase keys and None values filtered. + """ + result: Dict[str, Any] = {} + + if self.document_identifier is not None: + result["documentIdentifier"] = self.document_identifier + if self.document_name is not None: + result["documentName"] = self.document_name + if self.document_size_quantity is not None: + result["documentSizeQuantity"] = self.document_size_quantity + if self.document_ocr_text is not None: + result["documentOCRText"] = self.document_ocr_text + if self.document_title_text is not None: + result["documentTitleText"] = self.document_title_text + if self.interference_outcome_category is not None: + result["interferenceOutcomeCategory"] = self.interference_outcome_category + if self.document_filing_date is not None: + result["documentFilingDate"] = serialize_date(self.document_filing_date) + if self.decision_issue_date is not None: + result["decisionIssueDate"] = serialize_date(self.decision_issue_date) + if self.decision_type_category is not None: + result["decisionTypeCategory"] = self.decision_type_category + if self.file_download_uri is not None: + result["fileDownloadURI"] = self.file_download_uri + if self.statute_and_rule_bag is not None and len(self.statute_and_rule_bag) > 0: + result["statuteAndRuleBag"] = self.statute_and_rule_bag + if self.issue_type_bag is not None and len(self.issue_type_bag) > 0: + result["issueTypeBag"] = self.issue_type_bag + + return result
+
+ + + +
+[docs] +@dataclass(frozen=True) +class PTABInterferenceDecision: + """Individual PTAB interference decision record. + + Attributes: + interference_number: Interference number. + last_modified_date_time: Last modification timestamp. + interference_meta_data: Interference metadata. + senior_party_data: Senior party information. + junior_party_data: Junior party information. + additional_party_data_bag: List of additional parties. + document_data: Document metadata. + raw_data: Raw JSON response data (if include_raw_data=True). + """ + + interference_number: Optional[str] = None + last_modified_date_time: Optional[datetime] = None + interference_meta_data: Optional[InterferenceMetaData] = None + senior_party_data: Optional[SeniorPartyData] = None + junior_party_data: Optional[JuniorPartyData] = None + additional_party_data_bag: List[AdditionalPartyData] = field(default_factory=list) + document_data: Optional[InterferenceDocumentData] = None + raw_data: Optional[Dict[str, Any]] = None + +
+[docs] + @classmethod + def from_dict( + cls, data: Dict[str, Any], include_raw_data: bool = False + ) -> "PTABInterferenceDecision": + """Creates a PTABInterferenceDecision instance from a dictionary. + + Args: + data: Dictionary containing interference decision data from API response. + include_raw_data: Whether to include raw JSON data in the instance. + + Returns: + PTABInterferenceDecision: An instance of PTABInterferenceDecision. + """ + # Parse nested objects + interference_meta = data.get("interferenceMetaData") + interference_meta_data = ( + InterferenceMetaData.from_dict(interference_meta) + if interference_meta + else None + ) + + senior_party = data.get("seniorPartyData") + senior_party_data = ( + SeniorPartyData.from_dict(senior_party) if senior_party else None + ) + + junior_party = data.get("juniorPartyData") + junior_party_data = ( + JuniorPartyData.from_dict(junior_party) if junior_party else None + ) + + additional_parties_data = data.get("additionalPartyDataBag", []) + additional_party_data_bag = [ + AdditionalPartyData.from_dict(item) for item in additional_parties_data + ] + + # Handle alias: documentData vs decisionDocumentData + document = data.get("documentData") or data.get("decisionDocumentData") + document_data = ( + InterferenceDocumentData.from_dict(document) if document else None + ) + + return cls( + interference_number=data.get("interferenceNumber"), + last_modified_date_time=parse_to_datetime_utc( + data.get("lastModifiedDateTime") + ), + interference_meta_data=interference_meta_data, + senior_party_data=senior_party_data, + junior_party_data=junior_party_data, + additional_party_data_bag=additional_party_data_bag, + document_data=document_data, + raw_data=data if include_raw_data else None, + )
+ + +
+[docs] + def to_dict(self) -> Dict[str, Any]: + """Converts the PTABInterferenceDecision instance to a dictionary. + + Returns: + Dict[str, Any]: Dictionary with camelCase keys and None values filtered. + """ + result: Dict[str, Any] = {} + + # Manually process each field to preserve nested objects + if self.interference_number is not None: + result["interferenceNumber"] = self.interference_number + if self.last_modified_date_time is not None: + result["lastModifiedDateTime"] = serialize_datetime_as_naive( + self.last_modified_date_time + ) + if self.interference_meta_data is not None: + result["interferenceMetaData"] = self.interference_meta_data.to_dict() + if self.senior_party_data is not None: + result["seniorPartyData"] = self.senior_party_data.to_dict() + if self.junior_party_data is not None: + result["juniorPartyData"] = self.junior_party_data.to_dict() + if ( + self.additional_party_data_bag is not None + and len(self.additional_party_data_bag) > 0 + ): + result["additionalPartyDataBag"] = [ + party.to_dict() for party in self.additional_party_data_bag + ] + if self.document_data is not None: + result["documentData"] = self.document_data.to_dict() + + return result
+
+ + + +
+[docs] +@dataclass(frozen=True) +class PTABInterferenceResponse: + """Response container for PTAB interferences search. + + Attributes: + count: Total number of matching results. + request_identifier: UUID for the API request. + patent_interference_data_bag: List of interference decisions. + raw_data: Raw JSON response data (if include_raw_data=True). + """ + + count: int = 0 + request_identifier: Optional[str] = None + patent_interference_data_bag: List[PTABInterferenceDecision] = field( + default_factory=list + ) + raw_data: Optional[Dict[str, Any]] = None + +
+[docs] + @classmethod + def from_dict( + cls, data: Dict[str, Any], include_raw_data: bool = False + ) -> "PTABInterferenceResponse": + """Creates a PTABInterferenceResponse instance from a dictionary. + + Args: + data: Dictionary containing response data from API. + include_raw_data: Whether to include raw JSON data in the instance. + + Returns: + PTABInterferenceResponse: An instance of PTABInterferenceResponse. + """ + interferences_data = data.get("patentInterferenceDataBag", []) + interferences = [ + PTABInterferenceDecision.from_dict(item, include_raw_data=include_raw_data) + for item in interferences_data + ] + + return cls( + count=data.get("count", 0), + request_identifier=data.get("requestIdentifier"), + patent_interference_data_bag=interferences, + raw_data=data if include_raw_data else None, + )
+ + +
+[docs] + def to_dict(self) -> Dict[str, Any]: + """Converts the PTABInterferenceResponse instance to a dictionary. + + Returns: + Dict[str, Any]: Dictionary with camelCase keys and None values filtered. + """ + result: Dict[str, Any] = {} + + # Manually process each field + if self.count is not None: + result["count"] = self.count + if self.request_identifier is not None: + result["requestIdentifier"] = self.request_identifier + if ( + self.patent_interference_data_bag is not None + and len(self.patent_interference_data_bag) > 0 + ): + result["patentInterferenceDataBag"] = [ + decision.to_dict() for decision in self.patent_interference_data_bag + ] + + return result
+
+ + + +# ============================================================================ +# EXPORTS +# ============================================================================ + +__all__ = [ + # Trial Proceedings Models + "TrialMetaData", + "PatentOwnerData", + "RegularPetitionerData", + "RespondentData", + "DerivationPetitionerData", + "PTABTrialProceeding", + "PTABTrialProceedingResponse", + # Trial Documents/Decisions Models + "TrialDocumentData", + "TrialDecisionData", + "PTABTrialDocument", + "PTABTrialDocumentResponse", + # Appeal Decisions Models + "AppealMetaData", + "AppellantData", + "RequestorData", + "AppealDocumentData", + "DecisionData", + "PTABAppealDecision", + "PTABAppealResponse", + # Interference Decisions Models + "InterferenceMetaData", + "SeniorPartyData", + "JuniorPartyData", + "AdditionalPartyData", + "InterferenceDocumentData", + "PTABInterferenceDecision", + "PTABInterferenceResponse", +] +
+ +
+
+
+ +
+ +
+

© Copyright 2025, Dunlap Codding, P.C..

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/build/html/_modules/pyUSPTO/models/utils.html b/docs/build/html/_modules/pyUSPTO/models/utils.html new file mode 100644 index 0000000..6a7b427 --- /dev/null +++ b/docs/build/html/_modules/pyUSPTO/models/utils.html @@ -0,0 +1,376 @@ + + + + + + + + pyUSPTO.models.utils — pyUSPTO 0.2.3.dev1+g2c5d89b38.d20251125 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +

Source code for pyUSPTO.models.utils

+"""
+models.utils - Utility functions for USPTO data models
+
+This module provides utility functions for parsing, serializing, and converting
+data used across USPTO API data models. These utilities handle date/datetime
+conversions, boolean string representations, and string transformations.
+"""
+
+import warnings
+from datetime import date, datetime, timezone, tzinfo
+from typing import Optional
+from zoneinfo import ZoneInfo, ZoneInfoNotFoundError
+
+from pyUSPTO.warnings import (
+    USPTOBooleanParseWarning,
+    USPTODateParseWarning,
+    USPTOTimezoneWarning,
+)
+
+# --- Timezone and Parsing Utilities ---
+ASSUMED_NAIVE_TIMEZONE_STR = "America/New_York"
+try:
+    ASSUMED_NAIVE_TIMEZONE: Optional[tzinfo] = ZoneInfo(ASSUMED_NAIVE_TIMEZONE_STR)
+except ZoneInfoNotFoundError:
+    warnings.warn(
+        f"Timezone '{ASSUMED_NAIVE_TIMEZONE_STR}' not found. "
+        f"Naive datetimes will be treated as UTC.",
+        category=USPTOTimezoneWarning,
+        stacklevel=1,
+    )
+    ASSUMED_NAIVE_TIMEZONE = timezone.utc
+
+
+
+[docs] +def parse_to_date(date_str: Optional[str], fmt: str = "%Y-%m-%d") -> Optional[date]: + """Parses a string representation of a date into a date object. + + Args: + date_str (Optional[str]): The string to parse as a date. + fmt (str, optional): The expected strptime format string for parsing + the date. Defaults to "%Y-%m-%d". + + Returns: + Optional[date]: A date object if parsing is successful and `date_str` + is not None. Returns None if `date_str` is None or if parsing fails. + + Warns: + USPTODateParseWarning: If the date string cannot be parsed. + """ + + if not date_str: + return None + try: + return datetime.strptime(date_str, fmt).date() + except ValueError: + warnings.warn( + f"Could not parse date string '{date_str}' with format '{fmt}'", + category=USPTODateParseWarning, + stacklevel=2, + ) + return None
+ + + +
+[docs] +def parse_to_datetime_utc(datetime_str: Optional[str]) -> Optional[datetime]: + """Parses a string representation of a datetime into a UTC datetime object. + + Attempts to parse ISO format strings. If the input string contains timezone + information, it's used. If the string is a naive datetime (no timezone), + it's assumed to be in the `ASSUMED_NAIVE_TIMEZONE_STR` (e.g., "America/New_York") + and then converted to UTC. + + Args: + datetime_str (Optional[str]): The string to parse as a datetime. + Supports ISO 8601 format, including those ending with "Z". + + Returns: + Optional[datetime]: A timezone-aware datetime object in UTC if parsing + is successful and `datetime_str` is not None. Returns None if + `datetime_str` is None or if parsing/conversion fails. + + Warns: + USPTODateParseWarning: If the datetime string cannot be parsed. + USPTOTimezoneWarning: If timezone localization fails. + """ + + if not datetime_str: + return None + dt_obj: Optional[datetime] = None + parsed_successfully = False + if isinstance(datetime_str, str): + try: + if datetime_str.endswith("Z"): + dt_obj = datetime.fromisoformat(datetime_str.replace("Z", "+00:00")) + # Normalize offsets like -0500 → -05:00 for Python <3.11 + elif ( + len(datetime_str) > 5 + and (datetime_str[-5] in "+-") + and datetime_str[-3] != ":" + ): + datetime_str = ( + datetime_str[:-5] + datetime_str[-5:-2] + ":" + datetime_str[-2:] + ) + dt_obj = datetime.fromisoformat(datetime_str) + else: + dt_obj = datetime.fromisoformat(datetime_str) + parsed_successfully = True + except ValueError: + pass + + if not parsed_successfully or dt_obj is None: + warnings.warn( + f"Could not parse datetime string '{datetime_str}' with any known format", + category=USPTODateParseWarning, + stacklevel=2, + ) + return None + if dt_obj.tzinfo is None or dt_obj.tzinfo.utcoffset(dt_obj) is None: + if ASSUMED_NAIVE_TIMEZONE: + try: + aware_dt = dt_obj.replace(tzinfo=ASSUMED_NAIVE_TIMEZONE) + return aware_dt.astimezone(timezone.utc) + except Exception as e: + warnings.warn( + f"Error localizing naive datetime '{datetime_str}': {e}", + category=USPTOTimezoneWarning, + stacklevel=2, + ) + if ASSUMED_NAIVE_TIMEZONE == timezone.utc: + return dt_obj.replace(tzinfo=timezone.utc) + return None + else: + return dt_obj.astimezone(timezone.utc)
+ + + +
+[docs] +def serialize_date(d: Optional[date]) -> Optional[str]: + """Serializes a date object into an ISO 8601 string (YYYY-MM-DD). + + Args: + d (Optional[date]): The date object to serialize. + + Returns: + Optional[str]: The date as an ISO 8601 formatted string, or None + if the input is None. + """ + return d.isoformat() if d else None
+ + + +
+[docs] +def serialize_datetime_as_iso(dt: Optional[datetime]) -> Optional[str]: + """Serializes a datetime object to a local-timezone ISO 8601 string. + + If the input datetime object is timezone-aware, it is converted to the + assumed local timezone defined by `ASSUMED_NAIVE_TIMEZONE`. + If it is naive (lacks timezone information), it is first assigned that + assumed local timezone. + + The resulting datetime is formatted as: + YYYY-MM-DDTHH:MM:SS.000±HHMM + (e.g., "2024-12-10T00:00:00.000-0500") + + Args: + dt (Optional[datetime]): The datetime object to serialize. + Can be naive or timezone-aware. + + Returns: + Optional[str]: The datetime formatted in the assumed local timezone, + or None if the input `dt` is None. + """ + if not dt: + return None + + if dt.tzinfo is None or dt.tzinfo.utcoffset(dt) is None: + dt = dt.replace(tzinfo=ASSUMED_NAIVE_TIMEZONE) + + dt_local = dt.astimezone(ASSUMED_NAIVE_TIMEZONE) + return dt_local.strftime("%Y-%m-%dT%H:%M:%S.000%z")
+ + + +
+[docs] +def serialize_datetime_as_naive(dt: datetime) -> str: + if dt.tzinfo is not None and dt.tzinfo.utcoffset(dt) is not None: + dt = dt.astimezone(ASSUMED_NAIVE_TIMEZONE).replace(tzinfo=None) + else: + dt = dt.replace(tzinfo=ASSUMED_NAIVE_TIMEZONE).replace(tzinfo=None) + return dt.isoformat()
+ + + +
+[docs] +def parse_yn_to_bool(value: Optional[str]) -> Optional[bool]: + """Converts a 'Y'/'N' (case-insensitive) string to a boolean. + + Args: + value (Optional[str]): The string value to convert. Expected to be + 'Y', 'y', 'N', or 'n'. + + Returns: + Optional[bool]: True if `value` is 'Y' or 'y', False if `value` is + 'N' or 'n'. Returns None if `value` is None or any other string. + + Warns: + USPTOBooleanParseWarning: If the value is not 'Y' or 'N'. + """ + + if value is None: + return None + if value == "": + return None + if value.upper() == "Y": + return True + if value.upper() == "N": + return False + warnings.warn( + f"Unexpected value for Y/N boolean string: '{value}'. Treating as None.", + category=USPTOBooleanParseWarning, + stacklevel=2, + ) + return None
+ + + +
+[docs] +def serialize_bool_to_yn(value: Optional[bool]) -> Optional[str]: + """Converts a boolean value to its 'Y'/'N' string representation. + + Args: + value (Optional[bool]): The boolean value to convert. + + Returns: + Optional[str]: "Y" if `value` is True, "N" if `value` is False. + Returns None if `value` is None. + """ + + if value is None: + return None + return "Y" if value else "N"
+ + + +
+[docs] +def to_camel_case(snake_str: str) -> str: + """Converts a snake_case string to lowerCamelCase. + + For example, "example_snake_string" becomes "exampleSnakeString". + + Args: + snake_str (str): The input string in snake_case. + + Returns: + str: The converted string in lowerCamelCase. + """ + parts = snake_str.split("_") + return parts[0] + "".join(x.title() for x in parts[1:])
+ +
+ +
+
+
+ +
+ +
+

© Copyright 2025, Dunlap Codding, P.C..

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/build/html/_modules/pyUSPTO/warnings.html b/docs/build/html/_modules/pyUSPTO/warnings.html new file mode 100644 index 0000000..c659d20 --- /dev/null +++ b/docs/build/html/_modules/pyUSPTO/warnings.html @@ -0,0 +1,205 @@ + + + + + + + + pyUSPTO.warnings — pyUSPTO 0.2.3.dev1+g2c5d89b38.d20251125 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +

Source code for pyUSPTO.warnings

+"""
+warnings - Warning classes for pyUSPTO data parsing issues
+
+This module defines custom warning categories for different types of
+data parsing issues encountered when working with USPTO API responses.
+These warnings follow Python's standard warning framework and can be
+controlled using warnings.filterwarnings().
+
+Example:
+    # Suppress all pyUSPTO data warnings
+    import warnings
+    from pyUSPTO.warnings import USPTODataWarning
+    warnings.filterwarnings('ignore', category=USPTODataWarning)
+
+    # Turn specific warnings into errors (strict mode)
+    warnings.filterwarnings('error', category=USPTODateParseWarning)
+"""
+
+
+
+[docs] +class USPTODataWarning(UserWarning): + """Base warning class for USPTO data parsing issues. + + All pyUSPTO data-related warnings inherit from this class, + allowing users to filter all data warnings at once. + """ + + pass
+ + + +
+[docs] +class USPTODateParseWarning(USPTODataWarning): + """Warning for date/datetime string parsing failures. + + Raised when a date or datetime string from the API cannot be + parsed into a Python date/datetime object. The field will be + set to None. + """ + + pass
+ + + +
+[docs] +class USPTOBooleanParseWarning(USPTODataWarning): + """Warning for Y/N boolean string parsing failures. + + Raised when a string that should be 'Y' or 'N' has an unexpected + value. The field will be set to None. + """ + + pass
+ + + +
+[docs] +class USPTOTimezoneWarning(USPTODataWarning): + """Warning for timezone-related issues. + + Raised when timezone data is not available or timezone conversion + fails. Falls back to UTC timezone. + """ + + pass
+ + + +
+[docs] +class USPTOEnumParseWarning(USPTODataWarning): + """Warning for enum value parsing failures. + + Raised when an API response contains a value that doesn't match + any defined enum member. The field will be set to None. + """ + + pass
+ + + +
+[docs] +class USPTODataMismatchWarning(USPTODataWarning): + """Warning for data validation mismatches. + + Raised when the API returns data that doesn't match the requested + identifier (e.g., requesting application 12345678 but receiving 87654321). + This indicates a potential API inconsistency or data integrity issue. + """ + + pass
+ +
+ +
+
+
+ +
+ +
+

© Copyright 2025, Dunlap Codding, P.C..

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/build/html/_sources/api/clients.rst.txt b/docs/build/html/_sources/api/clients.rst.txt index 66d240e..3c555b9 100644 --- a/docs/build/html/_sources/api/clients.rst.txt +++ b/docs/build/html/_sources/api/clients.rst.txt @@ -10,3 +10,23 @@ Clients :members: :undoc-members: :show-inheritance: + +.. automodule:: pyUSPTO.clients.petition_decisions + :members: + :undoc-members: + :show-inheritance: + +.. automodule:: pyUSPTO.clients.ptab_appeals + :members: + :undoc-members: + :show-inheritance: + +.. automodule:: pyUSPTO.clients.ptab_interferences + :members: + :undoc-members: + :show-inheritance: + +.. automodule:: pyUSPTO.clients.ptab_trials + :members: + :undoc-members: + :show-inheritance: \ No newline at end of file diff --git a/docs/build/html/_sources/api/config.rst.txt b/docs/build/html/_sources/api/config.rst.txt index 9a901f6..91dc506 100644 --- a/docs/build/html/_sources/api/config.rst.txt +++ b/docs/build/html/_sources/api/config.rst.txt @@ -1,7 +1,12 @@ Configuration -============ +============= .. automodule:: pyUSPTO.config :members: :undoc-members: :show-inheritance: + +.. automodule:: pyUSPTO.http_config + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/build/html/_sources/api/index.rst.txt b/docs/build/html/_sources/api/index.rst.txt index d1947e9..3137977 100644 --- a/docs/build/html/_sources/api/index.rst.txt +++ b/docs/build/html/_sources/api/index.rst.txt @@ -1,5 +1,5 @@ API Reference -============ +============= .. toctree:: :maxdepth: 2 @@ -8,3 +8,4 @@ API Reference models config exceptions + warnings diff --git a/docs/build/html/_sources/api/models.rst.txt b/docs/build/html/_sources/api/models.rst.txt index ff0a4aa..55b2c67 100644 --- a/docs/build/html/_sources/api/models.rst.txt +++ b/docs/build/html/_sources/api/models.rst.txt @@ -10,3 +10,18 @@ Models :members: :undoc-members: :show-inheritance: + +.. automodule:: pyUSPTO.models.petition_data + :members: + :undoc-members: + :show-inheritance: + +.. automodule:: pyUSPTO.models.ptab + :members: + :undoc-members: + :show-inheritance: + +.. automodule:: pyUSPTO.models.utils + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/build/html/_sources/api/warnings.rst.txt b/docs/build/html/_sources/api/warnings.rst.txt new file mode 100644 index 0000000..293a606 --- /dev/null +++ b/docs/build/html/_sources/api/warnings.rst.txt @@ -0,0 +1,7 @@ +Warnings +======== + +.. automodule:: pyUSPTO.warnings + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/build/html/_sources/development.rst.txt b/docs/build/html/_sources/development.rst.txt index 2e1a9e6..65f2ce1 100644 --- a/docs/build/html/_sources/development.rst.txt +++ b/docs/build/html/_sources/development.rst.txt @@ -1,5 +1,5 @@ Development -========== +=========== Contributing ----------- diff --git a/docs/build/html/_sources/examples/bulk_data.rst.txt b/docs/build/html/_sources/examples/bulk_data.rst.txt index 695e7b2..a4547ab 100644 --- a/docs/build/html/_sources/examples/bulk_data.rst.txt +++ b/docs/build/html/_sources/examples/bulk_data.rst.txt @@ -1,5 +1,5 @@ Bulk Data Examples -================= +================== .. literalinclude:: ../../examples/bulk_data_example.py :language: python diff --git a/docs/build/html/_sources/examples/ifw_example.rst.txt b/docs/build/html/_sources/examples/ifw_example.rst.txt new file mode 100644 index 0000000..d228b48 --- /dev/null +++ b/docs/build/html/_sources/examples/ifw_example.rst.txt @@ -0,0 +1,6 @@ +Image File Wrapper Example +========================== + +.. literalinclude:: ../../../examples/ifw_example.py + :language: python + :linenos: diff --git a/docs/build/html/_sources/examples/index.rst.txt b/docs/build/html/_sources/examples/index.rst.txt index 0b0a3f0..029a8c4 100644 --- a/docs/build/html/_sources/examples/index.rst.txt +++ b/docs/build/html/_sources/examples/index.rst.txt @@ -6,3 +6,8 @@ Examples bulk_data patent_data + ifw_example + petition_decisions + ptab_appeals + ptab_interferences + ptab_trials diff --git a/docs/build/html/_sources/examples/patent_data.rst.txt b/docs/build/html/_sources/examples/patent_data.rst.txt index 946ec55..31a7253 100644 --- a/docs/build/html/_sources/examples/patent_data.rst.txt +++ b/docs/build/html/_sources/examples/patent_data.rst.txt @@ -1,6 +1,6 @@ Patent Data Examples -================== +==================== -.. literalinclude:: ../../examples/patent_data_example.py +.. literalinclude:: ../../../examples/patent_data_example.py :language: python :linenos: diff --git a/docs/build/html/_sources/examples/petition_decisions.rst.txt b/docs/build/html/_sources/examples/petition_decisions.rst.txt new file mode 100644 index 0000000..06bf5b8 --- /dev/null +++ b/docs/build/html/_sources/examples/petition_decisions.rst.txt @@ -0,0 +1,6 @@ +Petition Decisions Example +========================== + +.. literalinclude:: ../../../examples/petition_decisions_example.py + :language: python + :linenos: diff --git a/docs/build/html/_sources/examples/ptab_appeals.rst.txt b/docs/build/html/_sources/examples/ptab_appeals.rst.txt new file mode 100644 index 0000000..7bd1173 --- /dev/null +++ b/docs/build/html/_sources/examples/ptab_appeals.rst.txt @@ -0,0 +1,6 @@ +PTAB Appeals Example +==================== + +.. literalinclude:: ../../../examples/ptab_appeals_example.py + :language: python + :linenos: diff --git a/docs/build/html/_sources/examples/ptab_interferences.rst.txt b/docs/build/html/_sources/examples/ptab_interferences.rst.txt new file mode 100644 index 0000000..2c61060 --- /dev/null +++ b/docs/build/html/_sources/examples/ptab_interferences.rst.txt @@ -0,0 +1,6 @@ +PTAB Interferences Example +========================== + +.. literalinclude:: ../../../examples/ptab_interferences_example.py + :language: python + :linenos: diff --git a/docs/build/html/_sources/examples/ptab_trials.rst.txt b/docs/build/html/_sources/examples/ptab_trials.rst.txt new file mode 100644 index 0000000..24336ec --- /dev/null +++ b/docs/build/html/_sources/examples/ptab_trials.rst.txt @@ -0,0 +1,6 @@ +PTAB Trials Example +=================== + +.. literalinclude:: ../../../examples/ptab_trials_example.py + :language: python + :linenos: diff --git a/docs/build/html/_sources/installation.rst.txt b/docs/build/html/_sources/installation.rst.txt index 08b42c7..8580156 100644 --- a/docs/build/html/_sources/installation.rst.txt +++ b/docs/build/html/_sources/installation.rst.txt @@ -1,5 +1,5 @@ Installation -=========== +============ .. code-block:: bash diff --git a/docs/build/html/_sources/quickstart.rst.txt b/docs/build/html/_sources/quickstart.rst.txt index 3aba801..63c860c 100644 --- a/docs/build/html/_sources/quickstart.rst.txt +++ b/docs/build/html/_sources/quickstart.rst.txt @@ -1,5 +1,5 @@ Quick Start -========== +=========== This guide will help you get started with the pyUSPTO library. diff --git a/docs/build/html/_static/documentation_options.js b/docs/build/html/_static/documentation_options.js index 6078937..5cf2cf3 100644 --- a/docs/build/html/_static/documentation_options.js +++ b/docs/build/html/_static/documentation_options.js @@ -1,5 +1,5 @@ const DOCUMENTATION_OPTIONS = { - VERSION: '0.1.4.dev0+ga92fa00.d20250320', + VERSION: '0.2.3.dev1+g2c5d89b38.d20251125', LANGUAGE: 'en', COLLAPSE_INDEX: false, BUILDER: 'html', diff --git a/docs/build/html/api/clients.html b/docs/build/html/api/clients.html index 84f77b7..42088d5 100644 --- a/docs/build/html/api/clients.html +++ b/docs/build/html/api/clients.html @@ -6,7 +6,7 @@ - Clients — pyUSPTO 0.1.4.dev0+ga92fa00.d20250320 documentation + Clients — pyUSPTO 0.2.3.dev1+g2c5d89b38.d20251125 documentation @@ -14,7 +14,7 @@ - + @@ -63,26 +63,59 @@
  • PatentDataClient +
  • +
  • FinalPetitionDecisionsClient +
  • +
  • PTABAppealsClient +
  • +
  • PTABInterferencesClient +
  • +
  • PTABTrialsClient
  • @@ -90,6 +123,7 @@
  • Models
  • Configuration
  • Exceptions
  • +
  • Warnings
  • Examples
  • @@ -143,9 +177,9 @@
    Parameters:
    @@ -159,11 +193,11 @@
    Parameters:
    • file_data (FileData) – FileData object containing file information

    • -
    • destination (str) – Directory where the file should be saved

    • +
    • destination (str) – Directory where the file should be saved

    Return type:
    -

    str

    +

    str

    Returns:

    Path to the downloaded file

    @@ -178,13 +212,13 @@
    Parameters:
      -
    • product_id (str) – The product identifier

    • -
    • file_data_from_date (Optional[str]) – Filter files by data from date (YYYY-MM-DD)

    • -
    • file_data_to_date (Optional[str]) – Filter files by data to date (YYYY-MM-DD)

    • -
    • offset (Optional[int]) – Number of product file records to skip

    • -
    • limit (Optional[int]) – Number of product file records to collect

    • -
    • include_files (Optional[bool]) – Whether to include product files in the response

    • -
    • latest (Optional[bool]) – Whether to return only the latest product file

    • +
    • product_id (str) – The product identifier

    • +
    • file_data_from_date (str | None) – Filter files by data from date (YYYY-MM-DD)

    • +
    • file_data_to_date (str | None) – Filter files by data to date (YYYY-MM-DD)

    • +
    • offset (int | None) – Number of product file records to skip

    • +
    • limit (int | None) – Number of product file records to collect

    • +
    • include_files (bool | None) – Whether to include product files in the response

    • +
    • latest (bool | None) – Whether to return only the latest product file

    Return type:
    @@ -203,7 +237,7 @@

    This method is deprecated. Use search_products instead.

    Parameters:
    -

    params (Optional[Dict[str, Any]]) – Optional query parameters

    +

    params (Dict[str, Any] | None) – Optional query parameters

    Return type:

    BulkDataResponse

    @@ -220,13 +254,13 @@

    Paginate through all products matching the search criteria.

    Parameters:
    -

    **kwargs (Any) – Keyword arguments to pass to search_products

    +

    **kwargs (Any) – Keyword arguments to pass to search_products

    Yields:

    BulkDataProduct objects

    Return type:
    -

    Iterator[BulkDataProduct]

    +

    Iterator[BulkDataProduct]

    @@ -238,21 +272,21 @@
    Parameters:
      -
    • query (Optional[str]) – Search text

    • -
    • product_title (Optional[str]) – Filter by product title

    • -
    • product_description (Optional[str]) – Filter by product description

    • -
    • product_short_name (Optional[str]) – Filter by product identifier (short name)

    • -
    • from_date (Optional[str]) – Filter products with data from this date (YYYY-MM-DD)

    • -
    • to_date (Optional[str]) – Filter products with data until this date (YYYY-MM-DD)

    • -
    • categories (Optional[List[str]]) – Filter by dataset categories

    • -
    • labels (Optional[List[str]]) – Filter by product labels

    • -
    • datasets (Optional[List[str]]) – Filter by datasets

    • -
    • file_types (Optional[List[str]]) – Filter by file types

    • -
    • offset (Optional[int]) – Number of product records to skip

    • -
    • limit (Optional[int]) – Number of product records to collect

    • -
    • include_files (Optional[bool]) – Whether to include product files in the response

    • -
    • latest (Optional[bool]) – Whether to return only the latest product file for each product

    • -
    • facets (Optional[bool]) – Whether to enable facets in the response

    • +
    • query (str | None) – Search text

    • +
    • product_title (str | None) – Filter by product title

    • +
    • product_description (str | None) – Filter by product description

    • +
    • product_short_name (str | None) – Filter by product identifier (short name)

    • +
    • from_date (str | None) – Filter products with data from this date (YYYY-MM-DD)

    • +
    • to_date (str | None) – Filter products with data until this date (YYYY-MM-DD)

    • +
    • categories (List[str] | None) – Filter by dataset categories

    • +
    • labels (List[str] | None) – Filter by product labels

    • +
    • datasets (List[str] | None) – Filter by datasets

    • +
    • file_types (List[str] | None) – Filter by file types

    • +
    • offset (int | None) – Number of product records to skip

    • +
    • limit (int | None) – Number of product records to collect

    • +
    • include_files (bool | None) – Whether to include product files in the response

    • +
    • latest (bool | None) – Whether to return only the latest product file for each product

    • +
    • facets (bool | None) – Whether to enable facets in the response

    Return type:
    @@ -276,78 +310,170 @@

    Client for interacting with the USPTO Patent Data API.

    -ENDPOINTS = {'application_adjustment': 'applications/{application_number}/adjustment', 'application_assignment': 'applications/{application_number}/assignment', 'application_associated_documents': 'applications/{application_number}/associated-documents', 'application_attorney': 'applications/{application_number}/attorney', 'application_by_number': 'applications/{application_number}', 'application_continuity': 'applications/{application_number}/continuity', 'application_documents': 'applications/{application_number}/documents', 'application_foreign_priority': 'applications/{application_number}/foreign-priority', 'application_metadata': 'applications/{application_number}/meta-data', 'application_transactions': 'applications/{application_number}/transactions', 'applications_search': 'applications/search', 'applications_search_download': 'applications/search/download', 'download_document': 'download/applications/{application_number}/{document_id}', 'status_codes': 'status-codes'}
    +ENDPOINTS = {'download_application_document': 'api/v1/download/applications/{application_number}/{document_id}', 'get_application_adjustment': 'api/v1/patent/applications/{application_number}/adjustment', 'get_application_assignment': 'api/v1/patent/applications/{application_number}/assignment', 'get_application_associated_documents': 'api/v1/patent/applications/{application_number}/associated-documents', 'get_application_attorney': 'api/v1/patent/applications/{application_number}/attorney', 'get_application_by_number': 'api/v1/patent/applications/{application_number}', 'get_application_continuity': 'api/v1/patent/applications/{application_number}/continuity', 'get_application_documents': 'api/v1/patent/applications/{application_number}/documents', 'get_application_foreign_priority': 'api/v1/patent/applications/{application_number}/foreign-priority', 'get_application_metadata': 'api/v1/patent/applications/{application_number}/meta-data', 'get_application_transactions': 'api/v1/patent/applications/{application_number}/transactions', 'get_search_results': 'api/v1/patent/applications/search/download', 'search_applications': 'api/v1/patent/applications/search', 'status_codes': 'api/v1/patent/status-codes'}
    -
    -__init__(api_key=None, base_url=None, config=None)[source]
    -

    Initialize the PatentDataClient.

    +
    +download_archive(printed_metadata, file_name=None, destination_path=None, overwrite=False)[source]
    +

    Downloads Printed Metadata (XML data). These are XML files of the patent as printed.

    +
    +

    Note

    +

    See also download_publication() for a clearer method name with identical functionality.

    +
    Parameters:
      -
    • api_key (Optional[str]) – Optional API key for authentication

    • -
    • base_url (Optional[str]) – The base URL of the API, defaults to config.patent_data_base_url or “https://api.uspto.gov/api/v1/patent”

    • -
    • config (Optional[USPTOConfig]) – Optional USPTOConfig instance

    • +
    • printed_metadata (PrintedMetaData) – ArchiveMetaData object containing download URL and metadata

    • +
    • file_name (str | None) – Optional filename. If not provided, uses xml_file_name from metadata

    • +
    • destination_path (str | None) – Optional directory path to save the file

    • +
    • overwrite (bool) – Whether to overwrite existing files. Default False

    • +
    +
    +
    Returns:
    +

    Path to the downloaded file

    +
    +
    Return type:
    +

    str

    +
    +
    Raises:
    +
    -
    -download_application_document(application_number, document_id, destination)[source]
    -

    Download a document for a patent application.

    +
    +download_document(document_format, file_name=None, destination_path=None, overwrite=False, stream=True)[source]
    +

    Downloads a document in the specified format.

    Parameters:
      -
    • application_number (str) – The application number

    • -
    • document_id (str) – The document identifier

    • -
    • destination (str) – Directory where the file should be saved

    • +
    • document_format (DocumentFormat) – DocumentFormat object containing download URL and metadata

    • +
    • file_name (str | None) – Optional filename. If not provided, extracted from URL

    • +
    • destination_path (str | None) – Optional path - can be a directory OR a complete file path

    • +
    • overwrite (bool) – Whether to overwrite existing files. Default False

    • +
    • stream (bool) – Whether to stream the download. Default True for large files

    -
    Return type:
    -

    str

    +
    Returns:
    +

    Path to the downloaded file

    -
    Returns:
    -

    Path to the downloaded file

    +
    Return type:
    +

    str

    +
    +
    Raises:
    +
    -
    -download_patent_applications(params=None, format='json')[source]
    -

    Download patent data with specified format.

    +
    +download_publication(printed_metadata, file_name=None, destination_path=None, overwrite=False)[source]
    +

    Download a publication XML file (grant or pre-grant publication).

    +

    This method downloads publication XML files from PrintedMetaData objects, +such as grant documents or pre-grant publications (pgpub). The filename +is automatically extracted from the metadata if not provided.

    Parameters:
      -
    • params (Optional[Dict[str, Any]]) – Optional query parameters

    • -
    • format (str) – Download format (json or csv)

    • +
    • printed_metadata (PrintedMetaData) – PrintedMetaData object containing the publication +download URL and filename information. Typically obtained from +get_application_associated_documents() or from PatentFileWrapper’s +grant_document_meta_data or pg_publication_document_meta_data.

    • +
    • file_name (str | None) – Optional custom filename. If not provided, uses the +xml_file_name from the metadata (e.g., “18915708_12307527.xml”).

    • +
    • destination_path (str | None) – Optional directory path where the file should be saved. +If not provided, saves to the current directory. The directory will +be created if it doesn’t exist.

    • +
    • overwrite (bool) – Whether to overwrite an existing file at the destination. +Default is False, which raises FileExistsError if file exists.

    -
    Return type:
    -

    PatentDataResponse

    +
    Returns:
    +

    Absolute path to the downloaded publication file.

    -
    Returns:
    -

    PatentDataResponse object containing the API response

    +
    Return type:
    +

    str

    +
    +
    Raises:
    +
      +
    • ValueError – If printed_metadata has no file_location_uri (download URL).

    • +
    • FileExistsError – If the file already exists and overwrite=False.

    • +
    +
    +

    Examples

    +

    Download grant XML to a specific directory (auto-filename):

    +
    >>> response = client.get_application_by_number("18/915,708")
    +>>> ifw = response
    +>>> grant_metadata = ifw.grant_document_meta_data
    +>>> path = client.download_publication(grant_metadata, destination_path="./downloads")
    +>>> print(path)
    +'./downloads/18915708_12307527.xml'
    +
    +
    +

    Download pgpub XML with custom filename:

    +
    >>> pgpub_metadata = ifw.pg_publication_document_meta_data
    +>>> path = client.download_publication(
    +...     pgpub_metadata,
    +...     file_name="my_publication.xml",
    +...     destination_path="./downloads"
    +... )
    +>>> print(path)
    +'./downloads/my_publication.xml'
    +
    +
    +

    Download to current directory:

    +
    >>> path = client.download_publication(grant_metadata)
    +>>> print(path)
    +'./18915708_12307527.xml'
    +
    +
    +
    -
    -download_patent_applications_post(download_request)[source]
    -

    Download patent data using POST method with JSON payload.

    +
    +get_IFW_metadata(application_number=None, publication_number=None, patent_number=None, PCT_app_number=None, PCT_pub_number=None)[source]
    +

    Retrieves complete patent file wrapper data using common identifiers.

    +

    This utility fetches the PatentFileWrapper, which contains comprehensive +IFW metadata, application details, and more. Provide only one +identifier if possible. If multiple are given, they are processed in the +order listed in the arguments, and the first successful match is returned.

    Parameters:
    -

    download_request (Dict[str, Any]) – JSON payload with download parameters including format

    +
      +
    • application_number (Optional[str], optional) – USPTO application number +(e.g., “16123456”). Checked first (direct lookup).

    • +
    • patent_number (Optional[str], optional) – USPTO patent number +(e.g., “11000000”). Checked second (uses search).

    • +
    • publication_number (Optional[str], optional) – USPTO pre-grant +publication number (e.g., “20230123456”). Checked third (uses search).

    • +
    • PCT_app_number (Optional[str], optional) – PCT application number. +Checked fourth (direct lookup, treated as USPTO app#).

    • +
    • PCT_pub_number (Optional[str], optional) – PCT publication number +(e.g., “2023012345”). Checked fifth (uses search).

    • +
    -
    Return type:
    -

    PatentDataResponse

    +
    Returns:
    +

    +
    A PatentFileWrapper object with

    comprehensive data if found using one of the identifiers, +otherwise None.

    -
    Returns:
    -

    PatentDataResponse object containing the API response

    +
    +

    +
    +
    Return type:
    +

    Optional[PatentFileWrapper]

    @@ -355,16 +481,28 @@
    get_application_adjustment(application_number)[source]
    -

    Get patent term adjustment data for an application.

    +

    Retrieves patent term adjustment (PTA) data for a specific application.

    +

    This method fetches the PatentTermAdjustmentData component from the +full patent file wrapper. This data includes details on various delay +quantities (e.g., A, B, C delays, applicant delays), the total +calculated adjustment, and a history of PTA events that influenced the +term.

    Parameters:
    -

    application_number (str) – The application number

    +

    application_number (str) – The USPTO application number for which PTA +data is being requested (e.g., “16123456”).

    -
    Return type:
    -

    PatentDataResponse

    +
    Returns:
    +

    +
    A PatentTermAdjustmentData

    object containing the PTA details if the application is found +and has such data. Returns None if the application cannot be +found or if PTA data is not available in the response.

    -
    Returns:
    -

    PatentDataResponse object containing the adjustment data

    +
    +

    +
    +
    Return type:
    +

    Optional[PatentTermAdjustmentData]

    @@ -372,16 +510,29 @@
    get_application_assignment(application_number)[source]
    -

    Get assignment data for an application.

    +

    Retrieves a list of patent assignments for a specific application.

    +

    This method fetches the assignment_bag from the patent file wrapper, +which contains a list of Assignment objects. Each Assignment object +details an assignment including information such as reel and frame numbers, +recording dates, conveyance text, and details about the assignors and assignees.

    Parameters:
    -

    application_number (str) – The application number

    +

    application_number (str) – The USPTO application number for which +assignment data is being requested (e.g., “16123456”).

    -
    Return type:
    -

    PatentDataResponse

    +
    Returns:
    +

    +
    A list of Assignment objects, each

    representing a recorded assignment for the application. Returns +None if the application cannot be found, or if no assignment +data is available in the response. An empty list may be +returned if the application is found but has no recorded +assignments.

    -
    Returns:
    -

    PatentDataResponse object containing the assignment data

    +
    +

    +
    +
    Return type:
    +

    Optional[List[Assignment]]

    @@ -389,16 +540,34 @@
    get_application_associated_documents(application_number)[source]
    -

    Get associated documents metadata for an application.

    +

    Retrieves metadata for Pre-Grant Publication and Grant documents.

    +

    This method fetches metadata specifically for published documents associated +with the patent application, such as Pre-Grant Publications (PGPUBs) +and granted patent documents. It does not retrieve the prosecution +history documents (see get_application_documents for that). +The result is a PrintedPublication object, which holds +PrintedMetaData including file URIs and names. Download with download_archive.

    Parameters:
    -

    application_number (str) – The application number

    +

    application_number (str) – The USPTO application number for which +associated PGPUB/Grant document metadata is being requested +(e.g., “16123456”).

    +
    +
    Returns:
    +

    +
    A PrintedPublication object

    containing PrintedMetaData for the Pre-Grant Publication +and/or the Grant document, if available. Returns None if the +application cannot be found or if no such associated document +metadata is available. The fields within the returned object +(pgpub_document_meta_data, grant_document_meta_data) +may themselves be None if a particular type of document +(e.g., PGPUB) does not exist for the application.

    -
    Return type:
    -

    PatentDataResponse

    +
    +

    -
    Returns:
    -

    PatentDataResponse object containing the associated documents metadata

    +
    Return type:
    +

    Optional[PrintedPublication]

    @@ -406,16 +575,57 @@
    get_application_attorney(application_number)[source]
    -

    Get attorney/agent data for an application.

    +

    Retrieves data for the attorney(s) of record for a specific application.

    +

    This method fetches the RecordAttorney object associated with the +patent application. This object contains details about the attorney(s) +of record, including customer number correspondence data, power of attorney +information, and a list of listed attorneys.

    Parameters:
    -

    application_number (str) – The application number

    +

    application_number (str) – The USPTO application number for which +attorney data is being requested (e.g., “16123456”).

    -
    Return type:
    -

    PatentDataResponse

    +
    Returns:
    +

    +
    A RecordAttorney object with details

    about the attorney(s) of record if the application is found +and such data exists. Returns None if the application cannot +be found or if no attorney data is available in the response.

    -
    Returns:
    -

    PatentDataResponse object containing the attorney data

    +
    +

    +
    +
    Return type:
    +

    Optional[RecordAttorney]

    +
    +
    +
    + +
    +
    +get_application_by_number(application_number)[source]
    +

    Retrieves the full details for a specific patent application by its number.

    +

    This method fetches comprehensive information for a single patent application +identified by its unique application number.

    +
    +
    Parameters:
    +

    application_number (str) – The USPTO application number for the patent +application (e.g., “16123456” or “18/915,708”). The application +number will be automatically sanitized to remove commas and spaces.

    +
    +
    Returns:
    +

    +
    A PatentFileWrapper object representing

    the complete file wrapper for the application if found. This object +contains all data sections related to the application, such as +metadata, addresses, assignments, attorney/agent data, continuity +data, PTA/PTE data, transactions, and associated documents. +Returns None if the application cannot be found or if the response +does not contain the expected data.

    +
    +
    +

    +
    +
    Return type:
    +

    Optional[PatentFileWrapper]

    @@ -423,33 +633,71 @@
    get_application_continuity(application_number)[source]
    -

    Get continuity data for an application.

    +

    Retrieves continuity data (parent/child applications) for a specific application.

    +

    This method fetches the lineage of the specified application, returning an +ApplicationContinuityData object. This object consolidates lists of +ParentContinuity (applications to which the current one claims priority) +and ChildContinuity (applications claiming priority to the current one) +objects, each detailing the related application’s key identifiers and status.

    Parameters:
    -

    application_number (str) – The application number

    +

    application_number (str) – The USPTO application number for which +continuity data is being requested (e.g., “16123456”).

    -
    Return type:
    -

    PatentDataResponse

    +
    Returns:
    +

    +
    An ApplicationContinuityData

    object containing lists of parent and child continuity relationships. +Returns None if the application cannot be found or if the underlying +data to construct continuity is not available. The lists within +the returned object may be empty if no parent or child continuity +links exist.

    -
    Returns:
    -

    PatentDataResponse object containing the continuity data

    +
    +

    +
    +
    Return type:
    +

    Optional[ApplicationContinuityData]

    -get_application_documents(application_number)[source]
    -

    Get document details for an application.

    +get_application_documents(application_number, document_codes=None, official_date_from=None, official_date_to=None)[source] +

    Retrieves metadata for documents associated with a specific application.

    +

    This method fetches a collection of document metadata related to the given +patent application. The result is a DocumentBag object, which is an +iterable collection of Document instances. Each Document object +contains metadata such as its identifier, official date, document code +and description, direction (incoming/outgoing), and available download +formats.

    Parameters:
    -

    application_number (str) – The application number

    +
      +
    • application_number (str) – The USPTO application number for which +document metadata is being requested (e.g., “16123456”).

    • +
    • document_codes (Optional[List[str]]) – Filter by specific document type +codes. If provided, only documents with these codes will be returned. +Examples: [‘ABST’, ‘CLM’, ‘SPEC’, ‘DRWD’].

    • +
    • official_date_from (Optional[str]) – Filter documents from this date +(inclusive). Date format: YYYY-MM-DD (e.g., “2020-01-15”).

    • +
    • official_date_to (Optional[str]) – Filter documents to this date +(inclusive). Date format: YYYY-MM-DD (e.g., “2023-12-31”).

    • +
    -
    Return type:
    -

    PatentDataResponse

    +
    Returns:
    +

    +
    A DocumentBag object containing metadata for all

    publicly available documents associated with the application +that match the provided filters. The bag will be empty if no +documents are found or if the API response indicates no documents. +It does not return None for “not found” cases; an empty collection +is returned instead.

    -
    Returns:
    -

    PatentDataResponse object containing document details

    +
    +

    +
    +
    Return type:
    +

    DocumentBag

    @@ -457,16 +705,29 @@
    get_application_foreign_priority(application_number)[source]
    -

    Get foreign priority data for an application.

    +

    Retrieves a list of foreign priority claims for a specific application.

    +

    This method fetches the foreign_priority_bag from the patent file +wrapper. This bag contains a list of ForeignPriority objects, each +representing a claim to a foreign patent application’s priority date. +Details include the IP office name, filing date, and application number +of the foreign priority application.

    Parameters:
    -

    application_number (str) – The application number

    +

    application_number (str) – The USPTO application number for which +foreign priority data is being requested (e.g., “16123456”).

    -
    Return type:
    -

    PatentDataResponse

    +
    Returns:
    +

    +
    A list of ForeignPriority objects,

    each detailing a claimed foreign priority. Returns None if the +application cannot be found or if no foreign priority data is +available. An empty list may be returned if the application +is found but has no foreign priority claims.

    -
    Returns:
    -

    PatentDataResponse object containing the foreign priority data

    +
    +

    +
    +
    Return type:
    +

    Optional[List[ForeignPriority]]

    @@ -474,16 +735,29 @@
    get_application_metadata(application_number)[source]
    -

    Get metadata for a specific patent application.

    +

    Retrieves key metadata for a specific patent application.

    +

    This method fetches the ApplicationMetaData component from the full +patent file wrapper. The metadata includes a wide range of information +such as application status, important dates (filing, grant, publication), +applicant and inventor details, classification data, and other core +identifying information for the application.

    Parameters:
    -

    application_number (str) – The application number

    +

    application_number (str) – The USPTO application number for which +metadata is being requested (e.g., “16123456” or “18/915,708”). +The application number will be automatically sanitized.

    -
    Return type:
    -

    PatentDataResponse

    +
    Returns:
    +

    +
    An ApplicationMetaData object

    containing the core details of the patent application if found. +Returns None if the application cannot be found or if metadata +is not available in the response.

    -
    Returns:
    -

    PatentDataResponse object containing the application metadata

    +
    +

    +
    +
    Return type:
    +

    Optional[ApplicationMetaData]

    @@ -491,169 +765,964 @@
    get_application_transactions(application_number)[source]
    -

    Get transaction data for an application.

    +

    Retrieves the transaction history (events) for a specific application.

    +

    This method fetches the event_data_bag from the patent file wrapper. +This bag contains a list of EventData objects, each representing a +single recorded event in the prosecution history of the patent application. +Events include details like an event code, a textual description, and +the date the event was recorded.

    Parameters:
    -

    application_number (str) – The application number

    +

    application_number (str) – The USPTO application number for which +transaction history is being requested (e.g., “16123456”).

    -
    Return type:
    -

    PatentDataResponse

    +
    Returns:
    +

    +
    A list of EventData objects, each

    detailing a transaction or event in the application’s history. +Returns None if the application cannot be found or if no +transaction data is available. An empty list may be returned if +the application is found but has no recorded transaction events.

    -
    Returns:
    -

    PatentDataResponse object containing the transaction data

    +
    +

    +
    +
    Return type:
    +

    Optional[List[EventData]]

    -
    -get_patent_applications(params=None)[source]
    -

    Get a list of patent applications using the search endpoint.

    +
    +get_search_results(query=None, sort=None, offset=0, limit=25, fields_param=None, filters_param=None, range_filters_param=None, post_body=None, application_number_q=None, patent_number_q=None, inventor_name_q=None, applicant_name_q=None, assignee_name_q=None, filing_date_from_q=None, filing_date_to_q=None, grant_date_from_q=None, grant_date_to_q=None, classification_q=None, additional_query_params=None)[source]
    +

    Fetches a dataset of patent applications based on search criteria, always requesting JSON format. +For GET, parameters align with OpenAPI for /api/v1/patent/applications/search/download. +For POST, post_body should conform to PatentDownloadRequest schema.

    +
    +
    Return type:
    +

    list[ApplicationMetaData]

    +
    +
    +
    + +
    +
    +get_status_codes(params=None)[source]
    +

    Retrieves USPTO patent application status codes and their descriptions.

    +

    This method fetches a list of defined USPTO patent application status codes +(e.g., codes for “Pending,” “Abandoned,” “Issued”) using a GET request. +The request can be customized with query parameters to filter or paginate +the results if supported by the API endpoint.

    Parameters:
    -

    params (Optional[Dict[str, Any]]) – Optional query parameters including: -- q: Search query string -- sort: Field to sort by followed by sort order -- offset: Position in dataset to start from -- limit: Number of results to return -- facets: List of fields to facet upon -- fields: Fields to include in response -- filters: Field filters -- rangeFilters: Range filters

    +

    params (Optional[Dict[str, Any]], optional) – A dictionary of query +parameters to be sent with the GET request. These parameters can +be used to filter or control the output of the status codes +list. Defaults to None, which typically retrieves all available +status codes or the API’s default set.

    -
    Return type:
    -

    PatentDataResponse

    +
    Returns:
    +

    +
    An object containing a count of matching

    status codes, a StatusCodeCollection of the StatusCode +objects (code and description), and a request identifier.

    -
    Returns:
    -

    PatentDataResponse object containing the API response

    +
    +

    +
    +
    Return type:
    +

    StatusCodeSearchResponse

    -
    -get_patent_by_application_number(application_number)[source]
    -

    Get a specific patent by application number.

    +
    +paginate_applications(**kwargs)[source]
    +

    Provides an iterator to easily paginate through patent application search results.

    +

    This method simplifies the process of fetching all patent applications +that match a given search query by automatically handling pagination. +It internally calls the search_applications method for GET requests, +batching results and yielding them one by one.

    +

    All keyword arguments provided to this method (**kwargs) are passed +directly to the search_applications method to define the search +criteria. See the search_applications method for more details +on available parameters. +The offset and limit parameters are managed by the pagination logic; +setting them directly in kwargs might lead to unexpected behavior.

    Parameters:
    -

    application_number (str) – The application number

    +

    **kwargs (Any) – Keyword arguments to be passed to the +search_applications method for constructing the search query. +These define the criteria for the patent applications to be +retrieved. Do not include post_body.

    -
    Return type:
    -

    PatentFileWrapper

    +
    Returns:
    +

    +
    An iterator that yields PatentFileWrapper

    objects, allowing iteration over all matching patent applications +across multiple pages of results.

    -
    Returns:
    -

    PatentFileWrapper object containing the patent data

    +
    +

    +
    +
    Return type:
    +

    Iterator[PatentFileWrapper]

    +
    +
    Raises:
    +

    ValueError – If post_body is included in kwargs, as this + method only supports GET request parameters for pagination.

    -
    -get_patent_status_codes(params=None)[source]
    -

    Get patent application status codes and descriptions.

    +
    +sanitize_application_number(input_number)[source]
    +

    Sanitize and validate a USPTO application number.

    +

    Application numbers are either: +- 8 digits (e.g., “16123456”) +- Series code format: 2 digits + “/” + 6 digits (e.g., “08/123456”) +- PCT format: “PCT/US2024/012345” → “PCTUS2412345”

    +

    This method removes common separators (commas, spaces) while preserving +the “/” in series code format.

    Parameters:
    -

    params (Optional[Dict[str, Any]]) – Optional query parameters including: -- q: Search query string -- offset: Position in dataset to start from -- limit: Number of results to return

    +

    input_number (str) – Raw application number input. May include commas, +spaces, or other formatting.

    -
    Return type:
    -

    Dict[str, Any]

    +
    Returns:
    +

    Sanitized application number (either “NNNNNNNN” or “NN/NNNNNN”).

    -
    Returns:
    -

    Dictionary containing status codes and descriptions

    +
    Return type:
    +

    str

    +
    +
    Raises:
    +

    ValueError – If the format is invalid.

    +
    +
    +
    +

    Examples

    +
    >>> client.sanitize_application_number("16123456")
    +"16123456"
    +>>> client.sanitize_application_number("16,123,456")
    +"16123456"
    +>>> client.sanitize_application_number("08/123456")
    +"08/123456"
    +>>> client.sanitize_application_number("08/123,456")
    +"08/123456"
    +
    +
    +
    +
    + +
    +
    +search_applications(query=None, sort=None, offset=0, limit=25, facets=None, fields=None, filters=None, range_filters=None, post_body=None, application_number_q=None, patent_number_q=None, inventor_name_q=None, applicant_name_q=None, assignee_name_q=None, filing_date_from_q=None, filing_date_to_q=None, grant_date_from_q=None, grant_date_to_q=None, classification_q=None, earliestPublicationNumber_q=None, pctPublicationNumber_q=None, additional_query_params=None)[source]
    +

    Searches for patent applications. +Can perform a GET request based on OpenAPI query parameters or a POST request if post_body is specified.

    +
    +
    Return type:
    +

    PatentDataResponse

    -
    -paginate_patents(**kwargs)[source]
    -

    Paginate through all patents matching the search criteria.

    +
    +search_status_codes(search_request)[source]
    +

    Searches USPTO patent application status codes using POST criteria.

    +

    Performs targeted searches for USPTO patent application status codes +(e.g., for “Pending,” “Abandoned,” “Issued”) by sending a POST request +with a JSON body containing the search_request criteria. This method +is suited for more complex queries than the GET-based get_status_codes.

    Parameters:
    -

    **kwargs (Any) – Keyword arguments to pass to search_patents

    +

    search_request (Dict[str, Any]) – A dictionary with search criteria, +sent as the JSON POST body. The structure must conform to USPTO +API requirements for this endpoint (e.g., for searching by code +or description keywords).

    -
    Yields:
    -

    PatentFileWrapper objects

    +
    Returns:
    +

    +
    An object containing a count of matching

    status codes, a StatusCodeCollection of the StatusCode +objects (code and description), and a request identifier.

    +
    +
    +

    Return type:
    -

    Iterator[PatentFileWrapper]

    +

    StatusCodeSearchResponse

    +

    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

    + +

    clients.petition_decisions - Client for USPTO Final Petition Decisions API

    +

    This module provides a client for interacting with the USPTO Final Petition +Decisions API. It allows you to search for and retrieve final agency petition +decisions in publicly available patent applications and patents filed in 2001 or later.

    +
    +
    +class pyUSPTO.clients.petition_decisions.FinalPetitionDecisionsClient(api_key=None, base_url=None, config=None)[source]
    +

    Bases: BaseUSPTOClient[PetitionDecisionResponse]

    +

    Client for interacting with the USPTO Final Petition Decisions API.

    +

    This client provides methods to search for petition decisions, retrieve specific +decisions by ID, download decision data, and download associated documents.

    +

    Final petition decisions data are incrementally added to the USPTO Open Data Portal +on a monthly basis starting with data from 2022 and later.

    +
    +
    +ENDPOINTS = {'download_decisions': 'api/v1/petition/decisions/search/download', 'get_decision_by_id': 'api/v1/petition/decisions/{petitionDecisionRecordIdentifier}', 'search_decisions': 'api/v1/petition/decisions/search'}
    +
    +
    -
    -search_patent_applications_post(search_request)[source]
    -

    Search patent applications using POST method with JSON payload.

    +
    +__init__(api_key=None, base_url=None, config=None)[source]
    +

    Initialize the FinalPetitionDecisionsClient.

    Parameters:
    -

    search_request (Dict[str, Any]) – JSON payload with search parameters including: -- q: Search query string -- filters: Array of filter objects -- rangeFilters: Array of range filter objects -- sort: Array of sort objects -- fields: Array of field names to include -- pagination: Pagination object -- facets: Array of facet field names

    +
      +
    • api_key (str | None) – Optional API key for authentication.

    • +
    • base_url (str | None) – Optional base URL override for the API.

    • +
    • config (USPTOConfig | None) – Optional USPTOConfig instance for configuration.

    • +
    -
    Return type:
    -

    PatentDataResponse

    +
    +
    + +
    +
    +download_decisions(format='json', query=None, sort=None, offset=None, limit=None, fields=None, filters=None, range_filters=None, application_number_q=None, patent_number_q=None, inventor_name_q=None, applicant_name_q=None, decision_date_from_q=None, decision_date_to_q=None, additional_query_params=None, file_name=None, destination_path=None, overwrite=False)[source]
    +

    Downloads petition decisions data in the specified format.

    +

    This endpoint is designed for bulk downloads of petition decisions data. +It supports JSON and CSV formats.

    +
    +
    Parameters:
    +
      +
    • format (str) – Download format, either “json” or “csv”. Defaults to “json”.

    • +
    • query (str | None) – Direct query string in USPTO search syntax.

    • +
    • sort (str | None) – Sort order for results.

    • +
    • offset (int | None) – Number of records to skip (pagination).

    • +
    • limit (int | None) – Maximum number of records to return.

    • +
    • fields (str | None) – Specific fields to return.

    • +
    • filters (str | None) – Filter configuration string.

    • +
    • range_filters (str | None) – Range filter configuration string.

    • +
    • application_number_q (str | None) – Filter by application number.

    • +
    • patent_number_q (str | None) – Filter by patent number.

    • +
    • inventor_name_q (str | None) – Filter by inventor name.

    • +
    • applicant_name_q (str | None) – Filter by applicant name.

    • +
    • decision_date_from_q (str | None) – Filter decisions from this date (YYYY-MM-DD).

    • +
    • decision_date_to_q (str | None) – Filter decisions to this date (YYYY-MM-DD).

    • +
    • additional_query_params (Dict[str, Any] | None) – Additional custom query parameters.

    • +
    • file_name (str | None) – Optional filename for CSV downloads. Defaults to “petition_decisions.csv”.

    • +
    • destination_path (str | None) – Optional directory path to save CSV file. If None, returns Response.

    • +
    • overwrite (bool) – Whether to overwrite existing files. Default False.

    • +
    -
    Returns:
    -

    PatentDataResponse object containing the API response

    +
    Returns:
    +

      +
    • If format=”json”: Returns PetitionDecisionDownloadResponse

    • +
    • If format=”csv” and destination_path is None: Returns streaming Response

    • +
    • If format=”csv” and destination_path is set: Returns str path to saved file

    • +
    +

    +
    +
    Return type:
    +

    Union[PetitionDecisionDownloadResponse, requests.Response, str]

    +
    +
    Raises:
    +

    FileExistsError – If CSV file exists and overwrite=False

    +
    +

    Examples

    +

    # Download as JSON +>>> download = client.download_decisions( +… format=”json”, +… technology_center_q=”1700”, +… limit=1000 +… ) +>>> for decision in download.petition_decision_data: +… print(decision.application_number_text)

    +

    # Download CSV and save to file +>>> file_path = client.download_decisions( +… format=”csv”, +… decision_date_from_q=”2023-01-01”, +… destination_path=”./downloads” +… ) +>>> print(f”Saved to: {file_path}”)

    +

    # Download CSV as streaming response (advanced usage) +>>> response = client.download_decisions(format=”csv”) +>>> with open(“decisions.csv”, “wb”) as f: +… for chunk in response.iter_content(chunk_size=8192): +… f.write(chunk)

    +
    -
    -search_patent_status_codes_post(search_request)[source]
    -

    Search patent status codes using POST method with JSON payload.

    +
    +download_petition_document(download_option, file_name=None, destination_path=None, overwrite=False)[source]
    +

    Downloads a petition decision document in the specified format.

    Parameters:
    -

    search_request (Dict[str, Any]) – JSON payload with search parameters

    +
      +
    • download_option (DocumentDownloadOption) – DocumentDownloadOption object containing the download +URL and metadata.

    • +
    • file_name (str | None) – Optional filename for the downloaded file. If not provided, +it will be extracted from the URL or generated based on the MIME type.

    • +
    • destination_path (str | None) – Optional directory path where the file should be saved. +If not provided, saves to the current directory.

    • +
    • overwrite (bool) – Whether to overwrite an existing file. Defaults to False.

    • +
    -
    Return type:
    -

    Dict[str, Any]

    +
    Returns:
    +

    The absolute path to the downloaded file.

    -
    Returns:
    -

    Dictionary containing status codes and descriptions

    +
    Return type:
    +

    str

    +
    +
    Raises:
    +
    +
    +

    Examples

    +

    # Download first document from a decision +>>> decision = client.get_decision_by_id( +… “34044333-4b40-515f-a684-2515325c57c5”, +… include_documents=True +… ) +>>> if decision.document_bag: +… doc = decision.document_bag[0] +… if doc.download_option_bag: +… # Download PDF version +… pdf_option = next( +… opt for opt in doc.download_option_bag +… if opt.mime_type_identifier == “PDF” +… ) +… path = client.download_petition_document( +… pdf_option, +… destination_path=”./downloads” +… ) +… print(f”Downloaded to: {path}”)

    +
    -
    -search_patents(query=None, application_number=None, patent_number=None, inventor_name=None, applicant_name=None, assignee_name=None, filing_date_from=None, filing_date_to=None, grant_date_from=None, grant_date_to=None, classification=None, limit=25, offset=0)[source]
    -

    Search for patents with various filters.

    +
    +get_decision_by_id(petition_decision_record_identifier, include_documents=None)[source]
    +

    Retrieves a specific petition decision by its record identifier.

    Parameters:
      -
    • query (Optional[str]) – Search text in all fields

    • -
    • application_number (Optional[str]) – Filter by application number

    • -
    • patent_number (Optional[str]) – Filter by patent number

    • -
    • inventor_name (Optional[str]) – Filter by inventor name

    • -
    • applicant_name (Optional[str]) – Filter by applicant name

    • -
    • assignee_name (Optional[str]) – Filter by assignee name

    • -
    • filing_date_from (Optional[str]) – Filter by filing date from (YYYY-MM-DD)

    • -
    • filing_date_to (Optional[str]) – Filter by filing date to (YYYY-MM-DD)

    • -
    • grant_date_from (Optional[str]) – Filter by grant date from (YYYY-MM-DD)

    • -
    • grant_date_to (Optional[str]) – Filter by grant date to (YYYY-MM-DD)

    • -
    • classification (Optional[str]) – Filter by CPC classification

    • -
    • limit (Optional[int]) – Number of results to return (default 25)

    • -
    • offset (Optional[int]) – Position in dataset to start from (default 0)

    • +
    • petition_decision_record_identifier (str) – The unique identifier for the petition +decision record (UUID format).

    • +
    • include_documents (bool | None) – Whether to include associated documents in the response. +If True, adds includeDocuments=true query parameter.

    -
    Return type:
    -

    PatentDataResponse

    +
    Returns:
    +

    The petition decision if found, None otherwise.

    -
    Returns:
    -

    PatentDataResponse object containing matching patents

    +
    Return type:
    +

    Optional[PetitionDecision]

    +
    +
    +
    +

    Examples

    +

    # Get decision without documents +>>> decision = client.get_decision_by_id( +… “9f1a4a2b-eee1-58ec-a3aa-167c4075aed4” +… )

    +

    # Get decision with documents +>>> decision = client.get_decision_by_id( +… “34044333-4b40-515f-a684-2515325c57c5”, +… include_documents=True +… )

    +
    +
    + +
    +
    +paginate_decisions(**kwargs)[source]
    +

    Provides an iterator to paginate through petition decision search results.

    +

    This method simplifies fetching all petition decisions matching a search query +by automatically handling pagination. It internally calls the search_decisions +method for GET requests, batching results and yielding them one by one.

    +

    All keyword arguments are passed directly to search_decisions to define the +search criteria. The offset and limit parameters are managed by the pagination +logic; setting them directly in kwargs might lead to unexpected behavior.

    +
    +
    Parameters:
    +

    **kwargs (Any) – Keyword arguments passed to search_decisions for constructing +the search query. Do not include post_body.

    +
    +
    Returns:
    +

    +
    An iterator yielding PetitionDecision objects,

    allowing iteration over all matching petition decisions across multiple +pages of results.

    +
    +
    +

    +
    +
    Return type:
    +

    Iterator[PetitionDecision]

    +
    +
    Raises:
    +

    ValueError – If post_body is included in kwargs, as this method only + supports GET request parameters for pagination.

    +
    +
    +
    +

    Examples

    +

    # Paginate through all decisions for a technology center +>>> for decision in client.paginate_decisions(technology_center_q=”1700”): +… print(f”{decision.application_number_text}: {decision.decision_type_code}”)

    +

    # Paginate with date range +>>> for decision in client.paginate_decisions( +… decision_date_from_q=”2023-01-01”, +… decision_date_to_q=”2023-12-31” +… ): +… process_decision(decision)

    +
    +
    + +
    +
    +search_decisions(query=None, sort=None, offset=0, limit=25, facets=None, fields=None, filters=None, range_filters=None, post_body=None, application_number_q=None, patent_number_q=None, inventor_name_q=None, applicant_name_q=None, invention_title_q=None, decision_type_code_q=None, decision_date_from_q=None, decision_date_to_q=None, petition_mail_date_from_q=None, petition_mail_date_to_q=None, technology_center_q=None, final_deciding_office_name_q=None, additional_query_params=None)[source]
    +

    Searches for final petition decisions.

    +

    This method can perform either a GET request using query parameters or a POST +request if post_body is specified. When using GET, you can provide either a +direct query string or use convenience parameters that will be automatically +combined into a query.

    +
    +
    Parameters:
    +
      +
    • query (str | None) – Direct query string in USPTO search syntax.

    • +
    • sort (str | None) – Sort order for results.

    • +
    • offset (int | None) – Number of records to skip (pagination).

    • +
    • limit (int | None) – Maximum number of records to return.

    • +
    • facets (str | None) – Facet configuration string.

    • +
    • fields (str | None) – Specific fields to return.

    • +
    • filters (str | None) – Filter configuration string.

    • +
    • range_filters (str | None) – Range filter configuration string.

    • +
    • post_body (Dict[str, Any] | None) – Optional POST body for complex queries.

    • +
    • application_number_q (str | None) – Filter by application number.

    • +
    • patent_number_q (str | None) – Filter by patent number.

    • +
    • inventor_name_q (str | None) – Filter by inventor name.

    • +
    • applicant_name_q (str | None) – Filter by applicant name.

    • +
    • invention_title_q (str | None) – Filter by invention title.

    • +
    • decision_type_code_q (str | None) – Filter by decision type code.

    • +
    • decision_date_from_q (str | None) – Filter decisions from this date (YYYY-MM-DD).

    • +
    • decision_date_to_q (str | None) – Filter decisions to this date (YYYY-MM-DD).

    • +
    • petition_mail_date_from_q (str | None) – Filter petition mail dates from (YYYY-MM-DD).

    • +
    • petition_mail_date_to_q (str | None) – Filter petition mail dates to (YYYY-MM-DD).

    • +
    • technology_center_q (str | None) – Filter by technology center.

    • +
    • final_deciding_office_name_q (str | None) – Filter by deciding office name.

    • +
    • additional_query_params (Dict[str, Any] | None) – Additional custom query parameters.

    • +
    +
    +
    Returns:
    +

    Response containing matching petition decisions.

    +
    +
    Return type:
    +

    PetitionDecisionResponse

    +
    +
    +
    +

    Examples

    +

    # Search with direct query +>>> response = client.search_decisions(query=”applicationNumberText:17765301”)

    +

    # Search with convenience parameters +>>> response = client.search_decisions( +… applicant_name_q=”ACME Corp”, +… decision_date_from_q=”2022-01-01”, +… limit=50 +… )

    +

    # Search with POST body +>>> response = client.search_decisions( +… post_body={“q”: “technologyCenter:1700”, “limit”: 100} +… )

    +
    +
    + +
    + +

    clients.ptab_appeals - Client for USPTO PTAB Appeals API

    +

    This module provides a client for interacting with the USPTO PTAB (Patent Trial +and Appeal Board) Appeals API. It allows you to search for ex parte appeal decisions.

    +
    +
    +class pyUSPTO.clients.ptab_appeals.PTABAppealsClient(api_key=None, base_url=None, config=None)[source]
    +

    Bases: BaseUSPTOClient[PTABAppealResponse]

    +

    Client for interacting with the USPTO PTAB Appeals API.

    +

    This client provides methods to search for ex parte appeal decisions from the +Patent Trial and Appeal Board.

    +

    Appeals data includes decisions on patent application appeals from the examiner +to the PTAB.

    +
    +
    +ENDPOINTS = {'search_decisions': 'api/v1/patent/appeals/decisions/search'}
    +
    + +
    +
    +__init__(api_key=None, base_url=None, config=None)[source]
    +

    Initialize the PTABAppealsClient.

    +
    +
    Parameters:
    +
      +
    • api_key (str | None) – Optional API key for authentication.

    • +
    • base_url (str | None) – Optional base URL override for the API.

    • +
    • config (USPTOConfig | None) – Optional USPTOConfig instance for configuration.

    • +
    +
    +
    +
    + +
    +
    +paginate_decisions(**kwargs)[source]
    +

    Provides an iterator to paginate through appeal decision search results.

    +

    This method simplifies fetching all appeal decisions matching a search query +by automatically handling pagination. It internally calls the search_decisions +method for GET requests, batching results and yielding them one by one.

    +

    All keyword arguments are passed directly to search_decisions to define the +search criteria. The offset and limit parameters are managed by the pagination +logic; setting them directly in kwargs might lead to unexpected behavior.

    +
    +
    Parameters:
    +

    **kwargs (Any) – Keyword arguments passed to search_decisions for constructing +the search query. Do not include post_body.

    +
    +
    Returns:
    +

    +
    An iterator yielding PTABAppealDecision objects,

    allowing iteration over all matching decisions across multiple pages of results.

    +
    +
    +

    +
    +
    Return type:
    +

    Iterator[PTABAppealDecision]

    +
    +
    Raises:
    +

    ValueError – If post_body is included in kwargs, as this method only + supports GET request parameters for pagination.

    +
    +
    +
    +

    Examples

    +

    # Paginate through all decisions for a technology center +>>> for decision in client.paginate_decisions(technology_center_number_q=”3600”): +… print(f”{decision.appeal_meta_data.appeal_number}: ” +… f”{decision.decision_data.decision_type_category}”)

    +

    # Paginate with date range +>>> for decision in client.paginate_decisions( +… decision_date_from_q=”2023-01-01”, +… decision_date_to_q=”2023-12-31” +… ): +… process_decision(decision)

    +
    +
    + +
    +
    +search_decisions(query=None, sort=None, offset=0, limit=25, facets=None, fields=None, filters=None, range_filters=None, post_body=None, appeal_number_q=None, application_number_text_q=None, appellant_name_q=None, requestor_name_q=None, decision_type_category_q=None, decision_date_from_q=None, decision_date_to_q=None, technology_center_number_q=None, additional_query_params=None)[source]
    +

    Searches for PTAB appeal decisions.

    +

    This method can perform either a GET request using query parameters or a POST +request if post_body is specified. When using GET, you can provide either a +direct query string or use convenience parameters that will be automatically +combined into a query.

    +
    +
    Parameters:
    +
      +
    • query (str | None) – Direct query string in USPTO search syntax.

    • +
    • sort (str | None) – Sort order for results.

    • +
    • offset (int | None) – Number of records to skip (pagination).

    • +
    • limit (int | None) – Maximum number of records to return.

    • +
    • facets (str | None) – Facet configuration string.

    • +
    • fields (str | None) – Specific fields to return.

    • +
    • filters (str | None) – Filter configuration string.

    • +
    • range_filters (str | None) – Range filter configuration string.

    • +
    • post_body (Dict[str, Any] | None) – Optional POST body for complex queries.

    • +
    • appeal_number_q (str | None) – Filter by appeal number.

    • +
    • application_number_text_q (str | None) – Filter by application number.

    • +
    • appellant_name_q (str | None) – Filter by appellant name.

    • +
    • requestor_name_q (str | None) – Filter by requestor name.

    • +
    • decision_type_category_q (str | None) – Filter by decision type category.

    • +
    • decision_date_from_q (str | None) – Filter decisions from this date (YYYY-MM-DD).

    • +
    • decision_date_to_q (str | None) – Filter decisions to this date (YYYY-MM-DD).

    • +
    • technology_center_number_q (str | None) – Filter by technology center number.

    • +
    • additional_query_params (Dict[str, Any] | None) – Additional custom query parameters.

    • +
    +
    +
    Returns:
    +

    Response containing matching appeal decisions.

    +
    +
    Return type:
    +

    PTABAppealResponse

    +
    +

    Examples

    +

    # Search with direct query +>>> response = client.search_decisions(query=”appealNumber:2023-001234”)

    +

    # Search with convenience parameters +>>> response = client.search_decisions( +… technology_center_number_q=”3600”, +… decision_date_from_q=”2023-01-01”, +… limit=50 +… )

    +

    # Search with POST body +>>> response = client.search_decisions( +… post_body={“q”: “decisionTypeCategory:Affirmed”, “limit”: 100} +… )

    +
    +
    + +
    + +

    clients.ptab_interferences - Client for USPTO PTAB Interferences API

    +

    This module provides a client for interacting with the USPTO PTAB (Patent Trial +and Appeal Board) Interferences API. It allows you to search for patent interference decisions.

    +
    +
    +class pyUSPTO.clients.ptab_interferences.PTABInterferencesClient(api_key=None, base_url=None, config=None)[source]
    +

    Bases: BaseUSPTOClient[PTABInterferenceResponse]

    +

    Client for interacting with the USPTO PTAB Interferences API.

    +

    This client provides methods to search for patent interference decisions from the +Patent Trial and Appeal Board.

    +

    Interference proceedings are used to determine priority of invention when two or +more parties claim the same patentable invention.

    +
    +
    +ENDPOINTS = {'search_decisions': 'api/v1/patent/interferences/decisions/search'}
    +
    + +
    +
    +__init__(api_key=None, base_url=None, config=None)[source]
    +

    Initialize the PTABInterferencesClient.

    +
    +
    Parameters:
    +
      +
    • api_key (str | None) – Optional API key for authentication.

    • +
    • base_url (str | None) – Optional base URL override for the API.

    • +
    • config (USPTOConfig | None) – Optional USPTOConfig instance for configuration.

    • +
    +
    +
    +
    + +
    +
    +paginate_decisions(**kwargs)[source]
    +

    Provides an iterator to paginate through interference decision search results.

    +

    This method simplifies fetching all interference decisions matching a search query +by automatically handling pagination. It internally calls the search_decisions +method for GET requests, batching results and yielding them one by one.

    +

    All keyword arguments are passed directly to search_decisions to define the +search criteria. The offset and limit parameters are managed by the pagination +logic; setting them directly in kwargs might lead to unexpected behavior.

    +
    +
    Parameters:
    +

    **kwargs (Any) – Keyword arguments passed to search_decisions for constructing +the search query. Do not include post_body.

    +
    +
    Returns:
    +

    +
    An iterator yielding PTABInterferenceDecision

    objects, allowing iteration over all matching decisions across multiple pages +of results.

    +
    +
    +

    +
    +
    Return type:
    +

    Iterator[PTABInterferenceDecision]

    +
    +
    Raises:
    +

    ValueError – If post_body is included in kwargs, as this method only + supports GET request parameters for pagination.

    +
    +
    +
    +

    Examples

    +

    # Paginate through all interference decisions +>>> for decision in client.paginate_decisions(): +… print(f”{decision.interference_meta_data.interference_number}: ” +… f”{decision.document_data.interference_outcome_category}”)

    +

    # Paginate with date range +>>> for decision in client.paginate_decisions( +… decision_date_from_q=”2020-01-01”, +… decision_date_to_q=”2023-12-31” +… ): +… process_decision(decision)

    +
    +
    + +
    +
    +search_decisions(query=None, sort=None, offset=0, limit=25, facets=None, fields=None, filters=None, range_filters=None, post_body=None, interference_number_q=None, senior_party_application_number_q=None, junior_party_application_number_q=None, senior_party_name_q=None, junior_party_name_q=None, real_party_in_interest_q=None, interference_outcome_category_q=None, decision_type_category_q=None, decision_date_from_q=None, decision_date_to_q=None, additional_query_params=None)[source]
    +

    Searches for PTAB interference decisions.

    +

    This method can perform either a GET request using query parameters or a POST +request if post_body is specified. When using GET, you can provide either a +direct query string or use convenience parameters that will be automatically +combined into a query.

    +
    +
    Parameters:
    +
      +
    • query (str | None) – Direct query string in USPTO search syntax.

    • +
    • sort (str | None) – Sort order for results.

    • +
    • offset (int | None) – Number of records to skip (pagination).

    • +
    • limit (int | None) – Maximum number of records to return.

    • +
    • facets (str | None) – Facet configuration string.

    • +
    • fields (str | None) – Specific fields to return.

    • +
    • filters (str | None) – Filter configuration string.

    • +
    • range_filters (str | None) – Range filter configuration string.

    • +
    • post_body (Dict[str, Any] | None) – Optional POST body for complex queries.

    • +
    • interference_number_q (str | None) – Filter by interference number.

    • +
    • senior_party_application_number_q (str | None) – Filter by senior party application number.

    • +
    • junior_party_application_number_q (str | None) – Filter by junior party application number.

    • +
    • senior_party_name_q (str | None) – Filter by senior party name.

    • +
    • junior_party_name_q (str | None) – Filter by junior party name.

    • +
    • real_party_in_interest_q (str | None) – Filter by Real Party in Interest.

    • +
    • interference_outcome_category_q (str | None) – Filter by interference outcome category.

    • +
    • decision_type_category_q (str | None) – Filter by decision type category.

    • +
    • decision_date_from_q (str | None) – Filter decisions from this date (YYYY-MM-DD).

    • +
    • decision_date_to_q (str | None) – Filter decisions to this date (YYYY-MM-DD).

    • +
    • additional_query_params (Dict[str, Any] | None) – Additional custom query parameters.

    • +
    +
    +
    Returns:
    +

    Response containing matching interference decisions.

    +
    +
    Return type:
    +

    PTABInterferenceResponse

    +
    +
    +
    +

    Examples

    +

    # Search with direct query +>>> response = client.search_decisions(query=”interferenceNumber:106123”)

    +

    # Search with convenience parameters +>>> response = client.search_decisions( +… interference_outcome_category_q=”Priority to Senior Party”, +… decision_date_from_q=”2020-01-01”, +… limit=50 +… )

    +

    # Search with POST body +>>> response = client.search_decisions( +… post_body={“q”: “decisionTypeCategory:Final Decision”, “limit”: 100} +… )

    +
    +
    + +
    + +

    clients.ptab_trials - Client for USPTO PTAB Trials API

    +

    This module provides a client for interacting with the USPTO PTAB (Patent Trial +and Appeal Board) Trials API. It allows you to search for trial proceedings, +documents, and decisions.

    +
    +
    +class pyUSPTO.clients.ptab_trials.PTABTrialsClient(api_key=None, base_url=None, config=None)[source]
    +

    Bases: BaseUSPTOClient[PTABTrialProceedingResponse | PTABTrialDocumentResponse]

    +

    Client for interacting with the USPTO PTAB Trials API.

    +

    This client provides methods to search for trial proceedings, trial documents, +and trial decisions from the Patent Trial and Appeal Board.

    +

    Trial proceedings data includes IPR (Inter Partes Review), PGR (Post-Grant Review), +CBM (Covered Business Method), and DER (Derivation) proceedings.

    +
    +
    +ENDPOINTS = {'search_decisions': 'api/v1/patent/trials/decisions/search', 'search_documents': 'api/v1/patent/trials/documents/search', 'search_proceedings': 'api/v1/patent/trials/proceedings/search'}
    +
    + +
    +
    +__init__(api_key=None, base_url=None, config=None)[source]
    +

    Initialize the PTABTrialsClient.

    +
    +
    Parameters:
    +
      +
    • api_key (str | None) – Optional API key for authentication.

    • +
    • base_url (str | None) – Optional base URL override for the API.

    • +
    • config (USPTOConfig | None) – Optional USPTOConfig instance for configuration.

    • +
    +
    +
    +
    + +
    +
    +paginate_proceedings(**kwargs)[source]
    +

    Provides an iterator to paginate through trial proceeding search results.

    +
    +
    Return type:
    +

    Iterator[PTABTrialProceeding]

    +
    +
    +
    + +
    +
    +search_decisions(query=None, sort=None, offset=0, limit=25, facets=None, fields=None, filters=None, range_filters=None, post_body=None, trial_number_q=None, decision_type_category_q=None, document_type_description_q=None, decision_date_from_q=None, decision_date_to_q=None, trial_type_code_q=None, patent_number_q=None, application_number_q=None, patent_owner_name_q=None, trial_status_category_q=None, real_party_in_interest_name_q=None, document_category_q=None, additional_query_params=None)[source]
    +

    Searches for PTAB trial decisions.

    +

    This method can perform either a GET request using query parameters or a POST +request if post_body is specified. When using GET, you can provide either a +direct query string or use convenience parameters that will be automatically +combined into a query.

    +
    +
    Parameters:
    +
      +
    • query (str | None) – Direct query string in USPTO search syntax.

    • +
    • sort (str | None) – Sort order for results.

    • +
    • offset (int | None) – Number of records to skip (pagination).

    • +
    • limit (int | None) – Maximum number of records to return.

    • +
    • facets (str | None) – Facet configuration string.

    • +
    • fields (str | None) – Specific fields to return.

    • +
    • filters (str | None) – Filter configuration string.

    • +
    • range_filters (str | None) – Range filter configuration string.

    • +
    • post_body (Dict[str, Any] | None) – Optional POST body for complex queries.

    • +
    • trial_number_q (str | None) – Filter by trial number.

    • +
    • decision_type_category_q (str | None) – Filter by decision type category.

    • +
    • document_type_description_q (str | None) – Filter by “[description]”.

    • +
    • decision_date_from_q (str | None) – Filter decisions from this date (YYYY-MM-DD).

    • +
    • decision_date_to_q (str | None) – Filter decisions to this date (YYYY-MM-DD).

    • +
    • trial_type_code_q (str | None) – Filter by trial type code (e.g., “IPR”, “PGR”, “CBM”, “DER”).

    • +
    • patent_number_q (str | None) – Filter by patent number.

    • +
    • application_number_q (str | None) – Filter by application number.

    • +
    • patent_owner_name_q (str | None) – Filter by patent owner name.

    • +
    • trial_status_category_q (str | None) – Filter by trial status category.

    • +
    • real_party_in_interest_name_q (str | None) – Filter by real party in interest name.

    • +
    • document_category_q (str | None) – Filter by document category.

    • +
    • additional_query_params (Dict[str, Any] | None) – Additional custom query parameters.

    • +
    +
    +
    Returns:
    +

    Response containing matching trial decisions.

    +
    +
    Return type:
    +

    PTABTrialDocumentResponse

    +
    +
    +
    +

    Examples

    +

    # Search with direct query +>>> response = client.search_decisions(query=”trialNumber:IPR2023-00001”)

    +

    # Search with convenience parameters +>>> response = client.search_decisions( +… decision_type_category_q=”Final Written Decision”, +… decision_date_from_q=”2023-01-01”, +… limit=50 +… )

    +
    +
    + +
    +
    +search_documents(query=None, sort=None, offset=0, limit=25, facets=None, fields=None, filters=None, range_filters=None, post_body=None, trial_number_q=None, document_category_q=None, document_type_name_q=None, filing_date_from_q=None, filing_date_to_q=None, petitioner_real_party_in_interest_name_q=None, inventor_name_q=None, real_party_in_interest_name_q=None, patent_number_q=None, patent_owner_name_q=None, additional_query_params=None)[source]
    +

    Searches for PTAB trial documents.

    +

    This method can perform either a GET request using query parameters or a POST +request if post_body is specified. When using GET, you can provide either a +direct query string or use convenience parameters that will be automatically +combined into a query.

    +
    +
    Parameters:
    +
      +
    • query (str | None) – Direct query string in USPTO search syntax.

    • +
    • sort (str | None) – Sort order for results.

    • +
    • offset (int | None) – Number of records to skip (pagination).

    • +
    • limit (int | None) – Maximum number of records to return.

    • +
    • facets (str | None) – Facet configuration string.

    • +
    • fields (str | None) – Specific fields to return.

    • +
    • filters (str | None) – Filter configuration string.

    • +
    • range_filters (str | None) – Range filter configuration string.

    • +
    • post_body (Dict[str, Any] | None) – Optional POST body for complex queries.

    • +
    • trial_number_q (str | None) – Filter by trial number.

    • +
    • document_category_q (str | None) – Filter by document category (e.g., “Petition”) DOCUMENTED BUT NOT IN API.

    • +
    • document_type_name_q (str | None) – Filter by document type name (description).

    • +
    • filing_date_from_q (str | None) – Filter documents from this date (YYYY-MM-DD).

    • +
    • filing_date_to_q (str | None) – Filter documents to this date (YYYY-MM-DD).

    • +
    • petitioner_real_party_in_interest_name_q (str | None) – Filter by petitioner real party in interest.

    • +
    • inventor_name_q (str | None) – Filter by inventor name.

    • +
    • real_party_in_interest_name_q (str | None) – Filter by real party in interest (generic).

    • +
    • patent_number_q (str | None) – Filter by patent number.

    • +
    • patent_owner_name_q (str | None) – Filter by patent owner name.

    • +
    • additional_query_params (Dict[str, Any] | None) – Additional custom query parameters.

    • +
    +
    +
    Returns:
    +

    Response containing matching trial documents.

    +
    +
    Return type:
    +

    PTABTrialDocumentResponse

    +
    +
    +
    +

    Examples

    +

    # Search with direct query +>>> response = client.search_documents(query=”trialNumber:IPR2023-00001”)

    +

    # Search with convenience parameters +>>> response = client.search_documents( +… document_category_q=”Paper”, +… filing_date_from_q=”2023-01-01”, +… limit=50 +… )

    +
    +
    + +
    +
    +search_proceedings(query=None, sort=None, offset=0, limit=25, facets=None, fields=None, filters=None, range_filters=None, post_body=None, trial_number_q=None, patent_owner_name_q=None, petitioner_real_party_in_interest_name_q=None, respondent_name_q=None, trial_type_code_q=None, trial_status_category_q=None, petition_filing_date_from_q=None, petition_filing_date_to_q=None, additional_query_params=None)[source]
    +

    Searches for PTAB trial proceedings.

    +

    This method can perform either a GET request using query parameters or a POST +request if post_body is specified. When using GET, you can provide either a +direct query string or use convenience parameters that will be automatically +combined into a query.

    +
    +
    Parameters:
    +
      +
    • query (str | None) – Direct query string in USPTO search syntax.

    • +
    • sort (str | None) – Sort order for results.

    • +
    • offset (int | None) – Number of records to skip (pagination).

    • +
    • limit (int | None) – Maximum number of records to return.

    • +
    • facets (str | None) – Facet configuration string.

    • +
    • fields (str | None) – Specific fields to return.

    • +
    • filters (str | None) – Filter configuration string.

    • +
    • range_filters (str | None) – Range filter configuration string.

    • +
    • post_body (Dict[str, Any] | None) – Optional POST body for complex queries.

    • +
    • trial_number_q (str | None) – Filter by trial number (e.g., “IPR2023-00001”).

    • +
    • patent_owner_name_q (str | None) – Filter by patent owner name.

    • +
    • petitioner_real_party_in_interest_name_q (str | None) – Filter by petitioner real party in interest.

    • +
    • respondent_name_q (str | None) – Filter by respondent name.

    • +
    • trial_type_code_q (str | None) – Filter by trial type code (e.g., “IPR”, “PGR”, “CBM”, “DER”).

    • +
    • trial_status_category_q (str | None) – Filter by trial status category.

    • +
    • petition_filing_date_from_q (str | None) – Filter proceedings from this date (YYYY-MM-DD).

    • +
    • petition_filing_date_to_q (str | None) – Filter proceedings to this date (YYYY-MM-DD).

    • +
    • additional_query_params (Dict[str, Any] | None) – Additional custom query parameters.

    • +
    +
    +
    Returns:
    +

    Response containing matching trial proceedings.

    +
    +
    Return type:
    +

    PTABTrialProceedingResponse

    +
    +
    +
    +

    Examples

    +

    # Search with direct query +>>> response = client.search_proceedings(query=”trialNumber:IPR2023-00001”)

    +

    # Search with convenience parameters +>>> response = client.search_proceedings( +… trial_type_code_q=”IPR”, +… petition_filing_date_from_q=”2023-01-01”, +… limit=50 +… )

    +
    @@ -671,7 +1740,7 @@
    -

    © Copyright 2025, Andrew Piechocki.

    +

    © Copyright 2025, Dunlap Codding, P.C..

    Built with Sphinx using a diff --git a/docs/build/html/api/config.html b/docs/build/html/api/config.html index 75ef64a..2a7226f 100644 --- a/docs/build/html/api/config.html +++ b/docs/build/html/api/config.html @@ -6,7 +6,7 @@ - Configuration — pyUSPTO 0.1.4.dev0+ga92fa00.d20250320 documentation + Configuration — pyUSPTO 0.2.3.dev1+g2c5d89b38.d20251125 documentation @@ -14,7 +14,7 @@ - + @@ -58,9 +58,31 @@
  • USPTOConfig.from_env()
  • +
  • HTTPConfig +
  • Exceptions
  • +
  • Warnings
  • Examples
  • @@ -92,25 +114,32 @@
    -
    -

    Configuration

    -

    config - Configuration management for USPTO API clients

    -

    This module provides configuration management for USPTO API clients.

    +
    +

    Configuration

    +

    config - Configuration management for USPTO API clients

    +

    This module provides configuration management for USPTO API clients, +including API keys, base URLs, and HTTP transport settings.

    -class pyUSPTO.config.USPTOConfig(api_key=None, bulk_data_base_url='https://api.uspto.gov/api/v1/datasets', patent_data_base_url='https://api.uspto.gov/api/v1/patent')[source]
    -

    Bases: object

    +class pyUSPTO.config.USPTOConfig(api_key=None, bulk_data_base_url='https://api.uspto.gov', patent_data_base_url='https://api.uspto.gov', petition_decisions_base_url='https://api.uspto.gov', ptab_base_url='https://api.uspto.gov', http_config=None, include_raw_data=False)[source] +

    Bases: object

    Configuration for USPTO API clients.

    +

    Manages API-level configuration (keys, URLs) and optionally +accepts HTTP transport configuration via HTTPConfig.

    -__init__(api_key=None, bulk_data_base_url='https://api.uspto.gov/api/v1/datasets', patent_data_base_url='https://api.uspto.gov/api/v1/patent')[source]
    +__init__(api_key=None, bulk_data_base_url='https://api.uspto.gov', patent_data_base_url='https://api.uspto.gov', petition_decisions_base_url='https://api.uspto.gov', ptab_base_url='https://api.uspto.gov', http_config=None, include_raw_data=False)[source]

    Initialize the USPTOConfig.

    Parameters:
      -
    • api_key (Optional[str]) – API key for authentication, defaults to USPTO_API_KEY environment variable

    • -
    • bulk_data_base_url (str) – Base URL for the Bulk Data API

    • -
    • patent_data_base_url (str) – Base URL for the Patent Data API

    • +
    • api_key (str | None) – API key for authentication, defaults to USPTO_API_KEY environment variable

    • +
    • bulk_data_base_url (str) – Base URL for the Bulk Data API

    • +
    • patent_data_base_url (str) – Base URL for the Patent Data API

    • +
    • petition_decisions_base_url (str) – Base URL for the Final Petition Decisions API

    • +
    • ptab_base_url (str) – Base URL for the PTAB (Patent Trial and Appeal Board) API

    • +
    • http_config (HTTPConfig | None) – Optional HTTPConfig for request handling (uses defaults if None)

    • +
    • include_raw_data (bool) – If True, store raw JSON in response objects for debugging (default: False)

    @@ -125,13 +154,150 @@

    Configuration

    USPTOConfig

    Returns:
    -

    USPTOConfig instance

    +

    USPTOConfig instance with values from environment

    +

    http_config - HTTP client configuration for USPTO API requests

    +

    This module provides configuration for HTTP transport-level settings including +timeouts, retries, connection pooling, and custom headers.

    +
    +
    +class pyUSPTO.http_config.HTTPConfig(timeout=30.0, connect_timeout=10.0, max_retries=3, backoff_factor=1.0, retry_status_codes=<factory>, pool_connections=10, pool_maxsize=10, custom_headers=None)[source]
    +

    Bases: object

    +

    HTTP client configuration for request handling.

    +

    This class separates transport-level HTTP concerns from API-level +configuration, allowing fine-grained control over request behavior.

    +
    +
    +timeout
    +

    Read timeout in seconds for requests (default: 30.0)

    +
    + +
    +
    +connect_timeout
    +

    Connection establishment timeout in seconds (default: 10.0)

    +
    + +
    +
    +max_retries
    +

    Maximum number of retry attempts (default: 3)

    +
    + +
    +
    +backoff_factor
    +

    Exponential backoff multiplier for retries (default: 1.0)

    +
    + +
    +
    +retry_status_codes
    +

    HTTP status codes that trigger retries

    +
    + +
    +
    +pool_connections
    +

    Number of connection pools to cache (default: 10)

    +
    + +
    +
    +pool_maxsize
    +

    Maximum number of connections per pool (default: 10)

    +
    + +
    +
    +custom_headers
    +

    Additional headers to include in all requests

    +
    + +
    +
    +backoff_factor: float = 1.0
    +
    + +
    +
    +connect_timeout: float | None = 10.0
    +
    + +
    +
    +custom_headers: Dict[str, str] | None = None
    +
    + +
    +
    +classmethod from_env()[source]
    +

    Create HTTPConfig from environment variables.

    +
    +
    Environment variables:

    USPTO_REQUEST_TIMEOUT: Request timeout in seconds +USPTO_CONNECT_TIMEOUT: Connection timeout in seconds +USPTO_MAX_RETRIES: Maximum retry attempts +USPTO_BACKOFF_FACTOR: Retry backoff factor +USPTO_POOL_CONNECTIONS: Connection pool size +USPTO_POOL_MAXSIZE: Max connections per pool

    +
    +
    +
    +
    Return type:
    +

    HTTPConfig

    +
    +
    Returns:
    +

    HTTPConfig instance with values from environment or defaults

    +
    +
    +
    + +
    +
    +get_timeout_tuple()[source]
    +

    Get timeout as tuple for requests library.

    +
    +
    Return type:
    +

    tuple[float | None, float | None]

    +
    +
    Returns:
    +

    Tuple of (connect_timeout, read_timeout) for requests

    +
    +
    +
    + +
    +
    +max_retries: int = 3
    +
    + +
    +
    +pool_connections: int = 10
    +
    + +
    +
    +pool_maxsize: int = 10
    +
    + +
    +
    +retry_status_codes: List[int]
    +
    + +
    +
    +timeout: float | None = 30.0
    +
    + +
    +
    @@ -145,7 +311,7 @@

    Configuration -

    © Copyright 2025, Andrew Piechocki.

    +

    © Copyright 2025, Dunlap Codding, P.C..

    Built with Sphinx using a diff --git a/docs/build/html/api/exceptions.html b/docs/build/html/api/exceptions.html index 404f47e..1c68532 100644 --- a/docs/build/html/api/exceptions.html +++ b/docs/build/html/api/exceptions.html @@ -6,7 +6,7 @@ - Exceptions — pyUSPTO 0.1.4.dev0+ga92fa00.d20250320 documentation + Exceptions — pyUSPTO 0.2.3.dev1+g2c5d89b38.d20251125 documentation @@ -14,7 +14,7 @@ - + @@ -22,7 +22,7 @@ - + @@ -54,12 +54,35 @@
  • Models
  • Configuration
  • Exceptions
  • +
  • Warnings
  • Examples
  • @@ -94,33 +117,196 @@

    Exceptions

    exceptions - Exception classes for USPTO API clients

    -

    This module provides exception classes for USPTO API clients.

    +

    This module provides exception classes for USPTO API errors that correspond to +the various response types from the USPTO API. It also includes helper +structures and functions for creating these exceptions.

    +
    +
    +class pyUSPTO.exceptions.APIErrorArgs(message, status_code=None, api_short_error=None, error_details=None, request_identifier=None)[source]
    +

    Bases: object

    +

    Data structure to hold arguments for API exception constructors.

    +
    +
    +api_short_error: str | None = None
    +
    + +
    +
    +error_details: str | dict | None = None
    +
    + +
    +
    +classmethod from_http_error(http_error, client_operation_message)[source]
    +

    Creates an APIErrorArgs instance by parsing a requests.exceptions.HTTPError.

    +
    +
    Parameters:
    +
      +
    • http_error (HTTPError) – The HTTPError object from the requests library.

    • +
    • client_operation_message (str) – A message describing the client operation that failed.

    • +
    +
    +
    Return type:
    +

    APIErrorArgs

    +
    +
    Returns:
    +

    An instance of APIErrorArgs populated with details from the HTTPError.

    +
    +
    +
    + +
    +
    +classmethod from_request_exception(request_exception, client_operation_message=None)[source]
    +

    Creates an APIErrorArgs instance from a generic requests.exceptions.RequestException +(e.g., ConnectionError, Timeout) that is not an HTTPError.

    +
    +
    Return type:
    +

    APIErrorArgs

    +
    +
    +
    + +
    +
    +message: str
    +
    + +
    +
    +request_identifier: str | None = None
    +
    + +
    +
    +status_code: int | None = None
    +
    + +
    +
    -exception pyUSPTO.exceptions.USPTOApiAuthError(message, status_code=None)[source]
    +exception pyUSPTO.exceptions.USPTOApiAuthError(message, status_code=None, api_short_error=None, error_details=None, request_identifier=None)[source]

    Bases: USPTOApiError

    -

    Authentication error.

    +

    Authentication/Authorization error (HTTP 401/403).

    +
    + +
    +
    +exception pyUSPTO.exceptions.USPTOApiBadRequestError(message, status_code=None, api_short_error=None, error_details=None, request_identifier=None)[source]
    +

    Bases: USPTOApiError

    +

    Bad Request error (HTTP 400).

    -exception pyUSPTO.exceptions.USPTOApiError(message, status_code=None)[source]
    -

    Bases: Exception

    -

    Base exception for USPTO API errors.

    +exception pyUSPTO.exceptions.USPTOApiError(message, status_code=None, api_short_error=None, error_details=None, request_identifier=None)[source] +

    Bases: Exception

    +

    Base exception for USPTO API errors. +This is the parent class for all USPTO API-specific exceptions. It includes +information about the status code, API’s short error message, detailed error +information, and request identifier from the API response.

    +
    +
    +DEFAULT_UNKNOWN_MESSAGE = 'UNK USPTO API ERROR'
    +
    + +
    +
    +__init__(message, status_code=None, api_short_error=None, error_details=None, request_identifier=None)[source]
    +

    Initializes the USPTOApiError. +:type message: str +:param message: The primary message for the exception (often client-generated context). +:type status_code: int | None +:param status_code: The HTTP status code from the API response (e.g., 400, 403). +:type api_short_error: str | None +:param api_short_error: The short error description from the API (e.g., “Bad Request”, “Forbidden”). +:type error_details: str | dict | None +:param error_details: The detailed error message or structure from the API. +:type request_identifier: str | None +:param request_identifier: The request identifier from the API response, if available.

    +
    + +
    +
    +__str__()[source]
    +

    Provides a more informative string representation of the error.

    +
    +
    Return type:
    +

    str

    +
    +
    +
    + +
    +
    +property message: str
    +

    Provides direct access to the primary exception message. +This refers to the first argument passed to the exception, +which is conventionally the main human-readable message.

    +
    +
    -exception pyUSPTO.exceptions.USPTOApiNotFoundError(message, status_code=None)[source]
    +exception pyUSPTO.exceptions.USPTOApiNotFoundError(message, status_code=None, api_short_error=None, error_details=None, request_identifier=None)[source]

    Bases: USPTOApiError

    -

    Resource not found.

    +

    Resource not found error (HTTP 404).

    +
    + +
    +
    +exception pyUSPTO.exceptions.USPTOApiPayloadTooLargeError(message, status_code=None, api_short_error=None, error_details=None, request_identifier=None)[source]
    +

    Bases: USPTOApiError

    +

    Payload Too Large error (HTTP 413).

    -exception pyUSPTO.exceptions.USPTOApiRateLimitError(message, status_code=None)[source]
    +exception pyUSPTO.exceptions.USPTOApiRateLimitError(message, status_code=None, api_short_error=None, error_details=None, request_identifier=None)[source] +

    Bases: USPTOApiError

    +

    Rate limit exceeded error (HTTP 429).

    +
    + +
    +
    +exception pyUSPTO.exceptions.USPTOApiServerError(message, status_code=None, api_short_error=None, error_details=None, request_identifier=None)[source]
    +

    Bases: USPTOApiError

    +

    Internal Server Error (HTTP 500 series).

    +
    + +
    +
    +exception pyUSPTO.exceptions.USPTOConnectionError(message, status_code=None, api_short_error=None, error_details=None, request_identifier=None)[source]

    Bases: USPTOApiError

    -

    Rate limit exceeded.

    +

    Network-level connection error (DNS failure, refused connection, etc.).

    +
    + +
    +
    +exception pyUSPTO.exceptions.USPTOTimeout(message, status_code=None, api_short_error=None, error_details=None, request_identifier=None)[source]
    +

    Bases: USPTOApiError

    +

    Request to USPTO API timed out.

    +
    + +
    +
    +pyUSPTO.exceptions.get_api_exception(error_args)[source]
    +

    Determines and instantiates the appropriate USPTOApiError subclass +based on the status code in error_args.

    +
    +
    Parameters:
    +

    error_args (APIErrorArgs) – An instance of APIErrorArgs containing all necessary +information to construct the exception.

    +
    +
    Return type:
    +

    USPTOApiError

    +
    +
    Returns:
    +

    An instance of a USPTOApiError subclass.

    +
    +
    @@ -130,13 +316,13 @@